diff --git a/.codex/config.toml b/.codex/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..d60a6975b9ce0c7e3ae6056defacc834732b111c --- /dev/null +++ b/.codex/config.toml @@ -0,0 +1,31 @@ +# Coding MCPs: project-local registration (2026-09-07). + +[mcp_servers.serena] +command = "/home/smlflg/.local/share/coding-mcp/serena/.venv/bin/serena" +args = ["start-mcp-server", "--context=codex", "--project", "/home/smlflg/Projekte/Experimente", "--enable-web-dashboard", "false", "--open-web-dashboard", "false", "--enable-gui-log-window", "false"] +cwd = "/home/smlflg/Projekte/Experimente" +enabled = true +startup_timeout_sec = 120 +tool_timeout_sec = 180 + +[mcp_servers.serena.env] +"SERENA_HOME" = "/home/smlflg/.local/share/coding-mcp/serena/state" + +[mcp_servers.gitnexus] +command = "/home/smlflg/.nvm/versions/node/v24.13.0/bin/node" +args = ["/home/smlflg/.local/share/coding-mcp/gitnexus/node_modules/gitnexus/dist/cli/index.js", "mcp"] +cwd = "/home/smlflg/Projekte/Experimente" +enabled = true +startup_timeout_sec = 120 +tool_timeout_sec = 180 + +[mcp_servers.gitnexus.env] +"GITNEXUS_HOME" = "/home/smlflg/.local/share/coding-mcp/gitnexus/runtime" + +[mcp_servers.context7] +command = "/home/smlflg/.nvm/versions/node/v24.13.0/bin/node" +args = ["/home/smlflg/.local/share/coding-mcp/context7/node_modules/@upstash/context7-mcp/dist/index.js"] +cwd = "/home/smlflg/Projekte/Experimente" +enabled = true +startup_timeout_sec = 120 +tool_timeout_sec = 180 diff --git a/superlog/.codex/config.toml b/superlog/.codex/config.toml new file mode 100644 index 0000000000000000000000000000000000000000..7ba990e6f57248a370edce160d51ee30046bc74a --- /dev/null +++ b/superlog/.codex/config.toml @@ -0,0 +1,31 @@ +# Coding MCPs: project-local registration (2026-09-07). + +[mcp_servers.serena] +command = "/home/smlflg/.local/share/coding-mcp/serena/.venv/bin/serena" +args = ["start-mcp-server", "--context=codex", "--project", "/home/smlflg/Projekte/Experimente/superlog", "--enable-web-dashboard", "false", "--open-web-dashboard", "false", "--enable-gui-log-window", "false"] +cwd = "/home/smlflg/Projekte/Experimente/superlog" +enabled = true +startup_timeout_sec = 120 +tool_timeout_sec = 180 + +[mcp_servers.serena.env] +"SERENA_HOME" = "/home/smlflg/.local/share/coding-mcp/serena/state" + +[mcp_servers.gitnexus] +command = "/home/smlflg/.nvm/versions/node/v24.13.0/bin/node" +args = ["/home/smlflg/.local/share/coding-mcp/gitnexus/node_modules/gitnexus/dist/cli/index.js", "mcp"] +cwd = "/home/smlflg/Projekte/Experimente/superlog" +enabled = true +startup_timeout_sec = 120 +tool_timeout_sec = 180 + +[mcp_servers.gitnexus.env] +"GITNEXUS_HOME" = "/home/smlflg/.local/share/coding-mcp/gitnexus/runtime" + +[mcp_servers.context7] +command = "/home/smlflg/.nvm/versions/node/v24.13.0/bin/node" +args = ["/home/smlflg/.local/share/coding-mcp/context7/node_modules/@upstash/context7-mcp/dist/index.js"] +cwd = "/home/smlflg/Projekte/Experimente/superlog" +enabled = true +startup_timeout_sec = 120 +tool_timeout_sec = 180 diff --git a/superlog/.dockerignore b/superlog/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..441ad991e84ccacd12f96235eb1f291afceeae46 --- /dev/null +++ b/superlog/.dockerignore @@ -0,0 +1,18 @@ +.git +.context +.railway +.turbo +.overmind.sock +tmp + +node_modules +**/node_modules + +.env +.env.* +**/.env +**/.env.* + +dist +build +coverage diff --git a/superlog/.gitignore b/superlog/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..83425a42d1d6ab075576148f60ea8b4508e50551 --- /dev/null +++ b/superlog/.gitignore @@ -0,0 +1,16 @@ +node_modules +dist +.turbo +.next +.env +.env.local +.env.superlog +*.log +.DS_Store +*.tsbuildinfo +.claude/* +!.claude/skills/ +.playwright-mcp/ +.overmind.sock +tmp/ +target/ diff --git a/superlog/.nvmrc b/superlog/.nvmrc new file mode 100644 index 0000000000000000000000000000000000000000..209e3ef4b6247ce746048d5711befda46206d235 --- /dev/null +++ b/superlog/.nvmrc @@ -0,0 +1 @@ +20 diff --git a/superlog/LICENSE.md b/superlog/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..57bc88a15a0ee8266c259b2667e64608d3f7e292 --- /dev/null +++ b/superlog/LICENSE.md @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/superlog/Procfile b/superlog/Procfile new file mode 100644 index 0000000000000000000000000000000000000000..78d199cc3a3c67da3ea45af0f366a47351196763 --- /dev/null +++ b/superlog/Procfile @@ -0,0 +1,4 @@ +api: mkdir -p tmp/logs && unset PORT && pnpm --filter @superlog/api dev 2>&1 | tee tmp/logs/api.log +web: mkdir -p tmp/logs && unset PORT && pnpm --filter @superlog/web dev 2>&1 | tee tmp/logs/web.log +worker: mkdir -p tmp/logs && unset PORT && pnpm --filter @superlog/worker dev 2>&1 | tee tmp/logs/worker.log +proxy: mkdir -p tmp/logs && unset PORT && pnpm --filter @superlog/proxy dev 2>&1 | tee tmp/logs/proxy.log diff --git a/superlog/Procfile.portless b/superlog/Procfile.portless new file mode 100644 index 0000000000000000000000000000000000000000..35d3ed869193d0f9b0e7e769cc389c8fe03f7384 --- /dev/null +++ b/superlog/Procfile.portless @@ -0,0 +1,4 @@ +api: mkdir -p "${SUPERLOG_LOG_DIR:-tmp/logs}" && ./scripts/portless-run.sh api pnpm --filter @superlog/api dev 2>&1 | tee "${SUPERLOG_LOG_DIR:-tmp/logs}/api.log" +web: mkdir -p "${SUPERLOG_LOG_DIR:-tmp/logs}" && ./scripts/portless-run.sh web pnpm --filter @superlog/web dev 2>&1 | tee "${SUPERLOG_LOG_DIR:-tmp/logs}/web.log" +worker: mkdir -p "${SUPERLOG_LOG_DIR:-tmp/logs}" && ./scripts/with-stack-env.sh pnpm --filter @superlog/worker dev 2>&1 | tee "${SUPERLOG_LOG_DIR:-tmp/logs}/worker.log" +proxy: mkdir -p "${SUPERLOG_LOG_DIR:-tmp/logs}" && ./scripts/portless-run.sh proxy pnpm --filter @superlog/proxy dev 2>&1 | tee "${SUPERLOG_LOG_DIR:-tmp/logs}/proxy.log" diff --git a/superlog/README.md b/superlog/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0175863c9afa878e60c9dc42a00f0546b6a5596a --- /dev/null +++ b/superlog/README.md @@ -0,0 +1,112 @@ + + + Twitter post - 2 + + + +
+ +
+ +[![Last Commit](https://img.shields.io/github/last-commit/superloglabs/superlog?labelColor=333333&color=666666)](https://github.com/superloglabs/superlog/commits/main) +[![Commit Activity](https://img.shields.io/github/commit-activity/m/superloglabs/superlog?labelColor=333333&color=666666)](https://github.com/superloglabs/superlog/graphs/commit-activity) +[![Apache 2.0 License](https://img.shields.io/badge/License-Apache_2.0-555555.svg?labelColor=333333&color=666666)](./LICENSE.md) +
+![Discord](https://img.shields.io/discord/1511214206123380867?link=https%3A%2F%2Fdiscord.gg%2FbqJYtW3n) +Y Combinator P26 +[![Follow @superlogYC on X](https://img.shields.io/twitter/follow/superlogyc?logo=X&color=%23f5f5f5)](https://twitter.com/intent/follow?screen_name=superlogYC) + +
+ +

+ Website + · + Code + · + Skills + · + Helpers + · + Discord +

+ +## About + +[Superlog](https://superlog.sh) is an open-source agentic telemetry system. It +ingests traces, logs, and metrics, groups noisy signals into incidents, and watches your infra while you sleep. + +## Installation + +You can install Superlog in your project by using our [skills](https://superlog.sh) in your favourite coding agent: + +``` +Run npx skills add superloglabs/skills --all and use the skills to install Superlog in this project +``` + + + +## What is Superlog? + +Superlog is an open-core observability workspace for OpenTelemetry data. It +ingests traces, logs, and metrics, groups noisy signals into incidents, and gives +teams a local-first product surface for debugging production systems. + +This repository contains the fully open-source, free community edition: + +- Web app and API +- OTLP ingest proxy +- Worker processes for incident grouping and background jobs +- Postgres schema and ClickHouse-backed telemetry queries +- Agent runner interfaces for pluggable investigation runtimes +- A default `community` agent runner that records a local incident summary + +We also provide a hosted Superlog Cloud edition with a free tier, a pay-to-go plan and monthly credit packs. + +## Quick Start + +Prerequisites: + +- Node.js 20+ +- pnpm 9+ +- Docker + +Install dependencies: + +```bash +pnpm install +``` + +Start the local stack: + +```bash +docker compose up -d +pnpm --filter @superlog/db db:migrate +pnpm dev +``` + +The default local services are: + +- Web: `http://localhost:5173` +- API: `http://localhost:4100` +- OTLP intake: `http://localhost:4101` + +## Development + +Run typechecks: + +```bash +pnpm typecheck +``` + +## Repository Layout + +- `apps/web` - Vite/React frontend +- `apps/api` - HTTP API +- `apps/proxy` - OTLP intake proxy +- `apps/worker` - background workers and agent orchestration +- `packages/db` - Drizzle schema and migrations +- `packages/fingerprint` - telemetry fingerprinting helpers + +## License + +Superlog is licensed under the [Apache License 2.0](./LICENSE.md). diff --git a/superlog/SAMUEL_LOCAL_SETUP.md b/superlog/SAMUEL_LOCAL_SETUP.md new file mode 100644 index 0000000000000000000000000000000000000000..0ac7f81713410d779c2a83b5d33b3424f72f7b91 --- /dev/null +++ b/superlog/SAMUEL_LOCAL_SETUP.md @@ -0,0 +1,50 @@ +# Samuel Local Superlog Setup + +Status: isolated local sandbox. + +## What is running + +- Web UI: http://127.0.0.1:5173 +- API: http://127.0.0.1:4100 +- Proxy health: http://127.0.0.1:4000/health +- OTEL collector HTTP: http://127.0.0.1:4318 +- Postgres container: `superlog-sandbox-postgres` on host port `5434` +- ClickHouse container: `superlog-sandbox-clickhouse` on host ports `8123`, `9000` +- Collector container: `superlog-sandbox-collector` on host ports `4317`, `4318` + +## Isolation guarantees + +- Cloned into `/home/smlflg/Projekte/Experimente/superlog`. +- No existing project was modified or instrumented. +- No GitHub/Slack/Linear/Anthropic/OAuth credentials were added. +- Local `.env` files exist only in this sandbox and are mode `600`. +- Docker objects use the `superlog-sandbox-*` names. + +## Stop + +```bash +# Stop web/API/worker/proxy dev process from Hermes if still running: +# process session: proc_6d60aaec9f83 + +# Stop Docker backend: +docker stop superlog-sandbox-collector superlog-sandbox-clickhouse superlog-sandbox-postgres +``` + +## Start again + +```bash +cd /home/smlflg/Projekte/Experimente/superlog + +docker start superlog-sandbox-postgres superlog-sandbox-clickhouse superlog-sandbox-collector +corepack pnpm dev +``` + +## Remove sandbox data later + +Only if you explicitly want to delete local sandbox data: + +```bash +docker rm -f superlog-sandbox-collector superlog-sandbox-clickhouse superlog-sandbox-postgres +docker volume rm superlog_sandbox_pg_data superlog_sandbox_ch_data +rm -rf /home/smlflg/Projekte/Experimente/superlog +``` diff --git a/superlog/SECURITY.md b/superlog/SECURITY.md new file mode 100644 index 0000000000000000000000000000000000000000..0b0a7d9fddb9a379074b315070646c26bc662e79 --- /dev/null +++ b/superlog/SECURITY.md @@ -0,0 +1,67 @@ +# Security Policy + +We take the security of Superlog and its users seriously. Thank you for helping +keep Superlog and the people who use it safe. + +## Supported Versions + +Superlog ships from `main`. Security fixes are applied to the latest release and +the current `main` branch only. Older commits and tags are not patched — please +upgrade to the latest version before reporting an issue. + +| Version | Supported | +| ------------------ | ------------------ | +| Latest release / `main` | :white_check_mark: | +| Anything older | :x: | + +## Reporting a Vulnerability + +**Please do not report security vulnerabilities through public GitHub issues, +pull requests, or our Discord.** + +Instead, use either of these private channels: + +- **GitHub Private Vulnerability Reporting** (preferred): open a report from the + [Security tab](https://github.com/superloglabs/superlog/security/advisories/new) + of this repository. This keeps the discussion private until a fix is released. +- **Email**: send details to **security@superlog.sh**. + +Please include as much of the following as you can: + +- The type of issue (e.g. injection, authn/authz bypass, SSRF, RCE, data exposure). +- The affected component (`apps/web`, `apps/api`, `apps/proxy`, `apps/worker`, + `packages/*`) and file paths or commit if known. +- Step-by-step instructions to reproduce, including any required configuration. +- Proof-of-concept or exploit code, if you have it. +- The impact of the issue and how an attacker might exploit it. + +This information helps us triage your report more quickly. + +## What to Expect + +- **Acknowledgement** within 3 business days of your report. +- An **initial assessment** and severity triage within 7 business days. +- We will keep you informed of progress as we work on a fix, and we will let you + know when the issue is resolved. +- We practice **coordinated disclosure**: we ask that you give us a reasonable + opportunity to release a fix before any public disclosure. We are happy to + credit you in the release notes and advisory unless you prefer to remain + anonymous. + +## Scope + +This policy covers the open-source code in this repository. Issues in the hosted +**Superlog Cloud** service should also be reported through the channels above. + +Out of scope (please do not report these): + +- Reports from automated scanners without a demonstrated, exploitable impact. +- Denial-of-service achievable only through unrealistic traffic volumes. +- Vulnerabilities in third-party dependencies that are already publicly known — + open a regular issue or PR to bump the dependency instead. + +## Safe Harbor + +We will not pursue legal action against researchers who act in good faith, +follow this policy, avoid privacy violations and service degradation, and give +us a reasonable time to remediate before disclosing. diff --git a/superlog/apps/api/Dockerfile b/superlog/apps/api/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..34affa2891969460a14c03be69db0306de2ccb79 --- /dev/null +++ b/superlog/apps/api/Dockerfile @@ -0,0 +1,23 @@ +# Build context: repo root. Build with `docker build -f apps/api/Dockerfile .` +FROM node:20-slim + +WORKDIR /app + +RUN corepack enable && corepack prepare pnpm@9.12.0 --activate + +COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ +COPY apps/api/package.json apps/api/ +COPY packages/db/package.json packages/db/ +COPY packages/fingerprint/package.json packages/fingerprint/ + +RUN pnpm install --frozen-lockfile --filter @superlog/api... + +COPY tsconfig.base.json ./ +COPY apps/api apps/api +COPY packages/db packages/db +COPY packages/fingerprint packages/fingerprint + +ENV PORT=4100 +EXPOSE 4100 + +CMD ["pnpm", "--filter", "@superlog/api", "start"] diff --git a/superlog/apps/api/node_modules/.bin/nanoid b/superlog/apps/api/node_modules/.bin/nanoid new file mode 100644 index 0000000000000000000000000000000000000000..d428edeed232d3196a0ddd62cc1460e6619250fa --- /dev/null +++ b/superlog/apps/api/node_modules/.bin/nanoid @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/nanoid@5.1.9/node_modules/nanoid/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/nanoid@5.1.9/node_modules/nanoid/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/nanoid@5.1.9/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/nanoid@5.1.9/node_modules/nanoid/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/nanoid@5.1.9/node_modules/nanoid/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/nanoid@5.1.9/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../nanoid/bin/nanoid.js" "$@" +else + exec node "$basedir/../nanoid/bin/nanoid.js" "$@" +fi diff --git a/superlog/apps/api/node_modules/.bin/pino b/superlog/apps/api/node_modules/.bin/pino new file mode 100644 index 0000000000000000000000000000000000000000..dc3214724f83daa042ee09d324798cbf76e71918 --- /dev/null +++ b/superlog/apps/api/node_modules/.bin/pino @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules/pino/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules/pino/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../pino/bin.js" "$@" +else + exec node "$basedir/../pino/bin.js" "$@" +fi diff --git a/superlog/apps/api/node_modules/.bin/tsc b/superlog/apps/api/node_modules/.bin/tsc new file mode 100644 index 0000000000000000000000000000000000000000..5a3027f858d7058aef8886d341f0b32c85ab95db --- /dev/null +++ b/superlog/apps/api/node_modules/.bin/tsc @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" +else + exec node "$basedir/../typescript/bin/tsc" "$@" +fi diff --git a/superlog/apps/api/node_modules/.bin/tsserver b/superlog/apps/api/node_modules/.bin/tsserver new file mode 100644 index 0000000000000000000000000000000000000000..95999db035aafe7ad567730b16e83c6114b243ae --- /dev/null +++ b/superlog/apps/api/node_modules/.bin/tsserver @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" +else + exec node "$basedir/../typescript/bin/tsserver" "$@" +fi diff --git a/superlog/apps/api/node_modules/.bin/tsx b/superlog/apps/api/node_modules/.bin/tsx new file mode 100644 index 0000000000000000000000000000000000000000..82e6578c601cd86d9e2b3768fd274df4f0f6d556 --- /dev/null +++ b/superlog/apps/api/node_modules/.bin/tsx @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/dist/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/dist/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@" +else + exec node "$basedir/../tsx/dist/cli.mjs" "$@" +fi diff --git a/superlog/apps/api/package.json b/superlog/apps/api/package.json new file mode 100644 index 0000000000000000000000000000000000000000..4b21bfec7b1dc81b1a2784f3ab788806d697979e --- /dev/null +++ b/superlog/apps/api/package.json @@ -0,0 +1,51 @@ +{ + "name": "@superlog/api", + "version": "0.0.0", + "private": true, + "license": "Apache-2.0", + "type": "module", + "scripts": { + "dev": "tsx watch --import ./tracing.ts src/index.ts", + "start": "tsx --import ./tracing.ts src/index.ts", + "test": "tsx --test src/**/*.test.ts", + "test:mcp-clickhouse-ranges": "tsx scripts/test-mcp-clickhouse-ranges.ts", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.1053.0", + "@clickhouse/client": "^1.9.0", + "@hono/node-server": "^1.13.7", + "@hono/standard-validator": "^0.2.2", + "@jridgewell/trace-mapping": "^0.3.31", + "@modelcontextprotocol/sdk": "^1.29.0", + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/api-logs": "^0.215.0", + "@opentelemetry/auto-instrumentations-node": "^0.73.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.215.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.215.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.215.0", + "@opentelemetry/resources": "^2.7.0", + "@opentelemetry/sdk-logs": "^0.215.0", + "@opentelemetry/sdk-metrics": "^2.7.0", + "@opentelemetry/sdk-node": "^0.215.0", + "@opentelemetry/semantic-conventions": "^1.40.0", + "@scalar/hono-api-reference": "^0.10.19", + "@superlog/db": "workspace:*", + "@superlog/fingerprint": "workspace:*", + "autumn-js": "^1.2.27", + "better-auth": "^1.6.11", + "dotenv": "^17.4.2", + "drizzle-orm": "^0.45.2", + "hono": "^4.6.12", + "hono-openapi": "^1.3.0", + "nanoid": "^5.0.9", + "pino": "^10.3.1", + "resend": "^6.12.3", + "zod": "^4.4.3" + }, + "devDependencies": { + "@types/node": "^22.10.1", + "tsx": "^4.19.2", + "typescript": "^5.7.2" + } +} diff --git a/superlog/apps/api/scripts/test-agent-tracking-e2e.ts b/superlog/apps/api/scripts/test-agent-tracking-e2e.ts new file mode 100644 index 0000000000000000000000000000000000000000..902bc99d942fc1f61736811d34fd5f026b18da96 --- /dev/null +++ b/superlog/apps/api/scripts/test-agent-tracking-e2e.ts @@ -0,0 +1,634 @@ +/** + * End-to-end integration test for agent PR / Linear ticket tracking. + * + * What this exercises: + * 1. Migrations apply cleanly (creates the four new tables + linear webhook columns). + * 2. Worker-side row creation: agent_pull_requests + initial pr_opened event. + * 3. GitHub webhook handler updates parent state and appends agent_pr_events + * for: pull_request closed/merged, push, pull_request_review, + * pull_request_review_comment, issue_comment. + * A merged PR also resolves the incident, cascades linked issues, and + * writes an incident timeline event. + * 4. Worker-side Linear ticket creation: agent_linear_tickets + ticket_filed event. + * 5. Linear webhook handler updates parent state and appends agent_linear_ticket_events + * for: Issue update (state change), Comment create. + * 6. Timeline merge: incident_events + agent_pr_events + agent_linear_ticket_events + * come back chronologically with actor metadata. + * + * What this does NOT exercise: + * - Real GitHub PR creation (requires installed GitHub App + repo). + * - Real Linear ticket creation (requires agent run with OAuth + MCP). + * - Linear webhook auto-registration on OAuth (requires public API_BASE_URL). + * + * Run: pnpm exec tsx scripts/test-agent-tracking-e2e.ts + */ + +import { strict as assert } from "node:assert"; +import crypto from "node:crypto"; +import "dotenv/config"; +import { Hono } from "hono"; +import { db, runMigrations, schema } from "@superlog/db"; +import { and, asc, desc, eq, inArray } from "drizzle-orm"; +import { mountGithubPublic } from "../src/github.js"; +import { mountLinearPublic } from "../src/linear.js"; + +const TEST_TAG = `e2e-${Date.now()}`; +const GH_INSTALLATION_ID = Math.floor(Date.now() / 1000) + 9_000_000; // unique-ish +const REPO_FULL_NAME = `acme/${TEST_TAG}`; +const PR_NUMBER = 42; +const LINEAR_WORKSPACE_ID = `ws-${TEST_TAG}`; +const LINEAR_TICKET_ID = `linear-issue-${TEST_TAG}`; +const LINEAR_WEBHOOK_ID = `wh-${TEST_TAG}`; +const LINEAR_WEBHOOK_SECRET = "linear-test-secret"; + +process.env.GITHUB_APP_WEBHOOK_SECRET ??= "github-test-secret"; +const GH_WEBHOOK_SECRET = process.env.GITHUB_APP_WEBHOOK_SECRET; + +function step(label: string) { + console.log(`\n— ${label}`); +} + +function ok(label: string) { + console.log(` ✓ ${label}`); +} + +async function seed(): Promise<{ + orgId: string; + projectId: string; + incidentId: string; + issueId: string; + agentRunId: string; + ghInstallRowId: string; + linearInstallRowId: string; + agentPrRowId: string; + agentTicketRowId: string; +}> { + // Org / user / project + const [org] = await db + .insert(schema.orgs) + .values({ name: `e2e-${TEST_TAG}`, slug: `e2e-${TEST_TAG}` }) + .returning(); + if (!org) throw new Error("seed org failed"); + + const [project] = await db + .insert(schema.projects) + .values({ orgId: org.id, name: "test", slug: `test-${TEST_TAG}` }) + .returning(); + if (!project) throw new Error("seed project failed"); + + // Incident + agentRun + const [incident] = await db + .insert(schema.incidents) + .values({ + projectId: project.id, + title: "Test incident", + service: "api", + firstSeen: new Date(), + lastSeen: new Date(), + }) + .returning(); + if (!incident) throw new Error("seed incident failed"); + + const [issue] = await db + .insert(schema.issues) + .values({ + projectId: project.id, + fingerprint: `fp-${TEST_TAG}`, + kind: "span", + service: "api", + exceptionType: "Error", + title: "Test issue", + message: "boom", + firstSeen: new Date(), + lastSeen: new Date(), + }) + .returning(); + if (!issue) throw new Error("seed issue failed"); + + await db.insert(schema.incidentIssues).values({ + incidentId: incident.id, + issueId: issue.id, + }); + + const [agentRun] = await db + .insert(schema.agentRuns) + .values({ incidentId: incident.id, runtime: "anthropic", state: "running" }) + .returning(); + if (!agentRun) throw new Error("seed agent run failed"); + + await db.insert(schema.incidentEvents).values({ + agentRunId: agentRun.id, + kind: "agent.session_started", + summary: "Agent session started", + }); + + // GitHub installation + const [ghInstall] = await db + .insert(schema.githubInstallations) + .values({ + orgId: org.id, + projectId: project.id, + installationId: GH_INSTALLATION_ID, + accountLogin: "acme-bot", + accountType: "Organization", + repos: [{ id: 1, fullName: REPO_FULL_NAME, private: false }], + }) + .returning(); + if (!ghInstall) throw new Error("seed gh install failed"); + + // Linear installation (with webhook id/secret pre-populated) + const [linearInstall] = await db + .insert(schema.linearInstallations) + .values({ + projectId: project.id, + workspaceId: LINEAR_WORKSPACE_ID, + workspaceName: "Acme", + accessToken: "fake-token", + webhookId: LINEAR_WEBHOOK_ID, + webhookSecret: LINEAR_WEBHOOK_SECRET, + }) + .returning(); + if (!linearInstall) throw new Error("seed linear install failed"); + + // Worker-created rows: pretend the worker already opened a PR + filed a ticket. + const [agentPr] = await db + .insert(schema.agentPullRequests) + .values({ + incidentId: incident.id, + agentRunId: agentRun.id, + installationId: ghInstall.id, + repoFullName: REPO_FULL_NAME, + prNumber: PR_NUMBER, + prNodeId: "PR_node_1", + url: `https://github.com/${REPO_FULL_NAME}/pull/${PR_NUMBER}`, + branchName: "superlog/fix-1", + baseBranch: "main", + headSha: "deadbeef", + title: "[superlog] Fix bug", + state: "open", + lastSyncedAt: new Date(), + }) + .returning(); + if (!agentPr) throw new Error("seed agent_pr failed"); + + await db.insert(schema.agentPrEvents).values({ + agentPrId: agentPr.id, + kind: "pr_opened", + summary: `Opened PR #${PR_NUMBER}`, + actorLogin: "superlog-bot", + payload: { url: agentPr.url }, + providerEventId: `pr_opened:${REPO_FULL_NAME}#${PR_NUMBER}`, + occurredAt: new Date(), + }); + + const [agentTicket] = await db + .insert(schema.agentLinearTickets) + .values({ + incidentId: incident.id, + agentRunId: agentRun.id, + installationId: linearInstall.id, + workspaceId: LINEAR_WORKSPACE_ID, + ticketId: LINEAR_TICKET_ID, + url: `https://linear.app/acme/issue/ENG-1`, + lastSyncedAt: new Date(), + }) + .returning(); + if (!agentTicket) throw new Error("seed agent_ticket failed"); + + await db.insert(schema.agentLinearTicketEvents).values({ + agentLinearTicketId: agentTicket.id, + kind: "ticket_filed", + summary: `Filed ${LINEAR_TICKET_ID}`, + occurredAt: new Date(), + providerEventId: `ticket_filed:${LINEAR_WORKSPACE_ID}:${LINEAR_TICKET_ID}`, + }); + + return { + orgId: org.id, + projectId: project.id, + incidentId: incident.id, + issueId: issue.id, + agentRunId: agentRun.id, + ghInstallRowId: ghInstall.id, + linearInstallRowId: linearInstall.id, + agentPrRowId: agentPr.id, + agentTicketRowId: agentTicket.id, + }; +} + +async function cleanup(orgId: string): Promise { + // FKs cascade from org → projects → incidents → agentRuns → events. + // github_installations / linear_installations cascade from org too. + await db.delete(schema.orgs).where(eq(schema.orgs.id, orgId)); +} + +function ghSign(body: string): string { + return `sha256=${crypto.createHmac("sha256", GH_WEBHOOK_SECRET).update(body).digest("hex")}`; +} + +function linearSign(body: string): string { + return crypto.createHmac("sha256", LINEAR_WEBHOOK_SECRET).update(body).digest("hex"); +} + +async function postGithub( + app: Hono, + event: string, + delivery: string, + payload: unknown, +): Promise { + const body = JSON.stringify(payload); + return app.request("/github/webhook", { + method: "POST", + headers: { + "content-type": "application/json", + "x-github-event": event, + "x-github-delivery": delivery, + "x-hub-signature-256": ghSign(body), + }, + body, + }); +} + +async function postLinear(app: Hono, delivery: string, payload: unknown): Promise { + const body = JSON.stringify(payload); + return app.request("/linear/webhook", { + method: "POST", + headers: { + "content-type": "application/json", + "linear-signature": linearSign(body), + "linear-delivery": delivery, + }, + body, + }); +} + +async function main() { + step("Apply migrations"); + await runMigrations(); + ok("migrations applied"); + + step("Seed test fixtures"); + const seeded = await seed(); + ok(`org=${seeded.orgId} pr=${seeded.agentPrRowId} ticket=${seeded.agentTicketRowId}`); + + try { + // Build a Hono app with just the webhook routes mounted. + // biome-ignore lint/suspicious/noExplicitAny: test harness + const app = new Hono(); + mountGithubPublic(app); + mountLinearPublic(app); + + step("GitHub webhook: pull_request_review submitted"); + { + const res = await postGithub(app, "pull_request_review", `del-${TEST_TAG}-1`, { + action: "submitted", + repository: { full_name: REPO_FULL_NAME }, + pull_request: { number: PR_NUMBER }, + review: { + id: 1001, + state: "approved", + user: { login: "alice", id: 100, avatar_url: "https://avatars.example/alice" }, + }, + sender: { login: "alice", id: 100 }, + installation: { id: GH_INSTALLATION_ID }, + }); + assert.equal(res.status, 200, `expected 200, got ${res.status}: ${await res.text()}`); + + const events = await db.query.agentPrEvents.findMany({ + where: eq(schema.agentPrEvents.agentPrId, seeded.agentPrRowId), + orderBy: [desc(schema.agentPrEvents.createdAt)], + limit: 1, + }); + assert.equal(events[0]?.kind, "review_approved"); + assert.equal(events[0]?.actorLogin, "alice"); + ok(`event recorded: ${events[0]?.kind} by ${events[0]?.actorLogin}`); + } + + step("GitHub webhook: issue_comment on PR"); + { + const res = await postGithub(app, "issue_comment", `del-${TEST_TAG}-2`, { + action: "created", + repository: { full_name: REPO_FULL_NAME }, + issue: { number: PR_NUMBER, pull_request: { url: "..." } }, + comment: { + id: 2002, + body: "LGTM", + user: { login: "bob", id: 200, avatar_url: "https://avatars.example/bob" }, + }, + installation: { id: GH_INSTALLATION_ID }, + }); + assert.equal(res.status, 200); + + const ev = await db.query.agentPrEvents.findFirst({ + where: and( + eq(schema.agentPrEvents.agentPrId, seeded.agentPrRowId), + eq(schema.agentPrEvents.kind, "issue_comment"), + ), + }); + assert.ok(ev, "expected issue_comment event"); + assert.equal(ev.actorLogin, "bob"); + ok(`event recorded: issue_comment by ${ev.actorLogin}`); + } + + step("GitHub webhook: push to head branch updates head_sha"); + { + const res = await postGithub(app, "push", `del-${TEST_TAG}-3`, { + ref: "refs/heads/superlog/fix-1", + before: "deadbeef", + after: "cafebabe", + repository: { full_name: REPO_FULL_NAME }, + pusher: { name: "alice" }, + sender: { login: "alice", id: 100 }, + commits: [{ id: "cafebabe", message: "fix" }], + installation: { id: GH_INSTALLATION_ID }, + }); + assert.equal(res.status, 200); + + const pr = await db.query.agentPullRequests.findFirst({ + where: eq(schema.agentPullRequests.id, seeded.agentPrRowId), + }); + assert.equal(pr?.headSha, "cafebabe"); + ok(`head_sha updated: ${pr?.headSha}`); + } + + step("GitHub webhook: pull_request closed (merged)"); + { + const mergedAt = new Date().toISOString(); + const res = await postGithub(app, "pull_request", `del-${TEST_TAG}-4`, { + action: "closed", + repository: { full_name: REPO_FULL_NAME }, + pull_request: { + number: PR_NUMBER, + merged: true, + merged_at: mergedAt, + closed_at: mergedAt, + merged_by: { login: "alice", id: 100 }, + user: { login: "superlog-bot", id: 999 }, + head: { sha: "cafebabe", ref: "superlog/fix-1" }, + }, + sender: { login: "alice", id: 100 }, + installation: { id: GH_INSTALLATION_ID }, + }); + assert.equal(res.status, 200); + + const pr = await db.query.agentPullRequests.findFirst({ + where: eq(schema.agentPullRequests.id, seeded.agentPrRowId), + }); + assert.equal(pr?.state, "merged"); + assert.equal(pr?.mergedByLogin, "alice"); + assert.ok(pr?.mergedAt, "expected mergedAt"); + + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, seeded.incidentId), + }); + assert.equal(incident?.status, "resolved"); + + const issue = await db.query.issues.findFirst({ + where: eq(schema.issues.id, seeded.issueId), + }); + assert.equal(issue?.status, "resolved"); + assert.ok(issue?.resolvedAt, "expected issue resolvedAt"); + + const ev = await db.query.incidentEvents.findFirst({ + where: and( + eq(schema.incidentEvents.agentRunId, seeded.agentRunId), + eq(schema.incidentEvents.kind, "incident_resolved"), + ), + }); + assert.ok(ev, "expected incident_resolved timeline event"); + assert.equal(ev.summary, `Incident resolved because PR #${PR_NUMBER} was merged.`); + ok( + `PR merged: state=${pr?.state}, incident=${incident?.status}, issue=${issue?.status}`, + ); + } + + step("GitHub webhook: dedup on duplicate delivery"); + { + const res = await postGithub(app, "issue_comment", `del-${TEST_TAG}-2`, { + action: "created", + repository: { full_name: REPO_FULL_NAME }, + issue: { number: PR_NUMBER, pull_request: { url: "..." } }, + comment: { id: 2002, body: "LGTM", user: { login: "bob", id: 200 } }, + installation: { id: GH_INSTALLATION_ID }, + }); + assert.equal(res.status, 200); + const events = await db.query.agentPrEvents.findMany({ + where: and( + eq(schema.agentPrEvents.agentPrId, seeded.agentPrRowId), + eq(schema.agentPrEvents.providerEventId, `del-${TEST_TAG}-2`), + ), + }); + assert.equal(events.length, 1, `expected 1 dedup'd event, got ${events.length}`); + ok(`duplicate delivery deduped (${events.length} row)`); + } + + step("Linear webhook: Issue update with state change"); + { + const res = await postLinear(app, `lin-${TEST_TAG}-1`, { + action: "update", + type: "Issue", + webhookId: LINEAR_WEBHOOK_ID, + webhookTimestamp: Date.now(), + createdAt: new Date().toISOString(), + updatedFrom: { stateId: "old-state" }, + data: { + id: LINEAR_TICKET_ID, + identifier: "ENG-1", + title: "Bug fix", + url: `https://linear.app/acme/issue/ENG-1`, + state: { id: "in-progress", name: "In Progress", type: "started" }, + assignee: { id: "user-99", name: "Charlie" }, + }, + actor: { id: "user-99", name: "Charlie" }, + }); + assert.equal(res.status, 200, `expected 200, got ${res.status}: ${await res.text()}`); + + const ticket = await db.query.agentLinearTickets.findFirst({ + where: eq(schema.agentLinearTickets.id, seeded.agentTicketRowId), + }); + assert.equal(ticket?.state, "In Progress"); + assert.equal(ticket?.stateType, "started"); + assert.equal(ticket?.assigneeName, "Charlie"); + ok(`ticket state: ${ticket?.state} (${ticket?.stateType}), assignee=${ticket?.assigneeName}`); + + const ev = await db.query.agentLinearTicketEvents.findFirst({ + where: and( + eq(schema.agentLinearTicketEvents.agentLinearTicketId, seeded.agentTicketRowId), + eq(schema.agentLinearTicketEvents.kind, "ticket_state_changed"), + ), + }); + assert.ok(ev, "expected ticket_state_changed event"); + assert.equal(ev.actorName, "Charlie"); + ok(`event recorded: ${ev.kind} by ${ev.actorName}`); + } + + step("Linear webhook: Comment create"); + { + const res = await postLinear(app, `lin-${TEST_TAG}-2`, { + action: "create", + type: "Comment", + webhookId: LINEAR_WEBHOOK_ID, + createdAt: new Date().toISOString(), + data: { + id: "cmt-1", + issueId: LINEAR_TICKET_ID, + body: "Looks good", + user: { id: "user-99", name: "Charlie" }, + }, + }); + assert.equal(res.status, 200); + + const ev = await db.query.agentLinearTicketEvents.findFirst({ + where: and( + eq(schema.agentLinearTicketEvents.agentLinearTicketId, seeded.agentTicketRowId), + eq(schema.agentLinearTicketEvents.kind, "ticket_comment"), + ), + }); + assert.ok(ev, "expected ticket_comment event"); + assert.equal(ev.actorName, "Charlie"); + ok(`event recorded: ${ev.kind} by ${ev.actorName}`); + } + + step("Linear webhook: bad signature rejected"); + { + const res = await app.request("/linear/webhook", { + method: "POST", + headers: { + "content-type": "application/json", + "linear-signature": "0".repeat(64), + }, + body: JSON.stringify({ + webhookId: LINEAR_WEBHOOK_ID, + type: "Issue", + action: "update", + data: { id: LINEAR_TICKET_ID }, + }), + }); + assert.equal(res.status, 401); + ok(`bad signature → 401`); + } + + step("Timeline merge: agent run + agent_pr + agent_linear, sorted"); + { + const events = await loadTimelineForTest(seeded.incidentId, seeded.agentRunId); + const sources = new Set(events.map((e) => e.source)); + assert.ok(sources.has("agent_run"), "missing agent run events"); + assert.ok(sources.has("agent_pr"), "missing agent_pr events"); + assert.ok(sources.has("agent_linear"), "missing agent_linear events"); + + // Verify chronological order + for (let i = 1; i < events.length; i++) { + assert.ok( + events[i - 1]!.createdAt <= events[i]!.createdAt, + `events out of order at index ${i}`, + ); + } + // Verify actor surfaced for at least one PR event + const prEventWithActor = events.find((e) => e.source === "agent_pr" && e.actor); + assert.ok(prEventWithActor, "expected at least one PR event with actor metadata"); + const incidentResolvedEvent = events.find( + (e) => e.source === "agent_run" && e.kind === "incident_resolved", + ); + assert.ok(incidentResolvedEvent, "missing incident_resolved timeline event"); + assert.equal( + incidentResolvedEvent.summary, + `Incident resolved because PR #${PR_NUMBER} was merged.`, + ); + ok(`timeline has ${events.length} events across ${sources.size} sources, chronological`); + ok(`sample actor: ${prEventWithActor.actor?.name} (${prEventWithActor.kind})`); + } + + console.log("\nAll assertions passed."); + } finally { + step("Cleanup"); + await cleanup(seeded.orgId); + ok("test rows removed"); + } +} + +// Inline copy of apps/api/src/index.ts loadIncidentTimeline so the test doesn't +// have to spin up the whole api. If this drifts, the unit-of-truth is the api file. +async function loadTimelineForTest(incidentId: string, agentRunId: string) { + const [agentRunEvents, prRows, linearTickets] = await Promise.all([ + db.query.incidentEvents.findMany({ + where: eq(schema.incidentEvents.agentRunId, agentRunId), + orderBy: [asc(schema.incidentEvents.createdAt)], + }), + db.query.agentPullRequests.findMany({ + where: eq(schema.agentPullRequests.incidentId, incidentId), + }), + db.query.agentLinearTickets.findMany({ + where: eq(schema.agentLinearTickets.incidentId, incidentId), + }), + ]); + + const [prEventRows, linearEventRows] = await Promise.all([ + prRows.length === 0 + ? [] + : db.query.agentPrEvents.findMany({ + where: inArray( + schema.agentPrEvents.agentPrId, + prRows.map((r) => r.id), + ), + orderBy: [asc(schema.agentPrEvents.occurredAt)], + }), + linearTickets.length === 0 + ? [] + : db.query.agentLinearTicketEvents.findMany({ + where: inArray( + schema.agentLinearTicketEvents.agentLinearTicketId, + linearTickets.map((r) => r.id), + ), + orderBy: [asc(schema.agentLinearTicketEvents.occurredAt)], + }), + ]); + + type Item = { + id: string; + kind: string; + summary: string | null; + createdAt: string; + source: "agent_run" | "agent_pr" | "agent_linear"; + actor: { name: string | null } | null; + }; + const items: Item[] = []; + for (const ev of agentRunEvents) { + items.push({ + id: ev.id, + kind: ev.kind, + summary: ev.summary, + createdAt: ev.createdAt.toISOString(), + source: "agent_run", + actor: null, + }); + } + for (const ev of prEventRows) { + items.push({ + id: ev.id, + kind: ev.kind, + summary: ev.summary, + createdAt: ev.occurredAt.toISOString(), + source: "agent_pr", + actor: ev.actorLogin ? { name: ev.actorLogin } : null, + }); + } + for (const ev of linearEventRows) { + items.push({ + id: ev.id, + kind: ev.kind, + summary: ev.summary, + createdAt: ev.occurredAt.toISOString(), + source: "agent_linear", + actor: ev.actorName ? { name: ev.actorName } : null, + }); + } + items.sort((a, b) => a.createdAt.localeCompare(b.createdAt)); + return items; +} + +main() + .then(() => process.exit(0)) + .catch((e) => { + console.error("\nE2E test failed:", e); + process.exit(1); + }); diff --git a/superlog/apps/api/scripts/test-mcp-clickhouse-ranges.ts b/superlog/apps/api/scripts/test-mcp-clickhouse-ranges.ts new file mode 100644 index 0000000000000000000000000000000000000000..6a1a3de1fe1c1ac04d28bc83693eb44227aa258b --- /dev/null +++ b/superlog/apps/api/scripts/test-mcp-clickhouse-ranges.ts @@ -0,0 +1,72 @@ +import assert from "node:assert/strict"; +import type { ClickHouseClient } from "@clickhouse/client"; +import { listServices, queryLogs } from "../src/mcp/clickhouse.js"; + +type QueryCall = { + query: string; + query_params?: Record; + format?: string; +}; + +function fakeClickHouse(calls: QueryCall[]): ClickHouseClient { + return { + query: async (args: QueryCall) => { + calls.push(args); + return { json: async () => [] }; + }, + } as unknown as ClickHouseClient; +} + +function normalizedSql(sql: string): string { + return sql.replace(/\s+/g, " ").trim(); +} + +async function testDefaultRelativeRangeIsExecutableSql() { + const calls: QueryCall[] = []; + await queryLogs(fakeClickHouse(calls), "00000000-0000-0000-0000-000000000001", { + limit: 10, + }); + + const sql = normalizedSql(calls[0]?.query ?? ""); + assert.match(sql, /Timestamp >= now\(\) - INTERVAL 1 HOUR/); + assert.match(sql, /Timestamp <= now\(\)/); + assert.doesNotMatch(sql, /parseDateTime64BestEffortOrZero\(\{since:String\}\)/); + assert.doesNotMatch(sql, /parseDateTime64BestEffortOrZero\(\{until:String\}\)/); +} + +async function testExplicitRelativeRangeIsExecutableSql() { + const calls: QueryCall[] = []; + await listServices(fakeClickHouse(calls), "00000000-0000-0000-0000-000000000001", { + since: "now() - INTERVAL 7 DAY", + until: "now()", + }); + + const sql = normalizedSql(calls[0]?.query ?? ""); + assert.match(sql, /Timestamp >= now\(\) - INTERVAL 7 DAY/); + assert.match(sql, /Timestamp <= now\(\)/); + assert.doesNotMatch(sql, /parseDateTime64BestEffortOrZero\(\{since:String\}\)/); + assert.doesNotMatch(sql, /parseDateTime64BestEffortOrZero\(\{until:String\}\)/); +} + +async function testIsoRangeStillUsesParameterizedParsing() { + const calls: QueryCall[] = []; + await queryLogs(fakeClickHouse(calls), "00000000-0000-0000-0000-000000000001", { + range: { + since: "2026-05-06T13:12:08.771Z", + until: "2026-05-06T14:12:08.771Z", + }, + limit: 10, + }); + + const sql = normalizedSql(calls[0]?.query ?? ""); + assert.match(sql, /Timestamp >= parseDateTime64BestEffortOrZero\(\{since:String\}\)/); + assert.match(sql, /Timestamp <= parseDateTime64BestEffortOrZero\(\{until:String\}\)/); + assert.equal(calls[0]?.query_params?.since, "2026-05-06T13:12:08.771Z"); + assert.equal(calls[0]?.query_params?.until, "2026-05-06T14:12:08.771Z"); +} + +await testDefaultRelativeRangeIsExecutableSql(); +await testExplicitRelativeRangeIsExecutableSql(); +await testIsoRangeStillUsesParameterizedParsing(); + +console.log("mcp clickhouse range tests passed"); diff --git a/superlog/apps/api/src/alerts-service.ts b/superlog/apps/api/src/alerts-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..925c90a4e8ab4bacbd2dec0f492f9f5bde3fa2e9 --- /dev/null +++ b/superlog/apps/api/src/alerts-service.ts @@ -0,0 +1,391 @@ +import type { ClickHouseClient } from "@clickhouse/client"; +import { db, schema } from "@superlog/db"; +import { and, asc, desc, eq } from "drizzle-orm"; +import { HTTPException } from "hono/http-exception"; +import { z } from "zod"; +import { logger } from "./logger.js"; +import { type ResourceAttrFilter, countSeries, metricSeries, pickStep } from "./mcp/clickhouse.js"; + +const log = logger.child({ scope: "alerts" }); + +export const alertSourceSchema = z.enum(["logs", "traces", "metric"]); +export const alertAggregationSchema = z.enum(["count", "sum", "avg"]); +export const alertComparatorSchema = z.enum(["gt", "lt"]); +export const alertGroupModeSchema = z.enum(["per_group", "single"]); + +const resourceAttrSchema = z.object({ + key: z.string().min(1).max(200), + value: z.string().max(500), +}); + +export const alertFilterSchema = z.object({ + resourceAttrs: z.array(resourceAttrSchema).max(50).optional(), + service: z.string().max(200).optional(), + severity: z.string().max(50).optional(), + spanName: z.string().max(200).optional(), + statusCode: z.string().max(50).optional(), + minDurationMs: z.number().nonnegative().optional(), +}); + +export const alertInputSchema = z.object({ + name: z.string().min(1).max(200), + enabled: z.boolean().optional(), + source: alertSourceSchema, + metricName: z.string().max(200).nullable().optional(), + filter: alertFilterSchema.optional(), + groupBy: z.string().max(200).nullable().optional(), + groupMode: alertGroupModeSchema.optional(), + aggregation: alertAggregationSchema, + comparator: alertComparatorSchema, + threshold: z.number().finite(), + windowMinutes: z.number().int().min(1).max(1440).optional(), + evaluationIntervalSeconds: z.number().int().min(15).max(3600).optional(), +}); + +export type AlertInput = z.infer; + +export function validateAlertInput(input: AlertInput): void { + if (input.source === "metric" && !input.metricName) { + throw new HTTPException(400, { message: "metricName required when source = metric" }); + } + if (input.source !== "metric" && input.aggregation !== "count") { + throw new HTTPException(400, { + message: "aggregation must be 'count' for logs/traces sources", + }); + } + if (input.source === "metric" && input.aggregation === "count") { + throw new HTTPException(400, { + message: "aggregation must be 'sum' or 'avg' for metric source", + }); + } + if (input.groupMode === "per_group" && !input.groupBy) { + throw new HTTPException(400, { message: "groupBy required when groupMode = per_group" }); + } +} + +export function alertInputToFilter(input: AlertInput): schema.AlertFilter { + return { + resourceAttrs: input.filter?.resourceAttrs, + service: input.filter?.service, + severity: input.filter?.severity, + spanName: input.filter?.spanName, + statusCode: input.filter?.statusCode, + minDurationMs: input.filter?.minDurationMs, + }; +} + +function rangeForWindow(windowMinutes: number): { since: string; until: string } { + const now = new Date(); + const since = new Date(now.getTime() - windowMinutes * 60_000); + return { since: since.toISOString(), until: now.toISOString() }; +} + +function compare(value: number, comparator: schema.AlertComparator, threshold: number): boolean { + if (comparator === "gt") return value > threshold; + return value < threshold; +} + +export async function evaluateAlertQuery( + ch: ClickHouseClient, + alert: { + projectId: string; + source: schema.AlertSource; + metricName: string | null; + filter: schema.AlertFilter; + groupBy: string | null; + groupMode: schema.AlertGroupMode; + aggregation: schema.AlertAggregation; + windowMinutes: number; + }, +): Promise<{ groups: Map; total: number }> { + const range = rangeForWindow(alert.windowMinutes); + const rangeSeconds = alert.windowMinutes * 60; + const step = pickStep(rangeSeconds); + const resourceAttrs: ResourceAttrFilter[] | undefined = alert.filter.resourceAttrs; + const groupBy = alert.groupBy || undefined; + + const groupSums = new Map(); + const groupCounts = new Map(); + + if (alert.source === "metric") { + if (!alert.metricName) return { groups: new Map(), total: 0 }; + const rows = await metricSeries( + ch, + alert.projectId, + alert.metricName, + { + range, + service: alert.filter.service, + resourceAttrs, + }, + groupBy, + step, + ); + for (const row of rows) { + const key = row.group ?? ""; + groupSums.set(key, (groupSums.get(key) ?? 0) + row.value); + groupCounts.set(key, (groupCounts.get(key) ?? 0) + 1); + } + } else { + const rows = await countSeries( + ch, + alert.projectId, + alert.source, + { + range, + service: alert.filter.service, + resourceAttrs, + severity: alert.filter.severity, + spanName: alert.filter.spanName, + statusCode: alert.filter.statusCode, + minDurationMs: alert.filter.minDurationMs, + }, + groupBy, + step, + ); + for (const row of rows) { + const key = row.group ?? ""; + groupSums.set(key, (groupSums.get(key) ?? 0) + row.count); + groupCounts.set(key, (groupCounts.get(key) ?? 0) + 1); + } + } + + const groups = new Map(); + for (const [key, sum] of groupSums) { + if (alert.aggregation === "avg") { + const n = groupCounts.get(key) ?? 1; + groups.set(key, n > 0 ? sum / n : 0); + } else { + groups.set(key, sum); + } + } + + let total = 0; + if (alert.aggregation === "avg") { + let sumAll = 0; + let nAll = 0; + for (const [key, sum] of groupSums) { + sumAll += sum; + nAll += groupCounts.get(key) ?? 0; + } + total = nAll > 0 ? sumAll / nAll : 0; + } else { + for (const value of groupSums.values()) total += value; + } + + return { groups, total }; +} + +export type AlertEvalResult = + | { mode: "single"; value: number; breaches: number } + | { + mode: "per_group"; + groups: { key: string; value: number; breaching: boolean }[]; + breaches: number; + }; + +export function summarizeEvaluation( + alert: { + comparator: schema.AlertComparator; + threshold: number; + groupMode: schema.AlertGroupMode; + groupBy: string | null; + }, + evaluation: { groups: Map; total: number }, +): AlertEvalResult { + if (alert.groupMode === "per_group" && alert.groupBy) { + const rows: { key: string; value: number; breaching: boolean }[] = []; + for (const [key, value] of evaluation.groups) { + rows.push({ + key, + value, + breaching: compare(value, alert.comparator, alert.threshold), + }); + } + rows.sort((a, b) => b.value - a.value); + return { + mode: "per_group", + groups: rows, + breaches: rows.filter((g) => g.breaching).length, + }; + } + return { + mode: "single", + value: evaluation.total, + breaches: compare(evaluation.total, alert.comparator, alert.threshold) ? 1 : 0, + }; +} + +export async function listAlertsForProject(projectId: string): Promise { + return db.query.alerts.findMany({ + where: eq(schema.alerts.projectId, projectId), + orderBy: [asc(schema.alerts.name)], + }); +} + +export async function getAlertWithFirings( + projectId: string, + id: string, +): Promise<(schema.Alert & { firings: schema.AlertFiring[] }) | null> { + const alert = await db.query.alerts.findFirst({ + where: and(eq(schema.alerts.id, id), eq(schema.alerts.projectId, projectId)), + }); + if (!alert) return null; + const firings = await db.query.alertFirings.findMany({ + where: eq(schema.alertFirings.alertId, id), + orderBy: [desc(schema.alertFirings.evaluatedAt)], + limit: 50, + }); + return { ...alert, firings }; +} + +export async function createAlertRecord( + projectId: string, + userId: string, + input: AlertInput, +): Promise { + validateAlertInput(input); + const inserted = await db + .insert(schema.alerts) + .values({ + projectId, + name: input.name, + enabled: input.enabled ?? true, + source: input.source, + metricName: input.metricName ?? null, + filter: alertInputToFilter(input), + groupBy: input.groupBy ?? null, + groupMode: input.groupMode ?? "single", + aggregation: input.aggregation, + comparator: input.comparator, + threshold: input.threshold, + windowMinutes: input.windowMinutes ?? 5, + evaluationIntervalSeconds: input.evaluationIntervalSeconds ?? 60, + createdBy: userId, + }) + .returning(); + log.info( + { + alert_id: inserted[0]?.id, + project_id: projectId, + actor_user_id: userId, + source: input.source, + comparator: input.comparator, + threshold: input.threshold, + window_minutes: input.windowMinutes ?? 5, + }, + "alert created", + ); + const row = inserted[0]; + if (!row) throw new Error("alerts insert returned no rows"); + return row; +} + +export async function updateAlertRecord( + projectId: string, + id: string, + patch: Partial, +): Promise { + const existing = await db.query.alerts.findFirst({ + where: and(eq(schema.alerts.id, id), eq(schema.alerts.projectId, projectId)), + }); + if (!existing) return null; + + const merged: AlertInput = { + name: patch.name ?? existing.name, + enabled: patch.enabled ?? existing.enabled, + source: patch.source ?? existing.source, + metricName: patch.metricName !== undefined ? patch.metricName : existing.metricName, + filter: patch.filter ?? existing.filter, + groupBy: patch.groupBy !== undefined ? patch.groupBy : existing.groupBy, + groupMode: patch.groupMode ?? existing.groupMode, + aggregation: patch.aggregation ?? existing.aggregation, + comparator: patch.comparator ?? existing.comparator, + threshold: patch.threshold ?? existing.threshold, + windowMinutes: patch.windowMinutes ?? existing.windowMinutes, + evaluationIntervalSeconds: + patch.evaluationIntervalSeconds ?? existing.evaluationIntervalSeconds, + }; + validateAlertInput(merged); + + const updated = await db + .update(schema.alerts) + .set({ + name: merged.name, + enabled: merged.enabled ?? existing.enabled, + source: merged.source, + metricName: merged.metricName ?? null, + filter: alertInputToFilter(merged), + groupBy: merged.groupBy ?? null, + groupMode: merged.groupMode ?? "single", + aggregation: merged.aggregation, + comparator: merged.comparator, + threshold: merged.threshold, + windowMinutes: merged.windowMinutes ?? 5, + evaluationIntervalSeconds: merged.evaluationIntervalSeconds ?? 60, + updatedAt: new Date(), + }) + .where(and(eq(schema.alerts.id, id), eq(schema.alerts.projectId, projectId))) + .returning(); + return updated[0] ?? null; +} + +export async function deleteAlertRecord( + projectId: string, + id: string, + actorUserId: string, +): Promise { + await db + .delete(schema.alerts) + .where(and(eq(schema.alerts.id, id), eq(schema.alerts.projectId, projectId))); + log.info({ alert_id: id, project_id: projectId, actor_user_id: actorUserId }, "alert deleted"); +} + +export async function previewAlert( + ch: ClickHouseClient, + projectId: string, + input: AlertInput, +): Promise { + validateAlertInput(input); + const evaluation = await evaluateAlertQuery(ch, { + projectId, + source: input.source, + metricName: input.metricName ?? null, + filter: alertInputToFilter(input), + groupBy: input.groupBy ?? null, + groupMode: input.groupMode ?? "single", + aggregation: input.aggregation, + windowMinutes: input.windowMinutes ?? 5, + }); + return summarizeEvaluation( + { + comparator: input.comparator, + threshold: input.threshold, + groupMode: input.groupMode ?? "single", + groupBy: input.groupBy ?? null, + }, + evaluation, + ); +} + +export async function testAlertById( + ch: ClickHouseClient, + projectId: string, + id: string, +): Promise { + const alert = await db.query.alerts.findFirst({ + where: and(eq(schema.alerts.id, id), eq(schema.alerts.projectId, projectId)), + }); + if (!alert) return null; + const evaluation = await evaluateAlertQuery(ch, { + projectId: alert.projectId, + source: alert.source, + metricName: alert.metricName, + filter: alert.filter, + groupBy: alert.groupBy, + groupMode: alert.groupMode, + aggregation: alert.aggregation, + windowMinutes: alert.windowMinutes, + }); + return summarizeEvaluation(alert, evaluation); +} diff --git a/superlog/apps/api/src/alerts.ts b/superlog/apps/api/src/alerts.ts new file mode 100644 index 0000000000000000000000000000000000000000..36b337ca25a33fd772b420cd97f4c491349f0631 --- /dev/null +++ b/superlog/apps/api/src/alerts.ts @@ -0,0 +1,97 @@ +import type { ClickHouseClient } from "@clickhouse/client"; +import { db, schema } from "@superlog/db"; +import { eq } from "drizzle-orm"; +import type { Context, Hono } from "hono"; +import { HTTPException } from "hono/http-exception"; +import { + alertInputSchema, + createAlertRecord, + deleteAlertRecord, + getAlertWithFirings, + listAlertsForProject, + previewAlert, + testAlertById, + updateAlertRecord, +} from "./alerts-service.js"; +import { resolveActiveOrgContext } from "./org-context.js"; + +type Vars = { userId: string; orgId: string | null }; + +export { evaluateAlertQuery } from "./alerts-service.js"; + +export function mountAlerts(app: Hono<{ Variables: Vars }>, opts: { ch: ClickHouseClient }) { + const requireAccess = async (c: Context<{ Variables: Vars }>, projectId: string) => { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + const ctx = await resolveActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + if (project.orgId !== ctx.org.id) throw new HTTPException(403, { message: "forbidden" }); + return { project, user: ctx.user }; + }; + + app.get("/api/projects/:projectId/alerts", async (c) => { + const projectId = c.req.param("projectId"); + await requireAccess(c, projectId); + return c.json(await listAlertsForProject(projectId)); + }); + + app.post("/api/projects/:projectId/alerts", async (c) => { + const projectId = c.req.param("projectId"); + const { user } = await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = alertInputSchema.safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + return c.json(await createAlertRecord(projectId, user.id, parsed.data)); + }); + + app.get("/api/projects/:projectId/alerts/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + const alert = await getAlertWithFirings(projectId, id); + if (!alert) throw new HTTPException(404, { message: "alert not found" }); + return c.json(alert); + }); + + app.patch("/api/projects/:projectId/alerts/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = alertInputSchema.partial().safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + const updated = await updateAlertRecord(projectId, id, parsed.data); + if (!updated) throw new HTTPException(404, { message: "alert not found" }); + return c.json(updated); + }); + + app.delete("/api/projects/:projectId/alerts/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + const { user } = await requireAccess(c, projectId); + await deleteAlertRecord(projectId, id, user.id); + return c.json({ ok: true }); + }); + + app.post("/api/projects/:projectId/alerts/preview", async (c) => { + const projectId = c.req.param("projectId"); + await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = alertInputSchema.safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + return c.json(await previewAlert(opts.ch, projectId, parsed.data)); + }); + + app.post("/api/projects/:projectId/alerts/:id/test", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + const result = await testAlertById(opts.ch, projectId, id); + if (!result) throw new HTTPException(404, { message: "alert not found" }); + return c.json(result); + }); +} diff --git a/superlog/apps/api/src/auth.ts b/superlog/apps/api/src/auth.ts new file mode 100644 index 0000000000000000000000000000000000000000..fad65833a4febb45d5d02ceddb91b7dd92a86c45 --- /dev/null +++ b/superlog/apps/api/src/auth.ts @@ -0,0 +1,217 @@ +import { db, schema } from "@superlog/db"; +import { betterAuth } from "better-auth"; +import { drizzleAdapter } from "better-auth/adapters/drizzle"; +import { admin, organization } from "better-auth/plugins"; +import { autumn } from "autumn-js/better-auth"; +import { eq } from "drizzle-orm"; +import { + orgInvitationEmailBody, + passwordResetEmailBody, + sendEmail, + verificationEmailBody, +} from "./email.js"; + +// Better Auth server config. Mounted at /api/auth/* by apps/api/src/index.ts. +// +// Schema mapping: we reuse our existing `users`, `orgs`, `org_members` tables +// instead of letting Better Auth own parallel ones. The drizzle adapter +// accepts a `schema` map keyed by the model names BA expects. The +// organization plugin's `member.organizationId` and `invitation.organizationId` +// columns live on the `orgId` TS property in our schema, so we map those +// explicitly via the plugin's `schema.X.fields` config. +// +// Identity is UUID end-to-end: `advanced.database.generateId` makes BA emit +// UUIDs for new rows so foreign keys to our existing uuid columns line up. + +const WEB_ORIGIN = process.env.WEB_ORIGIN ?? "http://localhost:5173"; +const API_ORIGIN = process.env.BETTER_AUTH_URL ?? "http://localhost:4100"; + +// Derive the parent domain that web and api share so the OAuth state cookie +// is scoped to `.` instead of pinned to the api host. For prod that's +// `.superlog.sh`; for localhost / .superlog.localhost it's `undefined` +// because browsers won't honour Domain= on a TLD or localhost. +function sharedCookieDomain(): string | undefined { + try { + const apiHost = new URL(API_ORIGIN).hostname; + const webHost = new URL(WEB_ORIGIN).hostname; + if (apiHost === webHost) return undefined; // same host, no cross-sub needed + if (apiHost === "localhost" || webHost === "localhost") return undefined; + if (apiHost.endsWith(".localhost") || webHost.endsWith(".localhost")) return undefined; + // Trim to the longest common dotted suffix shared by both hosts. For + // api.superlog.sh / superlog.sh that yields "superlog.sh". + const a = apiHost.split("."); + const b = webHost.split("."); + const parts: string[] = []; + while (a.length && b.length && a[a.length - 1] === b[b.length - 1]) { + parts.unshift(a.pop() as string); + b.pop(); + } + if (parts.length < 2) return undefined; // needs at least eTLD+1 + return `.${parts.join(".")}`; + } catch { + return undefined; + } +} + +const COOKIE_DOMAIN = sharedCookieDomain(); + +// Autumn billing plugin. Maps each org (a Better Auth "organization") to an +// Autumn customer, auto-created on first sign-in, so billing is per-org. Only +// enabled when AUTUMN_SECRET_KEY is present, so local dev / worktrees without +// billing config keep working — same opt-in pattern as the social providers. +const autumnPlugins = process.env.AUTUMN_SECRET_KEY + ? [autumn({ customerScope: "organization" })] + : []; + +// Fail loud and early if the signing secret is missing. Better Auth doesn't +// throw on undefined `secret` — depending on the build it falls back to a +// fresh random value per process start, which silently invalidates every +// session on every deploy. Match the previous CLERK_SECRET_KEY guard so +// missing config surfaces as a startup error, not a slow-burn outage. +const BETTER_AUTH_SECRET = process.env.BETTER_AUTH_SECRET; +if (!BETTER_AUTH_SECRET) throw new Error("BETTER_AUTH_SECRET is required"); + +// Both providers stay disabled when their client IDs are missing — Better +// Auth's `socialProviders` map only enables what's present, so dropping the +// keys here is enough to hide the buttons in dev without breaking sign-up. +const googleProvider = + process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET + ? { + clientId: process.env.GOOGLE_CLIENT_ID, + clientSecret: process.env.GOOGLE_CLIENT_SECRET, + } + : undefined; + +const githubProvider = + process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET + ? { + clientId: process.env.GITHUB_CLIENT_ID, + clientSecret: process.env.GITHUB_CLIENT_SECRET, + // GitHub returns email: null in /user when the address is set to + // "Keep my email addresses private". user:email scope lets Better Auth + // fall back to /user/emails for the verified primary. Has no effect on + // GitHub Apps (which derive scopes from the App's User permissions) — + // for those, enable the "Email addresses" user permission on the App. + scope: ["user:email", "read:user"], + } + : undefined; + +// Picks the org to make active for a session. Prefers an explicit override +// (set via the org plugin's setActive API) then falls back to the user's +// first membership. Returns null if the user has no memberships — that's an +// error state callers can decide how to handle. +async function pickActiveOrgId(userId: string): Promise { + const membership = await db.query.orgMembers.findFirst({ + where: eq(schema.orgMembers.userId, userId), + }); + return membership?.orgId ?? null; +} + +export const auth = betterAuth({ + baseURL: API_ORIGIN, + secret: BETTER_AUTH_SECRET, + trustedOrigins: [WEB_ORIGIN], + database: drizzleAdapter(db, { + provider: "pg", + schema: { + user: schema.users, + session: schema.sessions, + account: schema.accounts, + verification: schema.verifications, + organization: schema.orgs, + member: schema.orgMembers, + invitation: schema.invitations, + }, + }), + advanced: { + database: { + generateId: () => crypto.randomUUID(), + }, + // Web and API often live on different subdomains of the same parent + // domain (e.g. `superlog.sh` + `api.superlog.sh`). The OAuth state + // cookie has to round-trip from BA's `/api/auth/sign-in/social` response + // through the provider and back to `/api/auth/callback/`; if + // the cookie is pinned to the API host instead of the parent domain it + // can fail to ride along on some browsers and BA returns + // `State mismatch: verification not found`. When the hosts share an + // eTLD+1, scope to the parent. localhost / *.localhost are skipped + // because browsers reject Domain= on those. + ...(COOKIE_DOMAIN + ? { + crossSubDomainCookies: { enabled: true, domain: COOKIE_DOMAIN }, + defaultCookieAttributes: { sameSite: "lax" as const, secure: true }, + } + : {}), + }, + emailAndPassword: { + enabled: true, + // Sign-ups still land logged-in immediately to keep dev/worktree flows + // fast — the verification email is still sent (see `emailVerification` + // below) so the user can confirm at their leisure. Flip this to true once + // we want to gate /api/* access on a verified address. + requireEmailVerification: false, + sendResetPassword: async ({ user, url }) => { + const body = passwordResetEmailBody(url); + await sendEmail({ to: user.email, subject: "Reset your Superlog password", ...body }); + }, + }, + emailVerification: { + sendOnSignUp: true, + autoSignInAfterVerification: true, + sendVerificationEmail: async ({ user, url }) => { + const body = verificationEmailBody(url); + await sendEmail({ to: user.email, subject: "Confirm your email for Superlog", ...body }); + }, + }, + socialProviders: { + ...(googleProvider ? { google: googleProvider } : {}), + ...(githubProvider ? { github: githubProvider } : {}), + }, + plugins: [ + organization({ + schema: { + // Our `org_members` table uses `orgId` (TS) / `org_id` (SQL) instead + // of Better Auth's expected `organizationId`. Same for `invitations`. + member: { + fields: { organizationId: "orgId" }, + }, + invitation: { + fields: { organizationId: "orgId" }, + }, + }, + sendInvitationEmail: async ({ id, email, role, organization, inviter }) => { + const url = `${WEB_ORIGIN}/accept-invitation?id=${encodeURIComponent(id)}`; + const body = orgInvitationEmailBody({ + url, + orgName: organization.name, + inviterEmail: inviter.user.email, + inviterName: inviter.user.name, + role, + }); + await sendEmail({ + to: email, + subject: `You're invited to ${organization.name} on Superlog`, + ...body, + }); + }, + }), + admin(), + ...autumnPlugins, + ], + databaseHooks: { + session: { + create: { + before: async (session) => { + // Seed the active org so the first request after sign-in already + // has org context. If the user has no memberships yet (e.g. on a + // bootstrap race) leave it null; callers handle that. + if (session.activeOrganizationId) return { data: session }; + const activeOrganizationId = await pickActiveOrgId(session.userId); + return { data: { ...session, activeOrganizationId } }; + }, + }, + }, + }, +}); + +export type Auth = typeof auth; diff --git a/superlog/apps/api/src/boot-migrations.test.ts b/superlog/apps/api/src/boot-migrations.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..dba0b5c0850fa1f5b29485939e980e8fce5086f2 --- /dev/null +++ b/superlog/apps/api/src/boot-migrations.test.ts @@ -0,0 +1,28 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { shouldRunMigrationsOnBoot } from "./boot-migrations.js"; + +test("defaults to running migrations on boot when unset", () => { + assert.equal(shouldRunMigrationsOnBoot({} as NodeJS.ProcessEnv), true); +}); + +test("runs on boot when explicitly enabled", () => { + assert.equal( + shouldRunMigrationsOnBoot({ RUN_MIGRATIONS_ON_BOOT: "true" } as NodeJS.ProcessEnv), + true, + ); +}); + +test("skips boot migrations only when explicitly set to 'false'", () => { + assert.equal( + shouldRunMigrationsOnBoot({ RUN_MIGRATIONS_ON_BOOT: "false" } as NodeJS.ProcessEnv), + false, + ); +}); + +test("any non-'false' value still runs on boot", () => { + assert.equal( + shouldRunMigrationsOnBoot({ RUN_MIGRATIONS_ON_BOOT: "0" } as NodeJS.ProcessEnv), + true, + ); +}); diff --git a/superlog/apps/api/src/boot-migrations.ts b/superlog/apps/api/src/boot-migrations.ts new file mode 100644 index 0000000000000000000000000000000000000000..ec365312f547e7702219b67c422a61b90de83fe9 --- /dev/null +++ b/superlog/apps/api/src/boot-migrations.ts @@ -0,0 +1,15 @@ +// Whether the API process should apply database migrations on boot. +// +// In a managed deployment, migrations should be applied by a dedicated, +// gated step that runs as a schema-owner role *before* any service rolls out. +// The long-running API process should then connect as a DML-only role that +// can't run DDL on boot — applying DDL from a rolling app deploy can crash-loop +// the service. Such a deployment sets RUN_MIGRATIONS_ON_BOOT=false. +// +// Locally (overmind, plain `pnpm dev`) there's no separate migrate step, so the +// default is to run on boot — preserving the existing developer experience. +// Worktree bootstrap already migrates explicitly, so this only affects the +// main-checkout dev loop. +export function shouldRunMigrationsOnBoot(env: NodeJS.ProcessEnv): boolean { + return env.RUN_MIGRATIONS_ON_BOOT !== "false"; +} diff --git a/superlog/apps/api/src/dashboards-service.ts b/superlog/apps/api/src/dashboards-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..4688dcc69681ec20dd1d332c29a41b03e488509c --- /dev/null +++ b/superlog/apps/api/src/dashboards-service.ts @@ -0,0 +1,252 @@ +import { db, schema } from "@superlog/db"; +import { and, asc, eq } from "drizzle-orm"; +import { z } from "zod"; + +export const dashboardWidgetTypeSchema = z.enum([ + "timeseries_count", + "timeseries_metric", + "trace_table", + "log_table", + "markdown", +]); + +const resourceAttrSchema = z.object({ + key: z.string().min(1).max(200), + value: z.string().max(500), + op: z.enum(["eq", "neq", "not_contains"]).optional(), +}); + +export const dashboardWidgetConfigSchema = z.object({ + source: z.enum(["logs", "traces"]).optional(), + filter: z.object({ + resourceAttrs: z.array(resourceAttrSchema).max(50).optional(), + }), + groupBy: z.string().max(200).optional(), + metricName: z.string().max(200).optional(), + aggregation: z.enum(["sum", "avg", "min", "max", "p95", "p99"]).optional(), + limit: z.number().int().positive().max(500).optional(), + chartType: z.enum(["line", "bar"]).optional(), + showXAxis: z.boolean().optional(), + showYAxis: z.boolean().optional(), + showLegend: z.boolean().optional(), + legendPosition: z.enum(["side", "bottom"]).optional(), + markdown: z.string().max(20_000).optional(), +}); + +export const dashboardWidgetLayoutSchema = z.object({ + x: z.number().int().min(0).max(48), + y: z.number().int().min(0).max(100000), + w: z.number().int().min(1).max(48), + h: z.number().int().min(1).max(100), +}); + +export const dashboardCreateSchema = z.object({ name: z.string().min(1).max(120) }); +export const dashboardUpdateSchema = z.object({ name: z.string().min(1).max(120) }); + +export const dashboardWidgetCreateSchema = z.object({ + type: dashboardWidgetTypeSchema, + title: z.string().min(1).max(200), + config: dashboardWidgetConfigSchema, + layout: dashboardWidgetLayoutSchema, +}); + +export const dashboardWidgetUpdateSchema = z.object({ + type: dashboardWidgetTypeSchema.optional(), + title: z.string().min(1).max(200).optional(), + config: dashboardWidgetConfigSchema.optional(), + layout: dashboardWidgetLayoutSchema.optional(), +}); + +export type DashboardCreateInput = z.infer; +export type DashboardUpdateInput = z.infer; +export type DashboardWidgetCreateInput = z.infer; +export type DashboardWidgetUpdateInput = z.infer; + +const slugFromName = (name: string) => + name + .toLowerCase() + .trim() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 60) || "dashboard"; + +export async function listDashboardsForProject(projectId: string): Promise { + return db.query.dashboards.findMany({ + where: eq(schema.dashboards.projectId, projectId), + orderBy: [asc(schema.dashboards.name)], + }); +} + +export async function getDashboardWithWidgets( + projectId: string, + id: string, +): Promise<(schema.Dashboard & { widgets: schema.DashboardWidget[] }) | null> { + const dashboard = await db.query.dashboards.findFirst({ + where: and(eq(schema.dashboards.id, id), eq(schema.dashboards.projectId, projectId)), + }); + if (!dashboard) return null; + const widgets = await db.query.dashboardWidgets.findMany({ + where: eq(schema.dashboardWidgets.dashboardId, id), + orderBy: [asc(schema.dashboardWidgets.position)], + }); + return { ...dashboard, widgets }; +} + +export async function createDashboard( + projectId: string, + userId: string, + input: DashboardCreateInput, +): Promise { + const baseSlug = slugFromName(input.name); + let slug = baseSlug; + for (let i = 2; i < 100; i++) { + const existing = await db.query.dashboards.findFirst({ + where: and(eq(schema.dashboards.projectId, projectId), eq(schema.dashboards.slug, slug)), + }); + if (!existing) break; + slug = `${baseSlug}-${i}`; + } + const inserted = await db + .insert(schema.dashboards) + .values({ projectId, name: input.name, slug, createdBy: userId }) + .returning(); + const row = inserted[0]; + if (!row) throw new Error("dashboards insert returned no rows"); + return row; +} + +export async function updateDashboard( + projectId: string, + id: string, + input: DashboardUpdateInput, +): Promise { + const updated = await db + .update(schema.dashboards) + .set({ name: input.name, updatedAt: new Date() }) + .where(and(eq(schema.dashboards.id, id), eq(schema.dashboards.projectId, projectId))) + .returning(); + return updated[0] ?? null; +} + +export async function deleteDashboard(projectId: string, id: string): Promise { + await db + .delete(schema.dashboards) + .where(and(eq(schema.dashboards.id, id), eq(schema.dashboards.projectId, projectId))); +} + +async function ensureDashboardOwned( + projectId: string, + dashboardId: string, +): Promise { + return ( + (await db.query.dashboards.findFirst({ + where: and(eq(schema.dashboards.id, dashboardId), eq(schema.dashboards.projectId, projectId)), + })) ?? null + ); +} + +export async function addDashboardWidget( + projectId: string, + dashboardId: string, + input: DashboardWidgetCreateInput, +): Promise { + const dashboard = await ensureDashboardOwned(projectId, dashboardId); + if (!dashboard) return null; + const existing = await db.query.dashboardWidgets.findMany({ + where: eq(schema.dashboardWidgets.dashboardId, dashboardId), + }); + const nextPosition = existing.reduce((m, w) => Math.max(m, w.position), -1) + 1; + const inserted = await db + .insert(schema.dashboardWidgets) + .values({ + dashboardId, + type: input.type, + title: input.title, + config: input.config, + layout: input.layout, + position: nextPosition, + }) + .returning(); + await db + .update(schema.dashboards) + .set({ updatedAt: new Date() }) + .where(eq(schema.dashboards.id, dashboardId)); + return inserted[0] ?? null; +} + +export async function updateDashboardWidget( + projectId: string, + dashboardId: string, + widgetId: string, + input: DashboardWidgetUpdateInput, +): Promise { + const dashboard = await ensureDashboardOwned(projectId, dashboardId); + if (!dashboard) return null; + const updated = await db + .update(schema.dashboardWidgets) + .set({ + ...(input.type !== undefined ? { type: input.type } : {}), + ...(input.title !== undefined ? { title: input.title } : {}), + ...(input.config !== undefined ? { config: input.config } : {}), + ...(input.layout !== undefined ? { layout: input.layout } : {}), + updatedAt: new Date(), + }) + .where( + and( + eq(schema.dashboardWidgets.id, widgetId), + eq(schema.dashboardWidgets.dashboardId, dashboardId), + ), + ) + .returning(); + if (!updated[0]) return null; + await db + .update(schema.dashboards) + .set({ updatedAt: new Date() }) + .where(eq(schema.dashboards.id, dashboardId)); + return updated[0]; +} + +export async function deleteDashboardWidget( + projectId: string, + dashboardId: string, + widgetId: string, +): Promise { + const dashboard = await ensureDashboardOwned(projectId, dashboardId); + if (!dashboard) return false; + await db + .delete(schema.dashboardWidgets) + .where( + and( + eq(schema.dashboardWidgets.id, widgetId), + eq(schema.dashboardWidgets.dashboardId, dashboardId), + ), + ); + return true; +} + +export async function updateDashboardLayout( + projectId: string, + dashboardId: string, + widgets: { id: string; layout: z.infer }[], +): Promise { + const dashboard = await ensureDashboardOwned(projectId, dashboardId); + if (!dashboard) return false; + await Promise.all( + widgets.map((w) => + db + .update(schema.dashboardWidgets) + .set({ layout: w.layout, updatedAt: new Date() }) + .where( + and( + eq(schema.dashboardWidgets.id, w.id), + eq(schema.dashboardWidgets.dashboardId, dashboardId), + ), + ), + ), + ); + await db + .update(schema.dashboards) + .set({ updatedAt: new Date() }) + .where(eq(schema.dashboards.id, dashboardId)); + return true; +} diff --git a/superlog/apps/api/src/dashboards.ts b/superlog/apps/api/src/dashboards.ts new file mode 100644 index 0000000000000000000000000000000000000000..00ad518c580b4f13e7961604aef53c453542c5e3 --- /dev/null +++ b/superlog/apps/api/src/dashboards.ts @@ -0,0 +1,136 @@ +import { db, schema } from "@superlog/db"; +import { eq } from "drizzle-orm"; +import type { Context, Hono } from "hono"; +import { HTTPException } from "hono/http-exception"; +import { z } from "zod"; +import { + addDashboardWidget, + createDashboard, + dashboardCreateSchema, + dashboardUpdateSchema, + dashboardWidgetCreateSchema, + dashboardWidgetLayoutSchema, + dashboardWidgetUpdateSchema, + deleteDashboard, + deleteDashboardWidget, + getDashboardWithWidgets, + listDashboardsForProject, + updateDashboard, + updateDashboardLayout, + updateDashboardWidget, +} from "./dashboards-service.js"; +import { resolveActiveOrgContext } from "./org-context.js"; + +type Vars = { userId: string; orgId: string | null }; + +export function mountDashboards(app: Hono<{ Variables: Vars }>) { + const requireAccess = async (c: Context<{ Variables: Vars }>, projectId: string) => { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + const ctx = await resolveActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + if (project.orgId !== ctx.org.id) throw new HTTPException(403, { message: "forbidden" }); + return { project, user: ctx.user }; + }; + + app.get("/api/projects/:projectId/dashboards", async (c) => { + const projectId = c.req.param("projectId"); + await requireAccess(c, projectId); + return c.json(await listDashboardsForProject(projectId)); + }); + + app.post("/api/projects/:projectId/dashboards", async (c) => { + const projectId = c.req.param("projectId"); + const { user } = await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = dashboardCreateSchema.safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + return c.json(await createDashboard(projectId, user.id, parsed.data)); + }); + + app.get("/api/projects/:projectId/dashboards/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + const dashboard = await getDashboardWithWidgets(projectId, id); + if (!dashboard) throw new HTTPException(404, { message: "dashboard not found" }); + return c.json(dashboard); + }); + + app.patch("/api/projects/:projectId/dashboards/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = dashboardUpdateSchema.safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + const updated = await updateDashboard(projectId, id, parsed.data); + if (!updated) throw new HTTPException(404, { message: "dashboard not found" }); + return c.json(updated); + }); + + app.delete("/api/projects/:projectId/dashboards/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + await deleteDashboard(projectId, id); + return c.json({ ok: true }); + }); + + app.post("/api/projects/:projectId/dashboards/:id/widgets", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = dashboardWidgetCreateSchema.safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + const widget = await addDashboardWidget(projectId, id, parsed.data); + if (!widget) throw new HTTPException(404, { message: "dashboard not found" }); + return c.json(widget); + }); + + app.patch("/api/projects/:projectId/dashboards/:id/widgets/:widgetId", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + const widgetId = c.req.param("widgetId"); + await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = dashboardWidgetUpdateSchema.safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + const widget = await updateDashboardWidget(projectId, id, widgetId, parsed.data); + if (!widget) throw new HTTPException(404, { message: "widget not found" }); + return c.json(widget); + }); + + app.patch("/api/projects/:projectId/dashboards/:id/layout", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireAccess(c, projectId); + const body = await c.req.json().catch(() => ({})); + const parsed = z + .object({ + widgets: z + .array(z.object({ id: z.string().uuid(), layout: dashboardWidgetLayoutSchema })) + .max(200), + }) + .safeParse(body); + if (!parsed.success) throw new HTTPException(400, { message: "invalid body" }); + const ok = await updateDashboardLayout(projectId, id, parsed.data.widgets); + if (!ok) throw new HTTPException(404, { message: "dashboard not found" }); + return c.json({ ok: true }); + }); + + app.delete("/api/projects/:projectId/dashboards/:id/widgets/:widgetId", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + const widgetId = c.req.param("widgetId"); + await requireAccess(c, projectId); + const ok = await deleteDashboardWidget(projectId, id, widgetId); + if (!ok) throw new HTTPException(404, { message: "dashboard not found" }); + return c.json({ ok: true }); + }); +} diff --git a/superlog/apps/api/src/email.ts b/superlog/apps/api/src/email.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef6528750ef81ee7d59a5014beaa99e8bcd01da2 --- /dev/null +++ b/superlog/apps/api/src/email.ts @@ -0,0 +1,99 @@ +import { Resend } from "resend"; +import { logger } from "./logger.js"; + +// Thin Resend wrapper used by Better Auth for verification + password reset +// emails. Dev fallback: when RESEND_API_KEY is unset, log the body to stderr +// instead of throwing — that lets worktree sign-ups continue to work without +// production-level email credentials. + +const log = logger.child({ scope: "email" }); + +const FROM = process.env.SUPERLOG_FROM_EMAIL ?? "Superlog "; +const REPLY_TO = process.env.SUPERLOG_REPLY_TO_EMAIL; + +let client: Resend | null = null; +function getClient(): Resend | null { + if (client) return client; + const key = process.env.RESEND_API_KEY; + if (!key) return null; + client = new Resend(key); + return client; +} + +export type EmailMessage = { + to: string; + subject: string; + html: string; + text: string; +}; + +export async function sendEmail(message: EmailMessage): Promise { + const c = getClient(); + if (!c) { + log.warn( + { to: message.to, subject: message.subject }, + "RESEND_API_KEY not set — printing email body instead of sending", + ); + log.info({ body: message.text }, "email body (dev fallback)"); + return; + } + const res = await c.emails.send({ + from: FROM, + to: [message.to], + replyTo: REPLY_TO, + subject: message.subject, + html: message.html, + text: message.text, + }); + if (res.error) { + log.error({ err: res.error, to: message.to }, "resend send failed"); + throw new Error(`resend: ${res.error.message ?? "unknown"}`); + } +} + +function escape(value: string): string { + return value + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """); +} + +export function verificationEmailBody(url: string): { html: string; text: string } { + const safe = escape(url); + return { + text: `Confirm your email to start using Superlog.\n\n${url}\n\nIf you didn't sign up, you can ignore this email.`, + html: `

Confirm your email to start using Superlog.

+

${safe}

+

If you didn't sign up, you can ignore this email.

`, + }; +} + +export function passwordResetEmailBody(url: string): { html: string; text: string } { + const safe = escape(url); + return { + text: `Reset your Superlog password.\n\n${url}\n\nThis link expires in 1 hour. If you didn't request a reset, ignore this email.`, + html: `

Reset your Superlog password.

+

${safe}

+

This link expires in 1 hour. If you didn't request a reset, ignore this email.

`, + }; +} + +export function orgInvitationEmailBody(args: { + url: string; + orgName: string; + inviterEmail: string; + inviterName?: string | null; + role: string; +}): { html: string; text: string } { + const safe = escape(args.url); + const org = escape(args.orgName); + const inviter = escape(args.inviterName?.trim() ? args.inviterName : args.inviterEmail); + const role = escape(args.role); + return { + text: `${args.inviterName?.trim() || args.inviterEmail} invited you to join ${args.orgName} on Superlog as ${args.role}.\n\nAccept: ${args.url}\n\nIf you weren't expecting this invite, you can ignore it.`, + html: `

${inviter} invited you to join ${org} on Superlog as ${role}.

+

Accept invitation

+

If you weren't expecting this invite, you can ignore it.

`, + }; +} diff --git a/superlog/apps/api/src/env.ts b/superlog/apps/api/src/env.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5e10e9f55499f3f76ae6db5a1081fac9f6d7f77 --- /dev/null +++ b/superlog/apps/api/src/env.ts @@ -0,0 +1,8 @@ +import { config as loadDotenv } from "dotenv"; +const portlessPort = process.env.PORTLESS_URL ? process.env.PORT : undefined; +loadDotenv(); +loadDotenv({ path: ".env.local", override: true }); +if (process.env.SUPERLOG_ENV_FILE) { + loadDotenv({ path: process.env.SUPERLOG_ENV_FILE, override: true }); +} +if (portlessPort) process.env.PORT = portlessPort; diff --git a/superlog/apps/api/src/feedback.ts b/superlog/apps/api/src/feedback.ts new file mode 100644 index 0000000000000000000000000000000000000000..4bc4f489f92d511945f65fa356739096c387693c --- /dev/null +++ b/superlog/apps/api/src/feedback.ts @@ -0,0 +1,299 @@ +import { db, schema } from "@superlog/db"; +import { and, eq } from "drizzle-orm"; +import type { Hono } from "hono"; +import { HTTPException } from "hono/http-exception"; +import { auth } from "./auth.js"; +import { logger } from "./logger.js"; + +const log = logger.child({ scope: "feedback" }); + +const MAX_BODY_LEN = 8_000; +const FEEDBACK_KINDS = new Set(["incident", "issue", "pr"]); + +// Public + authed routes share one mount because the PR-link page must be +// reachable without a session (external GitHub PR participants). +// +// /api/feedback (authed) is for the in-product dialog on incident/issue +// drawers — the session middleware in index.ts wraps it. /feedback/pr/... +// is mounted before the session middleware so it's open to anonymous +// submitters. The github.ts webhook handler inserts feedback rows directly +// via the helper below; same for the Slack interactivity handler. +// +// Every insert path funnels through `recordFeedback` so the Slack notifier +// and admin-inbox bookkeeping stay in one place. + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountFeedbackPublic(app: Hono): void { + // Anonymous PR-link submissions. We accept these without a session because + // the link is included in PR descriptions on customer repos, and many + // commenters won't have Superlog accounts. Rate-limiting is intentionally + // out-of-scope for v1 — the form is one click deep, the admin inbox is + // staff-only, and we can lock it down if it gets abused. + app.post("/feedback/pr/:owner/:repo/:number", async (c) => { + const owner = c.req.param("owner"); + const repo = c.req.param("repo"); + const number = Number(c.req.param("number")); + if (!owner || !repo || !Number.isFinite(number) || number <= 0) { + throw new HTTPException(400, { message: "invalid pr ref" }); + } + const body = (await c.req.json().catch(() => ({}))) as { + body?: unknown; + githubLogin?: unknown; + }; + const text = typeof body.body === "string" ? body.body.trim() : ""; + if (!text) throw new HTTPException(400, { message: "body required" }); + if (text.length > MAX_BODY_LEN) { + throw new HTTPException(400, { message: "body too long" }); + } + const githubLogin = typeof body.githubLogin === "string" ? body.githubLogin.trim() : ""; + + // Look up the agent PR row if we know about it — best-effort, the + // feedback is recorded either way. ref_id is the agent_pull_requests.id + // when we have it, otherwise we fall back to "owner/repo#number" so the + // admin still has something to click. + const repoFullName = `${owner}/${repo}`; + const agentPr = await db.query.agentPullRequests.findFirst({ + where: and( + eq(schema.agentPullRequests.repoFullName, repoFullName), + eq(schema.agentPullRequests.prNumber, number), + ), + }); + + // Try to grab the session cookie if the user happens to be signed in — + // that lets us attribute the feedback to a known Superlog user even + // though the route is public. Best-effort. + let authorUserId: string | null = null; + try { + const session = await auth.api.getSession({ headers: c.req.raw.headers }); + authorUserId = session?.user.id ?? null; + } catch { + authorUserId = null; + } + + await recordFeedback({ + kind: "pr", + refId: agentPr?.id ?? `${repoFullName}#${number}`, + refRepo: repoFullName, + source: "pr_link", + body: text, + authorUserId, + authorExternal: githubLogin ? { githubLogin } : null, + orgId: null, + projectId: null, + }); + + return c.json({ ok: true }); + }); +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountFeedbackAuthed(app: Hono): void { + // In-product dialog. The dialog is rendered on incident and issue + // drawers, so kind is always 'incident' or 'issue'. We trust the caller + // to pass the correct ref_id (incident or issue UUID); we don't gate on + // whether the user can actually see that incident — feedback is an + // unauth'd-by-design signal and the admin inbox is the only thing that + // reads it. + app.post("/api/feedback", async (c) => { + const userId = c.var.userId as string; + const body = (await c.req.json().catch(() => ({}))) as { + kind?: unknown; + refId?: unknown; + body?: unknown; + projectId?: unknown; + }; + const kind = typeof body.kind === "string" ? body.kind : ""; + if (!FEEDBACK_KINDS.has(kind as schema.FeedbackKind) || kind === "pr") { + // PR feedback comes in via /feedback/pr/* (anonymous) or the github + // webhook; the in-product dialog only fires on incident/issue pages. + throw new HTTPException(400, { message: "kind must be 'incident' or 'issue'" }); + } + const refId = typeof body.refId === "string" ? body.refId : ""; + if (!refId) throw new HTTPException(400, { message: "refId required" }); + const text = typeof body.body === "string" ? body.body.trim() : ""; + if (!text) throw new HTTPException(400, { message: "body required" }); + if (text.length > MAX_BODY_LEN) { + throw new HTTPException(400, { message: "body too long" }); + } + // Resolve projectId via lookup before we trust it. A garbage string + // (non-UUID syntax, or a stale ID whose project was deleted) would + // otherwise hit the feedback.project_id FK and 500 on insert. We + // wrap the lookup in try/catch because postgres throws a `22P02` + // syntax error rather than returning empty for malformed UUIDs. + const requestedProjectId = typeof body.projectId === "string" ? body.projectId : null; + let projectId: string | null = null; + let orgId: string | null = null; + if (requestedProjectId) { + const project = await db.query.projects + .findFirst({ where: eq(schema.projects.id, requestedProjectId) }) + .catch(() => null); + if (project) { + projectId = project.id; + orgId = project.orgId; + } + } + + await recordFeedback({ + kind: kind as "incident" | "issue", + refId, + refRepo: null, + source: "dialog", + body: text, + authorUserId: userId, + authorExternal: null, + orgId, + projectId, + }); + + return c.json({ ok: true }); + }); + + // Staff triage reads the same `feedback` table directly. +} + +// Shared insert + notify. Exported so the github webhook handler and Slack +// view_submission handler can call it directly without re-implementing the +// shape contract. +export async function recordFeedback(input: { + kind: schema.FeedbackKind; + refId: string; + refRepo: string | null; + source: schema.FeedbackSource; + body: string; + authorUserId: string | null; + authorExternal: schema.FeedbackAuthorExternal | null; + orgId: string | null; + projectId: string | null; +}): Promise { + const [row] = await db + .insert(schema.feedback) + .values({ + kind: input.kind, + refId: input.refId, + refRepo: input.refRepo, + source: input.source, + body: input.body, + authorUserId: input.authorUserId, + authorExternal: input.authorExternal, + orgId: input.orgId, + projectId: input.projectId, + }) + .returning(); + log.info( + { + feedback_id: row?.id, + kind: input.kind, + source: input.source, + ref_id: input.refId, + author_user_id: input.authorUserId, + }, + "feedback recorded", + ); + if (row) { + void notifyFeedbackSlack(row).catch((err) => { + log.warn({ err, feedback_id: row.id }, "feedback slack notify failed"); + }); + } +} + +// Posts a one-liner to FEEDBACK_SLACK_WEBHOOK so the team hears about new +// feedback in real time. Best-effort — failures are logged and swallowed +// so they never block the insert path. Configure FEEDBACK_SLACK_WEBHOOK to +// a Slack incoming webhook URL (Slack app → Incoming Webhooks → pick a +// channel). Leave unset to disable. +async function notifyFeedbackSlack(row: schema.Feedback): Promise { + const webhookUrl = process.env.FEEDBACK_SLACK_WEBHOOK; + if (!webhookUrl) return; + // Optional staff tooling deep link. Unset -> no deep link. + const adminOrigin = process.env.ADMIN_WEB_ORIGIN; + const link = adminOrigin ? `${adminOrigin}/feedback?id=${row.id}` : null; + const preview = row.body.length > 280 ? `${row.body.slice(0, 277)}…` : row.body; + let authorEmail: string | null = null; + if (row.authorUserId) { + const user = await db.query.users.findFirst({ + where: eq(schema.users.id, row.authorUserId), + }); + authorEmail = user?.email ?? null; + } + const author = authorEmail + ? authorEmail + : row.authorExternal?.githubLogin + ? `@${row.authorExternal.githubLogin} (github)` + : row.authorExternal?.slackUserId + ? `<@${row.authorExternal.slackUserId}> (slack)` + : "anonymous"; + // For PR feedback the refId is either an agent_pull_requests UUID (when + // we know the PR — happens for PR-comment webhooks and for /feedback/pr/* + // POSTs that match an agent PR row) or the fallback "owner/repo#number" + // string from feedback.ts:79 (when the link was hit for a PR we don't + // track). The UUID case needs the repo name prepended; the fallback case + // already includes it, so re-prepending makes "owner/repo#…" appear twice. + // Detect UUIDs by length (36) + presence of dashes. + const refDesc = + row.kind === "pr" + ? row.refId.includes("#") + ? `PR ${row.refId}` + : `PR ${row.refRepo ?? ""} (${row.refId.slice(0, 8)}…)` + : `${row.kind} ${row.refId.slice(0, 8)}…`; + const text = `:speech_balloon: *New feedback* on ${refDesc} via _${row.source}_ from ${author}\n>${preview}${ + link ? `\n<${link}|Open in admin>` : "" + }`; + try { + const res = await fetch(webhookUrl, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ text }), + }); + if (!res.ok) { + log.warn({ status: res.status }, "feedback slack webhook returned non-2xx"); + } + } catch (err) { + log.warn({ err }, "feedback slack webhook fetch failed"); + } +} + +// Used by github.ts to decide whether a PR comment counts as feedback. +// Greptile and other bot accounts have type='Bot'; their reviews are +// review-bot output, not user feedback. The author_association check +// keeps us from accepting drive-by comments from random GitHub users +// who happened to wander in — feedback should come from people who +// have a real relationship with the PR. +// +// Possible author_associations: OWNER, MEMBER, COLLABORATOR, CONTRIBUTOR, +// FIRST_TIME_CONTRIBUTOR, FIRST_TIMER, MANNEQUIN, NONE. +const FEEDBACK_ASSOCIATIONS = new Set([ + "OWNER", + "MEMBER", + "COLLABORATOR", + "CONTRIBUTOR", + "FIRST_TIME_CONTRIBUTOR", +]); + +export function isFeedbackEligibleCommenter(opts: { + userType?: string | null; + authorAssociation?: string | null; +}): boolean { + if (opts.userType === "Bot") return false; + if (!opts.authorAssociation) return false; + return FEEDBACK_ASSOCIATIONS.has(opts.authorAssociation); +} + +// Used by the dropped FEEDBACK_SLACK_WEBHOOK notifier — exported so tests +// can confirm the env var is honored without invoking fetch. +export function feedbackSlackWebhookConfigured(): boolean { + return !!process.env.FEEDBACK_SLACK_WEBHOOK; +} + +// Marker used by the github webhook to filter out our own footer so we +// don't surface our own link as feedback when GitHub echoes it back. +// The footer string itself is rendered by `renderFeedbackFooter` in +// apps/worker/src/github-app.ts (worker can't import from the api app), +// so any change to the URL path there needs to be mirrored here. The +// path `/feedback/pr/` is wired to a router pattern and is unlikely to +// move; matching on it (rather than the whole footer text) keeps this +// resilient to copy edits in the footer. +export const FEEDBACK_PR_FOOTER_MARKER = "/feedback/pr/"; + +// Used by the admin inbox query — also exported to keep the +// authorAssociation list in one place. Tests import this set directly. +export { FEEDBACK_ASSOCIATIONS }; diff --git a/superlog/apps/api/src/gateway.ts b/superlog/apps/api/src/gateway.ts new file mode 100644 index 0000000000000000000000000000000000000000..04e5b642f788b1daff3412d588f5228e7cc7bad3 --- /dev/null +++ b/superlog/apps/api/src/gateway.ts @@ -0,0 +1,612 @@ +import type { ClickHouseClient } from "@clickhouse/client"; +import { + db, + generateApiKey, + generateCliSession, + hashCliSession, + listAccessibleGithubInstallsForProject, + schema, + syncLoopsContactForUserProject, +} from "@superlog/db"; +import { and, eq, isNull } from "drizzle-orm"; +import type { Hono } from "hono"; +import { nanoid } from "nanoid"; + +import { auth } from "./auth.js"; +import { logger } from "./logger.js"; +import { resolveActiveOrgContext } from "./org-context.js"; + +const log = logger.child({ scope: "gateway" }); + +const UPSTREAM = "https://api.anthropic.com"; +const HARD_CAP_PER_ORG = Number(process.env.SUPERLOG_HARD_CAP ?? 500); +const DEVICE_TTL_MS = 10 * 60 * 1000; +const SESSION_TTL_DAYS = 60; + +export type Principal = { + sessionId: string; + userId: string; + orgId: string; + userEmail: string; + orgName: string; +}; + +// "cli" — MCP / `superlog init` style pairing. Goes through a GitHub-install +// gate in the activate page before releasing the CLI token to the poller. +// "skill" — agent skill (e.g. superlog-onboard) running in the user's terminal +// pairing for OTel ingest only. Skips the GitHub gate (the post-signup +// onboarding wizard handles GH + Slack). The poller only receives an ingest +// key, never a CLI session token, since the skill never calls /v1/* gateway +// routes. +type DeviceFlow = "cli" | "skill"; + +type Device = { + deviceCode: string; + userCode: string; + flow: DeviceFlow; + createdAt: number; + // user_linked = sign-in done and account/key rows created. For "cli" + // flow we hold here until the GitHub install step finishes; for "skill" we + // transition straight to approved. + status: "pending" | "user_linked" | "approved" | "expired"; + session?: { + cliToken: string; + ingestKey: string; + orgId: string; + projectId: string; + userEmail: string; + orgName: string; + }; +}; + +const usageByOrg = new Map(); +const devicesByDeviceCode = new Map(); +const devicesByUserCode = new Map(); + +export function getLinkedDevice(userCode: string): { orgId: string; projectId: string } | null { + const device = devicesByUserCode.get(userCode.toUpperCase()); + if (!device || !device.session) return null; + if (isExpired(device)) return null; + if (device.status !== "user_linked") return null; + return { orgId: device.session.orgId, projectId: device.session.projectId }; +} + +// Used by the post-pair integration redirects (GitHub install, Slack install) +// initiated from the skill. The skill device is already in `approved` state +// by the time it tries to drive these — getLinkedDevice rejects that. +// Accepts either user_linked or approved, but only for skill devices, since +// the cli/MCP flow has its own approval semantics that shouldn't be reused +// here. +export function getSkillDeviceForIntegration( + userCode: string, +): { orgId: string; projectId: string } | null { + const device = devicesByUserCode.get(userCode.toUpperCase()); + if (!device || !device.session) return null; + if (device.flow !== "skill") return null; + if (isExpired(device)) return null; + if (device.status !== "user_linked" && device.status !== "approved") return null; + return { orgId: device.session.orgId, projectId: device.session.projectId }; +} + +export function getDeviceFlow(userCode: string): DeviceFlow | null { + const device = devicesByUserCode.get(userCode.toUpperCase()); + if (!device) return null; + return device.flow; +} + +export type GatewayVars = { principal: Principal }; + +// The host app's Variables type is invariant in Hono. We don't enforce it at +// the call site — callers should declare `principal?: Principal` in their own +// Vars if they want typed access downstream. +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountGateway(app: Hono, ch: ClickHouseClient): void { + const upstreamKey = process.env.ANTHROPIC_API_KEY; + if (!upstreamKey) { + log.warn("ANTHROPIC_API_KEY not set — /v1/messages proxy disabled"); + } + const publicUrl = + process.env.GATEWAY_PUBLIC_URL ?? `http://localhost:${process.env.PORT ?? 4100}`; + const webOrigin = process.env.WEB_ORIGIN ?? "http://localhost:5173"; + + app.post("/oauth/device", async (c) => { + // Optional `flow` field — accept JSON body but tolerate empty/no body for + // older callers (the MCP CLI flow doesn't send one). + let flow: DeviceFlow = "cli"; + const ct = c.req.header("content-type") ?? ""; + if (ct.toLowerCase().includes("application/json")) { + const body = (await c.req.json().catch(() => ({}))) as { flow?: unknown }; + if (body.flow === "skill") flow = "skill"; + } else { + const form = await c.req.parseBody().catch(() => ({}) as Record); + if (form.flow === "skill") flow = "skill"; + } + + const deviceCode = `superlog_dev_${nanoid(24)}`; + const userCode = humanCode(); + const device: Device = { + deviceCode, + userCode, + flow, + createdAt: Date.now(), + status: "pending", + }; + devicesByDeviceCode.set(deviceCode, device); + devicesByUserCode.set(userCode, device); + const verificationUri = new URL(`${webOrigin}/activate`); + if (flow === "skill") verificationUri.searchParams.set("flow", "skill"); + const verificationUriComplete = new URL(verificationUri.toString()); + verificationUriComplete.searchParams.set("code", userCode); + return c.json({ + device_code: deviceCode, + user_code: userCode, + verification_uri: verificationUri.toString(), + verification_uri_complete: verificationUriComplete.toString(), + expires_in: Math.floor(DEVICE_TTL_MS / 1000), + interval: 2, + }); + }); + + app.post("/oauth/token", async (c, next) => { + // The MCP OAuth flow registers its own /oauth/token at this path with + // RFC 6749 form-encoded grants (authorization_code, refresh_token). + // CLI device-flow requests come in as JSON with a device_code field — + // anything else falls through to the MCP handler. + const ct = c.req.header("content-type") ?? ""; + if (!ct.toLowerCase().includes("application/json")) { + return next(); + } + const body = (await c.req.json().catch(() => ({}))) as { device_code?: string }; + if (!body.device_code) return next(); + const device = devicesByDeviceCode.get(body.device_code); + if (!device) return c.json({ error: "invalid_grant" }, 400); + if (isExpired(device)) { + device.status = "expired"; + log.warn( + { + user_code: device.userCode, + flow: device.flow, + age_ms: Date.now() - device.createdAt, + }, + "device flow token expired (oauth/token)", + ); + return c.json({ error: "expired_token" }, 410); + } + if (device.status !== "approved" || !device.session) { + return c.json({ error: "authorization_pending" }, 428); + } + if (device.flow === "skill") { + // Skill pollers only need the ingest key for OTel exporters; never + // expose the gateway-scope CLI session token. + // Refresh the device's createdAt so the post-pair integration URLs + // (`/github/install?user_code=…`, `/slack/install?user_code=…`) the + // skill is about to drive don't tip over the 10-min device TTL while + // the user clicks through GitHub + Slack OAuth. + device.createdAt = Date.now(); + return c.json({ + ingest_key: device.session.ingestKey, + project_id: device.session.projectId, + user: device.session.userEmail, + org: device.session.orgName, + user_code: device.userCode, + flow: "skill", + }); + } + return c.json({ + access_token: device.session.cliToken, + token_type: "Bearer", + ingest_key: device.session.ingestKey, + project_id: device.session.projectId, + user: device.session.userEmail, + org: device.session.orgName, + gateway_url: publicUrl, + }); + }); + + app.get("/activate", (c) => { + const code = c.req.query("code") ?? ""; + const url = new URL(`${webOrigin}/activate`); + if (code) url.searchParams.set("code", code); + return c.redirect(url.toString(), 302); + }); + + app.post("/activate/approve", async (c) => { + const userId = await requireUserFromSession(c); + if (userId instanceof Response) return userId; + + const body = (await c.req.json().catch(() => ({}))) as { + user_code?: string; + org_id?: string; + project_id?: string; + }; + const userCode = body.user_code?.toUpperCase() ?? ""; + const device = devicesByUserCode.get(userCode); + if (!device) return c.json({ error: "unknown device code" }, 404); + if (isExpired(device)) { + device.status = "expired"; + log.warn( + { + user_code: userCode, + user_id: userId, + flow: device.flow, + age_ms: Date.now() - device.createdAt, + }, + "device code expired (activate/approve)", + ); + return c.json({ error: "device code expired" }, 410); + } + if (device.status === "approved" || device.status === "user_linked") { + return c.json({ error: "already approved" }, 409); + } + + const { user, org, project } = await ensureAccount(userId, { + orgId: body.org_id ?? null, + projectId: body.project_id ?? null, + }); + + const cli = generateCliSession(); + const ingest = generateApiKey(); + const expiresAt = new Date(Date.now() + SESSION_TTL_DAYS * 24 * 60 * 60 * 1000); + + await db.transaction(async (tx) => { + await tx.insert(schema.cliSessions).values({ + userId: user.id, + orgId: org.id, + tokenPrefix: cli.prefix, + tokenHash: cli.hash, + expiresAt, + }); + await tx.insert(schema.apiKeys).values({ + projectId: project.id, + name: "CLI-issued ingest key", + keyPrefix: ingest.prefix, + keyHash: ingest.hash, + }); + }); + + device.status = "user_linked"; + device.session = { + cliToken: cli.plaintext, + ingestKey: ingest.plaintext, + orgId: org.id, + projectId: project.id, + userEmail: user.email, + orgName: org.name, + }; + void syncLoopsContactForUserProject({ + userId: user.id, + projectId: project.id, + appUrl: webOrigin, + }).catch((err) => + log.warn({ err, user_id: user.id }, "loops contact sync failed after activation"), + ); + + // Skill flow has no GitHub gate — the post-signup OnboardingWizard prompts + // for GitHub + Slack once the user lands on the dashboard. Approve in one + // hop so the skill's poller can pick up the ingest key immediately. + if (device.flow === "skill") { + device.status = "approved"; + return c.json({ + ok: true, + orgId: org.id, + projectId: project.id, + flow: "skill", + ingestKey: ingest.plaintext, + githubSetupNeeded: false, + }); + } + + const accessibleInstalls = await listAccessibleGithubInstallsForProject(project.id); + const githubSetupNeeded = accessibleInstalls.length === 0 && !org.githubSetupSkippedAt; + + return c.json({ ok: true, orgId: org.id, flow: "cli", githubSetupNeeded }); + }); + + app.post("/activate/finalize", async (c) => { + const userId = await requireUserFromSession(c); + if (userId instanceof Response) return userId; + void userId; + + const body = (await c.req.json().catch(() => ({}))) as { user_code?: string }; + const userCode = body.user_code?.toUpperCase() ?? ""; + const device = devicesByUserCode.get(userCode); + if (!device) return c.json({ error: "unknown device code" }, 404); + if (isExpired(device)) { + device.status = "expired"; + log.warn( + { + user_code: userCode, + flow: device.flow, + age_ms: Date.now() - device.createdAt, + }, + "device code expired (activate/finalize)", + ); + return c.json({ error: "device code expired" }, 410); + } + if (device.status === "approved") return c.json({ ok: true }); + if (device.status !== "user_linked" || !device.session) { + return c.json({ error: "not ready to finalize" }, 409); + } + + device.status = "approved"; + return c.json({ ok: true }); + }); + + app.use("/v1/*", async (c, next) => { + const header = c.req.header("authorization"); + if (!header?.toLowerCase().startsWith("bearer ")) { + return c.json({ error: "unauthenticated" }, 401); + } + const token = header.slice(7).trim(); + if (!token.startsWith("superlog_cli_")) { + return c.json( + { + error: + "wrong credential type: /v1/* requires a CLI session token (superlog_cli_*); did you mean to call intake.superlog.sh with your ingest key?", + }, + 401, + ); + } + const hash = hashCliSession(token); + const session = await db.query.cliSessions.findFirst({ + where: eq(schema.cliSessions.tokenHash, hash), + }); + if (!session || session.revokedAt) return c.json({ error: "invalid token" }, 401); + if (session.expiresAt && session.expiresAt < new Date()) { + return c.json({ error: "session expired" }, 401); + } + + const user = await db.query.users.findFirst({ + where: eq(schema.users.id, session.userId), + }); + const org = await db.query.orgs.findFirst({ + where: eq(schema.orgs.id, session.orgId), + }); + if (!user || !org) return c.json({ error: "session references missing account" }, 401); + + c.set("principal", { + sessionId: session.id, + userId: session.userId, + orgId: session.orgId, + userEmail: user.email, + orgName: org.name, + }); + + void db + .update(schema.cliSessions) + .set({ lastUsedAt: new Date() }) + .where(eq(schema.cliSessions.id, session.id)) + .catch((err: unknown) => log.error({ err }, "failed to bump last_used_at")); + + await next(); + }); + + app.get("/v1/me", (c) => { + const p = c.var.principal as Principal; + return c.json({ + user: p.userEmail, + org: p.orgName, + usage: usageByOrg.get(p.orgId) ?? 0, + cap: HARD_CAP_PER_ORG, + }); + }); + + app.all("/v1/messages", async (c) => { + if (!upstreamKey) { + return c.json({ error: "gateway upstream not configured" }, 503); + } + const p = c.var.principal as Principal; + const used = usageByOrg.get(p.orgId) ?? 0; + if (used >= HARD_CAP_PER_ORG) { + return c.json( + { + error: { + type: "rate_limit_error", + message: `org cap reached (${HARD_CAP_PER_ORG})`, + }, + }, + 429, + ); + } + usageByOrg.set(p.orgId, used + 1); + log.info( + { user: p.userEmail, org: p.orgName, used: used + 1, cap: HARD_CAP_PER_ORG }, + "/v1/messages", + ); + return proxyToAnthropic(c.req.raw, "/v1/messages", upstreamKey); + }); + + app.get("/v1/telemetry/recent", async (c) => { + const p = c.var.principal as Principal; + const service = c.req.query("service"); + const since = c.req.query("since"); + if (!service || !since) { + return c.json({ error: "service and since query params required" }, 400); + } + + // The install-verify step only cares about the signed-in user's default + // project. Multi-project users would query by project_id explicitly; that + // case can wait until we actually have it. + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.orgId, p.orgId), + }); + if (!project) return c.json({ error: "no project for this org" }, 404); + + const [traces, logs, metrics] = await Promise.all([ + chCountTraces(ch, project.id, service, since), + chCountLogs(ch, project.id, service, since), + chMetricsCountAcrossTables(ch, project.id, service, since), + ]); + + return c.json({ + service, + since, + projectId: project.id, + traces, + logs, + metrics, + }); + }); + + app.all("/v1/*", (c) => { + if (!upstreamKey) { + return c.json({ error: "gateway upstream not configured" }, 503); + } + return proxyToAnthropic(c.req.raw, new URL(c.req.url).pathname, upstreamKey); + }); +} + +async function chCountTraces( + ch: ClickHouseClient, + projectId: string, + service: string, + since: string, +): Promise<{ count: number; firstAt?: string; firstSpanName?: string }> { + const r = await ch.query({ + query: ` + SELECT count() AS c, + toString(min(Timestamp)) AS first_at, + argMin(SpanName, Timestamp) AS first_span + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND ServiceName = {service:String} + AND Timestamp >= parseDateTime64BestEffortOrZero({since:String}) + `, + query_params: { projectId, service, since }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { c: string | number; first_at?: string; first_span?: string }[]; + const row = rows[0]; + const count = Number(row?.c ?? 0); + return { + count, + firstAt: count > 0 ? row?.first_at : undefined, + firstSpanName: count > 0 ? row?.first_span : undefined, + }; +} + +async function chCountLogs( + ch: ClickHouseClient, + projectId: string, + service: string, + since: string, +): Promise<{ count: number }> { + const r = await ch.query({ + query: ` + SELECT count() AS c + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND ServiceName = {service:String} + AND Timestamp >= parseDateTime64BestEffortOrZero({since:String}) + `, + query_params: { projectId, service, since }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { c: string | number }[]; + return { count: Number(rows[0]?.c ?? 0) }; +} + +async function chMetricsCountAcrossTables( + ch: ClickHouseClient, + projectId: string, + service: string, + since: string, +): Promise<{ count: number }> { + const tables = [ + "otel_metrics_gauge", + "otel_metrics_sum", + "otel_metrics_histogram", + "otel_metrics_summary", + "otel_metrics_exp_histogram", + ]; + const counts = await Promise.all( + tables.map(async (t) => { + const r = await ch.query({ + query: ` + SELECT count() AS c + FROM ${t} + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND ServiceName = {service:String} + AND TimeUnix >= parseDateTime64BestEffortOrZero({since:String}) + `, + query_params: { projectId, service, since }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { c: string | number }[]; + return Number(rows[0]?.c ?? 0); + }), + ); + return { count: counts.reduce((a, b) => a + b, 0) }; +} + +async function ensureAccount( + userId: string, + scope: { orgId: string | null; projectId: string | null } = { + orgId: null, + projectId: null, + }, +): Promise<{ user: schema.User; org: schema.Org; project: schema.Project }> { + const { user, org, project } = await resolveActiveOrgContext({ + userId, + preferredOrgId: scope.orgId, + preferredProjectId: scope.projectId, + }); + return { user, org, project }; +} + +export async function proxyToAnthropic( + req: Request, + path: string, + upstreamKey: string, +): Promise { + const url = new URL(path, UPSTREAM); + // Allowlist only headers Anthropic needs. Forwarding cf-* / x-forwarded-* + // from our inbound (api.superlog.sh is orange-clouded) makes Anthropic's + // own Cloudflare edge think the request has already traversed CF and + // reject it with Error 1000 ("DNS points to prohibited IP"). + const FORWARD = new Set(["content-type", "accept", "accept-encoding"]); + const headers = new Headers(); + for (const [name, value] of req.headers) { + const lower = name.toLowerCase(); + if (FORWARD.has(lower) || lower.startsWith("anthropic-") || lower.startsWith("x-stainless-")) { + headers.set(name, value); + } + } + headers.set("x-api-key", upstreamKey); + if (!headers.has("anthropic-version")) headers.set("anthropic-version", "2023-06-01"); + + const upstream = await fetch(url, { + method: req.method, + headers, + body: + req.method === "GET" || req.method === "HEAD" + ? undefined + : (req.body as ReadableStream | null), + duplex: "half", + redirect: "manual", + } as RequestInit & { duplex: "half" }); + + const respHeaders = new Headers(upstream.headers); + respHeaders.delete("content-encoding"); + respHeaders.delete("content-length"); + return new Response(upstream.body, { status: upstream.status, headers: respHeaders }); +} + +async function requireUserFromSession( + // biome-ignore lint/suspicious/noExplicitAny: Hono Context generics vary across mount points. + c: any, +): Promise { + const session = await auth.api.getSession({ headers: c.req.raw.headers }); + if (!session) return c.json({ error: "unauthenticated" }, 401); + return session.user.id; +} + +function humanCode(): string { + const alphabet = "ABCDEFGHJKMNPQRSTVWXYZ23456789"; + const pick = () => alphabet[Math.floor(Math.random() * alphabet.length)]; + return `${pick()}${pick()}${pick()}${pick()}-${pick()}${pick()}${pick()}${pick()}`; +} + +function isExpired(d: Device): boolean { + return Date.now() - d.createdAt > DEVICE_TTL_MS; +} diff --git a/superlog/apps/api/src/github-branches.test.ts b/superlog/apps/api/src/github-branches.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..0cc191fc2ac06e410d2139bab5abff133ac3ddf1 --- /dev/null +++ b/superlog/apps/api/src/github-branches.test.ts @@ -0,0 +1,51 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { mergeRepoBranches, prBaseBranchExists } from "./github-branches.js"; + +test("mergeRepoBranches dedupes across repos, marks defaults, and sorts defaults first", () => { + const merged = mergeRepoBranches([ + { defaultBranch: "main", branches: ["main", "dev", "feature/x"] }, + { defaultBranch: "master", branches: ["master", "dev"] }, + ]); + assert.deepEqual(merged, [ + { name: "main", isDefault: true }, + { name: "master", isDefault: true }, + { name: "dev", isDefault: false }, + { name: "feature/x", isDefault: false }, + ]); +}); + +test("mergeRepoBranches treats a branch as default if it is the default in any repo", () => { + const merged = mergeRepoBranches([ + { defaultBranch: null, branches: ["dev"] }, + { defaultBranch: "dev", branches: ["dev"] }, + ]); + assert.deepEqual(merged, [{ name: "dev", isDefault: true }]); +}); + +test("mergeRepoBranches includes the default branch even if absent from the branch list", () => { + const merged = mergeRepoBranches([{ defaultBranch: "main", branches: [] }]); + assert.deepEqual(merged, [{ name: "main", isDefault: true }]); +}); + +test("mergeRepoBranches ignores blank names and trims", () => { + const merged = mergeRepoBranches([{ defaultBranch: " ", branches: [" ", " dev "] }]); + assert.deepEqual(merged, [{ name: "dev", isDefault: false }]); +}); + +test("prBaseBranchExists allows blank (uses repository default)", () => { + const branches = [{ name: "main", isDefault: true }]; + assert.equal(prBaseBranchExists(null, branches), true); + assert.equal(prBaseBranchExists("", branches), true); + assert.equal(prBaseBranchExists(" ", branches), true); +}); + +test("prBaseBranchExists requires a non-blank branch to be present", () => { + const branches = [ + { name: "main", isDefault: true }, + { name: "dev", isDefault: false }, + ]; + assert.equal(prBaseBranchExists("dev", branches), true); + assert.equal(prBaseBranchExists(" dev ", branches), true); + assert.equal(prBaseBranchExists("nope", branches), false); +}); diff --git a/superlog/apps/api/src/github-branches.ts b/superlog/apps/api/src/github-branches.ts new file mode 100644 index 0000000000000000000000000000000000000000..e10b51c083bc0502e3bd9f89500d73bd561c0dc5 --- /dev/null +++ b/superlog/apps/api/src/github-branches.ts @@ -0,0 +1,44 @@ +import { normalizePrBaseBranch } from "@superlog/db/schema"; + +export type RepoBranch = { name: string; isDefault: boolean }; + +export type RepoBranchInfo = { defaultBranch: string | null; branches: string[] }; + +// Pure: collapse the per-repo branch lists of a project into one deduped, +// sorted set for the config dropdown. A name is `isDefault` if it's the +// default branch of ANY repo. The default branch is always included even if +// the paginated branch list didn't surface it. Defaults sort first, then +// alphabetical — so the most likely target is at the top of the picker. +export function mergeRepoBranches(perRepo: RepoBranchInfo[]): RepoBranch[] { + const names = new Set(); + const defaults = new Set(); + for (const repo of perRepo) { + for (const raw of repo.branches) { + const name = raw.trim(); + if (name) names.add(name); + } + const def = repo.defaultBranch?.trim(); + if (def) { + names.add(def); + defaults.add(def); + } + } + return [...names] + .map((name) => ({ name, isDefault: defaults.has(name) })) + .sort((a, b) => { + if (a.isDefault !== b.isDefault) return a.isDefault ? -1 : 1; + return a.name.localeCompare(b.name); + }); +} + +// Pure: a configured PR base branch is valid if it's blank (meaning "use the +// repository default") or it matches a branch that actually exists in one of +// the project's repos. +export function prBaseBranchExists( + candidate: string | null | undefined, + branches: RepoBranch[], +): boolean { + const normalized = normalizePrBaseBranch(candidate); + if (!normalized) return true; + return branches.some((branch) => branch.name === normalized); +} diff --git a/superlog/apps/api/src/github.test.ts b/superlog/apps/api/src/github.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..aee7cfb35fc53ca3481fdae45f407a8d4cbd1f39 --- /dev/null +++ b/superlog/apps/api/src/github.test.ts @@ -0,0 +1,297 @@ +import "dotenv/config"; +import { strict as assert } from "node:assert"; +import crypto from "node:crypto"; +import { after, before, test } from "node:test"; +import { closeDb, db, runMigrations, schema } from "@superlog/db"; +import { and, eq } from "drizzle-orm"; +import { Hono } from "hono"; +import { mountGithubPublic } from "./github.js"; + +const GH_WEBHOOK_SECRET = "github-test-secret"; +process.env.GITHUB_APP_WEBHOOK_SECRET = GH_WEBHOOK_SECRET; + +const orgIds: string[] = []; + +before(async () => { + await runMigrations(); +}); + +after(async () => { + try { + for (const orgId of orgIds.reverse()) { + await db.delete(schema.orgs).where(eq(schema.orgs.id, orgId)); + } + } finally { + await closeDb(); + } +}); + +test("merged agent PR resolves incident, cascades linked issues, and writes timeline events", async () => { + const fixture = await seedAgentPrFixture("merged"); + const app = new Hono(); + mountGithubPublic(app); + + const mergedAt = new Date().toISOString(); + const res = await postGithub(app, "pull_request", `gh-${fixture.tag}-merged`, { + action: "closed", + repository: { full_name: fixture.repoFullName }, + pull_request: { + number: fixture.prNumber, + merged: true, + merged_at: mergedAt, + closed_at: mergedAt, + merged_by: { login: "alice", id: 100 }, + user: { login: "superlog-bot", id: 999 }, + head: { sha: "cafebabe", ref: fixture.branchName }, + }, + sender: { login: "alice", id: 100 }, + installation: { id: fixture.installationId }, + }); + + assert.equal(res.status, 200); + + const pr = await db.query.agentPullRequests.findFirst({ + where: eq(schema.agentPullRequests.id, fixture.agentPrId), + }); + assert.equal(pr?.state, "merged"); + assert.equal(pr?.mergedByLogin, "alice"); + assert.ok(pr?.mergedAt); + + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, fixture.incidentId), + }); + assert.equal(incident?.status, "resolved"); + + const issue = await db.query.issues.findFirst({ + where: eq(schema.issues.id, fixture.issueId), + }); + assert.ok(issue); + + const resolvedEvents = await db.query.incidentEvents.findMany({ + where: and( + eq(schema.incidentEvents.agentRunId, fixture.agentRunId), + eq(schema.incidentEvents.kind, "incident_resolved"), + ), + }); + assert.equal(resolvedEvents.length, 1); + assert.equal( + resolvedEvents[0]?.summary, + `Incident resolved because PR #${fixture.prNumber} was merged.`, + ); + assert.equal(resolvedEvents[0]?.detail?.reason, "agent_pr_merged"); + + const prMergedEvent = await db.query.agentPrEvents.findFirst({ + where: and( + eq(schema.agentPrEvents.agentPrId, fixture.agentPrId), + eq(schema.agentPrEvents.kind, "pr_merged"), + ), + }); + assert.ok(prMergedEvent); + + const duplicate = await postGithub(app, "pull_request", `gh-${fixture.tag}-merged`, { + action: "closed", + repository: { full_name: fixture.repoFullName }, + pull_request: { + number: fixture.prNumber, + merged: true, + merged_at: mergedAt, + closed_at: mergedAt, + merged_by: { login: "alice", id: 100 }, + }, + sender: { login: "alice", id: 100 }, + installation: { id: fixture.installationId }, + }); + assert.equal(duplicate.status, 200); + + const resolvedEventsAfterDuplicate = await db.query.incidentEvents.findMany({ + where: and( + eq(schema.incidentEvents.agentRunId, fixture.agentRunId), + eq(schema.incidentEvents.kind, "incident_resolved"), + ), + }); + assert.equal(resolvedEventsAfterDuplicate.length, 1); +}); + +test("closed unmerged agent PR does not resolve incident or linked issue", async () => { + const fixture = await seedAgentPrFixture("closed"); + const app = new Hono(); + mountGithubPublic(app); + + const closedAt = new Date().toISOString(); + const res = await postGithub(app, "pull_request", `gh-${fixture.tag}-closed`, { + action: "closed", + repository: { full_name: fixture.repoFullName }, + pull_request: { + number: fixture.prNumber, + merged: false, + closed_at: closedAt, + user: { login: "superlog-bot", id: 999 }, + }, + sender: { login: "alice", id: 100 }, + installation: { id: fixture.installationId }, + }); + + assert.equal(res.status, 200); + + const pr = await db.query.agentPullRequests.findFirst({ + where: eq(schema.agentPullRequests.id, fixture.agentPrId), + }); + assert.equal(pr?.state, "closed"); + + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, fixture.incidentId), + }); + assert.equal(incident?.status, "open"); + + const issue = await db.query.issues.findFirst({ + where: eq(schema.issues.id, fixture.issueId), + }); + assert.ok(issue); + + const resolvedEvent = await db.query.incidentEvents.findFirst({ + where: and( + eq(schema.incidentEvents.agentRunId, fixture.agentRunId), + eq(schema.incidentEvents.kind, "incident_resolved"), + ), + }); + assert.equal(resolvedEvent, undefined); +}); + +async function seedAgentPrFixture(label: string): Promise<{ + tag: string; + repoFullName: string; + branchName: string; + installationId: number; + incidentId: string; + issueId: string; + agentRunId: string; + agentPrId: string; + prNumber: number; +}> { + const tag = `test-${label}-${Date.now()}-${Math.floor(Math.random() * 1_000_000)}`; + const repoFullName = `acme/${tag}`; + const branchName = `superlog/${tag}`; + const installationId = Math.floor(Date.now() / 1000) + Math.floor(Math.random() * 1_000_000); + const prNumber = Math.floor(Math.random() * 10_000) + 1; + + const [org] = await db + .insert(schema.orgs) + .values({ name: tag, slug: tag }) + .returning(); + if (!org) throw new Error("failed to seed org"); + orgIds.push(org.id); + + const [project] = await db + .insert(schema.projects) + .values({ orgId: org.id, name: "test", slug: tag }) + .returning(); + if (!project) throw new Error("failed to seed project"); + + const now = new Date(); + const [incident] = await db + .insert(schema.incidents) + .values({ + projectId: project.id, + title: "Test incident", + service: "api", + firstSeen: now, + lastSeen: now, + }) + .returning(); + if (!incident) throw new Error("failed to seed incident"); + + const [issue] = await db + .insert(schema.issues) + .values({ + projectId: project.id, + fingerprint: `fp-${tag}`, + kind: "span", + service: "api", + exceptionType: "Error", + title: "Test issue", + message: "boom", + firstSeen: now, + lastSeen: now, + }) + .returning(); + if (!issue) throw new Error("failed to seed issue"); + + await db.insert(schema.incidentIssues).values({ + incidentId: incident.id, + issueId: issue.id, + }); + + const [agentRun] = await db + .insert(schema.agentRuns) + .values({ incidentId: incident.id, runtime: "anthropic", state: "running" }) + .returning(); + if (!agentRun) throw new Error("failed to seed agent run"); + + const [installation] = await db + .insert(schema.githubInstallations) + .values({ + orgId: org.id, + projectId: project.id, + installationId, + accountLogin: "acme-bot", + accountType: "Organization", + repos: [{ id: 1, fullName: repoFullName, private: false }], + }) + .returning(); + if (!installation) throw new Error("failed to seed GitHub installation"); + + const [agentPr] = await db + .insert(schema.agentPullRequests) + .values({ + incidentId: incident.id, + agentRunId: agentRun.id, + installationId: installation.id, + repoFullName, + prNumber, + prNodeId: `PR_${tag}`, + url: `https://github.com/${repoFullName}/pull/${prNumber}`, + branchName, + baseBranch: "main", + headSha: "deadbeef", + title: "[superlog] Fix bug", + state: "open", + lastSyncedAt: now, + }) + .returning(); + if (!agentPr) throw new Error("failed to seed agent PR"); + + return { + tag, + repoFullName, + branchName, + installationId, + incidentId: incident.id, + issueId: issue.id, + agentRunId: agentRun.id, + agentPrId: agentPr.id, + prNumber, + }; +} + +async function postGithub( + app: Hono, + event: string, + delivery: string, + payload: unknown, +): Promise { + const body = JSON.stringify(payload); + return app.request("/github/webhook", { + method: "POST", + headers: { + "content-type": "application/json", + "x-github-event": event, + "x-github-delivery": delivery, + "x-hub-signature-256": ghSign(body), + }, + body, + }); +} + +function ghSign(body: string): string { + return `sha256=${crypto.createHmac("sha256", GH_WEBHOOK_SECRET).update(body).digest("hex")}`; +} diff --git a/superlog/apps/api/src/github.ts b/superlog/apps/api/src/github.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c48b0f4166ae330737b176132016da69f93418e --- /dev/null +++ b/superlog/apps/api/src/github.ts @@ -0,0 +1,2037 @@ +import crypto from "node:crypto"; +import { + db, + listAccessibleGithubInstallsForProject, + resolveIncident, + schema, + syncLoopsContactsForOrg, +} from "@superlog/db"; +import { and, eq, inArray, isNull, sql } from "drizzle-orm"; +import type { Hono } from "hono"; +import type { Context } from "hono"; +import { + FEEDBACK_PR_FOOTER_MARKER, + isFeedbackEligibleCommenter, + recordFeedback, +} from "./feedback.js"; +import { getDeviceFlow, getLinkedDevice, getSkillDeviceForIntegration } from "./gateway.js"; +import { type RepoBranch, type RepoBranchInfo, mergeRepoBranches } from "./github-branches.js"; +import { runResolvedIncidentSideEffectsForIncident } from "./incidents/resolution-side-effects.js"; +import { logger } from "./logger.js"; +import { resolveActiveOrgContext } from "./org-context.js"; + +const log = logger.child({ scope: "github" }); +type Vars = { userId: string; orgId: string | null }; +const DEFAULT_COMMIT_AUTHOR = { + name: "Superlog app", + email: "bot@superlog.sh", +}; + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountGithubPublic(app: Hono): void { + const appSlug = process.env.GITHUB_APP_SLUG; + const stateSecret = process.env.STATE_SIGNING_SECRET; + const webhookSecret = process.env.GITHUB_APP_WEBHOOK_SECRET; + const webOrigin = process.env.WEB_ORIGIN ?? "http://localhost:5173"; + const oauthClientId = + process.env.GITHUB_OAUTH_CLIENT_ID ?? + process.env.GITHUB_APP_CLIENT_ID ?? + process.env.GITHUB_CLIENT_ID; + const oauthClientSecret = + process.env.GITHUB_OAUTH_CLIENT_SECRET ?? + process.env.GITHUB_APP_CLIENT_SECRET ?? + process.env.GITHUB_CLIENT_SECRET; + const installRedirectUrl = + process.env.GITHUB_INSTALL_OAUTH_REDIRECT_URL ?? + "http://localhost:4100/github/install/callback"; + + if (!appSlug) { + log.warn("GITHUB_APP_SLUG not set — /github/install disabled"); + } + if (!stateSecret) { + log.warn("STATE_SIGNING_SECRET not set — /github/install disabled"); + } + if (!webhookSecret) { + log.warn("GITHUB_APP_WEBHOOK_SECRET not set — /github/webhook disabled"); + } + + app.get("/github/install", (c) => { + if (!appSlug || !stateSecret) { + return c.json({ error: "github app not configured" }, 503); + } + const userCode = (c.req.query("user_code") ?? "").toUpperCase(); + // CLI/MCP flow: device must be in user_linked state. Skill flow drives + // GitHub install AFTER pairing (device already approved), so fall back + // to the skill-device helper when getLinkedDevice rejects it. + const device = getLinkedDevice(userCode) ?? getSkillDeviceForIntegration(userCode); + if (!device) return c.json({ error: "unknown or not-ready device code" }, 404); + + const state = signState("cli", userCode, stateSecret); + const url = new URL(`https://github.com/apps/${appSlug}/installations/new`); + url.searchParams.set("state", state); + return c.redirect(url.toString(), 302); + }); + + app.get("/github/install/callback", async (c) => { + if (!stateSecret) return c.json({ error: "github app not configured" }, 503); + const installationIdRaw = c.req.query("installation_id"); + const state = c.req.query("state") ?? ""; + const setupAction = c.req.query("setup_action") ?? "install"; + const oauthCode = c.req.query("code") ?? null; + log.info( + { + setup_action: setupAction, + installation_id: installationIdRaw ?? null, + has_oauth_code: !!oauthCode, + }, + "github install callback received", + ); + + const installationId = Number(installationIdRaw); + const marker = setupAction === "update" ? "updated" : "done"; + + // First try the management-API state shape for platform provisioning. + // Falls through to the existing cli/web state shape if not a mgmt state. + const mgmt = verifyMgmtState(state, stateSecret); + if (mgmt) { + const callbackWebOrigin = resolveCallbackWebOrigin(c, webOrigin); + const failTarget = mgmt.returnUrl ?? `${callbackWebOrigin}/`; + if (!Number.isFinite(installationId) || installationId <= 0) { + return c.redirect(`${failTarget}${failTarget.includes("?") ? "&" : "?"}gh=error`, 302); + } + let resolvedOrgId: string; + let resolvedProjectId: string | null; + if (mgmt.scope === "org") { + resolvedOrgId = mgmt.orgId; + resolvedProjectId = null; + } else { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, mgmt.projectId), + }); + if (!project) { + return c.redirect(`${failTarget}${failTarget.includes("?") ? "&" : "?"}gh=error`, 302); + } + resolvedOrgId = project.orgId; + resolvedProjectId = project.id; + } + const rowId = await upsertInstallation({ + orgId: resolvedOrgId, + projectId: resolvedProjectId, + installationId, + }); + await resumeBlockedAgentRunsForOrg(resolvedOrgId, "github_install", { + projectIdHint: resolvedProjectId, + }); + await maybeCaptureInstallerIdentity({ + installationRowId: rowId, + installationId, + oauthCode, + clientId: oauthClientId, + clientSecret: oauthClientSecret, + redirectUrl: installRedirectUrl, + }); + const successTarget = mgmt.returnUrl ?? `${callbackWebOrigin}/`; + return c.redirect( + `${successTarget}${successTarget.includes("?") ? "&" : "?"}gh=${marker}`, + 302, + ); + } + + const decoded = verifyState(state, stateSecret); + if (!decoded) return c.json({ error: "invalid state" }, 400); + + // "cli" kind: value is userCode → resolve org+project from device. + // "web" kind: value is projectId → resolve org from the project row. + let orgId: string | null; + let projectId: string | null; + if (decoded.kind === "cli") { + const device = getLinkedDevice(decoded.value) ?? getSkillDeviceForIntegration(decoded.value); + orgId = device?.orgId ?? null; + projectId = device?.projectId ?? null; + } else { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, decoded.value), + }); + orgId = project?.orgId ?? null; + projectId = project?.id ?? null; + } + + if (decoded.kind === "cli") { + const userCode = decoded.value; + const flow = getDeviceFlow(userCode); + const flowQuery = flow === "skill" ? "&flow=skill" : ""; + const callbackWebOrigin = resolveCallbackWebOrigin(c, webOrigin); + if (!orgId || !projectId) { + return c.redirect( + `${callbackWebOrigin}/activate?code=${userCode}${flowQuery}&gh=expired`, + 302, + ); + } + if (!Number.isFinite(installationId) || installationId <= 0) { + return c.redirect( + `${callbackWebOrigin}/activate?code=${userCode}${flowQuery}&gh=error`, + 302, + ); + } + const rowId = await upsertInstallation({ orgId, projectId, installationId }); + await resumeBlockedAgentRunsForProjects([projectId], "github_install"); + await maybeCaptureInstallerIdentity({ + installationRowId: rowId, + installationId, + oauthCode, + clientId: oauthClientId, + clientSecret: oauthClientSecret, + redirectUrl: installRedirectUrl, + }); + return c.redirect( + `${callbackWebOrigin}/activate?code=${userCode}${flowQuery}&gh=${marker}`, + 302, + ); + } + + // decoded.kind === "web" — value resolved to project above. + const callbackWebOrigin = resolveCallbackWebOrigin(c, webOrigin); + if (!Number.isFinite(installationId) || installationId <= 0 || !orgId || !projectId) { + return c.redirect(`${callbackWebOrigin}/?gh=error`, 302); + } + const rowId = await upsertInstallation({ orgId, projectId, installationId }); + await resumeBlockedAgentRunsForProjects([projectId], "github_install"); + await maybeCaptureInstallerIdentity({ + installationRowId: rowId, + installationId, + oauthCode, + clientId: oauthClientId, + clientSecret: oauthClientSecret, + redirectUrl: installRedirectUrl, + }); + return c.redirect(`${callbackWebOrigin}/?gh=${marker}`, 302); + }); + + app.post("/github/webhook", async (c) => { + if (!webhookSecret) return c.json({ error: "webhook not configured" }, 503); + + const rawBody = await c.req.text(); + const sigHeader = c.req.header("x-hub-signature-256") ?? ""; + if (!verifyWebhookSignature(rawBody, sigHeader, webhookSecret)) { + log.warn({ delivery: c.req.header("x-github-delivery") }, "github webhook signature failed"); + return c.json({ error: "bad signature" }, 401); + } + + const event = c.req.header("x-github-event") ?? ""; + let payload: WebhookPayload; + try { + payload = JSON.parse(rawBody) as WebhookPayload; + } catch { + return c.json({ error: "invalid json" }, 400); + } + + const delivery = c.req.header("x-github-delivery") ?? null; + try { + await handleWebhook(event, payload, delivery); + log.info( + { + event, + action: payload.action, + installation_id: payload.installation?.id, + delivery, + }, + "github webhook handled", + ); + } catch (err) { + log.error( + { + err, + event, + action: payload.action, + installation_id: payload.installation?.id, + }, + "webhook handler failed", + ); + // Let GitHub retry on transient failures. + return c.json({ error: "handler failed" }, 500); + } + return c.json({ ok: true }); + }); +} + +function resolveCallbackWebOrigin(c: Context, configuredWebOrigin: string): string { + const host = c.req.header("host") ?? ""; + if ( + host === "localhost:4100" || + host === "127.0.0.1:4100" || + configuredWebOrigin.endsWith(".superlog.localhost:1355") + ) { + return "http://localhost:5173"; + } + return configuredWebOrigin; +} + +type GhRepo = { id: number; full_name: string; private: boolean }; +export type StoredRepo = { id: number; fullName: string; private: boolean }; +type RepoAccess = { disabledRepoIds?: number[] }; +type GithubRepoSummary = StoredRepo & { enabled: boolean }; +type GithubInstallationReposResponse = { repositories: GhRepo[] }; +type GithubOAuthTokenResponse = { + access_token?: string; + token_type?: string; + scope?: string; + error?: string; + error_description?: string; +}; +type GithubViewerResponse = { + id: number; + login: string; + name: string | null; + email: string | null; + avatar_url: string | null; +}; +type GithubEmailResponse = { + email: string; + primary: boolean; + verified: boolean; + visibility: string | null; +}; +type GithubUserInstallation = { + id: number; + account: { login?: string; type?: string } | null; + html_url: string; + repository_selection: "all" | "selected"; + suspended_at: string | null; +}; +type GithubUserInstallationsResponse = { + installations: GithubUserInstallation[]; +}; +type GithubUserInstallationReposResponse = { + repositories: Array<{ id: number; full_name: string; private: boolean }>; +}; +type GithubInstallationSummary = { + installationId: number; + accountLogin: string | null; + accountType: string | null; + enabled: boolean; + manageUrl: string; + repos: GithubRepoSummary[]; +}; +type CommitAuthor = { + name: string; + email: string; + githubLogin: string; + githubId: number; + avatarUrl: string | null; +}; +type GhActor = { + login?: string; + id?: number; + avatar_url?: string | null; + type?: string; +} | null; +type WebhookPayload = { + action?: string; + installation?: { + id: number; + account?: { login?: string; type?: string }; + }; + repositories?: GhRepo[]; + repositories_added?: GhRepo[]; + repositories_removed?: GhRepo[]; + // pull_request events / pull_request_review / pull_request_review_comment + repository?: { full_name?: string }; + pull_request?: { + number?: number; + node_id?: string; + state?: string; + title?: string; + merged?: boolean; + merged_at?: string | null; + closed_at?: string | null; + merged_by?: GhActor; + user?: GhActor; + head?: { sha?: string; ref?: string }; + base?: { ref?: string }; + html_url?: string; + }; + // issue_comment (only PR if issue.pull_request present) + issue?: { + number?: number; + pull_request?: { url?: string }; + }; + comment?: { + id?: number; + body?: string; + user?: GhActor; + html_url?: string; + author_association?: string; + }; + review?: { + id?: number; + state?: string; + body?: string | null; + user?: GhActor; + html_url?: string; + author_association?: string; + }; + // push events + ref?: string; + after?: string; + before?: string; + pusher?: { name?: string; email?: string }; + sender?: GhActor; + commits?: Array<{ id?: string; message?: string; author?: { name?: string; email?: string } }>; +}; + +async function handleWebhook( + event: string, + payload: WebhookPayload, + delivery: string | null, +): Promise { + if ( + event === "pull_request" || + event === "pull_request_review" || + event === "pull_request_review_comment" || + event === "issue_comment" || + event === "push" + ) { + await handleAgentPrWebhook(event, payload, delivery); + return; + } + + const installationId = payload.installation?.id; + if (!installationId) return; + + if (event === "installation") { + const action = payload.action; + if (action === "created" || action === "new_permissions_accepted") { + await db + .update(schema.githubInstallations) + .set({ + accountLogin: payload.installation?.account?.login ?? null, + accountType: payload.installation?.account?.type ?? null, + repos: [], + revokedAt: null, + }) + .where(eq(schema.githubInstallations.installationId, installationId)); + await resumeBlockedAgentRunsForInstallation(installationId, "github_install"); + return; + } + if (action === "deleted" || action === "suspend") { + await db + .update(schema.githubInstallations) + .set({ revokedAt: new Date() }) + .where(eq(schema.githubInstallations.installationId, installationId)); + return; + } + if (action === "unsuspend") { + await db + .update(schema.githubInstallations) + .set({ revokedAt: null }) + .where(eq(schema.githubInstallations.installationId, installationId)); + await resumeBlockedAgentRunsForInstallation(installationId, "github_install"); + return; + } + return; + } + + if (event === "installation_repositories") { + const row = await db.query.githubInstallations.findFirst({ + where: eq(schema.githubInstallations.installationId, installationId), + }); + if (!row) return; + await db + .update(schema.githubInstallations) + .set({ + repos: [], + accountLogin: payload.installation?.account?.login ?? row.accountLogin, + accountType: payload.installation?.account?.type ?? row.accountType, + }) + .where(eq(schema.githubInstallations.installationId, installationId)); + if (payload.action === "added") { + await resumeBlockedAgentRunsForInstallation(installationId, "github_repos_added"); + } + } +} + +// Requeue any agentRuns sitting in `blocked_no_github` under the given +// project(s). Cheap and idempotent — single bulk UPDATE + batched event +// inserts. Callers: install webhook (resolves project IDs from +// installationId) and the OAuth install callback (knows projectId directly, +// avoids a webhook/callback race on first-time installs where the github +// installations row may not exist yet when the webhook arrives). +export async function resumeBlockedAgentRunsForProjects( + projectIds: string[], + trigger: "github_install" | "github_repos_added", +): Promise { + if (projectIds.length === 0) return; + const blocked = await db + .select({ id: schema.agentRuns.id }) + .from(schema.agentRuns) + .innerJoin(schema.incidents, eq(schema.incidents.id, schema.agentRuns.incidentId)) + .where( + and( + eq(schema.agentRuns.state, "blocked_no_github"), + inArray(schema.incidents.projectId, projectIds), + ), + ); + if (blocked.length === 0) return; + + const ids = blocked.map((row) => row.id); + const now = new Date(); + await db + .update(schema.agentRuns) + .set({ state: "queued", updatedAt: now }) + .where(inArray(schema.agentRuns.id, ids)); + await db + .insert(schema.incidentEvents) + .values( + ids.map((id) => ({ + agentRunId: id, + kind: "unblocked", + summary: "Investigation requeued.", + detail: { trigger }, + dedupeKey: `unblocked:${id}:${now.getTime()}`, + processedAt: now, + })), + ) + .onConflictDoNothing(); + log.info({ projectIds, trigger, count: ids.length }, "resumed blocked agent_runs"); +} + +// Org-scoped resume — fans out across every project in the org. Used for +// org-scoped installs where the install grants access to repos that any +// project can be wired up to. The optional `projectIdHint` is purely an +// optimisation: if the caller already knows one project should be revived, +// it's bundled into the same single query so we still issue one bulk update. +async function resumeBlockedAgentRunsForOrg( + orgId: string, + trigger: "github_install" | "github_repos_added", + opts: { projectIdHint?: string | null } = {}, +): Promise { + const orgProjects = await db.query.projects.findMany({ + where: eq(schema.projects.orgId, orgId), + columns: { id: true }, + }); + const projectIds = new Set(orgProjects.map((row) => row.id)); + if (opts.projectIdHint) projectIds.add(opts.projectIdHint); + if (projectIds.size === 0) return; + await resumeBlockedAgentRunsForProjects([...projectIds], trigger); +} + +async function resumeBlockedAgentRunsForInstallation( + installationId: number, + trigger: "github_install" | "github_repos_added", +): Promise { + const installs = await db.query.githubInstallations.findMany({ + where: and( + eq(schema.githubInstallations.installationId, installationId), + isNull(schema.githubInstallations.revokedAt), + ), + columns: { orgId: true, projectId: true }, + }); + if (installs.length === 0) return; + // Project-scoped installs grant access narrowly — fan out to that project + // only. Org-scoped installs (projectId null) can grant repos to any project + // in the org, so widen to every project under the org. + const directProjectIds = installs + .map((row) => row.projectId) + .filter((id): id is string => id !== null); + if (directProjectIds.length > 0) { + await resumeBlockedAgentRunsForProjects(directProjectIds, trigger); + } + const orgIdsForOrgScoped = Array.from( + new Set(installs.filter((row) => row.projectId === null).map((row) => row.orgId)), + ); + for (const orgId of orgIdsForOrgScoped) { + await resumeBlockedAgentRunsForOrg(orgId, trigger); + } +} + +async function handleAgentPrWebhook( + event: string, + payload: WebhookPayload, + delivery: string | null, +): Promise { + const repoFullName = payload.repository?.full_name; + if (!repoFullName) return; + + // Resolve which agent_pull_request row this event is about. + let prNumber: number | undefined; + if ( + event === "pull_request" || + event === "pull_request_review" || + event === "pull_request_review_comment" + ) { + prNumber = payload.pull_request?.number; + } else if (event === "issue_comment") { + if (!payload.issue?.pull_request) return; + prNumber = payload.issue.number; + } + // push: resolve by branch + let agentPrRow: schema.AgentPullRequest | undefined; + if (event === "push") { + const ref = payload.ref; + if (!ref?.startsWith("refs/heads/")) return; + const branch = ref.slice("refs/heads/".length); + agentPrRow = await db.query.agentPullRequests.findFirst({ + where: and( + eq(schema.agentPullRequests.repoFullName, repoFullName), + eq(schema.agentPullRequests.branchName, branch), + ), + }); + } else if (typeof prNumber === "number") { + agentPrRow = await db.query.agentPullRequests.findFirst({ + where: and( + eq(schema.agentPullRequests.repoFullName, repoFullName), + eq(schema.agentPullRequests.prNumber, prNumber), + ), + }); + } + if (!agentPrRow) return; + + // Capture human review comments as feedback. We surface this in + // /admin/feedback so we can hear about how our agent-opened PRs are + // landing with the people reviewing them. Bot comments (greptile and + // friends) and the GitHub "review submitted" envelope (which has its + // own dedicated state machine in describeAgentPrEvent) are skipped. + // + // Best-effort: don't let a feedback DB error cascade into a 500 that + // makes GitHub retry the whole delivery. A retry would re-run the + // agent_pr_events insert (idempotent via onConflictDoNothing) and the + // PR state update, but a partial state where the feedback row landed + // before the retry-triggering throw is exactly the kind of "I see the + // feedback but not the merge-resolved incident" inconsistency we want + // to avoid. Matches the wrapping pattern used for Slack feedback in + // apps/api/src/slack.ts. + await maybeRecordPrCommentFeedback({ event, payload, agentPrRow }).catch((err) => { + log.warn({ err, event, agent_pr_id: agentPrRow.id }, "pr comment feedback capture failed"); + }); + + const now = new Date(); + + // Update the parent row when this is a state-changing event. + if (event === "pull_request") { + const action = payload.action ?? ""; + const pr = payload.pull_request ?? {}; + let mergedResolution: { mergedAt: Date; mergedByLogin: string | null } | null = null; + const updates: Partial = { + lastSyncedAt: now, + updatedAt: now, + }; + if (pr.head?.sha) updates.headSha = pr.head.sha; + if (typeof pr.title === "string") updates.title = pr.title; + if (action === "closed") { + if (pr.merged) { + updates.state = "merged"; + if (pr.merged_at) updates.mergedAt = new Date(pr.merged_at); + updates.closedAt = pr.closed_at ? new Date(pr.closed_at) : now; + updates.mergedByLogin = pr.merged_by?.login ?? null; + updates.mergedByGithubId = pr.merged_by?.id ?? null; + mergedResolution = { + mergedAt: updates.mergedAt ?? updates.closedAt ?? now, + mergedByLogin: updates.mergedByLogin ?? null, + }; + } else { + updates.state = "closed"; + updates.closedAt = pr.closed_at ? new Date(pr.closed_at) : now; + } + } else if (action === "reopened") { + updates.state = "open"; + updates.closedAt = null; + } + await db + .update(schema.agentPullRequests) + .set(updates) + .where(eq(schema.agentPullRequests.id, agentPrRow.id)); + if (mergedResolution) { + await resolveIncidentForMergedAgentPr({ + agentPr: agentPrRow, + mergedAt: mergedResolution.mergedAt, + mergedByLogin: mergedResolution.mergedByLogin, + }); + } + } else if (event === "push") { + if (payload.after) { + await db + .update(schema.agentPullRequests) + .set({ headSha: payload.after, lastSyncedAt: now, updatedAt: now }) + .where(eq(schema.agentPullRequests.id, agentPrRow.id)); + } + } + + const { kind, summary, actor } = describeAgentPrEvent(event, payload); + if (!kind) return; + + await db + .insert(schema.agentPrEvents) + .values({ + agentPrId: agentPrRow.id, + kind, + summary, + actorLogin: actor?.login ?? null, + actorGithubId: actor?.id ?? null, + actorAvatarUrl: actor?.avatar_url ?? null, + payload: payload as unknown as Record, + providerEventId: delivery, + occurredAt: now, + }) + .onConflictDoNothing(); +} + +async function resolveIncidentForMergedAgentPr(opts: { + agentPr: schema.AgentPullRequest; + mergedAt: Date; + mergedByLogin: string | null; +}): Promise { + const { agentPr, mergedAt, mergedByLogin } = opts; + const { resolved } = await resolveIncident({ + incidentId: agentPr.incidentId, + kind: "agent_pr_merged", + reasonCode: "agent_pr_merged", + reasonText: `Resolved because agent PR #${agentPr.prNumber} (${agentPr.repoFullName}) was merged${ + mergedByLogin ? ` by @${mergedByLogin}` : "" + }.`, + agentRunId: agentPr.agentRunId, + eventSummary: `Incident resolved because PR #${agentPr.prNumber} was merged.`, + eventDetail: { + agentPrId: agentPr.id, + repoFullName: agentPr.repoFullName, + prNumber: agentPr.prNumber, + prUrl: agentPr.url, + mergedByLogin, + }, + eventDedupeKey: `incident_resolved:agent_pr:${agentPr.id}`, + resolvedAt: mergedAt, + }); + if (resolved) { + await runResolvedIncidentSideEffectsForIncident({ + incidentId: agentPr.incidentId, + closePullRequest: (pr) => + closeAgentPullRequestOnGithub({ + installationId: pr.githubInstallationId, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + }), + }); + } +} + +async function maybeRecordPrCommentFeedback(opts: { + event: string; + payload: WebhookPayload; + agentPrRow: schema.AgentPullRequest; +}): Promise { + const { event, payload, agentPrRow } = opts; + // Only the comment-bearing events count; PR open/close/merge has its + // own first-class handling and isn't user feedback. + let body: string | null = null; + let actor: GhActor = null; + let authorAssociation: string | null = null; + let commentUrl: string | null = null; + if (event === "issue_comment" && payload.action === "created") { + body = payload.comment?.body ?? null; + actor = payload.comment?.user ?? null; + authorAssociation = payload.comment?.author_association ?? null; + commentUrl = payload.comment?.html_url ?? null; + } else if (event === "pull_request_review_comment" && payload.action === "created") { + body = payload.comment?.body ?? null; + actor = payload.comment?.user ?? null; + authorAssociation = payload.comment?.author_association ?? null; + commentUrl = payload.comment?.html_url ?? null; + } else if (event === "pull_request_review" && payload.action === "submitted") { + body = payload.review?.body ?? null; + actor = payload.review?.user ?? null; + authorAssociation = payload.review?.author_association ?? null; + commentUrl = payload.review?.html_url ?? null; + } else { + return; + } + if (!body || body.trim().length === 0) return; + + // Skip our own footer echoed back by the GitHub UI — the PR description + // itself is rendered into comment-like contexts occasionally (e.g. the + // squashed merge commit message), and we don't want our own "leave + // feedback" link surfaced as feedback. + if (body.includes(FEEDBACK_PR_FOOTER_MARKER)) return; + + if ( + !isFeedbackEligibleCommenter({ + userType: actor?.type ?? null, + authorAssociation, + }) + ) { + return; + } + + // Resolve org + project via the agent PR's installation so the admin + // inbox can show which org's PR this feedback is on. + const install = await db.query.githubInstallations.findFirst({ + where: eq(schema.githubInstallations.id, agentPrRow.installationId), + }); + + // Best-effort idempotency: GitHub redelivers webhooks on failure (the + // outer handler returns 500 on its own catch path), so a single PR + // comment can hit us multiple times. The comment URL is a stable + // natural key — skip if we've already recorded feedback for it. Not a + // strict unique index because the dedupe window between delivery + // retries is minutes, not concurrent; a hard guarantee would need a + // unique partial index, which we may add later if duplicates show up. + if (commentUrl) { + const existing = await db.query.feedback.findFirst({ + where: and( + eq(schema.feedback.source, "pr_comment"), + sql`${schema.feedback.authorExternal}->>'githubCommentUrl' = ${commentUrl}`, + ), + columns: { id: true }, + }); + if (existing) return; + } + + await recordFeedback({ + kind: "pr", + refId: agentPrRow.id, + refRepo: agentPrRow.repoFullName, + source: "pr_comment", + body, + authorUserId: null, + authorExternal: { + githubLogin: actor?.login, + githubCommentUrl: commentUrl ?? undefined, + }, + orgId: install?.orgId ?? null, + projectId: install?.projectId ?? null, + }); +} + +function describeAgentPrEvent( + event: string, + payload: WebhookPayload, +): { kind: string | null; summary: string | null; actor: GhActor } { + if (event === "pull_request") { + const action = payload.action ?? ""; + const actor = payload.sender ?? payload.pull_request?.user ?? null; + if (action === "closed") { + const merged = payload.pull_request?.merged === true; + return { + kind: merged ? "pr_merged" : "pr_closed", + summary: merged ? "PR merged" : "PR closed", + actor: merged ? (payload.pull_request?.merged_by ?? actor) : actor, + }; + } + if (action === "reopened") return { kind: "pr_reopened", summary: "PR reopened", actor }; + if (action === "edited") return { kind: "pr_edited", summary: "PR edited", actor }; + if (action === "ready_for_review") { + return { kind: "pr_ready_for_review", summary: "Marked ready for review", actor }; + } + if (action === "converted_to_draft") { + return { kind: "pr_converted_to_draft", summary: "Converted to draft", actor }; + } + return { kind: null, summary: null, actor: null }; + } + if (event === "pull_request_review") { + if (payload.action !== "submitted") return { kind: null, summary: null, actor: null }; + const state = payload.review?.state ?? "commented"; + const summary = `Review submitted (${state})`; + return { + kind: `review_${state}`, + summary, + actor: payload.review?.user ?? payload.sender ?? null, + }; + } + if (event === "pull_request_review_comment") { + if (payload.action !== "created") return { kind: null, summary: null, actor: null }; + return { + kind: "review_comment", + summary: "Inline review comment", + actor: payload.comment?.user ?? payload.sender ?? null, + }; + } + if (event === "issue_comment") { + if (payload.action !== "created") return { kind: null, summary: null, actor: null }; + return { + kind: "issue_comment", + summary: "Comment on PR", + actor: payload.comment?.user ?? payload.sender ?? null, + }; + } + if (event === "push") { + const count = payload.commits?.length ?? 0; + return { + kind: "commit_pushed", + summary: `${count} commit${count === 1 ? "" : "s"} pushed`, + actor: payload.sender ?? null, + }; + } + return { kind: null, summary: null, actor: null }; +} + +function toStoredRepo(r: GhRepo): StoredRepo { + return { id: r.id, fullName: r.full_name, private: r.private }; +} + +// Upserts an installation row. Returns the row's PK id so callers can patch +// it (e.g. capture installer commit author). +// +// Both project- and org-scoped shapes use a partial unique index on the +// active rows for their respective key tuple. onConflict targets need the +// same WHERE clause as the index so postgres can match. +// +// The `set` payloads are effectively no-ops (any conflicting row already +// has revoked_at IS NULL by virtue of the partial-index WHERE clause; org_id +// is determined by project_id for the project-scoped case). They exist only +// because `DO UPDATE` makes RETURNING fire for the existing row, where +// `DO NOTHING` would return no row and force a second SELECT to get the id. +async function upsertInstallation(args: { + orgId: string; + projectId: string | null; + installationId: number; +}): Promise { + if (args.projectId) { + const [row] = await db + .insert(schema.githubInstallations) + .values({ + orgId: args.orgId, + projectId: args.projectId, + installationId: args.installationId, + }) + .onConflictDoUpdate({ + target: [schema.githubInstallations.projectId, schema.githubInstallations.installationId], + targetWhere: sql`project_id IS NOT NULL AND revoked_at IS NULL`, + set: { orgId: args.orgId, revokedAt: null }, + }) + .returning({ id: schema.githubInstallations.id }); + if (!row) throw new Error("upsert returned no row"); + return row.id; + } + const [row] = await db + .insert(schema.githubInstallations) + .values({ + orgId: args.orgId, + projectId: null, + installationId: args.installationId, + }) + .onConflictDoUpdate({ + target: [schema.githubInstallations.orgId, schema.githubInstallations.installationId], + targetWhere: sql`project_id IS NULL AND revoked_at IS NULL`, + set: { revokedAt: null }, + }) + .returning({ id: schema.githubInstallations.id }); + if (!row) throw new Error("insert returned no row"); + return row.id; +} + +async function maybeCaptureInstallerIdentity(opts: { + installationRowId: string; + installationId: number; + oauthCode: string | null; + clientId: string | undefined; + clientSecret: string | undefined; + redirectUrl: string; +}): Promise { + if (!opts.oauthCode || !opts.clientId || !opts.clientSecret) return; + try { + const token = await exchangeGithubOAuthCode({ + clientId: opts.clientId, + clientSecret: opts.clientSecret, + code: opts.oauthCode, + redirectUrl: opts.redirectUrl, + }); + const author = await fetchCommitAuthor(token); + await db + .update(schema.githubInstallations) + .set({ + commitAuthorName: author.name, + commitAuthorEmail: author.email, + commitAuthorGithubLogin: author.githubLogin, + commitAuthorGithubId: author.githubId, + commitAuthorAvatarUrl: author.avatarUrl, + commitAuthorSetAt: new Date(), + }) + .where(eq(schema.githubInstallations.id, opts.installationRowId)); + log.info( + { + installation_row_id: opts.installationRowId, + installation_id: opts.installationId, + github_login: author.githubLogin, + }, + "captured installer commit author from install OAuth", + ); + } catch (err) { + log.warn( + { err, installation_row_id: opts.installationRowId, installation_id: opts.installationId }, + "failed to capture installer commit author; falling back to default", + ); + } +} + +function verifyWebhookSignature(body: string, header: string, secret: string): boolean { + if (!header.startsWith("sha256=")) return false; + const provided = Buffer.from(header.slice("sha256=".length), "hex"); + const expected = crypto.createHmac("sha256", secret).update(body).digest(); + if (provided.length !== expected.length) return false; + return crypto.timingSafeEqual(provided, expected); +} + +function getGithubAppConfig(): { appId: string; privateKey: string } | null { + const appId = process.env.GITHUB_APP_ID?.trim(); + const privateKey = + process.env.GITHUB_APP_PRIVATE_KEY?.replace(/\\n/g, "\n") ?? + (process.env.GITHUB_APP_PRIVATE_KEY_BASE64 + ? Buffer.from(process.env.GITHUB_APP_PRIVATE_KEY_BASE64, "base64").toString("utf8") + : undefined); + if (!appId || !privateKey) return null; + return { appId, privateKey }; +} + +function signGithubAppJwt(appId: string, privateKey: string): string { + const now = Math.floor(Date.now() / 1000); + const header = Buffer.from(JSON.stringify({ alg: "RS256", typ: "JWT" })).toString("base64url"); + const payload = Buffer.from( + JSON.stringify({ + iat: now - 60, + exp: now + 9 * 60, + iss: appId, + }), + ).toString("base64url"); + const signingInput = `${header}.${payload}`; + const signature = crypto.sign("RSA-SHA256", Buffer.from(signingInput), privateKey); + return `${signingInput}.${signature.toString("base64url")}`; +} + +async function githubRequest(pathname: string, bearerToken: string): Promise { + const res = await fetch(`https://api.github.com${pathname}`, { + headers: { + accept: "application/vnd.github+json", + authorization: `Bearer ${bearerToken}`, + "x-github-api-version": "2022-11-28", + "user-agent": "superlog-api", + }, + }); + if (!res.ok) { + const text = await res.text().catch(() => ""); + throw new Error(`github GET ${pathname} failed: ${res.status} ${text}`); + } + return (await res.json()) as T; +} + +type GithubPermission = "read" | "write"; + +async function createInstallationToken(opts: { + installationId: number; + permissions: Record; +}): Promise { + const cfg = getGithubAppConfig(); + if (!cfg) throw new Error("GITHUB_APP_ID and GITHUB_APP_PRIVATE_KEY are required"); + const appJwt = signGithubAppJwt(cfg.appId, cfg.privateKey); + const res = await fetch( + `https://api.github.com/app/installations/${opts.installationId}/access_tokens`, + { + method: "POST", + headers: { + accept: "application/vnd.github+json", + authorization: `Bearer ${appJwt}`, + "content-type": "application/json; charset=utf-8", + "x-github-api-version": "2022-11-28", + "user-agent": "superlog-api", + }, + body: JSON.stringify({ permissions: opts.permissions }), + }, + ); + if (!res.ok) { + const text = await res.text().catch(() => ""); + throw new Error( + `github POST /app/installations/${opts.installationId}/access_tokens failed: ${res.status} ${text}`, + ); + } + const data = (await res.json()) as { token: string }; + return data.token; +} + +async function createInstallationReadToken(installationId: number): Promise { + return createInstallationToken({ installationId, permissions: { contents: "read" } }); +} + +async function createInstallationWriteToken(installationId: number): Promise { + return createInstallationToken({ + installationId, + permissions: { contents: "write", pull_requests: "write" }, + }); +} + +export async function mergeGithubPullRequest(opts: { + installationId: number; + repoFullName: string; + prNumber: number; + method: "squash" | "merge" | "rebase"; +}): Promise<{ sha: string | null }> { + const token = await createInstallationWriteToken(opts.installationId); + const res = await fetch( + `https://api.github.com/repos/${opts.repoFullName}/pulls/${opts.prNumber}/merge`, + { + method: "PUT", + headers: { + accept: "application/vnd.github+json", + authorization: `Bearer ${token}`, + "content-type": "application/json; charset=utf-8", + "x-github-api-version": "2022-11-28", + "user-agent": "superlog-api", + }, + body: JSON.stringify({ merge_method: opts.method }), + }, + ); + if (!res.ok) { + const text = await res.text().catch(() => ""); + throw new Error(`github PUT /pulls/${opts.prNumber}/merge failed: ${res.status} ${text}`); + } + const body = (await res.json().catch(() => ({}))) as { sha?: string }; + return { sha: body.sha ?? null }; +} + +export async function closeAgentPullRequestOnGithub(opts: { + installationId: number; + repoFullName: string; + prNumber: number; +}): Promise<{ ok: true } | { ok: false; error: string }> { + try { + const token = await createInstallationWriteToken(opts.installationId); + const res = await fetch( + `https://api.github.com/repos/${opts.repoFullName}/pulls/${opts.prNumber}`, + { + method: "PATCH", + headers: { + accept: "application/vnd.github+json", + authorization: `Bearer ${token}`, + "content-type": "application/json; charset=utf-8", + "x-github-api-version": "2022-11-28", + "user-agent": "superlog-api", + }, + body: JSON.stringify({ state: "closed" }), + }, + ); + if (res.ok) return { ok: true }; + const text = await res.text().catch(() => ""); + return { ok: false, error: `github PATCH /pulls/${opts.prNumber} ${res.status} ${text}` }; + } catch (err) { + return { ok: false, error: err instanceof Error ? err.message : String(err) }; + } +} + +// Safety ceiling on paginated GitHub list calls: 100 pages × 100 per page = +// 10k items. High enough to cover every realistic repo/branch count while +// still bounding the loop so a pathological account can't spin it forever. +const GITHUB_LIST_MAX_PAGES = 100; + +export async function listCurrentInstallationRepos(installationId: number): Promise { + const token = await createInstallationReadToken(installationId); + const repos: StoredRepo[] = []; + let page = 1; + for (; page <= GITHUB_LIST_MAX_PAGES; page += 1) { + const data = await githubRequest( + `/installation/repositories?per_page=100&page=${page}`, + token, + ); + repos.push(...data.repositories.map(toStoredRepo)); + if (data.repositories.length < 100) break; + } + if (page > GITHUB_LIST_MAX_PAGES) { + log.warn( + { installationId, cap: GITHUB_LIST_MAX_PAGES * 100 }, + "installation repo list hit the pagination cap; results may be truncated", + ); + } + return repos; +} + +// Direct, O(1) repo lookup that doesn't depend on paginating the install's +// full repo list. Used by the management-API grant flow: a 1000+ repo install +// would otherwise silently 404 anything past page 10 of the list. Returns +// null if the install's token can't see this repo (i.e. not covered). +export async function fetchInstallationRepoById( + installationId: number, + repoId: number, +): Promise { + const token = await createInstallationReadToken(installationId); + try { + const data = await githubRequest<{ id: number; full_name: string; private: boolean }>( + `/repositories/${repoId}`, + token, + ); + return { id: data.id, fullName: data.full_name, private: data.private }; + } catch (err) { + if ( + err instanceof Error && + (err.message.includes("failed: 404") || err.message.includes("failed: 403")) + ) { + return null; + } + throw err; + } +} + +async function fetchRepoBranchInfo( + installationId: number, + repoFullName: string, +): Promise { + const token = await createInstallationReadToken(installationId); + const repo = await githubRequest<{ default_branch?: string }>(`/repos/${repoFullName}`, token); + const branches: string[] = []; + let page = 1; + for (; page <= GITHUB_LIST_MAX_PAGES; page += 1) { + const data = await githubRequest<{ name: string }[]>( + `/repos/${repoFullName}/branches?per_page=100&page=${page}`, + token, + ); + branches.push(...data.map((b) => b.name)); + if (data.length < 100) break; + } + if (page > GITHUB_LIST_MAX_PAGES) { + log.warn( + { repo: repoFullName, cap: GITHUB_LIST_MAX_PAGES * 100 }, + "repo branch list hit the pagination cap; results may be truncated", + ); + } + return { defaultBranch: repo.default_branch ?? null, branches }; +} + +// Lists the branch set the agent could target for a project: the union of +// branches across every enabled repo the project's GitHub installation(s) can +// reach. `errored` is true when there were repos to inspect but every lookup +// failed (token/network), so callers can disable the picker instead of +// pretending the repo simply has no branches. +export async function listProjectRepoBranches( + projectId: string, +): Promise<{ branches: RepoBranch[]; errored: boolean }> { + const accessible = await listAccessibleGithubInstallsForProject(projectId); + const perRepo: RepoBranchInfo[] = []; + const seenRepos = new Set(); + let sawError = false; + for (const { installation: row, allowedRepoIds } of accessible) { + if (!row.agentEnabled) continue; + let repos: StoredRepo[]; + try { + repos = await listCurrentInstallationRepos(row.installationId); + } catch (err) { + sawError = true; + log.warn( + { err, projectId, installationId: row.installationId }, + "github repository listing failed while loading branches", + ); + continue; + } + const grantSet = allowedRepoIds === null ? null : new Set(allowedRepoIds); + const repoAccess = normalizeRepoAccess(row.repoAccess); + for (const repo of repos) { + if (grantSet && !grantSet.has(repo.id)) continue; + if (!isRepoEnabled(repoAccess, repo.id)) continue; + if (seenRepos.has(repo.fullName)) continue; + seenRepos.add(repo.fullName); + try { + perRepo.push(await fetchRepoBranchInfo(row.installationId, repo.fullName)); + } catch (err) { + sawError = true; + log.warn({ err, projectId, repo: repo.fullName }, "github branch listing failed for repo"); + } + } + } + // Distinguish "GitHub call failed" from "project genuinely has no branches": + // only flag errored when something broke AND we produced nothing, so a + // partial failure still returns the branches we did manage to load. + return { branches: mergeRepoBranches(perRepo), errored: sawError && perRepo.length === 0 }; +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountGithubAuthed(app: Hono): void { + const appSlug = process.env.GITHUB_APP_SLUG; + const oauthClientId = + process.env.GITHUB_OAUTH_CLIENT_ID ?? + process.env.GITHUB_APP_CLIENT_ID ?? + process.env.GITHUB_CLIENT_ID; + const oauthClientSecret = + process.env.GITHUB_OAUTH_CLIENT_SECRET ?? + process.env.GITHUB_APP_CLIENT_SECRET ?? + process.env.GITHUB_CLIENT_SECRET; + const stateSecret = process.env.STATE_SIGNING_SECRET; + const authorRedirectUrl = + process.env.GITHUB_AUTHOR_OAUTH_REDIRECT_URL ?? + `${process.env.BETTER_AUTH_URL ?? "http://localhost:4100"}/github/author/callback`; + + async function resolveActiveContext( + userId: string | undefined, + preferredOrgId?: string | null, + ): Promise<{ orgId: string; projectId: string } | null> { + if (!userId) return null; + const ctx = await resolveActiveOrgContext({ + userId, + preferredOrgId: preferredOrgId ?? null, + }).catch(() => null); + if (!ctx) return null; + return { orgId: ctx.org.id, projectId: ctx.project.id }; + } + + app.get("/api/github/installation", async (c) => { + const active = await resolveActiveContext( + c.var.userId as string | undefined, + c.var.orgId as string | null | undefined, + ); + if (!active) return c.json({ installed: false }); + + const accessible = await listAccessibleGithubInstallsForProject(active.projectId); + if (accessible.length === 0) return c.json({ installed: false }); + + const installations: GithubInstallationSummary[] = []; + let repoVerificationUnavailable = false; + for (const { installation: row, allowedRepoIds } of accessible) { + let repos = Array.isArray(row.repos) ? (row.repos as StoredRepo[]) : []; + try { + repos = await listCurrentInstallationRepos(row.installationId); + } catch (err) { + log.warn( + { err, projectId: active.projectId, installationId: row.installationId }, + "github repository listing failed", + ); + if ( + err instanceof Error && + err.message.includes("GITHUB_APP_ID and GITHUB_APP_PRIVATE_KEY") + ) { + repoVerificationUnavailable = true; + } + if (isMissingGithubInstallation(err)) { + await db + .update(schema.githubInstallations) + .set({ revokedAt: new Date() }) + .where(eq(schema.githubInstallations.id, row.id)); + continue; + } + } + const repoAccess = normalizeRepoAccess(row.repoAccess); + // Granted org-scoped installs are restricted to the project's allowed + // repo set; project-owned installs see everything in the install. + const grantSet = allowedRepoIds === null ? null : new Set(allowedRepoIds); + const scopedRepos = grantSet === null ? repos : repos.filter((repo) => grantSet.has(repo.id)); + installations.push({ + installationId: row.installationId, + accountLogin: row.accountLogin, + accountType: row.accountType, + enabled: row.agentEnabled, + manageUrl: githubInstallationManageUrl(row), + repos: scopedRepos.map((repo) => ({ + ...repo, + enabled: isRepoEnabled(repoAccess, repo.id), + })), + }); + } + if (installations.length === 0) return c.json({ installed: false }); + + const authorRow = accessible + .map(({ installation }) => installation) + .find((row) => row.commitAuthorName && row.commitAuthorEmail); + const repos = dedupeRepoSummaries( + installations.flatMap((installation) => + installation.repos.map((repo) => ({ + ...repo, + enabled: installation.enabled && repo.enabled, + })), + ), + ); + const firstInstallation = installations[0]; + if (!firstInstallation) return c.json({ installed: false }); + return c.json({ + installed: true, + installationId: firstInstallation.installationId, + accountLogin: firstInstallation.accountLogin, + manageUrl: firstInstallation.manageUrl, + repoVerificationUnavailable, + installations, + repos, + commitAuthor: + authorRow?.commitAuthorName && authorRow.commitAuthorEmail + ? { + source: "github_user", + name: authorRow.commitAuthorName, + email: authorRow.commitAuthorEmail, + githubLogin: authorRow.commitAuthorGithubLogin, + githubId: authorRow.commitAuthorGithubId, + avatarUrl: authorRow.commitAuthorAvatarUrl, + setAt: authorRow.commitAuthorSetAt?.toISOString() ?? null, + } + : { + source: "app", + name: DEFAULT_COMMIT_AUTHOR.name, + email: DEFAULT_COMMIT_AUTHOR.email, + githubLogin: null, + githubId: null, + avatarUrl: null, + setAt: null, + }, + }); + }); + + app.post("/api/github/skip", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + await db + .update(schema.orgs) + .set({ githubSetupSkippedAt: new Date() }) + .where(eq(schema.orgs.id, ctx.orgId)); + return c.json({ ok: true, orgId: ctx.orgId }); + }); + + // Lands here after Better Auth completes GitHub OAuth. If the user's org + // already has a GitHub App install we redirect back to the web app; if not, + // we kick off the App install flow inline so signing in with GitHub + // doubles as installing the App. The callbackURL passed from the web + // client points at this endpoint; the cookie session is set by Better Auth + // before the redirect lands here so `c.var.userId` is populated by the + // /api/* middleware. + app.get("/api/github/post-signin", async (c) => { + const webOrigin = process.env.WEB_ORIGIN ?? "http://localhost:5173"; + const active = await resolveActiveContext( + c.var.userId as string | undefined, + c.var.orgId as string | null | undefined, + ); + if (!active) return c.redirect(`${webOrigin}/`, 302); + + const installs = await listAccessibleGithubInstallsForProject(active.projectId); + if (installs.length > 0) return c.redirect(`${webOrigin}/`, 302); + + if (!appSlug || !stateSecret) { + // GitHub app not configured in this env — just send the user home so + // they aren't stuck on a blank page. + return c.redirect(`${webOrigin}/`, 302); + } + const state = signState("web", active.projectId, stateSecret); + const url = new URL(`https://github.com/apps/${appSlug}/installations/new`); + url.searchParams.set("state", state); + return c.redirect(url.toString(), 302); + }); + + app.post("/api/github/install-url", async (c) => { + if (!appSlug || !stateSecret) { + return c.json({ error: "github app not configured" }, 503); + } + const active = await resolveActiveContext( + c.var.userId as string | undefined, + c.var.orgId as string | null | undefined, + ); + if (!active) return c.json({ error: "no org for user" }, 404); + + // "web" state value is now the projectId; the callback resolves the org + // from the project row. + const state = signState("web", active.projectId, stateSecret); + const url = new URL(`https://github.com/apps/${appSlug}/installations/new`); + url.searchParams.set("state", state); + log.info( + { org_id: active.orgId, project_id: active.projectId, app_slug: appSlug }, + "github install url created", + ); + return c.json({ url: url.toString() }); + }); + + app.post("/api/github/repo-access", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + + const body = (await c.req.json().catch(() => null)) as { + installationId?: unknown; + enabled?: unknown; + repoId?: unknown; + repoEnabled?: unknown; + } | null; + const installationId = Number(body?.installationId); + if (!Number.isFinite(installationId) || installationId <= 0) { + return c.json({ error: "invalid installation id" }, 400); + } + + const row = await db.query.githubInstallations.findFirst({ + where: and( + eq(schema.githubInstallations.projectId, ctx.projectId), + eq(schema.githubInstallations.installationId, installationId), + isNull(schema.githubInstallations.revokedAt), + ), + }); + if (!row) return c.json({ error: "github installation not found" }, 404); + + const patch: { + agentEnabled?: boolean; + repoAccess?: RepoAccess; + } = {}; + if (typeof body?.enabled === "boolean") { + patch.agentEnabled = body.enabled; + } + if (body?.repoId !== undefined || body?.repoEnabled !== undefined) { + const repoId = Number(body?.repoId); + if (!Number.isFinite(repoId) || repoId <= 0 || typeof body?.repoEnabled !== "boolean") { + return c.json({ error: "invalid repo access update" }, 400); + } + patch.repoAccess = setRepoEnabled(row.repoAccess, repoId, body.repoEnabled); + } + if (Object.keys(patch).length === 0) { + return c.json({ error: "no repo access change provided" }, 400); + } + + await db + .update(schema.githubInstallations) + .set(patch) + .where(eq(schema.githubInstallations.id, row.id)); + return c.json({ ok: true }); + }); + + app.post("/api/github/author-login-url", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + + if (!oauthClientId || !oauthClientSecret || !stateSecret) { + if (!appSlug || !stateSecret) { + return c.json({ error: "github oauth not configured" }, 503); + } + log.warn( + { org_id: ctx.orgId, project_id: ctx.projectId }, + "github oauth not configured; falling back to app installation flow", + ); + const state = signState("web", ctx.projectId, stateSecret); + const url = new URL(`https://github.com/apps/${appSlug}/installations/new`); + url.searchParams.set("state", state); + return c.json({ url: url.toString() }); + } + + const state = signAuthorState( + { orgId: ctx.orgId, projectId: ctx.projectId, userId: ctx.userId, purpose: "author" }, + stateSecret, + ); + const url = new URL("https://github.com/login/oauth/authorize"); + url.searchParams.set("client_id", oauthClientId); + url.searchParams.set("redirect_uri", authorRedirectUrl); + url.searchParams.set("scope", "read:user user:email"); + url.searchParams.set("state", state); + return c.json({ url: url.toString() }); + }); + + app.post("/api/github/access-login-url", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + + if (!oauthClientId || !oauthClientSecret || !stateSecret) { + if (!appSlug || !stateSecret) { + return c.json({ error: "github oauth not configured" }, 503); + } + log.warn( + { org_id: ctx.orgId, project_id: ctx.projectId }, + "github oauth not configured; falling back to app installation flow", + ); + const state = signState("web", ctx.projectId, stateSecret); + const url = new URL(`https://github.com/apps/${appSlug}/installations/new`); + url.searchParams.set("state", state); + return c.json({ url: url.toString() }); + } + + const state = signAuthorState( + { orgId: ctx.orgId, projectId: ctx.projectId, userId: ctx.userId, purpose: "access" }, + stateSecret, + ); + const url = new URL("https://github.com/login/oauth/authorize"); + url.searchParams.set("client_id", oauthClientId); + url.searchParams.set("redirect_uri", authorRedirectUrl); + url.searchParams.set("scope", "read:user user:email"); + url.searchParams.set("state", state); + return c.json({ url: url.toString() }); + }); + + app.post("/api/github/commit-author/reset", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + + await db + .update(schema.githubInstallations) + .set({ + commitAuthorName: null, + commitAuthorEmail: null, + commitAuthorGithubLogin: null, + commitAuthorGithubId: null, + commitAuthorAvatarUrl: null, + commitAuthorSetByUserId: null, + commitAuthorSetAt: null, + }) + .where( + and( + eq(schema.githubInstallations.projectId, ctx.projectId), + isNull(schema.githubInstallations.revokedAt), + ), + ); + return c.json({ ok: true }); + }); +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountGithubAuthorOAuth(app: Hono): void { + const clientId = + process.env.GITHUB_OAUTH_CLIENT_ID ?? + process.env.GITHUB_APP_CLIENT_ID ?? + process.env.GITHUB_CLIENT_ID; + const clientSecret = + process.env.GITHUB_OAUTH_CLIENT_SECRET ?? + process.env.GITHUB_APP_CLIENT_SECRET ?? + process.env.GITHUB_CLIENT_SECRET; + const redirectUrl = + process.env.GITHUB_AUTHOR_OAUTH_REDIRECT_URL ?? + `${process.env.BETTER_AUTH_URL ?? "http://localhost:4100"}/github/author/callback`; + const stateSecret = process.env.STATE_SIGNING_SECRET; + const webOrigin = process.env.WEB_ORIGIN ?? "http://localhost:5173"; + + if (!clientId || !clientSecret) { + log.warn("GITHUB_OAUTH_CLIENT_ID/SECRET not set — /github/author/callback disabled"); + } + + app.get("/github/author/callback", async (c) => { + if (!clientId || !clientSecret || !stateSecret) { + return c.json({ error: "github oauth not configured" }, 503); + } + const err = c.req.query("error"); + if (err) return c.redirect(`${webOrigin}/settings?github_author=denied`, 302); + + const code = c.req.query("code"); + const state = c.req.query("state") ?? ""; + if (!code) return c.redirect(`${webOrigin}/settings?github_author=error`, 302); + + const decoded = verifyAuthorState(state, stateSecret); + if (!decoded) return c.json({ error: "invalid state" }, 400); + + let token: string; + try { + token = await exchangeGithubOAuthCode({ clientId, clientSecret, code, redirectUrl }); + } catch (e) { + log.error({ err: e, org_id: decoded.orgId }, "github author oauth exchange failed"); + return c.redirect(`${webOrigin}/settings?github_author=error`, 302); + } + + let author: CommitAuthor | null = null; + let installations: GithubUserInstallation[]; + let reposByInstallation: Map; + try { + [author, installations] = + decoded.purpose === "author" + ? await Promise.all([fetchCommitAuthor(token), listUserAccessibleInstallations(token)]) + : [null, await listUserAccessibleInstallations(token)]; + reposByInstallation = new Map( + await Promise.all( + installations.map( + async (installation) => + [installation.id, await listUserAccessibleRepos(token, installation.id)] as const, + ), + ), + ); + } catch (e) { + log.error({ err: e, org_id: decoded.orgId }, "github author fetch failed"); + return c.redirect(`${webOrigin}/settings?github_author=error`, 302); + } + + if (installations.length === 0) { + log.info( + { org_id: decoded.orgId, user_id: decoded.userId, github_login: author?.githubLogin }, + "github oauth connected but no accessible app installation found", + ); + const param = decoded.purpose === "author" ? "github_author" : "github"; + return c.redirect(`${webOrigin}/settings?${param}=no_install`, 302); + } + + const upserted = await db.transaction(async (tx) => { + const rows: Array<{ id: string }> = []; + for (const installation of installations) { + const repos = reposByInstallation.get(installation.id) ?? []; + const inserted = await tx + .insert(schema.githubInstallations) + .values({ + orgId: decoded.orgId, + projectId: decoded.projectId, + installationId: installation.id, + accountLogin: installation.account?.login ?? null, + accountType: installation.account?.type ?? null, + repos, + ...(author + ? { + commitAuthorName: author.name, + commitAuthorEmail: author.email, + commitAuthorGithubLogin: author.githubLogin, + commitAuthorGithubId: author.githubId, + commitAuthorAvatarUrl: author.avatarUrl, + commitAuthorSetByUserId: decoded.userId, + commitAuthorSetAt: new Date(), + } + : {}), + revokedAt: null, + }) + .onConflictDoUpdate({ + target: [ + schema.githubInstallations.projectId, + schema.githubInstallations.installationId, + ], + targetWhere: sql`project_id IS NOT NULL AND revoked_at IS NULL`, + set: { + orgId: decoded.orgId, + accountLogin: installation.account?.login ?? null, + accountType: installation.account?.type ?? null, + repos, + ...(author + ? { + commitAuthorName: author.name, + commitAuthorEmail: author.email, + commitAuthorGithubLogin: author.githubLogin, + commitAuthorGithubId: author.githubId, + commitAuthorAvatarUrl: author.avatarUrl, + commitAuthorSetByUserId: decoded.userId, + commitAuthorSetAt: new Date(), + } + : {}), + revokedAt: null, + }, + }) + .returning({ id: schema.githubInstallations.id }); + rows.push(...inserted); + } + if (author) { + await tx + .update(schema.githubInstallations) + .set({ + commitAuthorName: author.name, + commitAuthorEmail: author.email, + commitAuthorGithubLogin: author.githubLogin, + commitAuthorGithubId: author.githubId, + commitAuthorAvatarUrl: author.avatarUrl, + commitAuthorSetByUserId: decoded.userId, + commitAuthorSetAt: new Date(), + }) + .where( + and( + eq(schema.githubInstallations.projectId, decoded.projectId), + isNull(schema.githubInstallations.revokedAt), + ), + ); + } + return rows; + }); + + log.info( + { + org_id: decoded.orgId, + user_id: decoded.userId, + github_login: author?.githubLogin, + purpose: decoded.purpose, + installation_ids: installations.map((installation) => installation.id), + installation_row_ids: upserted.map((row) => row.id), + }, + "github installations reconciled from user oauth", + ); + void syncLoopsContactsForOrg({ orgId: decoded.orgId, appUrl: webOrigin }).catch((err) => { + log.warn({ err, org_id: decoded.orgId }, "loops contact sync failed after github connect"); + }); + if (decoded.purpose === "author") { + return c.redirect(`${webOrigin}/settings?github_author=connected`, 302); + } + // access flow: send back to root so the gate can pick up and show onboarding + return c.redirect(`${webOrigin}/`, 302); + }); +} + +async function exchangeGithubOAuthCode(opts: { + clientId: string; + clientSecret: string; + code: string; + redirectUrl: string; +}): Promise { + const res = await fetch("https://github.com/login/oauth/access_token", { + method: "POST", + headers: { + accept: "application/json", + "content-type": "application/json", + "user-agent": "superlog-api", + }, + body: JSON.stringify({ + client_id: opts.clientId, + client_secret: opts.clientSecret, + code: opts.code, + redirect_uri: opts.redirectUrl, + }), + }); + const data = (await res.json()) as GithubOAuthTokenResponse; + if (!res.ok || !data.access_token) { + throw new Error(data.error_description ?? data.error ?? `github oauth failed: ${res.status}`); + } + return data.access_token; +} + +async function githubUserRequest(pathname: string, token: string): Promise { + const res = await fetch(`https://api.github.com${pathname}`, { + headers: { + accept: "application/vnd.github+json", + authorization: `Bearer ${token}`, + "x-github-api-version": "2022-11-28", + "user-agent": "superlog-api", + }, + }); + if (!res.ok) { + const text = await res.text().catch(() => ""); + throw new Error(`github GET ${pathname} failed: ${res.status} ${text}`); + } + return (await res.json()) as T; +} + +async function fetchCommitAuthor(token: string): Promise { + const viewer = await githubUserRequest("/user", token); + let emails: GithubEmailResponse[] = []; + try { + emails = await githubUserRequest("/user/emails", token); + } catch (err) { + log.warn( + { err, github_login: viewer.login }, + "github user emails unavailable; falling back to profile or noreply email", + ); + } + const selectedEmail = + emails.find((email) => email.primary && email.verified)?.email ?? + emails.find((email) => email.verified)?.email ?? + viewer.email ?? + `${viewer.id}+${viewer.login}@users.noreply.github.com`; + const name = sanitizeGitName(viewer.name ?? viewer.login); + const email = sanitizeGitEmail(selectedEmail); + if (!name || !email) throw new Error("github profile did not provide a usable git identity"); + return { + name, + email, + githubLogin: viewer.login, + githubId: viewer.id, + avatarUrl: viewer.avatar_url, + }; +} + +async function listUserAccessibleInstallations(token: string): Promise { + const installs: GithubUserInstallation[] = []; + for (let page = 1; page <= 10; page += 1) { + const data = await githubUserRequest( + `/user/installations?per_page=100&page=${page}`, + token, + ); + installs.push(...data.installations); + if (data.installations.length < 100) break; + } + + return installs.filter((installation) => !installation.suspended_at); +} + +function githubInstallationManageUrl(installation: { + installationId: number; + accountLogin: string | null; + accountType: string | null; +}): string { + if (installation.accountType === "Organization" && installation.accountLogin) { + return `https://github.com/organizations/${installation.accountLogin}/settings/installations/${installation.installationId}`; + } + return `https://github.com/settings/installations/${installation.installationId}`; +} + +function isMissingGithubInstallation(err: unknown): boolean { + return err instanceof Error && err.message.includes("failed: 404"); +} + +function normalizeRepoAccess(value: unknown): RepoAccess { + if (!value || typeof value !== "object") return {}; + const disabledRepoIds = (value as RepoAccess).disabledRepoIds; + if (!Array.isArray(disabledRepoIds)) return {}; + return { + disabledRepoIds: [ + ...new Set(disabledRepoIds.filter((id): id is number => Number.isFinite(id) && id > 0)), + ], + }; +} + +function isRepoEnabled(repoAccess: RepoAccess, repoId: number): boolean { + return !(repoAccess.disabledRepoIds ?? []).includes(repoId); +} + +function setRepoEnabled(value: unknown, repoId: number, enabled: boolean): RepoAccess { + const repoAccess = normalizeRepoAccess(value); + const disabled = new Set(repoAccess.disabledRepoIds ?? []); + if (enabled) { + disabled.delete(repoId); + } else { + disabled.add(repoId); + } + return { disabledRepoIds: [...disabled].sort((a, b) => a - b) }; +} + +function dedupeRepoSummaries(repos: GithubRepoSummary[]): GithubRepoSummary[] { + const seen = new Set(); + const deduped: GithubRepoSummary[] = []; + for (const repo of repos) { + const existing = deduped.find((item) => item.fullName === repo.fullName); + if (existing) { + existing.enabled = existing.enabled || repo.enabled; + continue; + } + if (!seen.has(repo.fullName)) { + seen.add(repo.fullName); + deduped.push({ ...repo }); + } + } + return deduped; +} + +async function listUserAccessibleRepos( + token: string, + installationId: number, +): Promise { + const repos: StoredRepo[] = []; + for (let page = 1; page <= 10; page += 1) { + const data = await githubUserRequest( + `/user/installations/${installationId}/repositories?per_page=100&page=${page}`, + token, + ); + repos.push(...data.repositories.map(toStoredRepo)); + if (data.repositories.length < 100) break; + } + return repos; +} + +function sanitizeGitName(value: string): string | null { + const cleaned = value + .replace(/[\r\n<>]/g, " ") + .replace(/\s+/g, " ") + .trim(); + return cleaned || null; +} + +function sanitizeGitEmail(value: string): string | null { + const cleaned = value.trim(); + if (!cleaned || /[\r\n<>]/.test(cleaned) || !cleaned.includes("@")) return null; + return cleaned; +} + +async function resolveUserOrg( + c: Context<{ Variables: Vars }>, +): Promise<{ userId: string; orgId: string; projectId: string } | null> { + const userId = c.var.userId as string | undefined; + if (!userId) return null; + const ctx = await resolveActiveOrgContext({ + userId, + preferredOrgId: c.var.orgId as string | null | undefined, + }).catch(() => null); + if (!ctx) return null; + return { userId: ctx.user.id, orgId: ctx.org.id, projectId: ctx.project.id }; +} + +type AuthorStatePayload = { + orgId: string; + projectId: string; + userId: string; + purpose: "access" | "author"; +}; + +function signAuthorState(p: AuthorStatePayload, secret: string): string { + const body = `${p.orgId}.${p.projectId}.${p.userId}.${p.purpose}.${Date.now()}`; + const sig = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + return `${Buffer.from(body, "utf8").toString("base64url")}.${sig}`; +} + +function verifyAuthorState(state: string, secret: string): AuthorStatePayload | null { + const [payloadB64, sig] = state.split("."); + if (!payloadB64 || !sig) return null; + const body = Buffer.from(payloadB64, "base64url").toString("utf8"); + const expected = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + const provided = Buffer.from(sig); + const expectedBuf = Buffer.from(expected); + if (provided.length !== expectedBuf.length) return null; + if (!crypto.timingSafeEqual(provided, expectedBuf)) return null; + // Current format is `${orgId}.${projectId}.${userId}.${purpose}.${ts}` (5 + // parts). Old 3- or 4-part states (no projectId) are rejected — 10-min TTL + // means worst case is users mid-flow during deploy clicking again. + const parts = body.split("."); + if (parts.length !== 5) return null; + const [orgId, projectId, userId, purpose, tsRaw] = parts as [ + string, + string, + string, + string, + string, + ]; + if (!orgId || !projectId || !userId || !tsRaw) return null; + if (purpose !== "access" && purpose !== "author") return null; + const ts = Number(tsRaw); + if (!Number.isFinite(ts) || Date.now() - ts > 10 * 60 * 1000) return null; + return { orgId, projectId, userId, purpose }; +} + +type StateKind = "cli" | "web"; + +function signState(kind: StateKind, value: string, secret: string): string { + const payload = `${kind}.${value}.${Date.now()}`; + const sig = crypto.createHmac("sha256", secret).update(payload).digest("base64url"); + return `${base64url(payload)}.${sig}`; +} + +function verifyState(state: string, secret: string): { kind: StateKind; value: string } | null { + const [payloadB64, sig] = state.split("."); + if (!payloadB64 || !sig) return null; + const payload = Buffer.from(payloadB64, "base64url").toString("utf8"); + const expected = crypto.createHmac("sha256", secret).update(payload).digest("base64url"); + if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) return null; + const [kind, value, tsRaw] = payload.split("."); + if ((kind !== "cli" && kind !== "web") || !value || !tsRaw) return null; + const ts = Number(tsRaw); + // Match device code TTL: 10 min window. + if (!Number.isFinite(ts) || Date.now() - ts > 10 * 60 * 1000) return null; + return { kind, value }; +} + +// Management-API install state. Used when a platform backend mints an install +// URL via /api/v1/...; the state encodes scope (org vs project) and an +// optional return URL the user is bounced to after install. 30-min TTL since +// the customer's operator might not click immediately. +const MGMT_STATE_PREFIX = "mgmt-v1"; +export type GithubMgmtState = + | { scope: "org"; orgId: string; returnUrl: string | null } + | { scope: "project"; projectId: string; returnUrl: string | null }; + +function signMgmtState(payload: GithubMgmtState, secret: string): string { + const body = `${MGMT_STATE_PREFIX}.${Buffer.from(JSON.stringify(payload), "utf8").toString("base64url")}.${Date.now()}`; + const sig = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + return `${Buffer.from(body, "utf8").toString("base64url")}.${sig}`; +} + +function verifyMgmtState(state: string, secret: string): GithubMgmtState | null { + const [payloadB64, sig] = state.split("."); + if (!payloadB64 || !sig) return null; + const body = Buffer.from(payloadB64, "base64url").toString("utf8"); + const expected = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + const provided = Buffer.from(sig); + const expectedBuf = Buffer.from(expected); + if (provided.length !== expectedBuf.length) return null; + if (!crypto.timingSafeEqual(provided, expectedBuf)) return null; + const parts = body.split("."); + if (parts.length !== 3 || parts[0] !== MGMT_STATE_PREFIX) return null; + const ts = Number(parts[2]); + if (!Number.isFinite(ts) || Date.now() - ts > 30 * 60 * 1000) return null; + try { + const json = Buffer.from(parts[1] as string, "base64url").toString("utf8"); + const parsed = JSON.parse(json) as Partial; + if (parsed.scope === "org" && typeof parsed.orgId === "string") { + return { scope: "org", orgId: parsed.orgId, returnUrl: parsed.returnUrl ?? null }; + } + if (parsed.scope === "project" && typeof parsed.projectId === "string") { + return { scope: "project", projectId: parsed.projectId, returnUrl: parsed.returnUrl ?? null }; + } + return null; + } catch { + return null; + } +} + +// Public helper used by the management API to mint install URLs without +// touching state internals. +export function buildGithubMgmtInstallUrl(args: GithubMgmtState): { url: string } | null { + const appSlug = process.env.GITHUB_APP_SLUG; + const stateSecret = process.env.STATE_SIGNING_SECRET; + if (!appSlug || !stateSecret) return null; + const state = signMgmtState(args, stateSecret); + const url = new URL(`https://github.com/apps/${appSlug}/installations/new`); + url.searchParams.set("state", state); + return { url: url.toString() }; +} + +function base64url(s: string): string { + return Buffer.from(s, "utf8").toString("base64url"); +} diff --git a/superlog/apps/api/src/http-observability.test.ts b/superlog/apps/api/src/http-observability.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..b91d4e6ef21423e52de43c006060a2662779f5ef --- /dev/null +++ b/superlog/apps/api/src/http-observability.test.ts @@ -0,0 +1,55 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { buildApiSpanAttributes, normalizeHttpRoute } from "./http-observability.js"; + +test("normalizeHttpRoute collapses dynamic ids while keeping useful endpoint names", () => { + assert.equal( + normalizeHttpRoute("/api/projects/018f34d2-9f91-76cc-9e13-34f3287ff03d/explore/traces"), + "/api/projects/:id/explore/traces", + ); + assert.equal( + normalizeHttpRoute("/api/incidents/inc_01jwj3c9j7q93w2p50ab4t72w3/events"), + "/api/incidents/:id/events", + ); + assert.equal(normalizeHttpRoute("/api/me?tab=settings"), "/api/me"); +}); + +test("buildApiSpanAttributes adds tenant and normalized endpoint attributes for server spans", () => { + assert.deepEqual( + buildApiSpanAttributes({ + method: "post", + path: "/api/projects/project_123/explore/logs?limit=50", + routePath: "/api/*", + statusCode: 201, + orgId: "org_123", + userId: "user_123", + }), + { + "http.request.method": "POST", + "http.route": "/api/projects/:id/explore/logs", + "superlog.endpoint": "/api/projects/:id/explore/logs", + "http.response.status_code": 201, + "http.response.status_class": "2xx", + "tenant.org.id": "org_123", + "enduser.id": "user_123", + "tenant.project.id": "project_123", + }, + ); +}); + +test("buildApiSpanAttributes extracts project ids from all project-scoped API route families", () => { + for (const path of [ + "/api/projects/project_123/explore/logs", + "/api/org/projects/project_123/keys", + "/api/v1/projects/project_123/logs", + ]) { + assert.equal( + buildApiSpanAttributes({ + method: "get", + path, + statusCode: 200, + })["tenant.project.id"], + "project_123", + ); + } +}); diff --git a/superlog/apps/api/src/http-observability.ts b/superlog/apps/api/src/http-observability.ts new file mode 100644 index 0000000000000000000000000000000000000000..dec30be86b373e18a7f2d006a00e0b914bbb0fcb --- /dev/null +++ b/superlog/apps/api/src/http-observability.ts @@ -0,0 +1,100 @@ +import { trace } from "@opentelemetry/api"; +import type { Context, Next } from "hono"; +import { HTTPException } from "hono/http-exception"; + +type MetricAttributes = Record; + +export type ApiSpanAttributeInput = { + method: string; + path: string; + routePath?: string; + statusCode: number; + orgId?: string | null; + userId?: string | null; +}; + +function statusClass(statusCode: number): string { + return `${Math.floor(statusCode / 100)}xx`; +} + +function isDynamicSegment(segment: string): boolean { + if (/^\d+$/.test(segment)) return true; + if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(segment)) { + return true; + } + if (/^(project|org|user|inc|sui|key)_[a-z0-9]+$/i.test(segment)) return true; + if (/^[a-z][a-z0-9]*_[a-z0-9]{8,}$/i.test(segment)) return true; + return segment.length >= 20 && /[0-9]/.test(segment) && /^[a-z0-9_-]+$/i.test(segment); +} + +export function normalizeHttpRoute(rawPath: string): string { + const path = rawPath.split("?")[0] || "/"; + return path + .split("/") + .map((segment) => { + if (!segment) return segment; + if (segment.startsWith(":")) return segment; + return isDynamicSegment(segment) ? ":id" : segment; + }) + .join("/"); +} + +function routeName(input: Pick): string { + return input.routePath && input.routePath !== "*" && input.routePath !== "/api/*" + ? input.routePath + : normalizeHttpRoute(input.path); +} + +function extractProjectId(path: string): string | null { + const match = path.match(/^\/api\/(?:org\/)?(?:v1\/)?projects\/([^/?#]+)/); + return match?.[1] ?? null; +} + +export function buildApiSpanAttributes(input: ApiSpanAttributeInput): MetricAttributes { + const endpoint = routeName(input); + const attrs: MetricAttributes = { + "http.request.method": input.method.toUpperCase(), + "http.route": endpoint, + "superlog.endpoint": endpoint, + "http.response.status_code": input.statusCode, + "http.response.status_class": statusClass(input.statusCode), + }; + if (input.orgId) attrs["tenant.org.id"] = input.orgId; + if (input.userId) attrs["enduser.id"] = input.userId; + const projectId = extractProjectId(input.path); + if (projectId) attrs["tenant.project.id"] = projectId; + return attrs; +} + +type ApiObservabilityVars = { + userId?: string; + orgId?: string | null; +}; + +export function createApiHttpObservabilityMiddleware(): ( + c: Context<{ Variables: ApiObservabilityVars }>, + next: Next, +) => Promise { + return async (c, next) => { + let statusCode = 500; + + try { + await next(); + statusCode = c.res.status; + } catch (err) { + statusCode = err instanceof HTTPException ? err.status : 500; + throw err; + } finally { + trace.getActiveSpan()?.setAttributes( + buildApiSpanAttributes({ + method: c.req.method, + path: c.req.path, + routePath: c.req.routePath, + statusCode, + orgId: c.var.orgId, + userId: c.var.userId, + }), + ); + } + }; +} diff --git a/superlog/apps/api/src/impersonation.ts b/superlog/apps/api/src/impersonation.ts new file mode 100644 index 0000000000000000000000000000000000000000..12fcf083b80960e7c8da802b491b904a85b8ec70 --- /dev/null +++ b/superlog/apps/api/src/impersonation.ts @@ -0,0 +1,68 @@ +import { db, schema } from "@superlog/db"; +import { asc, eq, ilike, or } from "drizzle-orm"; +import type { Hono } from "hono"; +import { requireStaff } from "./staff.js"; + +type Vars = { userId: string; orgId: string | null }; +const MAX_TARGET_ROWS = 100; + +function normalizeSearch(raw: string | null): string { + return (raw ?? "").trim().replace(/[%_]/g, "").slice(0, 80); +} + +// Minimal staff-only user picker for the impersonation command-palette flow. +// The actual impersonation is performed by Better Auth's admin plugin +// (authClient.admin.impersonateUser); this endpoint only supplies the list of +// candidate users + the orgs they belong to so the palette can search them. +// It deliberately exposes nothing beyond what a user picker needs — no usage +// metrics or per-org analytics. +export function mountImpersonation(app: Hono<{ Variables: Vars }>): void { + app.get("/api/admin/impersonation-targets", async (c) => { + await requireStaff(c.var.userId); + const q = normalizeSearch(c.req.query("q") ?? null); + const rowsQuery = db + .select({ + userId: schema.users.id, + email: schema.users.email, + name: schema.users.name, + orgName: schema.orgs.name, + orgSlug: schema.orgs.slug, + }) + .from(schema.orgMembers) + .innerJoin(schema.users, eq(schema.users.id, schema.orgMembers.userId)) + .innerJoin(schema.orgs, eq(schema.orgs.id, schema.orgMembers.orgId)) + .orderBy(asc(schema.users.email), asc(schema.orgs.name)) + .limit(MAX_TARGET_ROWS); + const rows = q + ? await rowsQuery.where( + or( + ilike(schema.users.email, `%${q}%`), + ilike(schema.users.name, `%${q}%`), + ilike(schema.orgs.name, `%${q}%`), + ilike(schema.orgs.slug, `%${q}%`), + ), + ) + : await rowsQuery; + + // Collapse to one row per user; carry the orgs they belong to so the + // palette can match on either a person or a company. + const byUser = new Map< + string, + { userId: string; email: string; name: string | null; orgs: { name: string; slug: string }[] } + >(); + for (const r of rows) { + const existing = byUser.get(r.userId); + if (existing) { + existing.orgs.push({ name: r.orgName, slug: r.orgSlug }); + } else { + byUser.set(r.userId, { + userId: r.userId, + email: r.email, + name: r.name, + orgs: [{ name: r.orgName, slug: r.orgSlug }], + }); + } + } + return c.json({ users: Array.from(byUser.values()), limit: MAX_TARGET_ROWS }); + }); +} diff --git a/superlog/apps/api/src/incidents/detail.test.ts b/superlog/apps/api/src/incidents/detail.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f80e2528a1391103e074ca921d87ae2c9185b6b --- /dev/null +++ b/superlog/apps/api/src/incidents/detail.test.ts @@ -0,0 +1,74 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import type { Issue, IssueSample } from "@superlog/db"; + +// detail.ts transitively imports the db client, which throws at import time +// without a connection string. Set a dummy URL before the dynamic import (the +// porsager client connects lazily, so these pure-function tests never open a +// socket). Same dynamic-import pattern as linear.test.ts / loops.test.ts. +process.env.DATABASE_URL ??= "postgres://localhost:5434/superlog"; +const { toIssueContext } = await import("./detail.js"); + +test("issue context carries the stored telemetry sample as-is", () => { + const sample: IssueSample = { + kind: "span", + service: "api", + severity: "ERROR", + message: "boom", + body: null, + exceptionType: "TypeError", + topFrame: "checkout.ts:42", + normalizedFrames: ["checkout.ts:42", "handler.ts:10"], + stacktrace: "TypeError: boom\n at checkout.ts:42", + seenAt: "2026-05-24T01:00:00.000Z", + traceId: "abc123", + spanId: "def456", + spanName: "POST /checkout", + spanAttrs: { "http.route": "/checkout" }, + }; + const ctx = toIssueContext({ ...baseIssue(), lastSample: sample }); + + assert.equal(ctx.id, "issue-1"); + assert.equal(ctx.kind, "span"); + assert.equal(ctx.exceptionType, "TypeError"); + assert.equal(ctx.eventCount, 12); + assert.equal(ctx.firstSeen, "2026-05-24T00:00:00.000Z"); + assert.equal(ctx.lastSeen, "2026-05-24T01:00:00.000Z"); + // The full log/trace shape is passed through untouched so the agent can walk + // to live telemetry via the trace_id / span_id. + assert.deepEqual(ctx.sample, sample); + assert.equal(ctx.sample?.traceId, "abc123"); +}); + +test("issue context tolerates issues that never captured a sample", () => { + const ctx = toIssueContext({ ...baseIssue(), lastSample: null }); + assert.equal(ctx.sample, null); +}); + +function baseIssue(): Issue { + return { + id: "issue-1", + projectId: "project-1", + fingerprint: "fp-1", + kind: "span", + service: "api", + exceptionType: "TypeError", + title: "TypeError in checkout", + message: "boom", + topFrame: "checkout.ts:42", + normalizedFrames: ["checkout.ts:42"], + lastSample: null, + firstSeen: new Date("2026-05-24T00:00:00.000Z"), + lastSeen: new Date("2026-05-24T01:00:00.000Z"), + silencedAt: null, + lastAlertedAt: null, + slackMessageTs: null, + eventCount: 12, + groupingState: "grouped", + groupingSource: null, + groupingReason: null, + groupingAttemptedAt: null, + groupingAttemptCount: 0, + createdAt: new Date("2026-05-24T00:00:00.000Z"), + }; +} diff --git a/superlog/apps/api/src/incidents/detail.ts b/superlog/apps/api/src/incidents/detail.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b8910d0d4a6dd6cf86d90e93bf541c24958647c --- /dev/null +++ b/superlog/apps/api/src/incidents/detail.ts @@ -0,0 +1,115 @@ +import { type AgentRun, type Issue, type IssueSample, db, schema } from "@superlog/db"; +import { desc, eq, inArray } from "drizzle-orm"; +import { type IncidentSummary, toIncidentSummary } from "./search.js"; + +export type IssueContext = { + id: string; + kind: string; + service: string | null; + exceptionType: string; + title: string; + message: string | null; + topFrame: string | null; + fingerprint: string; + eventCount: number; + firstSeen: string; + lastSeen: string; + /** + * The representative log/trace shape captured for this issue: trace_id / + * span_id, stacktrace, and span/log/resource attributes. This is the inline + * "issue context" — the agent can read it directly, then walk to live + * telemetry with query_traces / query_logs using the trace_id. + */ + sample: IssueSample | null; +}; + +/** Compact, agent-friendly projection of an issue plus its stored telemetry sample. */ +export function toIssueContext(issue: Issue): IssueContext { + return { + id: issue.id, + kind: issue.kind, + service: issue.service, + exceptionType: issue.exceptionType, + title: issue.title, + message: issue.message, + topFrame: issue.topFrame, + fingerprint: issue.fingerprint, + eventCount: issue.eventCount, + firstSeen: issue.firstSeen.toISOString(), + lastSeen: issue.lastSeen.toISOString(), + sample: issue.lastSample ?? null, + }; +} + +export type AgentRunPointer = { + id: string; + state: string; + runtime: string; + selectedRepoFullName: string | null; + failureReason: string | null; + startedAt: string | null; + completedAt: string | null; +}; + +function toAgentRunPointer(run: AgentRun): AgentRunPointer { + return { + id: run.id, + state: run.state, + runtime: run.runtime, + selectedRepoFullName: run.selectedRepoFullName, + failureReason: run.failureReason, + startedAt: run.startedAt ? run.startedAt.toISOString() : null, + completedAt: run.completedAt ? run.completedAt.toISOString() : null, + }; +} + +export type IncidentDetail = { + incident: IncidentSummary; + issues: IssueContext[]; + latestAgentRun: AgentRunPointer | null; +}; + +/** + * Load an incident by its (global) id and assemble the full detail an agent + * needs to answer "what's going on in this incident": the incident summary + * (with project_id for follow-up telemetry queries), every linked issue with + * its stored log/trace sample, and a pointer to the latest investigation. + * + * Returns null when the incident does not exist. Access control is the + * caller's responsibility — resolve `incident.projectId` against the session. + */ +export async function getIncidentDetail(incidentId: string): Promise { + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, incidentId), + }); + if (!incident) return null; + + const [links, agentRuns] = await Promise.all([ + db.query.incidentIssues.findMany({ + where: eq(schema.incidentIssues.incidentId, incident.id), + orderBy: [desc(schema.incidentIssues.createdAt)], + }), + db.query.agentRuns.findMany({ + where: eq(schema.agentRuns.incidentId, incident.id), + orderBy: [desc(schema.agentRuns.createdAt)], + limit: 1, + }), + ]); + + const issues = + links.length > 0 + ? await db.query.issues.findMany({ + where: inArray( + schema.issues.id, + links.map((link) => link.issueId), + ), + orderBy: [desc(schema.issues.lastSeen)], + }) + : []; + + return { + incident: toIncidentSummary(incident), + issues: issues.map(toIssueContext), + latestAgentRun: agentRuns[0] ? toAgentRunPointer(agentRuns[0]) : null, + }; +} diff --git a/superlog/apps/api/src/incidents/list.test.ts b/superlog/apps/api/src/incidents/list.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..4d666b1ee463d6be278b25b58105b2cd78caa644 --- /dev/null +++ b/superlog/apps/api/src/incidents/list.test.ts @@ -0,0 +1,91 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { + type IncidentListItemInput, + buildIncidentListItem, + shouldInlineIncidentListStats, +} from "./list.js"; + +test("incident list omits graph stats by default so slow telemetry cannot block the page", () => { + const row = buildIncidentListItem(baseInput()); + + assert.equal("buckets" in row, false); + assert.equal("impactedUsers" in row, false); + assert.equal("impactedUsersAvailable" in row, false); + assert.equal("impactedUsersCapped" in row, false); + assert.equal("windowDays" in row, false); +}); + +test("incident list can still inline graph stats when explicitly requested", () => { + const row = buildIncidentListItem({ + ...baseInput(), + stats: { + windowDays: 14, + buckets: [{ day: "2026-05-24", count: 4 }], + impactedUsers: 3, + impactedUsersAvailable: true, + impactedUsersCapped: false, + }, + }); + + assert.deepEqual(row.buckets, [{ day: "2026-05-24", count: 4 }]); + assert.equal(row.windowDays, 14); + assert.equal(row.impactedUsers, 3); + assert.equal(row.impactedUsersAvailable, true); + assert.equal(row.impactedUsersCapped, false); +}); + +test("incident list only inlines graph stats behind an explicit query flag", () => { + assert.equal(shouldInlineIncidentListStats(undefined), false); + assert.equal(shouldInlineIncidentListStats(""), false); + assert.equal(shouldInlineIncidentListStats("0"), false); + assert.equal(shouldInlineIncidentListStats("true"), true); + assert.equal(shouldInlineIncidentListStats("1"), true); +}); + +function baseInput(): IncidentListItemInput { + return { + incident: { + id: "incident-1", + projectId: "project-1", + service: "api", + environment: "production", + title: "Checkout failures", + codename: "steady-amber", + severity: "SEV-2", + status: "open", + noiseReason: null, + noiseResolvedAt: null, + mergedAt: null, + slackInstallationId: null, + lastSlackPostedAt: null, + firstSeen: new Date("2026-05-24T00:00:00.000Z"), + lastSeen: new Date("2026-05-24T01:00:00.000Z"), + issueCount: 1, + slackChannelId: null, + slackThreadTs: null, + autoInvestigateSuppressedUntil: null, + autorecoveryLastEvaluatedAt: null, + agentSummary: null, + rootCauseText: null, + rootCauseConfidence: null, + estimatedImpactText: null, + estimatedImpactConfidence: null, + suggestedSeverity: null, + noiseClassification: null, + resolutionClassification: null, + findingsAgentRunId: null, + resolvedByKind: null, + resolvedByUserId: null, + resolvedBySlackUserId: null, + resolvedReasonCode: null, + resolvedReasonText: null, + resolvedAt: null, + mergedIntoId: null, + createdAt: new Date("2026-05-24T00:00:00.000Z"), + updatedAt: new Date("2026-05-24T00:00:00.000Z"), + }, + agentRun: null, + pendingResolutionProposal: null, + }; +} diff --git a/superlog/apps/api/src/incidents/list.ts b/superlog/apps/api/src/incidents/list.ts new file mode 100644 index 0000000000000000000000000000000000000000..2a3f0558c6db56270b7a6e1d391b02a5cc548219 --- /dev/null +++ b/superlog/apps/api/src/incidents/list.ts @@ -0,0 +1,59 @@ +import type { AgentRun, Incident, IncidentResolutionProposalConfidence } from "@superlog/db"; + +export type IncidentListStats = { + windowDays: number; + buckets: { day: string; count: number }[]; + impactedUsers: number; + impactedUsersAvailable: boolean; + impactedUsersCapped: boolean; +}; + +export type IncidentListPendingResolutionProposal = { + id: string; + sourceKind: string; + confidence: IncidentResolutionProposalConfidence; + proposedReasonCode: string; + proposedReasonText: string; + proposedAt: string; +}; + +export type IncidentListItemInput = { + incident: Incident; + agentRun: AgentRun | null; + pendingResolutionProposal: IncidentListPendingResolutionProposal | null; + stats?: IncidentListStats; +}; + +export type IncidentListItem = { + incident: Incident; + agentRun: AgentRun | null; + pendingResolutionProposal: IncidentListPendingResolutionProposal | null; + windowDays?: number; + buckets?: { day: string; count: number }[]; + impactedUsers?: number; + impactedUsersAvailable?: boolean; + impactedUsersCapped?: boolean; +}; + +export function shouldInlineIncidentListStats(value: string | undefined): boolean { + return value === "1" || value === "true"; +} + +export function buildIncidentListItem(input: IncidentListItemInput): IncidentListItem { + const base = { + incident: input.incident, + agentRun: input.agentRun, + pendingResolutionProposal: input.pendingResolutionProposal, + }; + + if (!input.stats) return base; + + return { + ...base, + windowDays: input.stats.windowDays, + buckets: input.stats.buckets, + impactedUsers: input.stats.impactedUsers, + impactedUsersAvailable: input.stats.impactedUsersAvailable, + impactedUsersCapped: input.stats.impactedUsersCapped, + }; +} diff --git a/superlog/apps/api/src/incidents/pr-retry.test.ts b/superlog/apps/api/src/incidents/pr-retry.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5c19512f1f5af889ce0c52215686a319d5f3819 --- /dev/null +++ b/superlog/apps/api/src/incidents/pr-retry.test.ts @@ -0,0 +1,64 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import type { AgentRunResult } from "@superlog/db"; +import { getPrDeliveryRetryEligibility } from "./pr-retry.js"; + +test("pr delivery retry is allowed for failed pr_open_failed runs with a pending reusable patch", () => { + const result: AgentRunResult = { + state: "failed", + summary: "Failed to validate or open the PR.", + failureReason: "pr_open_failed", + pr: { + selectedRepoFullName: "acme/api", + branchName: "superlog/fix-api", + baseBranch: "main", + patch: "diff --git a/a b/a\n", + validationPassed: true, + openStatus: "pending", + }, + }; + + assert.deepEqual( + getPrDeliveryRetryEligibility({ + state: "failed", + failureReason: "pr_open_failed", + result, + }), + { canRetry: true }, + ); +}); + +test("pr delivery retry is denied when no patch can be reused", () => { + const result: AgentRunResult = { + state: "failed", + summary: "Failed to validate or open the PR.", + failureReason: "pr_open_failed", + pr: { + selectedRepoFullName: "acme/api", + branchName: "superlog/fix-api", + baseBranch: "main", + validationPassed: true, + openStatus: "pending", + }, + }; + + assert.deepEqual( + getPrDeliveryRetryEligibility({ + state: "failed", + failureReason: "pr_open_failed", + result, + }), + { canRetry: false, reason: "agent run has no reusable patch" }, + ); +}); + +test("pr delivery retry is denied for non PR-open failures", () => { + assert.deepEqual( + getPrDeliveryRetryEligibility({ + state: "failed", + failureReason: "runtime_budget_exhausted", + result: null, + }), + { canRetry: false, reason: "agent run did not fail while opening a PR" }, + ); +}); diff --git a/superlog/apps/api/src/incidents/pr-retry.ts b/superlog/apps/api/src/incidents/pr-retry.ts new file mode 100644 index 0000000000000000000000000000000000000000..beb6273cf67e924f6247da58346b1d502d6d4481 --- /dev/null +++ b/superlog/apps/api/src/incidents/pr-retry.ts @@ -0,0 +1,46 @@ +import type { AgentRunResult } from "@superlog/db"; + +type RetryableAgentRun = { + state: string; + failureReason: string | null; + result: AgentRunResult | null; +}; + +export type PrDeliveryRetryEligibility = { canRetry: true } | { canRetry: false; reason: string }; + +export function getPrDeliveryRetryEligibility( + agentRun: RetryableAgentRun | null, +): PrDeliveryRetryEligibility { + if (!agentRun) return { canRetry: false, reason: "agent run not found" }; + if (agentRun.state !== "failed") { + return { canRetry: false, reason: "agent run is not failed" }; + } + if (agentRun.failureReason !== "pr_open_failed") { + return { canRetry: false, reason: "agent run did not fail while opening a PR" }; + } + + const pr = agentRun.result?.pr ?? null; + if (!pr) return { canRetry: false, reason: "agent run has no PR result" }; + if (pr.openStatus !== "pending") { + return { canRetry: false, reason: "agent run PR is not pending" }; + } + if (!pr.selectedRepoFullName) { + return { canRetry: false, reason: "agent run has no selected repository" }; + } + if (!pr.baseBranch) { + return { canRetry: false, reason: "agent run has no base branch" }; + } + if (!hasReusablePatch(pr)) { + return { canRetry: false, reason: "agent run has no reusable patch" }; + } + + return { canRetry: true }; +} + +function hasReusablePatch(pr: AgentRunResult["pr"]): boolean { + if (!pr) return false; + if (typeof pr.patch === "string" && pr.patch.trim().length > 0) return true; + if (typeof pr.patchFileId === "string" && pr.patchFileId.trim().length > 0) return true; + if (typeof pr.patchFilePath === "string" && pr.patchFilePath.trim().length > 0) return true; + return false; +} diff --git a/superlog/apps/api/src/incidents/pr-view.test.ts b/superlog/apps/api/src/incidents/pr-view.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..156d41f79cc1591c799aeaa0a65dcd309ec5f1df --- /dev/null +++ b/superlog/apps/api/src/incidents/pr-view.test.ts @@ -0,0 +1,76 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { buildIncidentPullRequestViews } from "./pr-view.js"; + +test("incident PR view includes the recorded PR patch from its agent run", () => { + const now = new Date("2026-06-06T12:00:00.000Z"); + const views = buildIncidentPullRequestViews( + [ + { + id: "pr-1", + agentRunId: "run-1", + repoFullName: "acme/app", + prNumber: 42, + url: "https://github.com/acme/app/pull/42", + branchName: "ash/fix-checkout", + baseBranch: "main", + headSha: "abc123", + state: "open", + title: "Fix checkout", + createdAt: now, + updatedAt: now, + mergedAt: null, + closedAt: null, + }, + ], + [ + { + id: "run-1", + result: { + state: "complete", + summary: "Fixed it", + pr: { + selectedRepoFullName: "acme/app", + branchName: "ash/fix-checkout", + baseBranch: "main", + validationPassed: true, + openStatus: "opened", + patch: "diff --git a/app.ts b/app.ts\n+ok\n", + }, + }, + }, + ], + ); + + assert.equal(views.length, 1); + assert.equal(views[0]?.repoFullName, "acme/app"); + assert.equal(views[0]?.patch, "diff --git a/app.ts b/app.ts\n+ok\n"); + assert.equal(views[0]?.createdAt, "2026-06-06T12:00:00.000Z"); +}); + +test("incident PR view returns null patch when the agent run has no patch body", () => { + const now = new Date("2026-06-06T12:00:00.000Z"); + const views = buildIncidentPullRequestViews( + [ + { + id: "pr-1", + agentRunId: "run-1", + repoFullName: "acme/app", + prNumber: 42, + url: "https://github.com/acme/app/pull/42", + branchName: "ash/fix-checkout", + baseBranch: "main", + headSha: null, + state: "open", + title: null, + createdAt: now, + updatedAt: now, + mergedAt: null, + closedAt: null, + }, + ], + [{ id: "run-1", result: { state: "complete", summary: "Fixed it", pr: null } }], + ); + + assert.equal(views[0]?.patch, null); +}); diff --git a/superlog/apps/api/src/incidents/pr-view.ts b/superlog/apps/api/src/incidents/pr-view.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c44551596bb0b8e3ca613011fb24b6c8c6d7369 --- /dev/null +++ b/superlog/apps/api/src/incidents/pr-view.ts @@ -0,0 +1,67 @@ +import type { schema } from "@superlog/db"; + +export type IncidentPullRequestView = { + id: string; + agentRunId: string; + repoFullName: string; + prNumber: number; + url: string; + branchName: string; + baseBranch: string; + headSha: string | null; + state: schema.AgentPrState; + title: string | null; + patch: string | null; + createdAt: string; + updatedAt: string; + mergedAt: string | null; + closedAt: string | null; +}; + +type AgentRunWithResult = Pick; +type AgentPullRequestRow = Pick< + schema.AgentPullRequest, + | "id" + | "agentRunId" + | "repoFullName" + | "prNumber" + | "url" + | "branchName" + | "baseBranch" + | "headSha" + | "state" + | "title" + | "createdAt" + | "updatedAt" + | "mergedAt" + | "closedAt" +>; + +export function buildIncidentPullRequestViews( + prs: AgentPullRequestRow[], + agentRuns: AgentRunWithResult[], +): IncidentPullRequestView[] { + const runsById = new Map(agentRuns.map((run) => [run.id, run] as const)); + return prs.map((pr) => { + const run = runsById.get(pr.agentRunId) ?? null; + const runPr = run?.result?.pr ?? null; + const patch = typeof runPr?.patch === "string" && runPr.patch.trim() ? runPr.patch : null; + return { + id: pr.id, + agentRunId: pr.agentRunId, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + url: pr.url, + branchName: pr.branchName, + baseBranch: pr.baseBranch, + headSha: pr.headSha, + state: pr.state, + title: pr.title, + patch, + createdAt: pr.createdAt.toISOString(), + updatedAt: pr.updatedAt.toISOString(), + mergedAt: pr.mergedAt?.toISOString() ?? null, + closedAt: pr.closedAt?.toISOString() ?? null, + }; + }); +} diff --git a/superlog/apps/api/src/incidents/resolution-side-effects.test.ts b/superlog/apps/api/src/incidents/resolution-side-effects.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..db53eca5bc8bf126e85ba561277a822856dda7cf --- /dev/null +++ b/superlog/apps/api/src/incidents/resolution-side-effects.test.ts @@ -0,0 +1,107 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + buildResolvedIncidentSlackRoot, + runResolvedIncidentSideEffects, +} from "./resolution-side-effects.js"; + +test("runResolvedIncidentSideEffects closes incident PRs through the shared helper and refreshes Slack root", async () => { + const calls: string[] = []; + + const result = await runResolvedIncidentSideEffects({ + incident: { + id: "inc-1", + title: "Checkout API timeout", + service: "checkout-api", + }, + projectName: "Acme", + deps: { + closeIncidentPullRequests: async (incidentId) => { + calls.push(`close-prs:${incidentId}`); + return { closedPullRequestCount: 2, failedPullRequestCount: 0 }; + }, + updateSlackRootMessage: async (input) => { + calls.push(`slack:${input.incident.id}:${input.text}`); + }, + }, + }); + + assert.deepEqual(result, { closedPullRequestCount: 2, failedPullRequestCount: 0 }); + assert.deepEqual(calls, [ + "close-prs:inc-1", + "slack:inc-1::white_check_mark: Checkout API timeout - Incident resolved", + ]); +}); + +test("runResolvedIncidentSideEffects still refreshes Slack when PR closure reports failures", async () => { + const calls: string[] = []; + const result = await runResolvedIncidentSideEffects({ + incident: { id: "inc-1", title: "Checkout API timeout", service: null }, + projectName: "Acme", + deps: { + closeIncidentPullRequests: async () => { + calls.push("close-prs"); + return { closedPullRequestCount: 0, failedPullRequestCount: 1 }; + }, + updateSlackRootMessage: async () => { + calls.push("slack"); + }, + }, + }); + + assert.deepEqual(result, { closedPullRequestCount: 0, failedPullRequestCount: 1 }); + assert.deepEqual(calls, ["close-prs", "slack"]); +}); + +test("runResolvedIncidentSideEffects still refreshes Slack when PR closure throws", async () => { + const calls: string[] = []; + const result = await runResolvedIncidentSideEffects({ + incident: { id: "inc-1", title: "Checkout API timeout", service: null }, + projectName: "Acme", + deps: { + closeIncidentPullRequests: async () => { + calls.push("close-prs"); + throw new Error("github unavailable"); + }, + updateSlackRootMessage: async () => { + calls.push("slack"); + }, + }, + }); + + assert.deepEqual(result, { closedPullRequestCount: 0, failedPullRequestCount: 1 }); + assert.deepEqual(calls, ["close-prs", "slack"]); +}); + +test("runResolvedIncidentSideEffects does not fail when Slack refresh throws", async () => { + const result = await runResolvedIncidentSideEffects({ + incident: { id: "inc-1", title: "Checkout API timeout", service: null }, + projectName: "Acme", + deps: { + closeIncidentPullRequests: async () => ({ + closedPullRequestCount: 1, + failedPullRequestCount: 0, + }), + updateSlackRootMessage: async () => { + throw new Error("slack unavailable"); + }, + }, + }); + + assert.deepEqual(result, { closedPullRequestCount: 1, failedPullRequestCount: 0 }); +}); + +test("buildResolvedIncidentSlackRoot removes resolve action and keeps feedback action", () => { + const update = buildResolvedIncidentSlackRoot({ + incident: { + id: "inc-1", + title: "Checkout API timeout", + service: "checkout-api", + }, + projectName: "Acme", + }); + + assert.equal(update.text, ":white_check_mark: Checkout API timeout - Incident resolved"); + assert.equal(JSON.stringify(update.blocks).includes("resolve_incident:"), false); + assert.equal(JSON.stringify(update.blocks).includes("give_feedback:inc-1"), true); +}); diff --git a/superlog/apps/api/src/incidents/resolution-side-effects.ts b/superlog/apps/api/src/incidents/resolution-side-effects.ts new file mode 100644 index 0000000000000000000000000000000000000000..d38a71f87b4c91794c4b47116d5c190f6421a9db --- /dev/null +++ b/superlog/apps/api/src/incidents/resolution-side-effects.ts @@ -0,0 +1,198 @@ +import type { CloseIncidentOpenPullRequestsResult, CloseIncidentPullRequest } from "@superlog/db"; +import { and, eq } from "drizzle-orm"; +import { logger } from "../logger.js"; + +const WEB_ORIGIN = process.env.WEB_ORIGIN ?? "http://localhost:5173"; + +const log = logger.child({ scope: "incident-resolution-side-effects" }); + +export type ResolvedIncidentSideEffectIncident = { + id: string; + title: string; + service: string | null; +}; + +export type ResolvedIncidentSlackRoot = { + text: string; + blocks: unknown[]; +}; + +export type ResolvedIncidentSideEffectDeps = { + closeIncidentPullRequests(incidentId: string): Promise; + updateSlackRootMessage(input: { + incident: ResolvedIncidentSideEffectIncident; + text: string; + blocks: unknown[]; + }): Promise; +}; + +export async function runResolvedIncidentSideEffects(opts: { + incident: ResolvedIncidentSideEffectIncident; + projectName: string; + deps: ResolvedIncidentSideEffectDeps; +}): Promise { + let closed: CloseIncidentOpenPullRequestsResult; + try { + closed = await opts.deps.closeIncidentPullRequests(opts.incident.id); + } catch (err) { + log.warn({ err, incident_id: opts.incident.id }, "failed to close incident PRs after resolve"); + closed = { closedPullRequestCount: 0, failedPullRequestCount: 1 }; + } + + const slackRoot = buildResolvedIncidentSlackRoot({ + incident: opts.incident, + projectName: opts.projectName, + }); + try { + await opts.deps.updateSlackRootMessage({ + incident: opts.incident, + text: slackRoot.text, + blocks: slackRoot.blocks, + }); + } catch (err) { + log.warn( + { err, incident_id: opts.incident.id }, + "failed to update resolved incident Slack root", + ); + } + + return closed; +} + +export async function runResolvedIncidentSideEffectsForIncident(opts: { + incidentId: string; + closePullRequest: CloseIncidentPullRequest; +}): Promise { + const { db, schema } = await import("@superlog/db"); + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, opts.incidentId), + }); + if (!incident) return null; + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, incident.projectId), + }); + return runResolvedIncidentSideEffects({ + incident: { + id: incident.id, + title: incident.title, + service: incident.service, + }, + projectName: project?.name ?? incident.projectId, + deps: createResolvedIncidentSideEffectDeps({ + closePullRequest: opts.closePullRequest, + }), + }); +} + +export function buildResolvedIncidentSlackRoot(opts: { + incident: ResolvedIncidentSideEffectIncident; + projectName: string; +}): ResolvedIncidentSlackRoot { + const incidentUrl = `${WEB_ORIGIN}/incidents/${opts.incident.id}`; + const lines = [ + ":white_check_mark: *Incident resolved*", + `*${opts.incident.title}*`, + opts.incident.service + ? `\`${opts.projectName}\` · \`${opts.incident.service}\`` + : `\`${opts.projectName}\``, + ]; + const blocks: unknown[] = [ + { type: "section", text: { type: "mrkdwn", text: lines.join("\n") } }, + { + type: "actions", + elements: [ + { + type: "button", + text: { type: "plain_text", text: "Open in Superlog", emoji: true }, + url: incidentUrl, + action_id: "open_superlog", + }, + { + type: "button", + text: { type: "plain_text", text: "💬 Give feedback", emoji: true }, + action_id: `give_feedback:${opts.incident.id}`, + }, + ], + }, + ]; + return { + text: `:white_check_mark: ${opts.incident.title} - Incident resolved`, + blocks, + }; +} + +export function createResolvedIncidentSideEffectDeps(opts: { + closePullRequest: CloseIncidentPullRequest; + updateSlackRootMessage?: ResolvedIncidentSideEffectDeps["updateSlackRootMessage"]; +}): ResolvedIncidentSideEffectDeps { + return { + closeIncidentPullRequests: async (incidentId) => { + const { closeIncidentOpenPullRequestsAfterResolution } = await import("@superlog/db"); + return closeIncidentOpenPullRequestsAfterResolution({ + incidentId, + closePullRequest: opts.closePullRequest, + onCloseFailure: ({ pr, error }) => + log.warn( + { + incident_id: incidentId, + agent_pr_id: pr.id, + repo: pr.repoFullName, + pr_number: pr.prNumber, + error, + }, + "failed to close incident PR after resolve", + ), + }); + }, + updateSlackRootMessage: opts.updateSlackRootMessage ?? updateResolvedIncidentSlackRootMessage, + }; +} + +export async function updateResolvedIncidentSlackRootMessage(input: { + incident: ResolvedIncidentSideEffectIncident; + text: string; + blocks: unknown[]; +}): Promise { + const { db, schema } = await import("@superlog/db"); + const row = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, input.incident.id), + }); + if (!row?.slackChannelId || !row.slackThreadTs || !row.slackInstallationId) return; + + const installation = await db.query.slackInstallations.findFirst({ + where: and( + eq(schema.slackInstallations.id, row.slackInstallationId), + eq(schema.slackInstallations.projectId, row.projectId), + ), + }); + if (!installation?.botAccessToken || installation.revokedAt) return; + + try { + const res = await fetch("https://slack.com/api/chat.update", { + method: "POST", + headers: { + "content-type": "application/json; charset=utf-8", + authorization: `Bearer ${installation.botAccessToken}`, + }, + body: JSON.stringify({ + channel: row.slackChannelId, + ts: row.slackThreadTs, + text: input.text, + blocks: input.blocks, + }), + }); + const data = (await res.json().catch(() => null)) as { ok?: boolean; error?: string } | null; + if (!data?.ok) { + log.warn( + { + incident_id: input.incident.id, + channel: row.slackChannelId, + error: data?.error ?? `status_${res.status}`, + }, + "failed to update resolved incident Slack root", + ); + } + } catch (err) { + log.warn({ err, incident_id: input.incident.id }, "resolved incident Slack root update threw"); + } +} diff --git a/superlog/apps/api/src/incidents/search.test.ts b/superlog/apps/api/src/incidents/search.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..82d6ff2ee8a2f31367660e2e68e7de3b9742b9ff --- /dev/null +++ b/superlog/apps/api/src/incidents/search.test.ts @@ -0,0 +1,111 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import type { Incident } from "@superlog/db"; + +// search.ts transitively imports the db client, which throws at import time +// without a connection string. Set a dummy URL before the dynamic import (the +// porsager client connects lazily, so these pure-function tests never open a +// socket). Same dynamic-import pattern as linear.test.ts / loops.test.ts. +process.env.DATABASE_URL ??= "postgres://localhost:5434/superlog"; +const { resolveIncidentSearchStatus, toIncidentSummary } = await import("./search.js"); + +test("status defaults to hiding agent-classified noise", () => { + assert.deepEqual(resolveIncidentSearchStatus(undefined), { kind: "exclude_noise" }); +}); + +test("status='all' includes every status, noise included", () => { + assert.deepEqual(resolveIncidentSearchStatus("all"), { kind: "all" }); +}); + +test("a concrete status narrows to exactly that status", () => { + assert.deepEqual(resolveIncidentSearchStatus("open"), { kind: "only", status: "open" }); + assert.deepEqual(resolveIncidentSearchStatus("autoresolved_noise"), { + kind: "only", + status: "autoresolved_noise", + }); +}); + +test("an unknown status is rejected rather than silently ignored", () => { + assert.throws(() => resolveIncidentSearchStatus("bogus"), /invalid incident status/i); +}); + +test("summary is a compact, agent-friendly projection with ISO timestamps", () => { + const summary = toIncidentSummary(baseIncident()); + + assert.equal(summary.id, "incident-1"); + assert.equal(summary.projectId, "project-1"); + assert.equal(summary.codename, "steady-amber"); + assert.equal(summary.title, "Checkout failures"); + assert.equal(summary.service, "api"); + assert.equal(summary.environment, "production"); + assert.equal(summary.severity, "SEV-2"); + assert.equal(summary.status, "open"); + assert.equal(summary.issueCount, 1); + assert.equal(summary.firstSeen, "2026-05-24T00:00:00.000Z"); + assert.equal(summary.lastSeen, "2026-05-24T01:00:00.000Z"); + assert.equal(summary.resolvedAt, null); + // Heavy/internal columns must not leak into the MCP payload. + assert.equal("noiseClassification" in summary, false); + assert.equal("slackInstallationId" in summary, false); +}); + +test("summary surfaces agent findings and resolution metadata when present", () => { + const summary = toIncidentSummary({ + ...baseIncident(), + status: "resolved", + agentSummary: "DB pool exhausted", + rootCauseText: "connection leak in checkout handler", + rootCauseConfidence: 80, + resolvedAt: new Date("2026-05-25T00:00:00.000Z"), + resolvedReasonCode: "agent_pr_merged", + }); + + assert.equal(summary.agentSummary, "DB pool exhausted"); + assert.equal(summary.rootCauseText, "connection leak in checkout handler"); + assert.equal(summary.rootCauseConfidence, 80); + assert.equal(summary.resolvedAt, "2026-05-25T00:00:00.000Z"); + assert.equal(summary.resolvedReasonCode, "agent_pr_merged"); +}); + +function baseIncident(): Incident { + return { + id: "incident-1", + projectId: "project-1", + service: "api", + environment: "production", + title: "Checkout failures", + codename: "steady-amber", + severity: "SEV-2", + status: "open", + noiseReason: null, + noiseResolvedAt: null, + mergedAt: null, + slackInstallationId: null, + lastSlackPostedAt: null, + firstSeen: new Date("2026-05-24T00:00:00.000Z"), + lastSeen: new Date("2026-05-24T01:00:00.000Z"), + issueCount: 1, + slackChannelId: null, + slackThreadTs: null, + autoInvestigateSuppressedUntil: null, + autorecoveryLastEvaluatedAt: null, + agentSummary: null, + rootCauseText: null, + rootCauseConfidence: null, + estimatedImpactText: null, + estimatedImpactConfidence: null, + suggestedSeverity: null, + noiseClassification: null, + resolutionClassification: null, + findingsAgentRunId: null, + resolvedByKind: null, + resolvedByUserId: null, + resolvedBySlackUserId: null, + resolvedReasonCode: null, + resolvedReasonText: null, + resolvedAt: null, + mergedIntoId: null, + createdAt: new Date("2026-05-24T00:00:00.000Z"), + updatedAt: new Date("2026-05-24T00:00:00.000Z"), + }; +} diff --git a/superlog/apps/api/src/incidents/search.ts b/superlog/apps/api/src/incidents/search.ts new file mode 100644 index 0000000000000000000000000000000000000000..864161ebcddb32e8ad7e5542d571e14e47930765 --- /dev/null +++ b/superlog/apps/api/src/incidents/search.ts @@ -0,0 +1,159 @@ +import { + type Incident, + type IncidentSeverity, + type IncidentStatus, + db, + schema, +} from "@superlog/db"; +import { and, desc, eq, gte, ilike, lte, ne, or } from "drizzle-orm"; + +const INCIDENT_STATUSES: readonly IncidentStatus[] = [ + "open", + "resolved", + "autoresolved_noise", + "merged", +]; + +function isIncidentStatus(value: string): value is IncidentStatus { + return (INCIDENT_STATUSES as readonly string[]).includes(value); +} + +export type IncidentSearchStatusFilter = + | { kind: "exclude_noise" } + | { kind: "all" } + | { kind: "only"; status: IncidentStatus }; + +/** + * Mirror the web list endpoint's default: with no status given, hide + * agent-classified noise. `all` opts into every status; any concrete status + * narrows to exactly that one. An unrecognised value is rejected so a typo + * doesn't silently return the whole backlog. + */ +export function resolveIncidentSearchStatus( + status: string | undefined, +): IncidentSearchStatusFilter { + if (!status) return { kind: "exclude_noise" }; + if (status === "all") return { kind: "all" }; + if (isIncidentStatus(status)) return { kind: "only", status }; + throw new Error(`invalid incident status: ${status}`); +} + +export type IncidentSummary = { + id: string; + projectId: string; + codename: string; + title: string; + service: string | null; + environment: string | null; + severity: IncidentSeverity | null; + status: IncidentStatus; + firstSeen: string; + lastSeen: string; + issueCount: number; + agentSummary: string | null; + rootCauseText: string | null; + rootCauseConfidence: number | null; + estimatedImpactText: string | null; + resolvedAt: string | null; + resolvedReasonCode: string | null; + mergedIntoId: string | null; + slackChannelId: string | null; + slackThreadTs: string | null; +}; + +/** + * Compact, agent-friendly projection of an incident. Drops the heavy/internal + * columns (noise & resolution classification blobs, slack install pointers, + * autorecovery bookkeeping) and renders timestamps as ISO strings. + */ +export function toIncidentSummary(incident: Incident): IncidentSummary { + return { + id: incident.id, + projectId: incident.projectId, + codename: incident.codename, + title: incident.title, + service: incident.service, + environment: incident.environment, + severity: incident.severity, + status: incident.status, + firstSeen: incident.firstSeen.toISOString(), + lastSeen: incident.lastSeen.toISOString(), + issueCount: incident.issueCount, + agentSummary: incident.agentSummary, + rootCauseText: incident.rootCauseText, + rootCauseConfidence: incident.rootCauseConfidence, + estimatedImpactText: incident.estimatedImpactText, + resolvedAt: incident.resolvedAt ? incident.resolvedAt.toISOString() : null, + resolvedReasonCode: incident.resolvedReasonCode, + mergedIntoId: incident.mergedIntoId, + slackChannelId: incident.slackChannelId, + slackThreadTs: incident.slackThreadTs, + }; +} + +export type IncidentSearchInput = { + status?: string; + severity?: IncidentSeverity; + service?: string; + query?: string; + since?: string; + until?: string; + limit?: number; +}; + +function parseTimestamp(value: string | undefined, label: string): Date | undefined { + if (!value) return undefined; + const date = new Date(value); + if (Number.isNaN(date.getTime())) { + throw new Error(`invalid ${label} timestamp: ${value}`); + } + return date; +} + +function clampLimit(limit: number | undefined): number { + if (!limit || !Number.isFinite(limit)) return 50; + return Math.min(Math.max(Math.trunc(limit), 1), 200); +} + +/** + * Search a project's incidents by status, severity, service, free-text + * (title/codename substring), and `last_seen` window. Newest activity first. + */ +export async function searchIncidents( + projectId: string, + input: IncidentSearchInput, +): Promise { + const conditions = [eq(schema.incidents.projectId, projectId)]; + + const status = resolveIncidentSearchStatus(input.status); + if (status.kind === "exclude_noise") { + conditions.push(ne(schema.incidents.status, "autoresolved_noise")); + } else if (status.kind === "only") { + conditions.push(eq(schema.incidents.status, status.status)); + } + + if (input.severity) conditions.push(eq(schema.incidents.severity, input.severity)); + if (input.service) conditions.push(eq(schema.incidents.service, input.service)); + + if (input.query) { + const like = `%${input.query}%`; + const textMatch = or( + ilike(schema.incidents.title, like), + ilike(schema.incidents.codename, like), + ); + if (textMatch) conditions.push(textMatch); + } + + const since = parseTimestamp(input.since, "since"); + if (since) conditions.push(gte(schema.incidents.lastSeen, since)); + const until = parseTimestamp(input.until, "until"); + if (until) conditions.push(lte(schema.incidents.lastSeen, until)); + + const rows = await db.query.incidents.findMany({ + where: and(...conditions), + orderBy: [desc(schema.incidents.lastSeen)], + limit: clampLimit(input.limit), + }); + + return rows.map(toIncidentSummary); +} diff --git a/superlog/apps/api/src/incidents/stats.test.ts b/superlog/apps/api/src/incidents/stats.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..23655a8f4d167911dd1612a4dd86cf37d129b941 --- /dev/null +++ b/superlog/apps/api/src/incidents/stats.test.ts @@ -0,0 +1,156 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { + buildIncidentStatsFromActivityRows, + buildIncidentStatsFromIssues, + buildIncidentStatsPairs, + buildIncidentStatsWithFallback, + emptyIncidentStats, +} from "./stats.js"; + +test("incident stats fallback buckets issue event counts by last seen day", () => { + const stats = buildIncidentStatsFromIssues( + [ + { eventCount: 395, lastSeen: new Date("2026-05-25T18:23:04.391Z") }, + { eventCount: 100, lastSeen: new Date("2026-05-27T18:52:35.544Z") }, + { eventCount: 10, lastSeen: new Date("2026-05-01T00:00:00.000Z") }, + ], + { now: new Date("2026-05-28T19:00:00.000Z"), windowDays: 14 }, + ); + + assert.equal(stats.windowDays, 14); + assert.equal(stats.totalEvents, 495); + assert.equal(stats.impactedUsers, 0); + assert.equal(stats.impactedUsersAvailable, false); + assert.equal(stats.buckets.length, 14); + assert.equal(stats.buckets.find((b) => b.day === "2026-05-25")?.count, 395); + assert.equal(stats.buckets.find((b) => b.day === "2026-05-27")?.count, 100); +}); + +test("incident stats fallback returns empty activity when there are no recent issues", () => { + const stats = buildIncidentStatsFromIssues( + [{ eventCount: 10, lastSeen: new Date("2026-05-01T00:00:00.000Z") }], + { now: new Date("2026-05-28T19:00:00.000Z"), windowDays: 14 }, + ); + + assert.deepEqual(stats, emptyIncidentStats(14, new Date("2026-05-28T19:00:00.000Z"))); +}); + +test("incident stats buckets pre-aggregated fingerprint activity rows", () => { + const stats = buildIncidentStatsFromActivityRows( + [ + { day: "2026-05-25", count: 395 }, + { day: "2026-05-25", count: "100" }, + { day: "2026-05-27", count: 7 }, + ], + { now: new Date("2026-05-28T19:00:00.000Z"), windowDays: 14 }, + ); + + assert.equal(stats.windowDays, 14); + assert.equal(stats.totalEvents, 502); + assert.equal(stats.impactedUsers, 0); + assert.equal(stats.impactedUsersAvailable, false); + assert.equal(stats.buckets.find((b) => b.day === "2026-05-25")?.count, 495); + assert.equal(stats.buckets.find((b) => b.day === "2026-05-27")?.count, 7); +}); + +test("incident stats returns issue fallback when telemetry load times out", async () => { + const reasons: string[] = []; + let aborted = false; + + const stats = await buildIncidentStatsWithFallback({ + fallback: buildIncidentStatsFromIssues( + [{ eventCount: 7, lastSeen: new Date("2026-05-27T00:00:00.000Z") }], + { now: new Date("2026-05-28T19:00:00.000Z"), windowDays: 14 }, + ), + timeoutMs: 5, + onTelemetryUnavailable: (reason) => reasons.push(reason), + loadTelemetry: (signal) => { + signal.addEventListener("abort", () => { + aborted = true; + }); + return new Promise(() => undefined); + }, + }); + + assert.equal(aborted, true); + assert.deepEqual(reasons, ["timeout"]); + assert.equal(stats.totalEvents, 7); + assert.equal(stats.buckets.find((b) => b.day === "2026-05-27")?.count, 7); +}); + +test("incident stats prefers telemetry when it loads before the timeout", async () => { + const telemetry = { + windowDays: 14, + buckets: [{ day: "2026-05-27", count: 42 }], + totalEvents: 42, + impactedUsers: 3, + impactedUsersAvailable: true, + }; + + const stats = await buildIncidentStatsWithFallback({ + fallback: emptyIncidentStats(14, new Date("2026-05-28T19:00:00.000Z")), + timeoutMs: 50, + loadTelemetry: async () => telemetry, + }); + + assert.deepEqual(stats, telemetry); +}); + +test("incident stats span pairs include resolved span names when available", () => { + const pairs = buildIncidentStatsPairs( + [ + { + id: "issue-1", + kind: "span", + service: "superlog-api", + exceptionType: "Error", + lastSample: { traceId: "trace-1", spanId: "span-1" }, + }, + { + id: "issue-2", + kind: "span", + service: "superlog-api", + exceptionType: "Error", + lastSample: { traceId: "trace-2", spanId: "span-2", spanName: "cached.authorize" }, + }, + { + id: "issue-3", + kind: "log", + service: "superlog-api", + exceptionType: "Error", + lastSample: null, + }, + ], + new Map([["trace-1:span-1", "project.authorize"]]), + ); + + assert.deepEqual(pairs.namedSpanServices, ["superlog-api", "superlog-api"]); + assert.deepEqual(pairs.namedSpanNames, ["project.authorize", "cached.authorize"]); + assert.deepEqual(pairs.namedSpanExcTypes, ["Error", "Error"]); + assert.deepEqual(pairs.unnamedSpanServices, []); + assert.deepEqual(pairs.unnamedSpanExcTypes, []); + assert.deepEqual(pairs.logServices, ["superlog-api"]); + assert.deepEqual(pairs.logExcTypes, ["Error"]); +}); + +test("incident stats keeps span pairs queryable when span name is unknown", () => { + const pairs = buildIncidentStatsPairs( + [ + { + id: "issue-1", + kind: "span", + service: "api", + exceptionType: "TypeError", + lastSample: { traceId: "trace-1", spanId: "span-1" }, + }, + ], + new Map(), + ); + + assert.deepEqual(pairs.namedSpanServices, []); + assert.deepEqual(pairs.namedSpanNames, []); + assert.deepEqual(pairs.namedSpanExcTypes, []); + assert.deepEqual(pairs.unnamedSpanServices, ["api"]); + assert.deepEqual(pairs.unnamedSpanExcTypes, ["TypeError"]); +}); diff --git a/superlog/apps/api/src/incidents/stats.ts b/superlog/apps/api/src/incidents/stats.ts new file mode 100644 index 0000000000000000000000000000000000000000..4b066cf09e860280bff58fc3c6d3c79cec1b1025 --- /dev/null +++ b/superlog/apps/api/src/incidents/stats.ts @@ -0,0 +1,223 @@ +export type IncidentStats = { + windowDays: number; + buckets: { day: string; count: number }[]; + totalEvents: number; + impactedUsers: number; + impactedUsersAvailable: boolean; +}; + +export type IncidentStatsIssue = { + eventCount: number; + lastSeen: Date | string; +}; + +export type IncidentStatsActivityRow = { + day: string; + count: number | string; +}; + +export type IncidentStatsFingerprintIssue = { + id: string; + kind: string; + service: string | null; + exceptionType: string; + lastSample?: { + traceId?: string | null; + spanId?: string | null; + spanName?: string | null; + } | null; +}; + +export type IncidentStatsPairs = { + namedSpanServices: string[]; + namedSpanNames: string[]; + namedSpanExcTypes: string[]; + unnamedSpanServices: string[]; + unnamedSpanExcTypes: string[]; + logServices: string[]; + logExcTypes: string[]; +}; + +export type BuildIncidentStatsFromIssuesOptions = { + now?: Date; + windowDays: number; +}; + +export type BuildIncidentStatsWithFallbackOptions = { + fallback: IncidentStats; + timeoutMs: number; + loadTelemetry(signal: AbortSignal): Promise; + onTelemetryUnavailable?: (reason: "timeout" | "error", error?: unknown) => void; +}; + +export function emptyIncidentStats(windowDays: number, now = new Date()): IncidentStats { + return { + windowDays, + buckets: buildBucketsFromMap(new Map(), windowDays, now), + totalEvents: 0, + impactedUsers: 0, + impactedUsersAvailable: false, + }; +} + +export function buildIncidentStatsFromIssues( + issues: IncidentStatsIssue[], + opts: BuildIncidentStatsFromIssuesOptions, +): IncidentStats { + const countsByDay = new Map(); + const windowStart = startOfUtcDay(opts.now ?? new Date()); + windowStart.setUTCDate(windowStart.getUTCDate() - opts.windowDays + 1); + + for (const issue of issues) { + const seenAt = issue.lastSeen instanceof Date ? issue.lastSeen : new Date(issue.lastSeen); + if (!Number.isFinite(seenAt.getTime()) || seenAt < windowStart) continue; + const day = toUtcDay(seenAt); + countsByDay.set(day, (countsByDay.get(day) ?? 0) + Number(issue.eventCount)); + } + + const buckets = buildBucketsFromMap(countsByDay, opts.windowDays, opts.now); + return { + windowDays: opts.windowDays, + buckets, + totalEvents: buckets.reduce((sum, bucket) => sum + bucket.count, 0), + impactedUsers: 0, + impactedUsersAvailable: false, + }; +} + +export function buildIncidentStatsFromActivityRows( + rows: IncidentStatsActivityRow[], + opts: BuildIncidentStatsFromIssuesOptions, +): IncidentStats { + const countsByDay = new Map(); + for (const row of rows) { + countsByDay.set(row.day, (countsByDay.get(row.day) ?? 0) + Number(row.count)); + } + + const buckets = buildBucketsFromMap(countsByDay, opts.windowDays, opts.now); + return { + windowDays: opts.windowDays, + buckets, + totalEvents: buckets.reduce((sum, bucket) => sum + bucket.count, 0), + impactedUsers: 0, + impactedUsersAvailable: false, + }; +} + +export function buildIncidentStatsPairs( + issues: IncidentStatsFingerprintIssue[], + spanNamesBySample: Map, +): IncidentStatsPairs { + const pairs: IncidentStatsPairs = { + namedSpanServices: [], + namedSpanNames: [], + namedSpanExcTypes: [], + unnamedSpanServices: [], + unnamedSpanExcTypes: [], + logServices: [], + logExcTypes: [], + }; + const seenNamedSpan = new Set(); + const seenUnnamedSpan = new Set(); + const seenLog = new Set(); + + for (const issue of issues) { + const svc = issue.service ?? ""; + const et = issue.exceptionType ?? ""; + if (issue.kind === "log") { + const key = pairKey(svc, et); + if (seenLog.has(key)) continue; + seenLog.add(key); + pairs.logServices.push(svc); + pairs.logExcTypes.push(et); + continue; + } + + const spanName = spanNameForIssue(issue, spanNamesBySample); + if (spanName) { + const key = pairKey(svc, spanName, et); + if (seenNamedSpan.has(key)) continue; + seenNamedSpan.add(key); + pairs.namedSpanServices.push(svc); + pairs.namedSpanNames.push(spanName); + pairs.namedSpanExcTypes.push(et); + continue; + } + + const key = pairKey(svc, et); + if (seenUnnamedSpan.has(key)) continue; + seenUnnamedSpan.add(key); + pairs.unnamedSpanServices.push(svc); + pairs.unnamedSpanExcTypes.push(et); + } + + return pairs; +} + +export async function buildIncidentStatsWithFallback( + opts: BuildIncidentStatsWithFallbackOptions, +): Promise { + const controller = new AbortController(); + let timedOut = false; + let timer: NodeJS.Timeout | null = null; + const timeout = new Promise((_, reject) => { + timer = setTimeout(() => { + timedOut = true; + controller.abort(); + reject(new Error("incident stats telemetry timed out")); + }, opts.timeoutMs); + }); + + try { + return await Promise.race([opts.loadTelemetry(controller.signal), timeout]); + } catch (err) { + opts.onTelemetryUnavailable?.(timedOut ? "timeout" : "error", err); + return opts.fallback; + } finally { + if (timer) clearTimeout(timer); + } +} + +export function buildBucketsFromMap( + countsByDay: Map, + windowDays: number, + now = new Date(), +): { day: string; count: number }[] { + const buckets: { day: string; count: number }[] = []; + const today = startOfUtcDay(now); + for (let i = windowDays - 1; i >= 0; i--) { + const d = new Date(today.getTime() - i * 24 * 60 * 60 * 1000); + const key = toUtcDay(d); + buckets.push({ day: key, count: countsByDay.get(key) ?? 0 }); + } + return buckets; +} + +function startOfUtcDay(value: Date): Date { + const out = new Date(value); + out.setUTCHours(0, 0, 0, 0); + return out; +} + +function toUtcDay(value: Date): string { + return value.toISOString().slice(0, 10); +} + +function spanNameForIssue( + issue: IncidentStatsFingerprintIssue, + spanNamesBySample: Map, +): string | null { + if (issue.lastSample?.spanName) return issue.lastSample.spanName; + const traceId = issue.lastSample?.traceId; + const spanId = issue.lastSample?.spanId; + if (!traceId || !spanId) return null; + return spanNamesBySample.get(spanSampleKey(traceId, spanId)) ?? null; +} + +export function spanSampleKey(traceId: string, spanId: string): string { + return `${traceId}:${spanId}`; +} + +function pairKey(...parts: string[]): string { + return parts.join("\u0001"); +} diff --git a/superlog/apps/api/src/index.ts b/superlog/apps/api/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d197a800a9ba1942c1b4de662cdffb7073a24920 --- /dev/null +++ b/superlog/apps/api/src/index.ts @@ -0,0 +1,2956 @@ +import "./env.js"; +import "./net.js"; +import { createClient } from "@clickhouse/client"; +import { serve } from "@hono/node-server"; +import { SpanStatusCode, trace } from "@opentelemetry/api"; +import { + DEFAULT_AGENT_RUN_PROVIDER, + type Issue, + confirmResolutionProposal, + createIncidentLifecycle, + db, + dismissResolutionProposal, + isAgentRunProvider, + listAccessibleGithubInstallsForProject, + mintApiKey, + resolveIncident, + runMigrations, + schema, + sendLoopsWelcomeFlow, + upsertLoopsContact, +} from "@superlog/db"; +import { fingerprint, fingerprintLog } from "@superlog/fingerprint"; +import { Autumn, AutumnError } from "autumn-js"; +import { and, asc, count, desc, eq, inArray, isNotNull, isNull, ne, or } from "drizzle-orm"; +import { Hono } from "hono"; +import type { Context } from "hono"; +import { cors } from "hono/cors"; +import { HTTPException } from "hono/http-exception"; +import { nanoid } from "nanoid"; +import { mountAlerts } from "./alerts.js"; +import { auth } from "./auth.js"; +import { shouldRunMigrationsOnBoot } from "./boot-migrations.js"; +import { mountDashboards } from "./dashboards.js"; +import { mountFeedbackAuthed, mountFeedbackPublic } from "./feedback.js"; +import { type GatewayVars, mountGateway } from "./gateway.js"; +import { prBaseBranchExists } from "./github-branches.js"; +import { + closeAgentPullRequestOnGithub, + listProjectRepoBranches, + mergeGithubPullRequest, + mountGithubAuthed, + mountGithubAuthorOAuth, + mountGithubPublic, +} from "./github.js"; +import { createApiHttpObservabilityMiddleware } from "./http-observability.js"; +import { mountImpersonation } from "./impersonation.js"; +import { buildIncidentListItem, shouldInlineIncidentListStats } from "./incidents/list.js"; +import { getPrDeliveryRetryEligibility } from "./incidents/pr-retry.js"; +import { buildIncidentPullRequestViews } from "./incidents/pr-view.js"; +import { runResolvedIncidentSideEffectsForIncident } from "./incidents/resolution-side-effects.js"; +import { + buildIncidentStatsFromActivityRows, + buildIncidentStatsFromIssues, + buildIncidentStatsPairs, + buildIncidentStatsWithFallback, + spanSampleKey, +} from "./incidents/stats.js"; +import { mountLinearAuthed, mountLinearPublic } from "./linear.js"; +import { logger } from "./logger.js"; +import { mountManagementApi, mountOrgKeyManagementAuthed } from "./management.js"; +import { + METRIC_AGGREGATIONS, + type MetricAggregation, + type ResourceAttrFilter, + type SeriesSource, + countSeries, + getTraceDetail, + listAttributeKeys, + listAttributeValues, + listIssueFilterAttributeKeys, + listIssueFilterAttributeValues, + listMetricNames, + listServices, + metricSeries, + pickStep, + previewIssueFilterMatches, + queryLogs, + queryMetrics, + queryTraces, + queryTracesAggregated, +} from "./mcp/clickhouse.js"; +import { mountMcpAuthed, mountMcpPublic } from "./mcp/index.js"; +import { resolveActiveOrgContext, resolveMaybeActiveOrgContext } from "./org-context.js"; +import { mountSettingsAuthed } from "./settings.js"; +import { normalizeSignupIntentKeyHash, normalizeSignupIntentKeyPrefix } from "./signup-intents.js"; +import { mountSlackAuthed, mountSlackPublic } from "./slack.js"; +import { sourceMapObjectStoreFromEnv } from "./sourcemaps.js"; +import { userIsStaff } from "./staff.js"; +import { symbolicateIssueSample, symbolicateTelemetrySample } from "./symbolication.js"; +import { buildSystemCapabilities } from "./system-capabilities.js"; +import { mountWebhooks } from "./webhooks.js"; + +const PORT = Number(process.env.PORT ?? 4100); +const WEB_ORIGIN = process.env.WEB_ORIGIN ?? "http://localhost:5173"; +const WEB_CORS_ORIGINS = Array.from( + new Set([WEB_ORIGIN, "http://localhost:5173", "http://127.0.0.1:5173"]), +); + +const ch = createClient({ + url: process.env.CLICKHOUSE_URL ?? "http://localhost:8123", + database: process.env.CLICKHOUSE_DB ?? "superlog", + username: process.env.CLICKHOUSE_USER ?? "default", + password: process.env.CLICKHOUSE_PASSWORD ?? "", + // idle_socket_ttl must stay below CH server's keep_alive_timeout (3s default) + // so we recycle before the server closes; request_timeout short-circuits + // stale sockets that slipped through instead of hanging 30s. + request_timeout: 10_000, + keep_alive: { enabled: true, idle_socket_ttl: 2_500 }, +}); + +const tracer = trace.getTracer("@superlog/api"); +const SIGNUP_INTENT_TTL_MS = 30 * 60 * 1000; + +type Vars = { + userId: string; + orgId: string | null; + impersonating?: boolean; +} & Partial; +const app = new Hono<{ Variables: Vars }>(); +const incidentLifecycle = createIncidentLifecycle(db); +const sourceMapObjectStore = sourceMapObjectStoreFromEnv(process.env); + +app.use( + "/api/*", + cors({ + origin: WEB_CORS_ORIGINS, + credentials: true, + allowHeaders: [ + "authorization", + "content-type", + "traceparent", + "tracestate", + "x-superlog-signup-source", + ], + allowMethods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"], + }), +); + +app.use("/api/*", createApiHttpObservabilityMiddleware()); + +app.use( + "/mcp", + cors({ + origin: "*", + allowHeaders: ["authorization", "content-type", "mcp-session-id", "mcp-protocol-version"], + allowMethods: ["GET", "POST", "DELETE", "OPTIONS"], + exposeHeaders: ["mcp-session-id", "www-authenticate"], + }), +); + +app.use( + "/oauth/*", + cors({ + origin: "*", + allowHeaders: ["content-type"], + allowMethods: ["GET", "POST", "OPTIONS"], + }), +); + +app.use( + "/.well-known/*", + cors({ + origin: "*", + allowMethods: ["GET", "OPTIONS"], + }), +); + +app.use( + "/activate/*", + cors({ + origin: WEB_CORS_ORIGINS, + credentials: true, + allowHeaders: ["authorization", "content-type", "traceparent", "tracestate"], + allowMethods: ["POST", "OPTIONS"], + }), +); + +// /feedback/pr/* is the anonymous PR-link surface — the web app posts to +// it cross-origin from /feedback/pr/:owner/:repo/:num. Credentials are +// included so a signed-in user is still attributed to their account. +app.use( + "/feedback/*", + cors({ + origin: WEB_CORS_ORIGINS, + credentials: true, + allowHeaders: ["content-type", "traceparent", "tracestate"], + allowMethods: ["POST", "OPTIONS"], + }), +); + +app.get("/health", (c) => c.json({ ok: true })); + +// Tells the web client which social providers have credentials configured +// in this environment so it can hide the buttons that would 503 on click. +app.get("/api/auth-providers", (c) => + c.json({ + google: !!(process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET), + github: !!(process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET), + }), +); + +app.get("/api/system/capabilities", (c) => c.json(buildSystemCapabilities())); + +app.post("/api/signup-intents", async (c) => { + const body = (await c.req.json().catch(() => ({}))) as { + keyHash?: unknown; + keyPrefix?: unknown; + returnTo?: unknown; + }; + const keyHash = normalizeSignupIntentKeyHash(body.keyHash); + const keyPrefix = normalizeSignupIntentKeyPrefix(body.keyPrefix); + if (!keyHash || !keyPrefix) { + throw new HTTPException(400, { message: "valid keyHash and keyPrefix required" }); + } + const returnTo = + typeof body.returnTo === "string" && body.returnTo.length <= 1024 ? body.returnTo : null; + + const intentId = `sui_${nanoid(24)}`; + const expiresAt = new Date(Date.now() + SIGNUP_INTENT_TTL_MS); + await db.insert(schema.signupIntents).values({ + id: intentId, + keyHash, + keyPrefix, + returnTo, + expiresAt, + }); + + const signupUrl = new URL(`${WEB_ORIGIN}/signup`); + signupUrl.searchParams.set("from", "skill"); + signupUrl.searchParams.set("intent", intentId); + + return c.json({ + id: intentId, + signupUrl: signupUrl.toString(), + expiresAt: expiresAt.toISOString(), + }); +}); + +// Better Auth handles its own routes under /api/auth/*. Mount before the +// session middleware so sign-in/sign-up/oauth-callback endpoints don't trip +// the unauthenticated guard. +app.on(["POST", "GET"], "/api/auth/*", (c) => auth.handler(c.req.raw)); + +mountGateway(app, ch); +mountGithubPublic(app); +mountGithubAuthorOAuth(app); +mountLinearPublic(app); +mountMcpPublic(app, ch); +mountSlackPublic(app); +mountFeedbackPublic(app); +// Management API (org-key auth, /api/v1/*) registers its own middleware +// before the session middleware below — the session middleware skips +// /api/v1/* and /api/auth/*. +mountManagementApi(app, { ch }); + +app.use("/api/*", async (c, next) => { + if (c.req.path.startsWith("/api/v1/")) return next(); + if (c.req.path.startsWith("/api/auth/")) return next(); + if (c.req.path === "/api/auth-providers") return next(); + const session = await auth.api.getSession({ headers: c.req.raw.headers }); + if (!session) return c.json({ error: "unauthenticated" }, 401); + c.set("userId", session.user.id); + c.set("orgId", session.session.activeOrganizationId ?? null); + // Better Auth's admin plugin sets impersonatedBy on the session row when an + // admin is acting as another user; surface it on `c.var` so /api/me can + // expose a boolean without the web client having to inspect raw session. + c.set("impersonating", typeof session.session.impersonatedBy === "string"); + await next(); +}); + +mountMcpAuthed(app); +mountGithubAuthed(app); +mountLinearAuthed(app); +mountSlackAuthed(app); +mountSettingsAuthed(app); +mountOrgKeyManagementAuthed(app); +mountDashboards(app); +mountAlerts(app, { ch }); +mountWebhooks(app); +mountFeedbackAuthed(app); +mountImpersonation(app); + +const ALLOWED_SIGNUP_SOURCES = new Set(["skill", "web", "mcp", "github", "cli"]); + +app.get("/api/me", async (c) => { + const ctx = await resolveMaybeActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + const { user } = ctx; + // Whether billing hard-blocks (ingest 402 / investigation cap) are enforced. + // Metering runs regardless; this only gates blocking, so the web can avoid + // showing an "Ingest paused" bar when nothing is actually being blocked. + const billingEnforcement = process.env.BILLING_ENFORCEMENT_ENABLED === "true"; + + // Pre-org users (just signed up, haven't created their first org yet) get a + // null org/project so the web client can route them to the create-org step + // in the onboarding wizard. + if (!ctx.org) { + return c.json({ + user: { + id: user.id, + email: user.email, + name: user.name, + isStaff: userIsStaff(user.role), + impersonating: c.var.impersonating === true, + }, + org: null, + project: null, + billingEnforcement, + }); + } + + const { org, project } = ctx; + + if (!org.signupSource) { + const headerSource = c.req.header("x-superlog-signup-source")?.trim().toLowerCase(); + if (headerSource && ALLOWED_SIGNUP_SOURCES.has(headerSource)) { + const updated = await db + .update(schema.orgs) + .set({ signupSource: headerSource }) + .where(and(eq(schema.orgs.id, org.id), isNull(schema.orgs.signupSource))) + .returning({ signupSource: schema.orgs.signupSource }); + if (updated[0]?.signupSource) org.signupSource = updated[0].signupSource; + } + } + + void upsertLoopsContact({ + user, + org, + project, + signupSource: org.signupSource, + appUrl: WEB_ORIGIN, + }).catch((err) => { + logger.warn({ err, userId: user.id, orgId: org.id }, "loops contact sync failed"); + }); + + const accessibleInstalls = await listAccessibleGithubInstallsForProject(project.id); + const githubSetupNeeded = accessibleInstalls.length === 0 && !org.githubSetupSkippedAt; + + // `hasIngested` decides whether OnboardingGate shows the install wizard. Reading + // it from api_keys.last_used_at (set by proxy/src/index.ts on every successful + // auth) avoids 6 ClickHouse count() queries per page load — the previous gate + // derived this from /stats and was firing on every navigation forever. + const ingestedKey = await db.query.apiKeys.findFirst({ + columns: { id: true }, + where: and(eq(schema.apiKeys.projectId, project.id), isNotNull(schema.apiKeys.lastUsedAt)), + }); + const hasIngested = ingestedKey !== undefined; + + return c.json({ + user: { + id: user.id, + email: user.email, + name: user.name, + isStaff: userIsStaff(user.role), + impersonating: c.var.impersonating === true, + }, + org: { id: org.id, name: org.name, slug: org.slug, githubSetupNeeded }, + project: { id: project.id, name: project.name, slug: project.slug, hasIngested }, + billingEnforcement, + }); +}); + +app.put("/api/me/active-project", async (c) => { + const { user, org } = await resolveActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + const body = (await c.req.json().catch(() => ({}))) as { projectId?: unknown }; + const projectId = typeof body.projectId === "string" ? body.projectId : null; + if (!projectId) throw new HTTPException(400, { message: "projectId required" }); + + const project = await db.query.projects.findFirst({ + where: and(eq(schema.projects.id, projectId), eq(schema.projects.orgId, org.id)), + }); + if (!project) throw new HTTPException(404, { message: "project not found in active org" }); + + await db + .update(schema.users) + .set({ activeProjectId: project.id }) + .where(eq(schema.users.id, user.id)); + + return c.json({ project: { id: project.id, name: project.name, slug: project.slug } }); +}); + +const ORG_NAME_MAX = 80; + +function slugifyOrgName(value: string): string { + return value + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 40); +} + +async function uniqueOrgSlug(client: Pick, base: string): Promise { + const seed = base || "org"; + let candidate = seed; + for (let attempt = 0; attempt < 20; attempt += 1) { + const existing = await client.query.orgs.findFirst({ where: eq(schema.orgs.slug, candidate) }); + if (!existing) return candidate; + candidate = `${seed.slice(0, 32)}-${nanoid(6).toLowerCase()}`; + } + return `${seed.slice(0, 20)}-${nanoid(12).toLowerCase()}`; +} + +// First-org creation. Called by the onboarding wizard's create-org step for +// users that signed up but don't have a membership yet. Idempotent on retry: +// if the user already has an org, returns it instead of creating a duplicate. +app.post("/api/me/orgs", async (c) => { + const body = (await c.req.json().catch(() => ({}))) as { name?: unknown }; + const rawName = typeof body.name === "string" ? body.name.trim() : ""; + if (!rawName) throw new HTTPException(400, { message: "name required" }); + if (rawName.length > ORG_NAME_MAX) { + throw new HTTPException(400, { message: `name must be ${ORG_NAME_MAX} chars or fewer` }); + } + + const userId = c.var.userId; + type WelcomePayload = { + user: { id: string; email: string }; + org: typeof schema.orgs.$inferSelect; + project: typeof schema.projects.$inferSelect; + }; + + const result = await db.transaction( + async ( + tx, + ): Promise<{ + payload: { + org: { id: string; name: string; slug: string }; + project: { id: string; name: string; slug: string }; + }; + welcome: WelcomePayload | null; + }> => { + // Serializes first-org creation for a user. Without this lock, two + // concurrent create-org requests can both see no membership and create two + // organizations before either membership row exists. + const [user] = await tx + .select({ id: schema.users.id, email: schema.users.email }) + .from(schema.users) + .where(eq(schema.users.id, userId)) + .for("update"); + if (!user) throw new HTTPException(404, { message: "user not found" }); + + const existingMembership = await tx.query.orgMembers.findFirst({ + where: eq(schema.orgMembers.userId, userId), + }); + if (existingMembership) { + const org = await tx.query.orgs.findFirst({ + where: eq(schema.orgs.id, existingMembership.orgId), + }); + if (!org) + throw new HTTPException(500, { message: "org membership references missing org" }); + let project = await tx.query.projects.findFirst({ + where: eq(schema.projects.orgId, org.id), + }); + if (!project) { + const [createdProject] = await tx + .insert(schema.projects) + .values({ orgId: org.id, name: "Default", slug: "default" }) + .returning(); + if (!createdProject) { + throw new HTTPException(500, { message: "failed to create default project" }); + } + project = createdProject; + await tx + .insert(schema.projectAutomationSettings) + .values({ projectId: project.id }) + .onConflictDoNothing({ target: schema.projectAutomationSettings.projectId }); + } + return { + payload: { + org: { id: org.id, name: org.name, slug: org.slug }, + project: { id: project.id, name: project.name, slug: project.slug }, + }, + welcome: null, + }; + } + + const slug = await uniqueOrgSlug(tx, slugifyOrgName(rawName)); + const [org] = await tx.insert(schema.orgs).values({ name: rawName, slug }).returning(); + if (!org) throw new HTTPException(500, { message: "failed to create org" }); + + await tx + .insert(schema.orgMembers) + .values({ orgId: org.id, userId, role: "owner" }) + .onConflictDoNothing({ target: [schema.orgMembers.orgId, schema.orgMembers.userId] }); + + const [project] = await tx + .insert(schema.projects) + .values({ orgId: org.id, name: "Default", slug: "default" }) + .returning(); + if (!project) throw new HTTPException(500, { message: "failed to create default project" }); + + await tx + .insert(schema.projectAutomationSettings) + .values({ projectId: project.id }) + .onConflictDoNothing({ target: schema.projectAutomationSettings.projectId }); + + // Promote the new org to active on every session this user has open, so the + // next /api/me call returns it without requiring a sign-out/sign-in round trip. + await tx + .update(schema.sessions) + .set({ activeOrganizationId: org.id }) + .where( + and(eq(schema.sessions.userId, userId), isNull(schema.sessions.activeOrganizationId)), + ); + + return { + payload: { + org: { id: org.id, name: org.name, slug: org.slug }, + project: { id: project.id, name: project.name, slug: project.slug }, + }, + welcome: { user, org, project }, + }; + }, + ); + + if (result.welcome) { + void sendLoopsWelcomeFlow({ + user: result.welcome.user, + org: result.welcome.org, + project: result.welcome.project, + signupSource: result.welcome.org.signupSource, + appUrl: WEB_ORIGIN, + }).catch((err) => { + logger.warn({ err, userId, orgId: result.welcome?.org.id }, "loops welcome flow failed"); + }); + } + + return c.json(result.payload); +}); + +app.post("/api/signup-intents/:intentId/claim", async (c) => { + const intentId = c.req.param("intentId"); + const body = (await c.req.json().catch(() => ({}))) as { projectId?: unknown }; + const projectId = typeof body.projectId === "string" ? body.projectId : null; + if (!projectId) throw new HTTPException(400, { message: "projectId required" }); + + const { user, org } = await resolveActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + const project = await db.query.projects.findFirst({ + where: and(eq(schema.projects.id, projectId), eq(schema.projects.orgId, org.id)), + }); + if (!project) throw new HTTPException(404, { message: "project not found in active org" }); + + const claimed = await db.transaction(async (tx) => { + const intent = await tx.query.signupIntents.findFirst({ + where: eq(schema.signupIntents.id, intentId), + }); + if (!intent) throw new HTTPException(404, { message: "signup intent not found" }); + if (intent.expiresAt < new Date()) { + logger.warn( + { + intent_id: intentId, + project_id: projectId, + user_id: c.var.userId, + expires_at: intent.expiresAt.toISOString(), + age_ms: Date.now() - intent.expiresAt.getTime(), + }, + "signup intent expired", + ); + throw new HTTPException(410, { message: "signup intent expired" }); + } + if (intent.consumedAt) { + if (intent.claimedProjectId === project.id) { + return { + id: null, + keyPrefix: intent.keyPrefix, + returnTo: intent.returnTo, + alreadyClaimed: true, + }; + } + throw new HTTPException(409, { message: "signup intent already claimed" }); + } + + const existingKey = await tx.query.apiKeys.findFirst({ + where: eq(schema.apiKeys.keyHash, intent.keyHash), + }); + if (existingKey && existingKey.projectId !== project.id) { + throw new HTTPException(409, { + message: "signup intent key already belongs to another project", + }); + } + + const [key] = existingKey + ? [existingKey] + : await tx + .insert(schema.apiKeys) + .values({ + projectId: project.id, + name: "Skill onboarding", + keyHash: intent.keyHash, + keyPrefix: intent.keyPrefix, + }) + .returning(); + if (!key) throw new Error("failed to claim signup intent key"); + + await tx + .update(schema.signupIntents) + .set({ + consumedAt: new Date(), + claimedProjectId: project.id, + claimedByUserId: user.id, + }) + .where(eq(schema.signupIntents.id, intent.id)); + + return { + id: key.id, + keyPrefix: key.keyPrefix, + returnTo: intent.returnTo, + alreadyClaimed: false, + }; + }); + + return c.json(claimed); +}); + +app.post("/api/projects/:projectId/keys", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + return tracer.startActiveSpan("apikey.create", async (span) => { + span.setAttribute("tenant.project_id", projectId); + try { + const body = (await c.req.json().catch(() => ({}))) as { name?: string }; + const name = body.name?.trim() || "new key"; + span.setAttribute("apikey.name", name); + const minted = await mintApiKey({ projectId, name }); + span.setAttribute("apikey.prefix", minted.keyPrefix); + span.setAttribute("apikey.id", minted.id); + return c.json({ + id: minted.id, + name: minted.name, + keyPrefix: minted.keyPrefix, + createdAt: minted.createdAt, + plaintext: minted.plaintext, + }); + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + span.end(); + } + }); +}); + +app.get("/api/projects/:projectId/keys", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const rows = await db.query.apiKeys.findMany({ + where: eq(schema.apiKeys.projectId, projectId), + }); + return c.json( + rows.map((k) => ({ + id: k.id, + name: k.name, + keyPrefix: k.keyPrefix, + lastUsedAt: k.lastUsedAt, + revokedAt: k.revokedAt, + createdAt: k.createdAt, + })), + ); +}); + +app.delete("/api/projects/:projectId/keys/:keyId", async (c) => { + const projectId = c.req.param("projectId"); + const keyId = c.req.param("keyId"); + await requireProjectAccess(c, projectId); + await db + .update(schema.apiKeys) + .set({ revokedAt: new Date() }) + .where(and(eq(schema.apiKeys.id, keyId), eq(schema.apiKeys.projectId, projectId))); + return c.json({ ok: true }); +}); + +// Reports whether the user has connected at least one MCP client to this +// project. Used by the dashboard's setup-todos to hide the "Install the MCP +// server" card once a token exists. Counts non-revoked tokens whose refresh +// is still valid (or never expires) — clients with only stale access tokens +// will still re-auth, so we don't gate on `accessExpiresAt`. +app.get("/api/projects/:projectId/mcp-status", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const rows = await db + .select({ id: schema.mcpOauthTokens.id }) + .from(schema.mcpOauthTokens) + .where( + and(eq(schema.mcpOauthTokens.projectId, projectId), isNull(schema.mcpOauthTokens.revokedAt)), + ) + .limit(1); + return c.json({ connected: rows.length > 0 }); +}); + +app.get("/api/projects/:projectId/stats", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const [traces, logs, metrics, issueRows] = await Promise.all([ + chCount("otel_traces", "Timestamp", projectId), + chCount("otel_logs", "Timestamp", projectId), + chMetricsCount(projectId), + db.select({ c: count() }).from(schema.issues).where(eq(schema.issues.projectId, projectId)), + ]); + return c.json({ + window: "1h", + traces, + logs, + metrics, + issues: Number(issueRows[0]?.c ?? 0), + }); +}); + +// The Autumn SDK throws a typed AutumnError carrying the HTTP `statusCode` and +// raw `body` — use it directly (no casts) and match the specific 409 +// "plan_already_attached" conflict code in the body. +function isPlanAlreadyAttached(err: unknown): boolean { + return ( + err instanceof AutumnError && + err.statusCode === 409 && + err.body.includes("plan_already_attached") + ); +} + +// Immediate "switch to Free" — per Autumn's guidance, attach the Free plan now +// (planSchedule "immediate") and carry usage over, rather than cancelling. Free +// is the auto_enable default, so attaching it when already on Free returns a +// "plan_already_attached" conflict, which we treat as a no-op success. Per-org +// (org = Autumn customer); the carry-over closes the toggle-to-reset loophole. +app.post("/api/me/billing/cancel", async (c) => { + const ctx = await resolveMaybeActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + if (!ctx.org) throw new HTTPException(400, { message: "no active org" }); + const key = process.env.AUTUMN_SECRET_KEY; + if (!key) throw new HTTPException(400, { message: "billing is not configured" }); + const orgId = ctx.org.id; + // "Switch to Free" — per Autumn's guidance, attach the Free plan immediately + // and carry usage over, rather than cancelling the paid plan. When a paid + // plan is active this is a real downgrade: planSchedule:"immediate" applies it + // now and carryOverUsages preserves the org's metered usage (spans / logs / + // metric points / investigation credits) so a maxed cap can't be reset by + // toggling paid↔Free. (Cancelling instead spins up a fresh Free entitlement + // with usage 0 — the reset we were fighting; and billing.update has no + // carry-over option.) If the org is ALREADY on Free (Free is the auto_enable + // default), the attach 409s "plan_already_attached" — that's a no-op success. + const autumn = new Autumn({ secretKey: key }); + try { + await autumn.billing.attach({ + customerId: orgId, + planId: "free", + planSchedule: "immediate", + carryOverUsages: { enabled: true }, + }); + } catch (err) { + // Only the "already on Free" conflict is a no-op success; surface any other + // error so a genuine failure isn't reported as a successful switch. + if (isPlanAlreadyAttached(err)) { + return c.json({ ok: true }); + } + throw err; + } + return c.json({ ok: true }); +}); + +app.get("/api/projects/:projectId/explore/attribute-keys", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const { since, until } = parseRangeQuery(c); + const rows = await listAttributeKeys( + ch, + projectId, + { since, until }, + parseExploreAttributeSource(c), + ); + return c.json(rows); +}); + +app.get("/api/projects/:projectId/explore/attribute-values", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const key = c.req.query("key"); + if (!key) throw new HTTPException(400, { message: "key is required" }); + const { since, until } = parseRangeQuery(c); + const rows = await listAttributeValues( + ch, + projectId, + key, + { since, until }, + 200, + parseExploreAttributeSource(c), + ); + return c.json(rows); +}); + +app.get("/api/projects/:projectId/explore/services", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const { since, until } = parseRangeQuery(c); + const services = await listServices(ch, projectId, { since, until }); + return c.json(services); +}); + +app.post("/api/projects/:projectId/explore/logs", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + return tracer.startActiveSpan("explore.query_logs", async (span) => { + span.setAttribute("tenant.project_id", projectId); + try { + const body = (await c.req.json().catch(() => ({}))) as ExploreListBody; + const limit = clampLimit(body.limit, 100, 500); + span.setAttribute("explore.limit", limit); + if (body.service) span.setAttribute("explore.service", body.service); + if (body.severity) span.setAttribute("explore.severity", body.severity); + if (body.search) span.setAttribute("explore.has_search", true); + const rows = await queryLogs(ch, projectId, { + range: body.range, + service: body.service, + severity: body.severity, + search: body.search, + resourceAttrs: normalizeAttrs(body.resourceAttrs), + limit, + }); + span.setAttribute("explore.row_count", rows.length); + return c.json(rows); + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + span.end(); + } + }); +}); + +app.post("/api/projects/:projectId/explore/traces", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as ExploreListBody; + const limit = clampLimit(body.limit, 100, 500); + const rows = await queryTraces(ch, projectId, { + range: body.range, + service: body.service, + spanName: body.spanName, + statusCode: body.statusCode, + minDurationMs: body.minDurationMs, + resourceAttrs: normalizeAttrs(body.resourceAttrs), + limit, + }); + return c.json(rows); +}); + +app.post("/api/projects/:projectId/explore/traces-aggregated", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as ExploreListBody; + const limit = clampLimit(body.limit, 100, 500); + const rows = await queryTracesAggregated(ch, projectId, { + range: body.range, + service: body.service, + spanName: body.spanName, + statusCode: body.statusCode, + minDurationMs: body.minDurationMs, + resourceAttrs: normalizeAttrs(body.resourceAttrs), + limit, + }); + return c.json(rows); +}); + +app.get("/api/projects/:projectId/explore/traces/:traceId", async (c) => { + const projectId = c.req.param("projectId"); + const traceId = c.req.param("traceId"); + await requireProjectAccess(c, projectId); + if (!/^[a-fA-F0-9]{1,64}$/.test(traceId)) { + throw new HTTPException(400, { message: "invalid trace id" }); + } + const detail = await getTraceDetail(ch, projectId, traceId); + return c.json(detail); +}); + +app.post("/api/projects/:projectId/explore/series", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as ExploreSeriesBody; + const source: SeriesSource = body.source === "traces" ? "traces" : "logs"; + const filter = body.filter ?? {}; + const rangeSeconds = estimateRangeSeconds(filter.range); + const step = pickStep(rangeSeconds); + const rows = await countSeries( + ch, + projectId, + source, + { + range: filter.range, + service: filter.service, + resourceAttrs: normalizeAttrs(filter.resourceAttrs), + search: filter.search, + severity: filter.severity, + spanName: filter.spanName, + statusCode: filter.statusCode, + minDurationMs: filter.minDurationMs, + }, + body.groupBy || undefined, + step, + ); + return c.json({ step: `${step.n} ${step.unit}`, rows }); +}); + +app.get("/api/projects/:projectId/explore/metric-names", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const { since, until } = parseRangeQuery(c); + const names = await listMetricNames(ch, projectId, { since, until }); + return c.json(names); +}); + +app.post("/api/projects/:projectId/explore/metric-series", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as MetricSeriesBody; + const metricName = typeof body.metricName === "string" ? body.metricName : ""; + const filter = body.filter ?? {}; + const rangeSeconds = estimateRangeSeconds(filter.range); + const step = pickStep(rangeSeconds); + const aggregation = + typeof body.aggregation === "string" && + (METRIC_AGGREGATIONS as readonly string[]).includes(body.aggregation) + ? (body.aggregation as MetricAggregation) + : undefined; + const rows = await metricSeries( + ch, + projectId, + metricName, + { + range: filter.range, + service: filter.service, + resourceAttrs: normalizeAttrs(filter.resourceAttrs), + }, + body.groupBy || undefined, + step, + aggregation, + ); + return c.json({ step: `${step.n} ${step.unit}`, rows }); +}); + +app.post("/api/projects/:projectId/explore/metrics", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as ExploreListBody & { metricName?: string }; + const limit = clampLimit(body.limit, 100, 500); + const rows = await queryMetrics(ch, projectId, { + metricName: typeof body.metricName === "string" ? body.metricName : undefined, + range: body.range, + service: body.service, + resourceAttrs: normalizeAttrs(body.resourceAttrs), + limit, + }); + return c.json(rows); +}); + +type MetricSeriesBody = { + metricName?: string; + groupBy?: string; + aggregation?: string; + filter?: Omit; +}; + +type ExploreListBody = { + range?: { since?: string; until?: string }; + service?: string; + resourceAttrs?: ResourceAttrFilter[]; + search?: string; + severity?: string; + spanName?: string; + statusCode?: string; + minDurationMs?: number; + limit?: number; +}; + +type ExploreSeriesBody = { + source?: SeriesSource; + groupBy?: string; + filter?: Omit; +}; + +function parseRangeQuery(c: Context<{ Variables: Vars }>): { since?: string; until?: string } { + const since = c.req.query("since"); + const until = c.req.query("until"); + return { since, until }; +} + +function parseExploreAttributeSource( + c: Context<{ Variables: Vars }>, +): SeriesSource | "metrics" | undefined { + const source = c.req.query("source"); + if (source === "logs" || source === "traces" || source === "metrics") return source; + return undefined; +} + +function clampLimit(n: number | undefined, fallback: number, max: number): number { + const v = Math.floor(Number(n ?? fallback)); + if (!Number.isFinite(v) || v <= 0) return fallback; + return Math.min(v, max); +} + +function isIncidentStatus(value: string): value is schema.IncidentStatus { + return ( + value === "open" || value === "resolved" || value === "autoresolved_noise" || value === "merged" + ); +} + +function normalizeAttrs(attrs: ResourceAttrFilter[] | undefined): ResourceAttrFilter[] | undefined { + if (!Array.isArray(attrs)) return undefined; + const out = attrs.filter( + (a): a is ResourceAttrFilter => + !!a && + typeof a.key === "string" && + a.key.length > 0 && + typeof a.value === "string" && + (a.op === undefined || a.op === "eq" || a.op === "neq" || a.op === "not_contains"), + ); + return out.length > 0 ? out : undefined; +} + +function estimateRangeSeconds(range: { since?: string; until?: string } | undefined): number { + if (!range?.since || !range?.until) return 3600; + const s = Date.parse(range.since); + const u = Date.parse(range.until); + if (!Number.isFinite(s) || !Number.isFinite(u) || u <= s) return 3600; + return (u - s) / 1000; +} + +async function chCount(table: string, tsColumn: string, projectId: string): Promise { + const r = await ch.query({ + query: ` + SELECT count() AS c + FROM ${table} + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND ${tsColumn} > now() - INTERVAL 1 HOUR + `, + query_params: { projectId }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { c: string | number }[]; + return Number(rows[0]?.c ?? 0); +} + +async function chMetricsCount(projectId: string): Promise { + return tracer.startActiveSpan("metrics.aggregate_counts", async (span) => { + span.setAttribute("tenant.project_id", projectId); + try { + const tables = [ + "otel_metrics_gauge", + "otel_metrics_sum", + "otel_metrics_histogram", + "otel_metrics_summary", + "otel_metrics_exp_histogram", + ]; + span.setAttribute("metrics.table_count", tables.length); + const counts = await Promise.all(tables.map((t) => chCount(t, "TimeUnix", projectId))); + const total = counts.reduce((a, b) => a + b, 0); + span.setAttribute("metrics.total", total); + return total; + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + span.end(); + } + }); +} + +async function requireProjectAccess( + c: Context<{ Variables: Vars }>, + projectId: string, +): Promise { + return tracer.startActiveSpan("project.authorize", async (span) => { + span.setAttribute("tenant.project_id", projectId); + span.setAttribute("superlog.user_id", c.var.userId); + if (c.var.orgId) span.setAttribute("superlog.org_id_hint", c.var.orgId); + try { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + const ctx = await resolveActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + if (project.orgId !== ctx.org.id) throw new HTTPException(403, { message: "forbidden" }); + span.setAttribute("superlog.org_id", ctx.org.id); + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + span.end(); + } + }); +} + +async function getProjectAutomation(projectId: string): Promise<{ + autoInvestigateIssuesEnabled: boolean; + agentRunProvider: string; + maxRuntimeMinutes: number; + maxHumanResumeCount: number; + customInstructions: string; + agentRunEnabled: boolean; + linearTicketPolicy: schema.LinearTicketPolicy; + linearTicketInstructions: schema.LinearTicketInstruction[]; + prPolicy: schema.PrPolicy; + prBaseBranch: string | null; + autoMergeFixPrs: schema.AutoMergePolicy; + autoMergeMethod: schema.AutoMergeMethod; + issueFilterConfig: schema.IssueFilterConfig; +}> { + const row = await db.query.projectAutomationSettings.findFirst({ + where: eq(schema.projectAutomationSettings.projectId, projectId), + }); + return { + autoInvestigateIssuesEnabled: row?.autoInvestigateIssuesEnabled ?? true, + agentRunProvider: row?.agentRunProvider ?? DEFAULT_AGENT_RUN_PROVIDER, + maxRuntimeMinutes: row?.maxRuntimeMinutes ?? 90, + maxHumanResumeCount: row?.maxHumanResumeCount ?? 3, + customInstructions: row?.customInstructions ?? "", + agentRunEnabled: row?.agentRunEnabled ?? true, + linearTicketPolicy: row?.linearTicketPolicy ?? "on_ready_to_pr", + linearTicketInstructions: row?.linearTicketInstructions ?? [], + prPolicy: row?.prPolicy ?? "on_ready_to_pr", + prBaseBranch: schema.normalizePrBaseBranch(row?.prBaseBranch), + autoMergeFixPrs: row?.autoMergeFixPrs ?? "never", + autoMergeMethod: row?.autoMergeMethod ?? "squash", + issueFilterConfig: row?.issueFilterConfig ?? schema.EMPTY_ISSUE_FILTER_CONFIG, + }; +} + +function sanitizeClauseList(input: unknown): schema.IssueFilterClause[] { + if (!Array.isArray(input)) return []; + const out: schema.IssueFilterClause[] = []; + const seen = new Set(); + for (const item of input) { + if (!item || typeof item !== "object") continue; + const key = + typeof (item as { key?: unknown }).key === "string" + ? (item as { key: string }).key.trim() + : ""; + const value = + typeof (item as { value?: unknown }).value === "string" + ? (item as { value: string }).value.trim() + : ""; + if (!key || !value) continue; + const dedupe = `${key.toLowerCase()}=${value}`; + if (seen.has(dedupe)) continue; + seen.add(dedupe); + out.push({ key: key.slice(0, 200), value: value.slice(0, 400) }); + if (out.length >= 20) break; + } + return out; +} + +function sanitizeIssueFilterConfig( + input: unknown, + fallback: schema.IssueFilterConfig, +): schema.IssueFilterConfig { + if (!input || typeof input !== "object") return fallback; + const o = input as Partial>; + return { + includeLogs: sanitizeClauseList(o.includeLogs), + includeSpans: sanitizeClauseList(o.includeSpans), + excludeLogs: sanitizeClauseList(o.excludeLogs), + excludeSpans: sanitizeClauseList(o.excludeSpans), + }; +} + +async function getProjectIncident(projectId: string, incidentId: string) { + return db.query.incidents.findFirst({ + where: and(eq(schema.incidents.id, incidentId), eq(schema.incidents.projectId, projectId)), + }); +} + +async function getLatestAgentRun(incidentId: string) { + return db.query.agentRuns.findFirst({ + where: eq(schema.agentRuns.incidentId, incidentId), + orderBy: [desc(schema.agentRuns.createdAt)], + }); +} + +app.get("/api/projects/:projectId/issues", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const silencedParam = c.req.query("silenced") ?? "active"; + const limit = clampLimit(Number(c.req.query("limit") ?? 50), 50, 200); + const projectFilter = eq(schema.issues.projectId, projectId); + const where = + silencedParam === "all" + ? projectFilter + : silencedParam === "silenced" + ? and(projectFilter, isNotNull(schema.issues.silencedAt)) + : and(projectFilter, isNull(schema.issues.silencedAt)); + const rows = await db.query.issues.findMany({ + where, + orderBy: [desc(schema.issues.lastSeen)], + limit, + }); + return c.json(rows); +}); + +app.get("/api/projects/:projectId/issues/:issueId", async (c) => { + const projectId = c.req.param("projectId"); + const issueId = c.req.param("issueId"); + await requireProjectAccess(c, projectId); + const issue = await db.query.issues.findFirst({ + where: and(eq(schema.issues.id, issueId), eq(schema.issues.projectId, projectId)), + }); + if (!issue) throw new HTTPException(404, { message: "issue not found" }); + const symbolication = await symbolicateIssueSample({ + database: db, + objectReader: sourceMapObjectStore, + projectId, + sample: issue.lastSample, + }).catch((err) => { + logger.warn({ err, projectId, issueId }, "failed to symbolicate issue sample"); + return null; + }); + return c.json({ ...issue, symbolication }); +}); + +app.post("/api/projects/:projectId/issues/lookup", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as { + kind?: "log" | "span"; + service?: string | null; + severity?: string | null; + body?: string | null; + exceptionType?: string | null; + exceptionMessage?: string | null; + stacktrace?: string | null; + }; + const kind = body.kind === "span" ? "span" : "log"; + const fp = + kind === "span" + ? fingerprint({ + type: body.exceptionType || body.severity || "Error", + stacktrace: body.stacktrace ?? null, + message: body.exceptionMessage ?? body.body ?? null, + }) + : fingerprintLog({ + service: body.service ?? "", + severity: body.severity ?? "", + body: body.body ?? "", + exceptionType: body.exceptionType ?? null, + stacktrace: body.stacktrace ?? null, + }); + const issue = await db.query.issues.findFirst({ + where: and(eq(schema.issues.projectId, projectId), eq(schema.issues.fingerprint, fp.hash)), + }); + return c.json({ issue: issue ?? null }); +}); + +app.post("/api/projects/:projectId/symbolication/log", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as { + stacktrace?: string | null; + logAttrs?: Record | null; + resourceAttrs?: Record | null; + }; + const symbolication = await symbolicateTelemetrySample({ + database: db, + objectReader: sourceMapObjectStore, + projectId, + sample: { + stacktrace: body.stacktrace ?? null, + logAttrs: body.logAttrs ?? null, + resourceAttrs: body.resourceAttrs ?? null, + }, + }).catch((err) => { + logger.warn({ err, projectId }, "failed to symbolicate log sample"); + return null; + }); + return c.json({ symbolication }); +}); + +app.get("/api/projects/:projectId/issues/:issueId/agent-run", async (c) => { + const projectId = c.req.param("projectId"); + const issueId = c.req.param("issueId"); + await requireProjectAccess(c, projectId); + + const issue = await db.query.issues.findFirst({ + where: and(eq(schema.issues.id, issueId), eq(schema.issues.projectId, projectId)), + }); + if (!issue) throw new HTTPException(404, { message: "issue not found" }); + + const link = await db.query.incidentIssues.findFirst({ + where: eq(schema.incidentIssues.issueId, issueId), + }); + if (!link) return c.json({ incident: null, agentRun: null, events: [] }); + + const incident = await getProjectIncident(projectId, link.incidentId); + if (!incident) return c.json({ incident: null, agentRun: null, events: [] }); + + const agentRun = await getLatestAgentRun(incident.id); + if (!agentRun) return c.json({ incident, agentRun: null, events: [] }); + + const events = await loadIncidentTimeline(incident.id, agentRun.id); + + return c.json({ incident, agentRun, events }); +}); + +app.patch("/api/projects/:projectId/incidents/:incidentId", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as { status?: string }; + const status = body.status; + if (status !== "open" && status !== "resolved") { + throw new HTTPException(400, { message: "status must be 'open' or 'resolved'" }); + } + const existing = await db.query.incidents.findFirst({ + where: and(eq(schema.incidents.id, incidentId), eq(schema.incidents.projectId, projectId)), + }); + if (!existing) throw new HTTPException(404, { message: "incident not found" }); + + if (status === "resolved") { + // Route the dashboard's mark-resolved through the shared helper so the + // resolved_* columns are populated exactly like every other resolve path. + const { resolved } = await resolveIncident({ + incidentId, + kind: "dashboard_manual", + reasonCode: "dashboard_manual", + reasonText: `Resolved from the dashboard by user ${c.var.userId}.`, + resolvedByUserId: c.var.userId, + }); + if (resolved) { + await runResolvedIncidentSideEffectsForIncident({ + incidentId, + closePullRequest: (pr) => + closeAgentPullRequestOnGithub({ + installationId: pr.githubInstallationId, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + }), + }); + } + } else { + await incidentLifecycle.reopenManually({ + incident: existing, + actor: { userId: c.var.userId }, + summary: "Incident reopened from the dashboard.", + detail: { reason: "dashboard_manual" }, + }); + } + + const updated = await db.query.incidents.findFirst({ + where: and(eq(schema.incidents.id, incidentId), eq(schema.incidents.projectId, projectId)), + }); + return c.json(updated); +}); + +// Confirm/dismiss a pending resolution proposal from the dashboard. The +// proposalId in the path is the source of truth — projectId/incidentId +// are validated for access control and to make the URL self-documenting. +// Both routes route through the same shared helper the Slack handler +// uses, so confirmed/dismissed proposals from either surface look +// identical in the audit log. +async function decideResolutionProposal( + c: Context<{ Variables: Vars }>, + decision: "confirm" | "dismiss", +): Promise { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + const proposalId = c.req.param("proposalId"); + if (!projectId || !incidentId || !proposalId) { + throw new HTTPException(400, { message: "missing path parameter" }); + } + await requireProjectAccess(c, projectId); + + const proposal = await db.query.incidentResolutionProposals.findFirst({ + where: eq(schema.incidentResolutionProposals.id, proposalId), + }); + if (!proposal || proposal.incidentId !== incidentId) { + throw new HTTPException(404, { message: "proposal not found" }); + } + // Make sure the proposal belongs to this project — defence in depth on + // the project-access check above (the incident's projectId is the + // authoritative one). + const incident = await db.query.incidents.findFirst({ + where: and(eq(schema.incidents.id, incidentId), eq(schema.incidents.projectId, projectId)), + }); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + // Look up the user's name for the attribution phrase. Skip if the user + // row is gone (e.g. just-deleted account); the helper falls back to the + // user id. + const user = await db.query.users.findFirst({ + where: eq(schema.users.id, c.var.userId), + columns: { id: true, name: true, email: true }, + }); + const displayName = user?.name?.trim() || user?.email || null; + + const actor = { userId: c.var.userId, displayName }; + const result = + decision === "confirm" + ? await confirmResolutionProposal({ proposalId, actor }) + : await dismissResolutionProposal({ proposalId, actor }); + if (!result.ok) { + // already_confirmed / already_dismissed land as 409 so the dashboard + // can refresh and show the up-to-date state without treating it as a + // hard error. + if (result.reason?.startsWith("already_")) { + throw new HTTPException(409, { message: result.reason }); + } + throw new HTTPException(400, { message: result.reason ?? "decision failed" }); + } + if (decision === "confirm" && result.incidentId) { + await runResolvedIncidentSideEffectsForIncident({ + incidentId: result.incidentId, + closePullRequest: (pr) => + closeAgentPullRequestOnGithub({ + installationId: pr.githubInstallationId, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + }), + }); + } + return c.json({ ok: true, incidentId, proposalId, decision }); +} + +app.post( + "/api/projects/:projectId/incidents/:incidentId/resolution-proposals/:proposalId/confirm", + (c) => decideResolutionProposal(c, "confirm"), +); +app.post( + "/api/projects/:projectId/incidents/:incidentId/resolution-proposals/:proposalId/dismiss", + (c) => decideResolutionProposal(c, "dismiss"), +); + +app.post("/api/projects/:projectId/issues/:issueId/silence", async (c) => { + const projectId = c.req.param("projectId"); + const issueId = c.req.param("issueId"); + await requireProjectAccess(c, projectId); + return tracer.startActiveSpan("issue.silence", async (span) => { + span.setAttribute("tenant.project_id", projectId); + span.setAttribute("issue.id", issueId); + try { + const updated = await db + .update(schema.issues) + .set({ silencedAt: new Date() }) + .where( + and( + eq(schema.issues.id, issueId), + eq(schema.issues.projectId, projectId), + isNull(schema.issues.silencedAt), + ), + ) + .returning(); + if (!updated[0]) { + span.setAttribute("issue.silence.applied", false); + const existing = await db.query.issues.findFirst({ + where: and(eq(schema.issues.id, issueId), eq(schema.issues.projectId, projectId)), + }); + if (!existing) throw new HTTPException(404, { message: "issue not found" }); + return c.json(existing); + } + span.setAttribute("issue.silence.applied", true); + return c.json(updated[0]); + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + span.end(); + } + }); +}); + +app.post("/api/projects/:projectId/issues/:issueId/unsilence", async (c) => { + const projectId = c.req.param("projectId"); + const issueId = c.req.param("issueId"); + await requireProjectAccess(c, projectId); + const existing = await db.query.issues.findFirst({ + where: and(eq(schema.issues.id, issueId), eq(schema.issues.projectId, projectId)), + }); + if (!existing) throw new HTTPException(404, { message: "issue not found" }); + if (!existing.silencedAt) return c.json(existing); + const conflict = await db.query.issues.findFirst({ + where: and( + eq(schema.issues.projectId, projectId), + eq(schema.issues.fingerprint, existing.fingerprint), + isNull(schema.issues.silencedAt), + ), + }); + if (conflict) { + throw new HTTPException(409, { + message: "another active issue already exists for this fingerprint", + }); + } + const updated = await db + .update(schema.issues) + .set({ silencedAt: null }) + .where(and(eq(schema.issues.id, issueId), eq(schema.issues.projectId, projectId))) + .returning(); + return c.json(updated[0] ?? existing); +}); + +app.get("/api/projects/:projectId/automation", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const current = await getProjectAutomation(projectId); + return c.json({ projectId, ...current }); +}); + +// Picker support for the Issue filter editor — keys/values/preview are drawn +// from ERROR events only (logs SeverityNumber>=17, traces with exception +// event) so the UI matches the population the worker filter applies to. +const ISSUE_FILTER_RANGE = "now() - INTERVAL 24 HOUR"; + +app.get("/api/projects/:projectId/issue-filter/attribute-keys", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const rows = await listIssueFilterAttributeKeys(ch, projectId, { + since: ISSUE_FILTER_RANGE, + }); + return c.json(rows); +}); + +app.get("/api/projects/:projectId/issue-filter/attribute-values", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const key = c.req.query("key"); + if (!key) throw new HTTPException(400, { message: "key is required" }); + const rows = await listIssueFilterAttributeValues(ch, projectId, key, { + since: ISSUE_FILTER_RANGE, + }); + return c.json(rows); +}); + +// POST because the filter is now a structured object with 4 lists, which +// doesn't fit cleanly in a query string. +app.post("/api/projects/:projectId/issue-filter/preview", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as { + config?: unknown; + }; + const config = sanitizeIssueFilterConfig(body.config, schema.EMPTY_ISSUE_FILTER_CONFIG); + const events = await previewIssueFilterMatches( + ch, + projectId, + config, + { since: ISSUE_FILTER_RANGE }, + 10, + ); + return c.json({ events }); +}); + +const VALID_AGENT_POLICIES: ReadonlySet = new Set(["never", "on_ready_to_pr", "always"]); +const VALID_AUTO_MERGE_POLICIES: ReadonlySet = new Set([ + "never", + "when_checks_pass", + "immediately", +]); +const VALID_AUTO_MERGE_METHODS: ReadonlySet = new Set(["squash", "merge", "rebase"]); +const MAX_INSTRUCTIONS_LEN = 8000; + +function parsePrBaseBranch(input: unknown, current: string | null): string | null { + if (input === undefined) return current; + if (input === null) return null; + if (typeof input !== "string") return current; + const branch = schema.normalizePrBaseBranch(input); + if (branch && !schema.isValidPrBaseBranch(branch)) { + throw new HTTPException(400, { + message: + "prBaseBranch must be a valid Git branch name, or blank to use the repository default", + }); + } + return branch; +} + +// Branches the agent could target for PRs: the union across the project's +// enabled GitHub repos. Powers the strict PR-target-branch picker in Settings. +app.get("/api/projects/:projectId/github/branches", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + + const result = await listProjectRepoBranches(projectId); + if (result.errored) { + return c.json({ error: "failed to load branches from GitHub" }, 502); + } + return c.json({ branches: result.branches }); +}); + +app.patch("/api/projects/:projectId/automation", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + + const current = await getProjectAutomation(projectId); + const body = (await c.req.json().catch(() => ({}))) as { + autoInvestigateIssuesEnabled?: unknown; + agentRunProvider?: unknown; + maxRuntimeMinutes?: unknown; + maxHumanResumeCount?: unknown; + customInstructions?: unknown; + agentRunEnabled?: unknown; + linearTicketPolicy?: unknown; + linearTicketInstructions?: unknown; + prPolicy?: unknown; + prBaseBranch?: unknown; + autoMergeFixPrs?: unknown; + autoMergeMethod?: unknown; + issueFilterConfig?: unknown; + }; + + const autoInvestigateIssuesEnabled = + typeof body.autoInvestigateIssuesEnabled === "boolean" + ? body.autoInvestigateIssuesEnabled + : current.autoInvestigateIssuesEnabled; + const agentRunProvider = + typeof body.agentRunProvider === "string" ? body.agentRunProvider : current.agentRunProvider; + const maxRuntimeMinutes = + typeof body.maxRuntimeMinutes === "number" + ? Math.floor(body.maxRuntimeMinutes) + : current.maxRuntimeMinutes; + const maxHumanResumeCount = + typeof body.maxHumanResumeCount === "number" + ? Math.floor(body.maxHumanResumeCount) + : current.maxHumanResumeCount; + const customInstructions = + typeof body.customInstructions === "string" + ? body.customInstructions.slice(0, MAX_INSTRUCTIONS_LEN) + : current.customInstructions; + const agentRunEnabled = + typeof body.agentRunEnabled === "boolean" ? body.agentRunEnabled : current.agentRunEnabled; + const linearTicketPolicy: schema.LinearTicketPolicy = + typeof body.linearTicketPolicy === "string" && VALID_AGENT_POLICIES.has(body.linearTicketPolicy) + ? (body.linearTicketPolicy as schema.LinearTicketPolicy) + : current.linearTicketPolicy; + const linearTicketInstructions: schema.LinearTicketInstruction[] = (() => { + if (!Array.isArray(body.linearTicketInstructions)) return current.linearTicketInstructions; + const validated = body.linearTicketInstructions + .filter( + (item): item is { id: string; title: string; text: string } => + item !== null && + typeof item === "object" && + typeof item.id === "string" && + typeof item.title === "string" && + typeof item.text === "string", + ) + .slice(0, 20) + .map((item) => ({ + id: item.id, + title: item.title.slice(0, 200), + text: item.text.slice(0, 2000), + })); + return validated; + })(); + const prPolicy: schema.PrPolicy = + typeof body.prPolicy === "string" && VALID_AGENT_POLICIES.has(body.prPolicy) + ? (body.prPolicy as schema.PrPolicy) + : current.prPolicy; + const prBaseBranch = parsePrBaseBranch(body.prBaseBranch, current.prBaseBranch); + const autoMergeFixPrs: schema.AutoMergePolicy = + typeof body.autoMergeFixPrs === "string" && VALID_AUTO_MERGE_POLICIES.has(body.autoMergeFixPrs) + ? (body.autoMergeFixPrs as schema.AutoMergePolicy) + : current.autoMergeFixPrs; + const autoMergeMethod: schema.AutoMergeMethod = + typeof body.autoMergeMethod === "string" && VALID_AUTO_MERGE_METHODS.has(body.autoMergeMethod) + ? (body.autoMergeMethod as schema.AutoMergeMethod) + : current.autoMergeMethod; + const issueFilterConfig = + body.issueFilterConfig !== undefined + ? sanitizeIssueFilterConfig(body.issueFilterConfig, current.issueFilterConfig) + : current.issueFilterConfig; + + if (!isAgentRunProvider(agentRunProvider)) { + throw new HTTPException(400, { + message: "agentRunProvider must be one of: community, anthropic, disabled", + }); + } + if (!Number.isFinite(maxRuntimeMinutes) || maxRuntimeMinutes < 1 || maxRuntimeMinutes > 720) { + throw new HTTPException(400, { message: "maxRuntimeMinutes must be between 1 and 720" }); + } + if ( + !Number.isFinite(maxHumanResumeCount) || + maxHumanResumeCount < 0 || + maxHumanResumeCount > 10 + ) { + throw new HTTPException(400, { message: "maxHumanResumeCount must be between 0 and 10" }); + } + + // When the target branch changed to a non-blank value, confirm it actually + // exists in one of the project's repos. Skipped when GitHub can't be reached + // (errored) so a transient API failure can't lock the user out of saving + // unrelated settings — the worker still falls back to the repo default at PR + // time if the branch later disappears. + if (prBaseBranch && prBaseBranch !== current.prBaseBranch) { + const { branches, errored } = await listProjectRepoBranches(projectId); + if (!errored && !prBaseBranchExists(prBaseBranch, branches)) { + throw new HTTPException(400, { + message: `Branch "${prBaseBranch}" was not found in this project's connected repositories.`, + }); + } + } + + const values = { + projectId, + autoInvestigateIssuesEnabled, + agentRunProvider, + maxRuntimeMinutes, + maxHumanResumeCount, + customInstructions, + agentRunEnabled, + linearTicketPolicy, + linearTicketInstructions, + prPolicy, + prBaseBranch, + autoMergeFixPrs, + autoMergeMethod, + issueFilterConfig, + updatedAt: new Date(), + }; + + const updated = await db + .insert(schema.projectAutomationSettings) + .values(values) + .onConflictDoUpdate({ + target: schema.projectAutomationSettings.projectId, + set: { + autoInvestigateIssuesEnabled, + agentRunProvider, + maxRuntimeMinutes, + maxHumanResumeCount, + customInstructions, + agentRunEnabled, + linearTicketPolicy, + linearTicketInstructions, + prPolicy, + prBaseBranch, + autoMergeFixPrs, + autoMergeMethod, + issueFilterConfig, + updatedAt: new Date(), + }, + }) + .returning(); + + return c.json(updated[0] ?? values); +}); + +app.get("/api/projects/:projectId/incidents", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const limit = clampLimit(Number(c.req.query("limit") ?? 50), 50, 200); + const status = c.req.query("status"); + const incidentStatus = status && status !== "all" && isIncidentStatus(status) ? status : null; + if (status && status !== "all" && !incidentStatus) { + throw new HTTPException(400, { message: "invalid incident status" }); + } + + // Default view hides agent-classified noise. Pass ?status=all to include it, + // or ?status=autoresolved_noise to inspect just the noise pile. + const baseFilter = eq(schema.incidents.projectId, projectId); + let where = !status + ? and(baseFilter, ne(schema.incidents.status, "autoresolved_noise")) + : baseFilter; + if (incidentStatus) { + where = and(baseFilter, eq(schema.incidents.status, incidentStatus)); + } + const incidents = await db.query.incidents.findMany({ + where, + orderBy: [desc(schema.incidents.lastSeen)], + limit, + }); + const [agentRuns, pendingProposals] = await Promise.all([ + Promise.all(incidents.map((incident) => getLatestAgentRun(incident.id))), + loadPendingResolutionProposals(incidents.map((i) => i.id)), + ]); + + // Graph stats hit ClickHouse and can be slow on large projects. Keep the list + // itself Postgres-only by default; callers that still need the legacy inline + // shape can opt in with ?includeStats=1 while the web UI lazy-loads rows. + const inlineStats = shouldInlineIncidentListStats(c.req.query("includeStats")); + const statsByIncidentId = inlineStats + ? await loadIncidentsBucketStats( + projectId, + incidents.map((i) => i.id), + ) + : new Map(); + const emptyStats: IncidentBucketStats = { + buckets: buildBucketsFromMap(new Map(), INCIDENT_STATS_WINDOW_DAYS), + impactedUsers: 0, + impactedUsersAvailable: false, + impactedUsersCapped: false, + }; + + return c.json( + incidents.map((incident, index) => + buildIncidentListItem({ + incident, + agentRun: agentRuns[index] ?? null, + pendingResolutionProposal: pendingProposals.get(incident.id) ?? null, + stats: inlineStats + ? { + windowDays: INCIDENT_STATS_WINDOW_DAYS, + ...(statsByIncidentId.get(incident.id) ?? emptyStats), + } + : undefined, + }), + ), + ); +}); + +type IncidentBucketStats = { + buckets: { day: string; count: number }[]; + impactedUsers: number; + impactedUsersAvailable: boolean; + impactedUsersCapped: boolean; +}; + +// Bulk version of the per-incident stats query, used by the incidents list. +// Two ClickHouse round-trips: one returns (svc, et, day, count) tuples for +// the sparkline, the other returns (svc, et) → distinct user.id arrays. +// We then map each tuple back to whichever incident's issues had that +// (svc, et) pair, summing counts and Set-unioning users per-incident. +// Same approximation as the single-incident endpoint — see +// `fetchIncidentTimeseriesPairs`. +async function loadIncidentsBucketStats( + projectId: string, + incidentIds: string[], +): Promise> { + if (incidentIds.length === 0) return new Map(); + + const links = await db.query.incidentIssues.findMany({ + where: inArray(schema.incidentIssues.incidentId, incidentIds), + }); + if (links.length === 0) return new Map(); + + const issues = await db.query.issues.findMany({ + where: inArray( + schema.issues.id, + links.map((l) => l.issueId), + ), + }); + if (issues.length === 0) return new Map(); + + const issueById = new Map(issues.map((i) => [i.id, i] as const)); + // incidentId -> list of (kind, svc, et) it cares about + const incidentPairs = new Map(); + for (const link of links) { + const issue = issueById.get(link.issueId); + if (!issue) continue; + const arr = incidentPairs.get(link.incidentId) ?? []; + arr.push({ + kind: issue.kind === "log" ? "log" : "span", + svc: issue.service ?? "", + et: issue.exceptionType ?? "", + }); + incidentPairs.set(link.incidentId, arr); + } + + // Union all pairs into the CH query (one round-trip). + const spanServices: string[] = []; + const spanExcTypes: string[] = []; + const logServices: string[] = []; + const logExcTypes: string[] = []; + const seenSpan = new Set(); + const seenLog = new Set(); + for (const pairs of incidentPairs.values()) { + for (const p of pairs) { + const key = pairKey2(p.svc, p.et); + if (p.kind === "log") { + if (!seenLog.has(key)) { + seenLog.add(key); + logServices.push(p.svc); + logExcTypes.push(p.et); + } + } else { + if (!seenSpan.has(key)) { + seenSpan.add(key); + spanServices.push(p.svc); + spanExcTypes.push(p.et); + } + } + } + } + + // Delimiter unlikely to appear in service / exception_type — keeps the + // composite map key unambiguous so ("ab","c") and ("a","bc") don't collide. + const tupleKey = (kind: string, svc: string, et: string) => `${kind}${svc}${et}`; + + const [rows, userRows] = await Promise.all([ + fetchIncidentTimeseriesPairs({ + projectId, + spanServices, + spanExcTypes, + logServices, + logExcTypes, + windowDays: INCIDENT_STATS_WINDOW_DAYS, + }), + fetchIncidentUserIdsByPair({ + projectId, + spanServices, + spanExcTypes, + logServices, + logExcTypes, + windowDays: INCIDENT_STATS_WINDOW_DAYS, + }), + ]); + + const tupleCounts = new Map>(); + for (const r of rows) { + const key = tupleKey(r.kind, r.svc, r.et); + let byDay = tupleCounts.get(key); + if (!byDay) { + byDay = new Map(); + tupleCounts.set(key, byDay); + } + byDay.set(r.day, (byDay.get(r.day) ?? 0) + r.count); + } + const tupleUsers = new Map(); + for (const r of userRows) { + tupleUsers.set(tupleKey(r.kind, r.svc, r.et), { + users: r.users, + // groupUniqArray returns up to N rows; if we got exactly N we likely + // truncated. A false positive here just shows "200+" once — better + // than under-reporting a genuinely viral incident. + capped: r.users.length >= INCIDENT_USERS_CAP, + }); + } + + const out = new Map(); + for (const [incidentId, pairs] of incidentPairs) { + const merged = new Map(); + const userUnion = new Set(); + let capped = false; + // A single incident may have two issues whose (kind, svc, et) tuples are + // equal; dedupe so we don't double-count counts or users. + const tupleKeys = new Set(pairs.map((p) => tupleKey(p.kind, p.svc, p.et))); + for (const key of tupleKeys) { + const byDay = tupleCounts.get(key); + if (byDay) for (const [day, c] of byDay) merged.set(day, (merged.get(day) ?? 0) + c); + const tu = tupleUsers.get(key); + if (tu) { + for (const uid of tu.users) userUnion.add(uid); + if (tu.capped) capped = true; + } + } + out.set(incidentId, { + buckets: buildBucketsFromMap(merged, INCIDENT_STATS_WINDOW_DAYS), + impactedUsers: userUnion.size, + impactedUsersAvailable: userUnion.size > 0, + impactedUsersCapped: capped, + }); + } + return out; +} + +app.get("/api/projects/:projectId/incidents/:incidentId", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + await requireProjectAccess(c, projectId); + + const incident = await getProjectIncident(projectId, incidentId); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + const [links, agentRuns] = await Promise.all([ + db.query.incidentIssues.findMany({ + where: eq(schema.incidentIssues.incidentId, incidentId), + orderBy: [desc(schema.incidentIssues.createdAt)], + }), + db.query.agentRuns.findMany({ + where: eq(schema.agentRuns.incidentId, incident.id), + orderBy: [desc(schema.agentRuns.createdAt)], + }), + ]); + const issues = + links.length > 0 + ? await db.query.issues.findMany({ + where: inArray( + schema.issues.id, + links.map((link) => link.issueId), + ), + orderBy: [desc(schema.issues.lastSeen)], + }) + : []; + + // Timeline is the incident's own — events from incident_events scoped to + // this incident (and any of its agent runs), plus PR/Linear ticket events. + // Findings (root cause, severity, etc.) on `incident` are the primary + // source of truth; the timeline + agent-run history ride along on the + // same GET so the detail panel renders in one round trip. + const latestAgentRun = agentRuns[0] ?? null; + const [timeline, pendingProposalMap] = await Promise.all([ + latestAgentRun ? loadIncidentTimeline(incident.id, latestAgentRun.id) : Promise.resolve([]), + loadPendingResolutionProposals([incident.id]), + ]); + + return c.json({ + incident, + issues, + agentRun: latestAgentRun, + agentRuns, + timeline, + pendingResolutionProposal: pendingProposalMap.get(incident.id) ?? null, + }); +}); + +app.get("/api/projects/:projectId/incidents/:incidentId/pull-requests", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + await requireProjectAccess(c, projectId); + + const incident = await getProjectIncident(projectId, incidentId); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + const [prs, agentRuns] = await Promise.all([ + db.query.agentPullRequests.findMany({ + where: eq(schema.agentPullRequests.incidentId, incidentId), + orderBy: [desc(schema.agentPullRequests.createdAt)], + }), + db.query.agentRuns.findMany({ + where: eq(schema.agentRuns.incidentId, incidentId), + }), + ]); + + return c.json(buildIncidentPullRequestViews(prs, agentRuns)); +}); + +const VALID_MANUAL_MERGE_METHODS = new Set(["squash", "merge", "rebase"]); + +app.post("/api/projects/:projectId/incidents/:incidentId/pull-requests/:prId/merge", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + const prId = c.req.param("prId"); + await requireProjectAccess(c, projectId); + + const incident = await getProjectIncident(projectId, incidentId); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + const pr = await db.query.agentPullRequests.findFirst({ + where: and( + eq(schema.agentPullRequests.id, prId), + eq(schema.agentPullRequests.incidentId, incidentId), + ), + }); + if (!pr) throw new HTTPException(404, { message: "pull request not found" }); + if (pr.state !== "open") { + throw new HTTPException(409, { message: `pull request is already ${pr.state}` }); + } + + const installation = await db.query.githubInstallations.findFirst({ + where: eq(schema.githubInstallations.id, pr.installationId), + }); + if (!installation || installation.revokedAt) { + throw new HTTPException(409, { message: "github installation is unavailable" }); + } + + const body = (await c.req.json().catch(() => ({}))) as { method?: unknown }; + const method = + typeof body.method === "string" && VALID_MANUAL_MERGE_METHODS.has(body.method) + ? (body.method as "squash" | "merge" | "rebase") + : "squash"; + + const merged = await mergeGithubPullRequest({ + installationId: installation.installationId, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + method, + }); + + const now = new Date(); + const [updatedPr] = await db + .update(schema.agentPullRequests) + .set({ + state: "merged", + mergedAt: now, + closedAt: now, + headSha: merged.sha ?? pr.headSha, + lastSyncedAt: now, + updatedAt: now, + }) + .where(eq(schema.agentPullRequests.id, pr.id)) + .returning(); + + await db + .insert(schema.agentPrEvents) + .values({ + agentPrId: pr.id, + kind: "pr_merged", + summary: `PR #${pr.prNumber} merged from dashboard`, + payload: { method, sha: merged.sha, prUrl: pr.url, repoFullName: pr.repoFullName }, + providerEventId: `dashboard_merge:${pr.id}`, + occurredAt: now, + }) + .onConflictDoNothing(); + + await resolveIncident({ + incidentId: pr.incidentId, + kind: "agent_pr_merged", + reasonCode: "agent_pr_merged", + reasonText: `Resolved because agent PR #${pr.prNumber} (${pr.repoFullName}) was merged.`, + agentRunId: pr.agentRunId, + eventSummary: `Incident resolved because PR #${pr.prNumber} was merged.`, + eventDetail: { + agentPrId: pr.id, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + prUrl: pr.url, + mergedByLogin: null, + }, + eventDedupeKey: `incident_resolved:agent_pr:${pr.id}`, + resolvedAt: now, + }); + + const agentRun = await db.query.agentRuns.findFirst({ + where: eq(schema.agentRuns.id, pr.agentRunId), + }); + + return c.json({ + ok: true, + sha: merged.sha, + pullRequest: updatedPr + ? (buildIncidentPullRequestViews([updatedPr], agentRun ? [agentRun] : [])[0] ?? null) + : null, + }); +}); + +const INCIDENT_STATS_WINDOW_DAYS = 14; + +// Composite-key delimiter for (kind, service, exception_type) tuples. ASCII SOH +// is never a legal char in any of those fields, so it guarantees ("ab","c") and +// ("a","bc") get distinct keys. +const PAIR_KEY_SEP = ""; +const pairKey2 = (svc: string, et: string) => `${svc}${PAIR_KEY_SEP}${et}`; + +// Backfills the last N days as zero so the bar chart always shows a continuous timeline. +function buildBucketsFromMap( + countsByDay: Map, + windowDays: number, +): { day: string; count: number }[] { + const buckets: { day: string; count: number }[] = []; + const today = new Date(); + today.setUTCHours(0, 0, 0, 0); + for (let i = windowDays - 1; i >= 0; i--) { + const d = new Date(today.getTime() - i * 24 * 60 * 60 * 1000); + const key = d.toISOString().slice(0, 10); + buckets.push({ day: key, count: countsByDay.get(key) ?? 0 }); + } + return buckets; +} + +// Per-incident user-id sample cap. groupUniqArray(N) limits the response payload +// so a viral incident doesn't blow up the list endpoint; the per-incident count +// displayed in the UI is exact up to this cap, and "200+" thereafter. +const INCIDENT_USERS_CAP = 200; + +// Bulk fetch distinct user IDs per (kind, service, exception_type) across a project. +// Caller maps the returned tuples back to incidents and Set-unions per-incident. +async function fetchIncidentUserIdsByPair(args: { + projectId: string; + spanServices: string[]; + spanExcTypes: string[]; + logServices: string[]; + logExcTypes: string[]; + windowDays: number; +}): Promise<{ kind: "span" | "log"; svc: string; et: string; users: string[] }[]> { + const { projectId, spanServices, spanExcTypes, logServices, logExcTypes, windowDays } = args; + if (spanServices.length === 0 && logServices.length === 0) return []; + + const spanWhere = + spanServices.length === 0 + ? "0" + : `(coalesce(ServiceName, ''), coalesce(event_attrs['exception.type'], '')) IN arrayZip({spanServices:Array(String)}, {spanExcTypes:Array(String)})`; + const logWhere = + logServices.length === 0 + ? "0" + : `(coalesce(ServiceName, ''), coalesce(LogAttributes['exception.type'], '')) IN arrayZip({logServices:Array(String)}, {logExcTypes:Array(String)})`; + + const query = ` + SELECT 'span' AS kind, + coalesce(ServiceName, '') AS svc, + coalesce(event_attrs['exception.type'], '') AS et, + groupUniqArray(${INCIDENT_USERS_CAP})(nullIf(coalesce(SpanAttributes['user.id'], ResourceAttributes['user.id']), '')) AS users + FROM ( + SELECT Timestamp, ServiceName, SpanAttributes, ResourceAttributes, Events.Name, Events.Attributes + FROM otel_traces + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND has({spanServices:Array(String)}, coalesce(ServiceName, '')) + AND has(Events.Name, 'exception') + ) + ARRAY JOIN Events.Name AS event_name, Events.Attributes AS event_attrs + WHERE event_name = 'exception' + AND ${spanWhere} + GROUP BY svc, et + UNION ALL + SELECT 'log' AS kind, + coalesce(ServiceName, '') AS svc, + coalesce(LogAttributes['exception.type'], '') AS et, + groupUniqArray(${INCIDENT_USERS_CAP})(nullIf(coalesce(LogAttributes['user.id'], ResourceAttributes['user.id']), '')) AS users + FROM otel_logs + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND SeverityNumber >= 17 + AND has({logServices:Array(String)}, coalesce(ServiceName, '')) + AND ${logWhere} + GROUP BY svc, et + `; + + const res = await ch.query({ + query, + query_params: { + projectId, + days: windowDays, + spanServices, + spanExcTypes, + logServices, + logExcTypes, + }, + format: "JSONEachRow", + }); + const rows = (await res.json()) as { + kind: "span" | "log"; + svc: string; + et: string; + users: string[]; + }[]; + return rows; +} + +// Bulk fetch per-(service, exception_type, day) counts for spans + logs across a project. +// Caller maps the returned tuples back to incidents. The incident → telemetry link is +// approximate: fingerprints live in pg only, so we filter by the fingerprint *inputs* +// (exception.type, optionally service). This over-counts slightly when two distinct +// stacktraces share an exception type in the same service — fine for a sparkline. +async function fetchIncidentTimeseriesPairs(args: { + projectId: string; + spanServices: string[]; + spanExcTypes: string[]; + logServices: string[]; + logExcTypes: string[]; + windowDays: number; +}): Promise<{ svc: string; et: string; day: string; count: number; kind: "span" | "log" }[]> { + const { projectId, spanServices, spanExcTypes, logServices, logExcTypes, windowDays } = args; + if (spanServices.length === 0 && logServices.length === 0) return []; + + const spanWhere = + spanServices.length === 0 + ? "0" + : `(coalesce(ServiceName, ''), coalesce(event_attrs['exception.type'], '')) IN arrayZip({spanServices:Array(String)}, {spanExcTypes:Array(String)})`; + const logWhere = + logServices.length === 0 + ? "0" + : `(coalesce(ServiceName, ''), coalesce(LogAttributes['exception.type'], '')) IN arrayZip({logServices:Array(String)}, {logExcTypes:Array(String)})`; + + const query = ` + SELECT 'span' AS kind, + coalesce(ServiceName, '') AS svc, + coalesce(event_attrs['exception.type'], '') AS et, + toString(toDate(Timestamp)) AS day, + count() AS c + FROM ( + SELECT Timestamp, ServiceName, Events.Name, Events.Attributes + FROM otel_traces + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND has({spanServices:Array(String)}, coalesce(ServiceName, '')) + AND has(Events.Name, 'exception') + ) + ARRAY JOIN Events.Name AS event_name, Events.Attributes AS event_attrs + WHERE event_name = 'exception' + AND ${spanWhere} + GROUP BY svc, et, day + UNION ALL + SELECT 'log' AS kind, + coalesce(ServiceName, '') AS svc, + coalesce(LogAttributes['exception.type'], '') AS et, + toString(toDate(Timestamp)) AS day, + count() AS c + FROM otel_logs + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND SeverityNumber >= 17 + AND has({logServices:Array(String)}, coalesce(ServiceName, '')) + AND ${logWhere} + GROUP BY svc, et, day + `; + + const res = await ch.query({ + query, + query_params: { + projectId, + days: windowDays, + spanServices, + spanExcTypes, + logServices, + logExcTypes, + }, + format: "JSONEachRow", + }); + const rows = (await res.json()) as { + kind: "span" | "log"; + svc: string; + et: string; + day: string; + c: string | number; + }[]; + return rows.map((r) => ({ ...r, count: Number(r.c) })); +} + +// Daily event counts + impacted-user count for an incident's underlying telemetry. +app.get("/api/projects/:projectId/incidents/:incidentId/stats", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + await requireProjectAccess(c, projectId); + + const incident = await getProjectIncident(projectId, incidentId); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + const windowDays = INCIDENT_STATS_WINDOW_DAYS; + const empty = { + windowDays, + buckets: [] as { day: string; count: number }[], + totalEvents: 0, + impactedUsers: 0, + impactedUsersAvailable: false, + }; + + const links = await db.query.incidentIssues.findMany({ + where: eq(schema.incidentIssues.incidentId, incidentId), + }); + if (links.length === 0) return c.json(empty); + + const issues = await db.query.issues.findMany({ + where: inArray( + schema.issues.id, + links.map((l) => l.issueId), + ), + }); + if (issues.length === 0) return c.json(empty); + + const fingerprints = [...new Set(issues.map((issue) => issue.fingerprint).filter(Boolean))]; + const aggregateParams: Record = { + projectId, + days: windowDays, + fingerprints, + }; + const aggregateQuery = ` + SELECT toString(day) AS bucket_day, sum(event_count) AS count + FROM issue_activity_daily + WHERE project_id = {projectId:String} + AND fingerprint IN {fingerprints:Array(String)} + AND day >= today() - ({days:UInt32} - 1) + GROUP BY day + ORDER BY day ASC + `; + + const spanNamesBySample = await loadSpanNamesForIssueSamples(projectId, issues).catch((err) => { + logger.warn( + { err, projectId, incidentId }, + "incident span-name lookup unavailable; using unscoped span stats", + ); + return new Map(); + }); + const { + namedSpanServices, + namedSpanNames, + namedSpanExcTypes, + unnamedSpanServices, + unnamedSpanExcTypes, + logServices, + logExcTypes, + } = buildIncidentStatsPairs(issues, spanNamesBySample); + + // Match spans against the incident's fingerprint inputs. When we can resolve + // SpanName from the issue sample, include it so ClickHouse can use the + // (ServiceName, SpanName, Timestamp) primary key instead of scanning every + // exception span for a busy service. + const namedSpanWhere = + namedSpanServices.length === 0 + ? "0" + : `(coalesce(ServiceName, ''), coalesce(SpanName, ''), coalesce(event_attrs['exception.type'], '')) IN arrayZip({namedSpanServices:Array(String)}, {namedSpanNames:Array(String)}, {namedSpanExcTypes:Array(String)})`; + const unnamedSpanWhere = + unnamedSpanServices.length === 0 + ? "0" + : `(coalesce(ServiceName, ''), coalesce(event_attrs['exception.type'], '')) IN arrayZip({unnamedSpanServices:Array(String)}, {unnamedSpanExcTypes:Array(String)})`; + const spanWhere = `(${namedSpanWhere} OR ${unnamedSpanWhere})`; + const logWhere = + logServices.length === 0 + ? "0" + : `(coalesce(ServiceName, ''), coalesce(LogAttributes['exception.type'], '')) IN arrayZip({logServices:Array(String)}, {logExcTypes:Array(String)})`; + + const params: Record = { + projectId, + days: windowDays, + namedSpanServices, + namedSpanNames, + namedSpanExcTypes, + unnamedSpanServices, + unnamedSpanExcTypes, + logServices, + logExcTypes, + }; + const fallbackStats = buildIncidentStatsFromIssues(issues, { windowDays }); + + const bucketsQuery = ` + SELECT day, sum(c) AS c + FROM ( + SELECT toString(toDate(Timestamp)) AS day, count() AS c + FROM ( + SELECT Timestamp, ServiceName, SpanName, Events.Name, Events.Attributes + FROM otel_traces + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND ( + has({namedSpanServices:Array(String)}, coalesce(ServiceName, '')) + OR has({unnamedSpanServices:Array(String)}, coalesce(ServiceName, '')) + ) + AND ( + has({unnamedSpanServices:Array(String)}, coalesce(ServiceName, '')) + OR has({namedSpanNames:Array(String)}, coalesce(SpanName, '')) + ) + AND has(Events.Name, 'exception') + ) + ARRAY JOIN Events.Name AS event_name, Events.Attributes AS event_attrs + WHERE event_name = 'exception' + AND ${spanWhere} + GROUP BY day + UNION ALL + SELECT toString(toDate(Timestamp)) AS day, count() AS c + FROM otel_logs + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND SeverityNumber >= 17 + AND has({logServices:Array(String)}, coalesce(ServiceName, '')) + AND ${logWhere} + GROUP BY day + ) + GROUP BY day + ORDER BY day ASC + `; + + const usersQuery = ` + SELECT + uniqExact(uid) AS users, + countIf(uid IS NOT NULL) AS tagged_events + FROM ( + SELECT nullIf(coalesce(SpanAttributes['user.id'], ResourceAttributes['user.id']), '') AS uid + FROM ( + SELECT Timestamp, ServiceName, SpanName, SpanAttributes, ResourceAttributes, Events.Name, Events.Attributes + FROM otel_traces + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND ( + has({namedSpanServices:Array(String)}, coalesce(ServiceName, '')) + OR has({unnamedSpanServices:Array(String)}, coalesce(ServiceName, '')) + ) + AND ( + has({unnamedSpanServices:Array(String)}, coalesce(ServiceName, '')) + OR has({namedSpanNames:Array(String)}, coalesce(SpanName, '')) + ) + AND has(Events.Name, 'exception') + ) + ARRAY JOIN Events.Name AS event_name, Events.Attributes AS event_attrs + WHERE event_name = 'exception' + AND ${spanWhere} + UNION ALL + SELECT nullIf(coalesce(LogAttributes['user.id'], ResourceAttributes['user.id']), '') AS uid + FROM otel_logs + WHERE Timestamp > now() - INTERVAL {days:UInt32} DAY + AND ResourceAttributes['superlog.project_id'] = {projectId:String} + AND SeverityNumber >= 17 + AND has({logServices:Array(String)}, coalesce(ServiceName, '')) + AND ${logWhere} + ) + `; + + const stats = await buildIncidentStatsWithFallback({ + fallback: fallbackStats, + // Stay below the ClickHouse client's 10s request timeout so this endpoint + // returns issue-derived activity instead of surfacing a 500 to the drawer. + timeoutMs: 8_500, + onTelemetryUnavailable: (reason, err) => { + logger.warn( + { err, reason, projectId, incidentId }, + "incident telemetry stats unavailable; returning issue fallback", + ); + }, + loadTelemetry: async (signal) => { + try { + const activityRes = await ch.query({ + query: aggregateQuery, + query_params: aggregateParams, + format: "JSONEachRow", + abort_signal: signal, + }); + const activityRows = (await activityRes.json()) as { + bucket_day: string; + count: string | number; + }[]; + return buildIncidentStatsFromActivityRows( + activityRows.map((row) => ({ day: row.bucket_day, count: row.count })), + { windowDays }, + ); + } catch (err) { + logger.warn( + { err, projectId, incidentId }, + "incident fingerprint activity aggregate unavailable; falling back to raw telemetry stats", + ); + } + + const [bucketsRes, usersRes] = await Promise.all([ + ch.query({ + query: bucketsQuery, + query_params: params, + format: "JSONEachRow", + abort_signal: signal, + }), + ch.query({ + query: usersQuery, + query_params: params, + format: "JSONEachRow", + abort_signal: signal, + }), + ]); + + const bucketRows = (await bucketsRes.json()) as { day: string; c: string | number }[]; + const userRows = (await usersRes.json()) as { + users: string | number; + tagged_events: string | number; + }[]; + + const countsByDay = new Map(bucketRows.map((r) => [r.day, Number(r.c)])); + const buckets = buildBucketsFromMap(countsByDay, windowDays); + const totalEvents = buckets.reduce((a, b) => a + b.count, 0); + const taggedEvents = Number(userRows[0]?.tagged_events ?? 0); + + return { + windowDays, + buckets, + totalEvents, + impactedUsers: Number(userRows[0]?.users ?? 0), + // false ⇒ no event in the window had a user.id attribute, so the UI can show a + // "not instrumented" hint and link to the OTel onboarding skill. + impactedUsersAvailable: taggedEvents > 0, + }; + }, + }); + + return c.json(stats); +}); + +async function loadSpanNamesForIssueSamples( + projectId: string, + issues: Pick[], +): Promise> { + const samples: { traceId: string; spanId: string }[] = []; + const seen = new Set(); + for (const issue of issues) { + if (issue.kind === "log" || issue.lastSample?.spanName) continue; + const traceId = issue.lastSample?.traceId; + const spanId = issue.lastSample?.spanId; + if (!traceId || !spanId) continue; + const key = spanSampleKey(traceId, spanId); + if (seen.has(key)) continue; + seen.add(key); + samples.push({ traceId, spanId }); + } + if (samples.length === 0) return new Map(); + + const res = await ch.query({ + query: ` + SELECT + TraceId AS trace_id, + SpanId AS span_id, + any(SpanName) AS span_name + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND TraceId IN {traceIds:Array(String)} + AND SpanId IN {spanIds:Array(String)} + GROUP BY trace_id, span_id + `, + query_params: { + projectId, + traceIds: samples.map((s) => s.traceId), + spanIds: samples.map((s) => s.spanId), + }, + format: "JSONEachRow", + }); + const rows = (await res.json()) as { trace_id: string; span_id: string; span_name: string }[]; + return new Map( + rows + .filter((row) => row.span_name) + .map((row) => [spanSampleKey(row.trace_id, row.span_id), row.span_name]), + ); +} + +// Pull the latest open (decision IS NULL) resolution proposal for each +// incident id. Returns a Map keyed by incident id so the caller can +// stitch it into the response without an N+1 query. Empty input → empty +// map (no DB roundtrip). +async function loadPendingResolutionProposals( + incidentIds: string[], +): Promise> { + if (incidentIds.length === 0) return new Map(); + const rows = await db.query.incidentResolutionProposals.findMany({ + where: and( + inArray(schema.incidentResolutionProposals.incidentId, incidentIds), + isNull(schema.incidentResolutionProposals.decision), + ), + orderBy: [desc(schema.incidentResolutionProposals.proposedAt)], + }); + // One open proposal per incident is the invariant — the gating in the + // sweep selector enforces it — but defensively pick the newest if for + // some reason multiple exist (e.g. mid-migration data). + const map = new Map(); + for (const row of rows) { + if (map.has(row.incidentId)) continue; + map.set(row.incidentId, { + id: row.id, + sourceKind: row.sourceKind, + confidence: row.confidence, + proposedReasonCode: row.proposedReasonCode, + proposedReasonText: row.proposedReasonText, + proposedAt: row.proposedAt.toISOString(), + }); + } + return map; +} + +type PendingResolutionProposal = { + id: string; + sourceKind: string; + confidence: schema.IncidentResolutionProposalConfidence; + proposedReasonCode: string; + proposedReasonText: string; + proposedAt: string; +}; + +// Back-compat: returns the same {agentRun, events} shape the web client +// used pre-merge. The main `/incidents/:id` GET now folds this in. +app.get("/api/projects/:projectId/incidents/:incidentId/agent-run", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + await requireProjectAccess(c, projectId); + + const incident = await getProjectIncident(projectId, incidentId); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + const agentRun = await getLatestAgentRun(incident.id); + // An incident may have lifecycle events (manual resolve from the + // dashboard or Slack, sweep proposal confirmed) without ever having + // had an agent run — pass a never-matches uuid so loadIncidentTimeline + // returns only the incident-scoped lifecycle events. + const events = await loadIncidentTimeline( + incident.id, + agentRun?.id ?? "00000000-0000-0000-0000-000000000000", + ); + + return c.json({ agentRun: agentRun ?? null, events }); +}); + +app.post("/api/projects/:projectId/incidents/:incidentId/agent-run/restart", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + await requireProjectAccess(c, projectId); + + const incident = await getProjectIncident(projectId, incidentId); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + const latest = await getLatestAgentRun(incident.id); + if (!latest) throw new HTTPException(404, { message: "agent run not found" }); + + const automation = await getProjectAutomation(projectId); + if (!automation.agentRunEnabled) { + throw new HTTPException(400, { message: "incident agent_runs are disabled" }); + } + + const activeStates = [ + "queued", + "repo_discovery", + "running", + "awaiting_human", + "pr_retry_queued", + "blocked_no_github", + ]; + const now = new Date(); + const agentRun = await db.transaction(async (tx) => { + const superseded = await tx + .update(schema.agentRuns) + .set({ state: "superseded", completedAt: now, updatedAt: now }) + .where( + and( + eq(schema.agentRuns.incidentId, incident.id), + inArray(schema.agentRuns.state, activeStates), + ), + ) + .returning({ id: schema.agentRuns.id }); + + if (superseded.length > 0) { + await tx.insert(schema.incidentEvents).values( + superseded.map((row) => ({ + agentRunId: row.id, + kind: "agent_run_superseded", + summary: "Investigation superseded by a restart.", + dedupeKey: `superseded:${row.id}:${now.getTime()}`, + processedAt: now, + })), + ); + } + + const [created] = await tx + .insert(schema.agentRuns) + .values({ + incidentId: incident.id, + runtime: automation.agentRunProvider, + state: "queued", + }) + .returning(); + if (!created) throw new Error("failed to restart agent run"); + + await tx.insert(schema.incidentEvents).values({ + agentRunId: created.id, + kind: "agent_run_restarted", + summary: "Investigation restarted.", + detail: { + restartedFromAgentRunId: latest.id, + restartedFromState: latest.state, + }, + dedupeKey: `restart:${created.id}`, + processedAt: now, + }); + + return created; + }); + + return c.json(agentRun); +}); + +app.post("/api/projects/:projectId/incidents/:incidentId/agent-run/retry-pr", async (c) => { + const projectId = c.req.param("projectId"); + const incidentId = c.req.param("incidentId"); + await requireProjectAccess(c, projectId); + + const incident = await getProjectIncident(projectId, incidentId); + if (!incident) throw new HTTPException(404, { message: "incident not found" }); + + const latest = await getLatestAgentRun(incident.id); + if (!latest) throw new HTTPException(404, { message: "agent run not found" }); + const eligibility = getPrDeliveryRetryEligibility(latest ?? null); + if (!eligibility.canRetry) { + throw new HTTPException(400, { message: eligibility.reason }); + } + + const now = new Date(); + const agentRun = await db.transaction(async (tx) => { + const [updated] = await tx + .update(schema.agentRuns) + .set({ + state: "pr_retry_queued", + failureReason: null, + completedAt: null, + updatedAt: now, + }) + .where( + and( + eq(schema.agentRuns.id, latest.id), + eq(schema.agentRuns.state, "failed"), + eq(schema.agentRuns.failureReason, "pr_open_failed"), + ), + ) + .returning(); + if (!updated) throw new HTTPException(409, { message: "agent run is no longer retryable" }); + + await tx.insert(schema.incidentEvents).values({ + agentRunId: updated.id, + kind: "agent_run_pr_retry_queued", + summary: "PR delivery retry queued.", + detail: { + retriedFromState: latest.state, + selectedRepoFullName: latest.result?.pr?.selectedRepoFullName ?? null, + branchName: latest.result?.pr?.branchName ?? null, + }, + dedupeKey: `pr-retry:${updated.id}:${now.getTime()}`, + processedAt: now, + }); + + return updated; + }); + + return c.json(agentRun); +}); + +type TimelineEvent = { + id: string; + agentRunId: string; + kind: string; + summary: string | null; + detail: Record | null; + // The provider's own event id (Anthropic `sevt_…`). Tool_result events carry + // the matching `toolUseId` in their detail; pairing logic in the UI keys on + // this, not on `id` (which is a freshly-allocated row UUID). + providerEventId: string | null; + createdAt: string; + source: "agent_run" | "agent_pr" | "agent_linear"; + actor?: { + name: string | null; + avatarUrl: string | null; + profileUrl: string | null; + } | null; +}; + +async function loadIncidentTimeline( + incidentId: string, + agentRunId: string, +): Promise { + const [agentRunEvents, prRows, linearTickets] = await Promise.all([ + // Match events on either join key: events tied to this incident's + // current agent run OR events keyed directly on the incident (manual + // resolves, sweep proposal confirmations, etc., don't have an + // agent_run_id to anchor to). + db.query.incidentEvents.findMany({ + where: or( + eq(schema.incidentEvents.agentRunId, agentRunId), + eq(schema.incidentEvents.incidentId, incidentId), + ), + orderBy: [asc(schema.incidentEvents.createdAt)], + }), + db.query.agentPullRequests.findMany({ + where: eq(schema.agentPullRequests.incidentId, incidentId), + }), + db.query.agentLinearTickets.findMany({ + where: eq(schema.agentLinearTickets.incidentId, incidentId), + }), + ]); + + const [prEventRows, linearEventRows] = await Promise.all([ + prRows.length === 0 + ? ([] as schema.AgentPrEvent[]) + : db.query.agentPrEvents.findMany({ + where: inArray( + schema.agentPrEvents.agentPrId, + prRows.map((r) => r.id), + ), + orderBy: [asc(schema.agentPrEvents.occurredAt)], + }), + linearTickets.length === 0 + ? ([] as schema.AgentLinearTicketEvent[]) + : db.query.agentLinearTicketEvents.findMany({ + where: inArray( + schema.agentLinearTicketEvents.agentLinearTicketId, + linearTickets.map((r) => r.id), + ), + orderBy: [asc(schema.agentLinearTicketEvents.occurredAt)], + }), + ]); + + const prById = new Map(prRows.map((r) => [r.id, r] as const)); + const linearById = new Map(linearTickets.map((r) => [r.id, r] as const)); + + const items: TimelineEvent[] = []; + + for (const ev of agentRunEvents) { + items.push({ + id: ev.id, + // The row's own agent_run_id if it has one; fall back to the + // active agent run id we were called with so consumers that key + // off `agentRunId` still group events correctly. Lifecycle events + // without any run context land with the caller-supplied value. + agentRunId: ev.agentRunId ?? agentRunId, + kind: ev.kind, + summary: ev.summary, + detail: ev.detail, + providerEventId: ev.providerEventId, + createdAt: ev.createdAt.toISOString(), + source: "agent_run", + actor: null, + }); + } + for (const ev of prEventRows) { + const pr = prById.get(ev.agentPrId); + items.push({ + id: ev.id, + agentRunId, + kind: ev.kind, + summary: ev.summary, + detail: { + ...(ev.payload ?? {}), + prUrl: pr?.url ?? null, + prNumber: pr?.prNumber ?? null, + repoFullName: pr?.repoFullName ?? null, + }, + providerEventId: ev.providerEventId, + createdAt: ev.occurredAt.toISOString(), + source: "agent_pr", + actor: ev.actorLogin + ? { + name: ev.actorLogin, + avatarUrl: ev.actorAvatarUrl, + profileUrl: `https://github.com/${ev.actorLogin}`, + } + : null, + }); + } + for (const ev of linearEventRows) { + const ticket = linearById.get(ev.agentLinearTicketId); + items.push({ + id: ev.id, + agentRunId, + kind: ev.kind, + summary: ev.summary, + detail: { + ...(ev.payload ?? {}), + ticketUrl: ticket?.url ?? null, + ticketIdentifier: ticket?.ticketIdentifier ?? null, + }, + providerEventId: ev.providerEventId, + createdAt: ev.occurredAt.toISOString(), + source: "agent_linear", + actor: ev.actorName + ? { name: ev.actorName, avatarUrl: ev.actorAvatarUrl, profileUrl: null } + : null, + }); + } + + items.sort((a, b) => a.createdAt.localeCompare(b.createdAt)); + return items; +} + +if (shouldRunMigrationsOnBoot(process.env)) { + await runMigrations(); + logger.info({ scope: "db" }, "migrations applied"); +} else { + // Managed deploy: migrations are applied by a dedicated, gated step as a + // schema-owner role before this service rolls out. The app role can't (and + // shouldn't) run DDL on boot. + logger.info({ scope: "db" }, "skipping boot migrations (RUN_MIGRATIONS_ON_BOOT=false)"); +} + +const server = serve({ fetch: app.fetch, port: PORT }); +// Same load-balancer keep-alive concern as the proxy: Node's default 5s +// keepAliveTimeout lets it close idle sockets an upstream LB (typically ~60s +// idle timeout) still pools, so reused connections RST and surface as a 502 +// even though the app is healthy. Keep the keep-alive comfortably above the LB +// idle timeout — a thin margin still leaks 502s under bursty connection reuse — +// with headersTimeout above keepAliveTimeout per Node's required order. +if ("keepAliveTimeout" in server) { + server.keepAliveTimeout = 75_000; + server.headersTimeout = 76_000; +} +logger.info({ port: PORT }, "superlog api listening"); diff --git a/superlog/apps/api/src/integrations-manifest.ts b/superlog/apps/api/src/integrations-manifest.ts new file mode 100644 index 0000000000000000000000000000000000000000..04022167c2a0604c7915888af5b9aafbbda4557f --- /dev/null +++ b/superlog/apps/api/src/integrations-manifest.ts @@ -0,0 +1,26 @@ +export type IntegrationManifestSecret = { + name: string; + description: string; +}; + +export type IntegrationManifest = { + slug: string; + name: string; + description: string; + required_secrets: IntegrationManifestSecret[]; +}; + +export const INTEGRATION_MANIFESTS: Record = { + revyl: { + slug: "revyl", + name: "Revyl", + description: + "Trigger and inspect Revyl test runs and workflows; author new regression tests from YAML.", + required_secrets: [ + { + name: "REVYL_API_KEY", + description: "Revyl bearer token (Settings → API Keys in Revyl).", + }, + ], + }, +}; diff --git a/superlog/apps/api/src/linear.test.ts b/superlog/apps/api/src/linear.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..32440fdced5bf06fb26b4c73b300274c10700c2a --- /dev/null +++ b/superlog/apps/api/src/linear.test.ts @@ -0,0 +1,27 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; + +process.env.DATABASE_URL ??= "postgres://localhost:5434/superlog"; + +test("buildLinearAuthorizeUrl requests app-actor authorization", async () => { + const { buildLinearAuthorizeUrl } = await import("./linear.js"); + const url = new URL( + buildLinearAuthorizeUrl({ + clientId: "lin-client", + redirectUrl: "https://api.superlog.sh/linear/oauth/callback", + state: "signed-state", + }), + ); + + assert.equal(url.origin + url.pathname, "https://linear.app/oauth/authorize"); + assert.equal(url.searchParams.get("response_type"), "code"); + assert.equal(url.searchParams.get("client_id"), "lin-client"); + assert.equal( + url.searchParams.get("redirect_uri"), + "https://api.superlog.sh/linear/oauth/callback", + ); + assert.equal(url.searchParams.get("scope"), "read,write,issues:create,comments:create"); + assert.equal(url.searchParams.get("state"), "signed-state"); + assert.equal(url.searchParams.get("prompt"), "consent"); + assert.equal(url.searchParams.get("actor"), "app"); +}); diff --git a/superlog/apps/api/src/linear.ts b/superlog/apps/api/src/linear.ts new file mode 100644 index 0000000000000000000000000000000000000000..548482bdea231b8c80ccd0eec5d4ab6baa5c6e35 --- /dev/null +++ b/superlog/apps/api/src/linear.ts @@ -0,0 +1,483 @@ +import crypto from "node:crypto"; +import { + createLinearWebhook, + db, + deleteLinearWebhook, + exchangeLinearCode, + fetchLinearViewer, + revokeLinearToken, + schema, +} from "@superlog/db"; +import { and, eq, isNull } from "drizzle-orm"; +import type { Hono } from "hono"; +import type { Context } from "hono"; +import { logger } from "./logger.js"; +import { resolveActiveOrgContext } from "./org-context.js"; + +const log = logger.child({ scope: "linear" }); + +const SCOPES = "read,write,issues:create,comments:create"; + +type Vars = { userId: string; orgId: string | null }; + +export function buildLinearAuthorizeUrl(args: { + clientId: string; + redirectUrl: string; + state: string; +}): string { + const url = new URL("https://linear.app/oauth/authorize"); + url.searchParams.set("response_type", "code"); + url.searchParams.set("client_id", args.clientId); + url.searchParams.set("redirect_uri", args.redirectUrl); + url.searchParams.set("scope", SCOPES); + url.searchParams.set("state", args.state); + url.searchParams.set("prompt", "consent"); + url.searchParams.set("actor", "app"); + return url.toString(); +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountLinearPublic(app: Hono): void { + const clientId = process.env.LINEAR_CLIENT_ID; + const clientSecret = process.env.LINEAR_CLIENT_SECRET; + const redirectUrl = + process.env.LINEAR_OAUTH_REDIRECT_URL ?? "http://localhost:4100/linear/oauth/callback"; + const stateSecret = process.env.STATE_SIGNING_SECRET; + const webOrigin = process.env.WEB_ORIGIN ?? "http://localhost:5173"; + + if (!clientId || !clientSecret) { + log.warn("LINEAR_CLIENT_ID/SECRET not set — /linear/oauth/callback disabled"); + } + + app.get("/linear/oauth/callback", async (c) => { + if (!clientId || !clientSecret || !stateSecret) { + return c.json({ error: "linear not configured" }, 503); + } + const err = c.req.query("error"); + if (err) return c.redirect(`${webOrigin}/settings?linear=denied`, 302); + + const code = c.req.query("code"); + const state = c.req.query("state") ?? ""; + if (!code) return c.redirect(`${webOrigin}/settings?linear=error`, 302); + + const decoded = verifyState(state, stateSecret); + if (!decoded) return c.json({ error: "invalid state" }, 400); + + let token: Awaited>; + try { + token = await exchangeLinearCode({ + clientId, + clientSecret, + code, + redirectUri: redirectUrl, + }); + } catch (e) { + log.error({ err: e }, "linear oauth exchange failed"); + return c.redirect(`${webOrigin}/settings?linear=error`, 302); + } + + let viewer: Awaited>; + try { + viewer = await fetchLinearViewer(token.access_token); + } catch (e) { + log.error({ err: e }, "linear viewer fetch failed"); + return c.redirect(`${webOrigin}/settings?linear=error`, 302); + } + + const expiresAt = + typeof token.expires_in === "number" ? new Date(Date.now() + token.expires_in * 1000) : null; + + const webhook = await registerLinearWebhookSafely(token.access_token); + await upsertInstallation({ + projectId: decoded.projectId, + actorUserId: decoded.userId, + workspaceId: viewer.organization.id, + workspaceName: viewer.organization.name, + workspaceUrlKey: viewer.organization.urlKey, + actorEmail: viewer.email, + accessToken: token.access_token, + refreshToken: token.refresh_token ?? null, + accessExpiresAt: expiresAt, + scope: token.scope ?? null, + webhookId: webhook?.id ?? null, + webhookSecret: webhook?.secret ?? null, + }); + log.info( + { + org_id: decoded.orgId, + project_id: decoded.projectId, + workspace_id: viewer.organization.id, + workspace_name: viewer.organization.name, + actor_user_id: decoded.userId, + }, + "linear installed", + ); + + return c.redirect(`${webOrigin}/settings?linear=installed`, 302); + }); + + app.post("/linear/webhook", async (c) => { + const rawBody = await c.req.text(); + const sigHeader = c.req.header("linear-signature") ?? ""; + const delivery = c.req.header("linear-delivery") ?? null; + + let parsed: LinearWebhookPayload; + try { + parsed = JSON.parse(rawBody) as LinearWebhookPayload; + } catch { + return c.json({ error: "invalid json" }, 400); + } + + const webhookId = typeof parsed.webhookId === "string" ? parsed.webhookId : null; + if (!webhookId) return c.json({ error: "missing webhookId" }, 400); + + const install = await db.query.linearInstallations.findFirst({ + where: eq(schema.linearInstallations.webhookId, webhookId), + }); + if (!install || !install.webhookSecret) { + log.warn({ webhook_id: webhookId }, "linear webhook from unknown installation"); + return c.json({ error: "unknown webhook" }, 404); + } + if (!verifyLinearSignature(rawBody, sigHeader, install.webhookSecret)) { + log.warn({ webhook_id: webhookId, delivery }, "linear webhook signature failed"); + return c.json({ error: "bad signature" }, 401); + } + + try { + await handleLinearWebhook(parsed, install, delivery); + } catch (e) { + log.error({ err: e, webhook_id: webhookId }, "linear webhook handler failed"); + return c.json({ error: "handler failed" }, 500); + } + return c.json({ ok: true }); + }); +} + +type LinearWebhookActor = { id?: string; name?: string; avatarUrl?: string | null } | null; +type LinearWebhookPayload = { + action?: string; // create | update | remove + type?: string; // Issue | Comment | ... + webhookId?: string; + webhookTimestamp?: number; + createdAt?: string; + updatedFrom?: Record | null; + data?: { + id?: string; + identifier?: string; + title?: string; + body?: string; + url?: string; + issueId?: string; + issue?: { id?: string }; + state?: { id?: string; name?: string; type?: string }; + assignee?: LinearWebhookActor; + user?: LinearWebhookActor; + }; + actor?: LinearWebhookActor; +}; + +function verifyLinearSignature(body: string, header: string, secret: string): boolean { + if (!header) return false; + const expected = crypto.createHmac("sha256", secret).update(body).digest("hex"); + const expectedBuf = Buffer.from(expected, "hex"); + const provided = header.startsWith("sha256=") ? header.slice("sha256=".length) : header; + let providedBuf: Buffer; + try { + providedBuf = Buffer.from(provided, "hex"); + } catch { + return false; + } + if (providedBuf.length !== expectedBuf.length) return false; + return crypto.timingSafeEqual(providedBuf, expectedBuf); +} + +async function handleLinearWebhook( + payload: LinearWebhookPayload, + install: schema.LinearInstallation, + delivery: string | null, +): Promise { + const type = payload.type; + const action = payload.action; + if (!type || !action) return; + + const issueId = + type === "Issue" + ? payload.data?.id + : type === "Comment" + ? (payload.data?.issueId ?? payload.data?.issue?.id) + : null; + if (!issueId) return; + + const ticket = await db.query.agentLinearTickets.findFirst({ + where: and( + eq(schema.agentLinearTickets.workspaceId, install.workspaceId), + eq(schema.agentLinearTickets.ticketId, issueId), + ), + }); + if (!ticket) return; + + const occurredAt = payload.createdAt ? new Date(payload.createdAt) : new Date(); + + if (type === "Issue" && action === "update") { + const data = payload.data ?? {}; + const updates: Partial = { + lastSyncedAt: new Date(), + updatedAt: new Date(), + }; + if (typeof data.title === "string") updates.title = data.title; + if (typeof data.identifier === "string") updates.ticketIdentifier = data.identifier; + if (typeof data.url === "string") updates.url = data.url; + if (data.state?.name) updates.state = data.state.name; + if (data.state?.type) { + updates.stateType = data.state.type as schema.AgentLinearTicketState; + } + if (data.assignee) { + updates.assigneeName = data.assignee.name ?? null; + updates.assigneeLinearId = data.assignee.id ?? null; + } + await db + .update(schema.agentLinearTickets) + .set(updates) + .where(eq(schema.agentLinearTickets.id, ticket.id)); + } + + const { kind, summary, actor } = describeLinearEvent(payload); + if (!kind) return; + + await db + .insert(schema.agentLinearTicketEvents) + .values({ + agentLinearTicketId: ticket.id, + kind, + summary, + actorName: actor?.name ?? null, + actorLinearId: actor?.id ?? null, + actorAvatarUrl: actor?.avatarUrl ?? null, + payload: payload as unknown as Record, + providerEventId: delivery, + occurredAt, + }) + .onConflictDoNothing(); +} + +function describeLinearEvent(payload: LinearWebhookPayload): { + kind: string | null; + summary: string | null; + actor: LinearWebhookActor; +} { + const actor = payload.actor ?? null; + const type = payload.type; + const action = payload.action; + if (type === "Issue") { + if (action === "update") { + const stateChanged = + payload.updatedFrom && Object.prototype.hasOwnProperty.call(payload.updatedFrom, "stateId"); + if (stateChanged) { + return { + kind: "ticket_state_changed", + summary: payload.data?.state?.name + ? `State → ${payload.data.state.name}` + : "Ticket state changed", + actor, + }; + } + return { kind: "ticket_updated", summary: "Ticket updated", actor }; + } + if (action === "remove") return { kind: "ticket_removed", summary: "Ticket deleted", actor }; + return { kind: null, summary: null, actor }; + } + if (type === "Comment") { + if (action === "create") { + return { + kind: "ticket_comment", + summary: "Comment on ticket", + actor: payload.data?.user ?? actor, + }; + } + return { kind: null, summary: null, actor }; + } + return { kind: null, summary: null, actor }; +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountLinearAuthed(app: Hono): void { + const clientId = process.env.LINEAR_CLIENT_ID; + const redirectUrl = + process.env.LINEAR_OAUTH_REDIRECT_URL ?? "http://localhost:4100/linear/oauth/callback"; + const stateSecret = process.env.STATE_SIGNING_SECRET; + + app.get("/api/linear/installation", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ installed: false }); + const row = await findCurrentInstallation(ctx.projectId); + if (!row) return c.json({ installed: false }); + return c.json({ + installed: true, + workspaceId: row.workspaceId, + workspaceName: row.workspaceName, + workspaceUrlKey: row.workspaceUrlKey, + actorEmail: row.actorEmail, + scope: row.scope, + needsReauth: row.reauthRequiredAt !== null, + reauthReason: row.reauthReason, + reauthRequiredAt: row.reauthRequiredAt?.toISOString() ?? null, + }); + }); + + app.post("/api/linear/install-url", async (c) => { + if (!clientId || !stateSecret) { + return c.json({ error: "linear not configured" }, 503); + } + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + + const state = signState( + { orgId: ctx.orgId, projectId: ctx.projectId, userId: ctx.userId }, + stateSecret, + ); + return c.json({ url: buildLinearAuthorizeUrl({ clientId, redirectUrl, state }) }); + }); + + app.post("/api/linear/uninstall", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const row = await findCurrentInstallation(ctx.projectId); + if (!row) return c.json({ ok: true }); + + if (row.webhookId) { + await deleteLinearWebhook({ accessToken: row.accessToken, webhookId: row.webhookId }); + } + await revokeLinearToken(row.accessToken); + await db + .update(schema.linearInstallations) + .set({ revokedAt: new Date(), updatedAt: new Date() }) + .where(eq(schema.linearInstallations.id, row.id)); + log.info( + { org_id: ctx.orgId, workspace_id: row.workspaceId, actor_user_id: ctx.userId }, + "linear uninstalled", + ); + return c.json({ ok: true }); + }); +} + +async function findCurrentInstallation(projectId: string) { + return db.query.linearInstallations.findFirst({ + where: and( + eq(schema.linearInstallations.projectId, projectId), + isNull(schema.linearInstallations.revokedAt), + ), + }); +} + +async function upsertInstallation(v: { + projectId: string; + actorUserId: string | null; + workspaceId: string; + workspaceName: string | null; + workspaceUrlKey: string | null; + actorEmail: string | null; + accessToken: string; + refreshToken: string | null; + accessExpiresAt: Date | null; + scope: string | null; + webhookId: string | null; + webhookSecret: string | null; +}): Promise { + // Per-project: revoke any existing active install in this project so the + // partial unique index (project_id WHERE revoked_at IS NULL) stays satisfied. + await db.transaction(async (tx) => { + await tx + .update(schema.linearInstallations) + .set({ revokedAt: new Date(), updatedAt: new Date() }) + .where( + and( + eq(schema.linearInstallations.projectId, v.projectId), + isNull(schema.linearInstallations.revokedAt), + ), + ); + await tx.insert(schema.linearInstallations).values({ + projectId: v.projectId, + actorUserId: v.actorUserId, + workspaceId: v.workspaceId, + workspaceName: v.workspaceName, + workspaceUrlKey: v.workspaceUrlKey, + actorEmail: v.actorEmail, + accessToken: v.accessToken, + refreshToken: v.refreshToken, + accessExpiresAt: v.accessExpiresAt, + scope: v.scope, + webhookId: v.webhookId, + webhookSecret: v.webhookSecret, + }); + }); +} + +function getApiBaseUrl(): string | null { + const raw = process.env.API_BASE_URL; + if (!raw) return null; + return raw.replace(/\/$/, ""); +} + +async function registerLinearWebhookSafely( + accessToken: string, +): Promise<{ id: string; secret: string } | null> { + const apiBase = getApiBaseUrl(); + if (!apiBase || apiBase.includes("localhost") || apiBase.includes("127.0.0.1")) { + log.info("API_BASE_URL not public — skipping Linear webhook registration"); + return null; + } + try { + const webhook = await createLinearWebhook({ + accessToken, + url: `${apiBase}/linear/webhook`, + resourceTypes: ["Issue", "Comment"], + label: "Superlog", + }); + return webhook; + } catch (e) { + log.error({ err: e }, "linear webhookCreate failed — continuing without webhook"); + return null; + } +} + +async function resolveUserOrg( + c: Context<{ Variables: Vars }>, +): Promise<{ userId: string; orgId: string; projectId: string } | null> { + const userId = c.var.userId; + if (!userId) return null; + const ctx = await resolveActiveOrgContext({ + userId, + preferredOrgId: c.var.orgId, + }).catch(() => null); + if (!ctx) return null; + return { userId: ctx.user.id, orgId: ctx.org.id, projectId: ctx.project.id }; +} + +type StatePayload = { orgId: string; projectId: string; userId: string }; + +function signState(p: StatePayload, secret: string): string { + const body = `${p.orgId}.${p.projectId}.${p.userId}.${Date.now()}`; + const sig = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + return `${Buffer.from(body, "utf8").toString("base64url")}.${sig}`; +} + +function verifyState(state: string, secret: string): StatePayload | null { + const [payloadB64, sig] = state.split("."); + if (!payloadB64 || !sig) return null; + const body = Buffer.from(payloadB64, "base64url").toString("utf8"); + const expected = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + const provided = Buffer.from(sig); + const expectedBuf = Buffer.from(expected); + if (provided.length !== expectedBuf.length) return null; + if (!crypto.timingSafeEqual(provided, expectedBuf)) return null; + // Current format is `${orgId}.${projectId}.${userId}.${ts}` (4 parts). Old + // 3-part states (no projectId) are rejected — they expire in 10 min so worst + // case is a user mid-install during deploy seeing one error and retrying. + const parts = body.split("."); + if (parts.length !== 4) return null; + const [orgId, projectId, userId, tsRaw] = parts as [string, string, string, string]; + if (!orgId || !projectId || !userId || !tsRaw) return null; + const ts = Number(tsRaw); + if (!Number.isFinite(ts) || Date.now() - ts > 10 * 60 * 1000) return null; + return { orgId, projectId, userId }; +} diff --git a/superlog/apps/api/src/logger.ts b/superlog/apps/api/src/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..d7ef968be4f7a0bcfcf1a841e1b650a1a201046d --- /dev/null +++ b/superlog/apps/api/src/logger.ts @@ -0,0 +1,51 @@ +import { logs, SeverityNumber } from "@opentelemetry/api-logs"; +import pino, { multistream } from "pino"; +import type { Writable } from "node:stream"; + +const SERVICE_NAME = "@superlog/api"; + +const PINO_LEVEL_TO_OTEL: Record = { + 10: { num: SeverityNumber.TRACE, text: "TRACE" }, + 20: { num: SeverityNumber.DEBUG, text: "DEBUG" }, + 30: { num: SeverityNumber.INFO, text: "INFO" }, + 40: { num: SeverityNumber.WARN, text: "WARN" }, + 50: { num: SeverityNumber.ERROR, text: "ERROR" }, + 60: { num: SeverityNumber.FATAL, text: "FATAL" }, +}; + +// Bridges each pino log line to the global OTel LoggerProvider set up in +// tracing.ts. We do this via pino.multistream rather than the auto-instrumentation +// because the latter relies on import-in-the-middle, which broke other ESM +// modules' named exports (drizzle-orm, etc.) when registered globally. +const DEFAULT_SEVERITY = { num: SeverityNumber.INFO, text: "INFO" } as const; + +const otelStream: Writable = Object.assign(Object.create(null), { + write(chunk: string): boolean { + // biome-ignore lint/suspicious/noExplicitAny: pino emits JSON whose shape mirrors AnyValueMap. + let rec: any; + try { + rec = JSON.parse(chunk); + } catch { + return true; + } + const level = typeof rec.level === "number" ? rec.level : 30; + const sev = PINO_LEVEL_TO_OTEL[level] ?? DEFAULT_SEVERITY; + const { level: _l, time, msg, pid: _p, hostname: _h, name: _n, ...attributes } = rec; + logs.getLogger(SERVICE_NAME).emit({ + timestamp: typeof time === "number" ? time : Date.now(), + severityNumber: sev.num, + severityText: sev.text, + body: typeof msg === "string" ? msg : JSON.stringify(msg ?? ""), + attributes, + }); + return true; + }, +}) as unknown as Writable; + +export const logger = pino( + { name: SERVICE_NAME }, + multistream([ + { stream: process.stdout }, + { stream: otelStream }, + ]), +); diff --git a/superlog/apps/api/src/loops.test.ts b/superlog/apps/api/src/loops.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..0cda2bedeb9de53bfdb9b4d202dbb207d4cdd52d --- /dev/null +++ b/superlog/apps/api/src/loops.test.ts @@ -0,0 +1,113 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; + +process.env.DATABASE_URL ??= "postgres://postgres:postgres@localhost:5434/superlog"; + +const { + DEFAULT_LOOPS_WELCOME_EVENT, + buildLoopsContactPayload, + buildLoopsWelcomeEventPayload, + sendLoopsWelcomeFlow, +} = await import("@superlog/db"); + +const input = { + user: { id: "user_123", email: "founder@acme.test" }, + org: { id: "org_123", name: "Acme Observability", slug: "acme-observability" }, + project: { id: "project_123", name: "Default", slug: "default" }, + signupSource: "skill", + clerkOrgId: "org_clerk_123", + appUrl: "https://superlog.sh", +}; + +test("buildLoopsWelcomeEventPayload includes welcome context for Loops", () => { + const payload = buildLoopsWelcomeEventPayload(input); + + assert.equal(payload.email, "founder@acme.test"); + assert.equal(payload.userId, "user_123"); + assert.equal(payload.eventName, DEFAULT_LOOPS_WELCOME_EVENT); + assert.equal(payload.source, "Superlog signup"); + assert.deepEqual(payload.eventProperties, { + userId: "user_123", + orgId: "org_123", + orgName: "Acme Observability", + orgSlug: "acme-observability", + projectId: "project_123", + projectName: "Default", + projectSlug: "default", + signupSource: "skill", + clerkOrgId: "org_clerk_123", + appUrl: "https://superlog.sh", + }); +}); + +test("buildLoopsContactPayload mirrors lifecycle flags onto the contact", () => { + const payload = buildLoopsContactPayload(input, { + telemetrySet: true, + telemetrySetAt: "2026-05-11T20:00:00.000Z", + githubAdded: true, + githubAddedAt: "2026-05-11T20:01:00.000Z", + slackAdded: false, + slackAddedAt: null, + mcpInstalled: true, + mcpInstalledAt: "2026-05-11T20:02:00.000Z", + }); + + assert.equal(payload.email, "founder@acme.test"); + assert.equal(payload.userId, "user_123"); + assert.equal(payload.orgName, "Acme Observability"); + assert.equal(payload.telemetrySet, true); + assert.equal(payload.githubAdded, true); + assert.equal(payload.slackAdded, false); + assert.equal(payload.mcpInstalledAt, "2026-05-11T20:02:00.000Z"); +}); + +test("sendLoopsWelcomeFlow skips cleanly without an API key", async () => { + const result = await sendLoopsWelcomeFlow(input, { + apiKey: "", + fetch: async () => { + throw new Error("fetch should not be called"); + }, + }); + + assert.deepEqual(result, { sent: false, reason: "not_configured" }); +}); + +test("sendLoopsWelcomeFlow sends the welcome event to Loops", async () => { + let capturedUrl = ""; + let capturedInit: RequestInit | undefined; + + const result = await sendLoopsWelcomeFlow(input, { + apiKey: "loops_secret", + apiBase: "https://loops.test/api/v1/", + eventName: "welcomeSignup", + fetch: async (url, init) => { + capturedUrl = String(url); + capturedInit = init; + return new Response(JSON.stringify({ success: true }), { status: 200 }); + }, + }); + + assert.deepEqual(result, { sent: true }); + assert.equal(capturedUrl, "https://loops.test/api/v1/events/send"); + assert.equal(capturedInit?.method, "POST"); + assert.equal( + (capturedInit?.headers as Record).authorization, + "Bearer loops_secret", + ); + + const body = JSON.parse(String(capturedInit?.body)); + assert.equal(body.eventName, "welcomeSignup"); + assert.equal(body.email, "founder@acme.test"); + assert.equal(body.eventProperties.signupSource, "skill"); +}); + +test("sendLoopsWelcomeFlow surfaces Loops API errors", async () => { + await assert.rejects( + () => + sendLoopsWelcomeFlow(input, { + apiKey: "loops_secret", + fetch: async () => new Response("bad key", { status: 401 }), + }), + /Loops request failed: 401 bad key/, + ); +}); diff --git a/superlog/apps/api/src/management-auth.ts b/superlog/apps/api/src/management-auth.ts new file mode 100644 index 0000000000000000000000000000000000000000..308ade4c5c506430b9362644d07f7c1b1911f8c9 --- /dev/null +++ b/superlog/apps/api/src/management-auth.ts @@ -0,0 +1,28 @@ +import type { DB } from "@superlog/db"; +import { hashApiKey, isIngestApiKey } from "@superlog/db/keys"; +import * as schema from "@superlog/db/schema"; +import { and, eq, isNull } from "drizzle-orm"; + +export async function resolvePublicSourceMapUploadAuth(opts: { + database: DB; + method: string; + path: string; + token: string; +}): Promise<{ projectId: string; apiKeyId: string } | null> { + if (!isIngestApiKey(opts.token)) return null; + if (opts.method.toUpperCase() !== "POST") return null; + const match = opts.path.match( + /^\/api\/v1\/projects\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\/sourcemaps$/, + ); + const projectId = match?.[1]; + if (!projectId) return null; + + const row = await opts.database.query.apiKeys.findFirst({ + where: and( + eq(schema.apiKeys.keyHash, hashApiKey(opts.token)), + isNull(schema.apiKeys.revokedAt), + ), + }); + if (!row || row.projectId !== projectId) return null; + return { projectId, apiKeyId: row.id }; +} diff --git a/superlog/apps/api/src/management-schemas.test.ts b/superlog/apps/api/src/management-schemas.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..df0b7d12591eb0869a3b5010e2af26e1d2a3d586 --- /dev/null +++ b/superlog/apps/api/src/management-schemas.test.ts @@ -0,0 +1,41 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + createProjectInputSchema, + projectResponseSchema, + updateProjectInputSchema, +} from "./management-schemas.js"; + +test("management API project schemas accept project context", () => { + const create = createProjectInputSchema.parse({ + name: "Billing", + slug: "billing", + project_context: "Stripe customer IDs are scoped per org.", + }); + assert.equal(create.project_context, "Stripe customer IDs are scoped per org."); + + const update = updateProjectInputSchema.parse({ + project_context: "Billing jobs run from apps/worker.", + }); + assert.equal(update.project_context, "Billing jobs run from apps/worker."); + + const response = projectResponseSchema.parse({ + project: { + id: "00000000-0000-4000-8000-000000000000", + name: "Billing", + slug: "billing", + project_context: "Stripe customer IDs are scoped per org.", + automerge_fix_prs: "never", + automerge_method: "squash", + pr_base_branch: null, + }, + }); + assert.equal(response.project.project_context, "Stripe customer IDs are scoped per org."); +}); + +test("management API project context is capped", () => { + assert.throws( + () => updateProjectInputSchema.parse({ project_context: "x".repeat(8001) }), + /Too big/, + ); +}); diff --git a/superlog/apps/api/src/management-schemas.ts b/superlog/apps/api/src/management-schemas.ts new file mode 100644 index 0000000000000000000000000000000000000000..e63e59da204b4bac9258c5ec02acc212259690a3 --- /dev/null +++ b/superlog/apps/api/src/management-schemas.ts @@ -0,0 +1,249 @@ +import { PR_BASE_BRANCH_MAX_LENGTH } from "@superlog/db/schema"; +import { z } from "zod"; + +// Slug rules: lowercase alphanumeric + dashes, max 40 chars. +const SLUG_RE = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + +export const automergePolicySchema = z + .enum(["never", "when_checks_pass", "immediately"]) + .describe( + "Controls whether the agent's auto-opened fix PRs are merged. " + + "'when_checks_pass' uses GitHub native auto-merge; 'immediately' calls the merge API right after PR open.", + ); + +export const automergeMethodSchema = z + .enum(["squash", "merge", "rebase"]) + .describe("Merge strategy used for auto-merge."); + +export const prBaseBranchSchema = z + .string() + .max(PR_BASE_BRANCH_MAX_LENGTH) + .nullable() + .describe( + "Target branch for agent-opened PRs. Null or blank uses the repository default branch.", + ); + +const slugSchema = z + .string() + .min(1) + .max(40) + .regex(SLUG_RE, "slug must be lowercase alphanumeric + dashes, max 40 chars"); + +const nameSchema = z.string().min(1).max(120); +const projectContextSchema = z.string().max(8000); + +export const projectIdParamSchema = z.object({ + projectId: z.string().uuid(), +}); + +export const installationRowIdParamSchema = z.object({ + installationRowId: z.string().uuid(), +}); + +export const repoIdParamSchema = z.object({ + projectId: z.string().uuid(), + repoId: z.string().regex(/^\d+$/, "repoId must be a positive integer"), +}); + +export const createProjectInputSchema = z.object({ + name: nameSchema, + slug: slugSchema, + project_context: projectContextSchema.optional(), + mint_ingest_key: z + .boolean() + .default(true) + .describe("If true, mint an initial ingest key alongside the project."), + automerge_fix_prs: automergePolicySchema.optional(), + automerge_method: automergeMethodSchema.optional(), + pr_base_branch: prBaseBranchSchema.optional(), +}); + +export const updateProjectInputSchema = z + .object({ + name: nameSchema.optional(), + slug: slugSchema.optional(), + project_context: projectContextSchema.optional(), + automerge_fix_prs: automergePolicySchema.optional(), + automerge_method: automergeMethodSchema.optional(), + pr_base_branch: prBaseBranchSchema.optional(), + }) + .describe("Partial update. Only fields present in the body are written."); + +export const mintApiKeyInputSchema = z.object({ + name: z.string().min(1).max(120).optional(), +}); + +export const installUrlInputSchema = z.object({ + return_url: z + .string() + .url() + .optional() + .describe( + "Where to bounce the user after install. Host must be in the org's allowed_return_url_hosts allowlist; must be http(s); must not embed credentials.", + ), +}); + +export const grantRepoInputSchema = z.object({ + installation_id: z.string().uuid().describe("Install row UUID (from GET .../installations)."), + repo_id: z.number().int().positive().describe("GitHub numeric repo ID."), +}); + +// ─── Telemetry read API ───────────────────────────────────────────────────── +// Generic GET endpoints for reading telemetry. Authed with the same +// sl_management_* keys as the rest of the management API. Anyone with a +// management key can use these; the dialtone uptime monitor happens to be +// one consumer. + +const traceIdParamSchema = z + .string() + .regex(/^[a-fA-F0-9]{1,64}$/, "trace_id must be 1–64 hex chars") + .describe("Hex-encoded OTLP trace id."); + +const isoOrRelativeTimeSchema = z + .string() + .min(1) + .max(128) + .describe( + "ISO 8601 timestamp (e.g. '2026-05-25T19:00:00Z') or a ClickHouse " + + "relative expression (e.g. 'now() - INTERVAL 1 HOUR'). Defaults: from=1h ago, to=now.", + ); + +export const traceByIdParamSchema = z.object({ + projectId: z.string().uuid(), + traceId: traceIdParamSchema, +}); + +export const logsQuerySchema = z.object({ + trace_id: traceIdParamSchema.optional(), + service: z.string().min(1).max(200).optional(), + severity: z.string().min(1).max(40).optional(), + search: z.string().min(1).max(500).optional(), + from: isoOrRelativeTimeSchema.optional(), + to: isoOrRelativeTimeSchema.optional(), + limit: z.coerce.number().int().min(1).max(500).default(100), +}); + +export const metricsQuerySchema = z.object({ + name: z.string().min(1).max(200).describe("Metric name (e.g. 'http.server.duration')."), + service: z.string().min(1).max(200).optional(), + from: isoOrRelativeTimeSchema.optional(), + to: isoOrRelativeTimeSchema.optional(), + limit: z.coerce.number().int().min(1).max(500).default(100), +}); + +// Schemas are deliberately open — these wrap existing internal helpers whose +// row shapes already feed the dashboard. Locking down the body in OpenAPI is +// future work; for now we document that the response is a JSON object. +export const telemetryReadResponseSchema = z + .object({}) + .passthrough() + .describe("ClickHouse rows. Shape mirrors what the dashboard /explore/* endpoints return."); + +// ─── Response schemas ────────────────────────────────────────────────────── + +export const projectSchema = z + .object({ + id: z.string().uuid(), + name: z.string(), + slug: z.string(), + project_context: z.string(), + created_at: z.string().datetime().optional(), + automerge_fix_prs: automergePolicySchema, + automerge_method: automergeMethodSchema, + pr_base_branch: prBaseBranchSchema, + }) + .describe("Project metadata."); + +export const mintedApiKeySchema = z.object({ + id: z.string(), + name: z.string(), + key_prefix: z.string().describe("Stable prefix of the key (safe to display)."), + plaintext: z.string().describe("Full key. Shown once — store immediately."), +}); + +export const createProjectResponseSchema = z.object({ + project: projectSchema, + api_key: mintedApiKeySchema + .nullable() + .describe("Present when mint_ingest_key is true (default); null otherwise."), +}); + +export const projectListResponseSchema = z.object({ + projects: z.array(projectSchema), +}); + +export const projectResponseSchema = z.object({ + project: projectSchema, +}); + +export const apiKeySchema = z.object({ + id: z.string(), + name: z.string(), + key_prefix: z.string(), + last_used_at: z.string().datetime().nullable(), + revoked_at: z.string().datetime().nullable(), + created_at: z.string().datetime(), +}); + +export const apiKeyListResponseSchema = z.object({ + api_keys: z.array(apiKeySchema), +}); + +export const mintApiKeyResponseSchema = z.object({ + api_key: mintedApiKeySchema, +}); + +export const installUrlResponseSchema = z.object({ + install_url: z.string().url(), +}); + +export const githubInstallationSchema = z.object({ + id: z.string().uuid(), + installation_id: z.number().int().describe("GitHub's numeric install ID."), + account_login: z.string().nullable(), + account_type: z.string().nullable(), + created_at: z.string().datetime(), +}); + +export const githubInstallationListResponseSchema = z.object({ + installations: z.array(githubInstallationSchema), +}); + +export const githubRepoSchema = z.object({ + id: z.number().int(), + full_name: z.string(), + private: z.boolean(), +}); + +export const githubRepoListResponseSchema = z.object({ + repos: z.array(githubRepoSchema), + truncated: z + .boolean() + .describe( + "True if the install has more repos than the listing endpoint returns (cap is 1000).", + ), +}); + +export const projectRepoGrantSchema = z.object({ + id: z.string().uuid(), + installation_id: z.string().uuid(), + repo_id: z.number().int(), + repo_full_name: z.string(), + created_at: z.string().datetime(), +}); + +export const grantRepoResponseSchema = z.object({ + grant: projectRepoGrantSchema, +}); + +export const grantListResponseSchema = z.object({ + grants: z.array(projectRepoGrantSchema), +}); + +export const okResponseSchema = z.object({ + ok: z.literal(true), +}); + +export const errorResponseSchema = z.object({ + error: z.string(), +}); diff --git a/superlog/apps/api/src/management-sourcemaps-auth.test.ts b/superlog/apps/api/src/management-sourcemaps-auth.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..3c2546ca97912891070a1e52a3d4772e18ab3411 --- /dev/null +++ b/superlog/apps/api/src/management-sourcemaps-auth.test.ts @@ -0,0 +1,52 @@ +import assert from "node:assert/strict"; +import { randomUUID } from "node:crypto"; +import { test } from "node:test"; +import type { DB } from "@superlog/db"; +import { resolvePublicSourceMapUploadAuth } from "./management-auth.js"; + +function databaseReturning(row: { id: string; projectId: string } | null): DB { + return { + query: { + apiKeys: { + async findFirst() { + return row; + }, + }, + }, + } as unknown as DB; +} + +test("public ingest keys can authorize source map uploads for their own project", async () => { + const projectId = randomUUID(); + const auth = await resolvePublicSourceMapUploadAuth({ + database: databaseReturning({ id: "key-1", projectId }), + method: "POST", + path: `/api/v1/projects/${projectId}/sourcemaps`, + token: "sl_public_test-token", + }); + + assert.deepEqual(auth, { projectId, apiKeyId: "key-1" }); +}); + +test("public ingest keys cannot upload source maps for another project", async () => { + const auth = await resolvePublicSourceMapUploadAuth({ + database: databaseReturning({ id: "key-1", projectId: randomUUID() }), + method: "POST", + path: `/api/v1/projects/${randomUUID()}/sourcemaps`, + token: "sl_public_test-token", + }); + + assert.equal(auth, null); +}); + +test("public ingest keys do not authorize other management API routes", async () => { + const projectId = randomUUID(); + const auth = await resolvePublicSourceMapUploadAuth({ + database: databaseReturning({ id: "key-1", projectId }), + method: "GET", + path: `/api/v1/projects/${projectId}/api-keys`, + token: "sl_public_test-token", + }); + + assert.equal(auth, null); +}); diff --git a/superlog/apps/api/src/management.ts b/superlog/apps/api/src/management.ts new file mode 100644 index 0000000000000000000000000000000000000000..c45d76fd0417fb7cdc991f90e06b528a02e87b33 --- /dev/null +++ b/superlog/apps/api/src/management.ts @@ -0,0 +1,1513 @@ +import type { ClickHouseClient } from "@clickhouse/client"; +import { Scalar } from "@scalar/hono-api-reference"; +import { + db, + isIngestApiKey, + isOrgManagementKey, + mintApiKey, + mintOrgApiKey, + resolveOrgApiKey, + schema, +} from "@superlog/db"; +import { and, desc, eq, inArray, isNull } from "drizzle-orm"; +import type { Context, Hono } from "hono"; +import { describeRoute, openAPIRouteHandler, resolver, validator } from "hono-openapi"; +import { HTTPException } from "hono/http-exception"; +import { + buildGithubMgmtInstallUrl, + fetchInstallationRepoById, + listCurrentInstallationRepos, +} from "./github.js"; +import { logger } from "./logger.js"; +import { resolvePublicSourceMapUploadAuth } from "./management-auth.js"; +import { + apiKeyListResponseSchema, + createProjectInputSchema, + createProjectResponseSchema, + errorResponseSchema, + githubInstallationListResponseSchema, + githubRepoListResponseSchema, + grantListResponseSchema, + grantRepoInputSchema, + grantRepoResponseSchema, + installUrlInputSchema, + installUrlResponseSchema, + installationRowIdParamSchema, + logsQuerySchema, + metricsQuerySchema, + mintApiKeyInputSchema, + mintApiKeyResponseSchema, + okResponseSchema, + projectIdParamSchema, + projectListResponseSchema, + projectResponseSchema, + repoIdParamSchema, + telemetryReadResponseSchema, + traceByIdParamSchema, + updateProjectInputSchema, +} from "./management-schemas.js"; +import { getTraceDetail, queryLogs, queryMetrics } from "./mcp/clickhouse.js"; +import { resolveActiveOrgContext } from "./org-context.js"; +import { + sourceMapObjectStoreFromEnv, + sourceMapUploadSchema, + storeSourceMapArtifact, +} from "./sourcemaps.js"; + +const log = logger.child({ scope: "management" }); +const sourceMapObjectStore = sourceMapObjectStoreFromEnv(process.env); + +type MgmtVars = { + managementOrgId: string; + managementKeyId: string; + sourceMapUploadProjectId?: string; +}; +type DashboardVars = { userId: string; orgId: string | null }; + +async function getAutomergeForProject(projectId: string): Promise<{ + automerge_fix_prs: schema.AutoMergePolicy; + automerge_method: schema.AutoMergeMethod; + pr_base_branch: string | null; +}> { + const row = await db.query.projectAutomationSettings.findFirst({ + where: eq(schema.projectAutomationSettings.projectId, projectId), + }); + return { + automerge_fix_prs: row?.autoMergeFixPrs ?? "never", + automerge_method: row?.autoMergeMethod ?? "squash", + pr_base_branch: schema.normalizePrBaseBranch(row?.prBaseBranch), + }; +} + +function parsePrBaseBranch(input: unknown): string | null | undefined { + if (input === undefined) return undefined; + if (input === null) return null; + if (typeof input !== "string") return undefined; + const branch = schema.normalizePrBaseBranch(input); + if (branch && !schema.isValidPrBaseBranch(branch)) { + throw new HTTPException(400, { + message: + "pr_base_branch must be a valid Git branch name, or blank to use the repository default", + }); + } + return branch; +} + +// Shared response stubs so individual routes don't repeat themselves. +const errorContent = { + "application/json": { schema: resolver(errorResponseSchema) }, +}; +const COMMON_ERRORS = { + 401: { description: "Missing / wrong-type / revoked token", content: errorContent }, +}; +const NOT_FOUND = { + 404: { + description: "Resource not found in this org", + content: errorContent, + }, +}; +const BAD_REQUEST = { + 400: { description: "Malformed input", content: errorContent }, +}; +const CONFLICT = { + 409: { description: "Conflict (e.g. slug already in use)", content: errorContent }, +}; +const BAD_GATEWAY = { + 502: { description: "Upstream GitHub call failed", content: errorContent }, +}; +const SERVICE_UNAVAILABLE = { + 503: { description: "GitHub App not configured server-side", content: errorContent }, +}; + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountManagementApi(app: Hono, opts: { ch: ClickHouseClient }): void { + const { ch } = opts; + // Public docs paths (openapi.json + Scalar reference) are mounted first so + // they don't go through the bearer-token middleware below. + app.get( + "/api/v1/openapi.json", + openAPIRouteHandler(app, { + documentation: { + openapi: "3.1.0", + info: { + title: "Superlog Management API", + version: "1.0.0", + description: + "Programmatic surface for provisioning projects, ingest keys, and " + + "GitHub access. Authenticated with org-scoped management keys " + + "(prefix `sl_management_*`).", + }, + servers: [ + { url: "https://api.superlog.sh", description: "Production" }, + { url: "http://localhost:4100", description: "Local dev" }, + ], + components: { + securitySchemes: { + bearerAuth: { + type: "http", + scheme: "bearer", + bearerFormat: "sl_management_*", + }, + }, + }, + security: [{ bearerAuth: [] }], + tags: [{ name: "Projects" }, { name: "API keys" }, { name: "GitHub integration" }], + }, + excludeStaticFile: true, + }), + ); + app.get( + "/api/v1/docs", + Scalar({ + url: "/api/v1/openapi.json", + pageTitle: "Superlog Management API", + }), + ); + + // Auth middleware. Sits at /api/v1/* — the parent /api/* session middleware + // already skips this prefix (see index.ts). The docs paths above bypass + // this by short-circuiting before next() is called. + app.use("/api/v1/*", async (c, next) => { + if (c.req.path === "/api/v1/openapi.json" || c.req.path === "/api/v1/docs") { + return next(); + } + const header = c.req.header("authorization"); + if (!header?.toLowerCase().startsWith("bearer ")) { + return c.json({ error: "missing bearer token" }, 401); + } + const token = header.slice(7).trim(); + if (isIngestApiKey(token)) { + const resolved = await resolvePublicSourceMapUploadAuth({ + database: db, + method: c.req.method, + path: c.req.path, + token, + }); + if (!resolved) { + return c.json( + { + error: + "wrong credential type: public ingest keys can only upload source maps for their own project", + }, + 401, + ); + } + c.set("sourceMapUploadProjectId", resolved.projectId); + await next(); + return; + } + if (!isOrgManagementKey(token)) { + return c.json( + { error: "wrong credential type: /api/v1/* requires an sl_management_* key" }, + 401, + ); + } + const resolved = await resolveOrgApiKey(token); + if (!resolved) return c.json({ error: "invalid or revoked key" }, 401); + c.set("managementOrgId", resolved.orgId); + c.set("managementKeyId", resolved.id); + await next(); + }); + + app.post( + "/api/v1/projects", + describeRoute({ + tags: ["Projects"], + summary: "Create a project", + description: + "Creates a new project in the authed org. Optionally mints an initial " + + "ingest key in the same call (default behavior).", + responses: { + 200: { + description: "Project created", + content: { "application/json": { schema: resolver(createProjectResponseSchema) } }, + }, + ...BAD_REQUEST, + ...COMMON_ERRORS, + ...CONFLICT, + }, + }), + validator("json", createProjectInputSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const body = c.req.valid("json"); + const name = body.name.trim(); + const slug = body.slug.trim().toLowerCase(); + + const existing = await db.query.projects.findFirst({ + where: and(eq(schema.projects.orgId, orgId), eq(schema.projects.slug, slug)), + }); + if (existing) throw new HTTPException(409, { message: "slug already in use in this org" }); + + const [project] = await db + .insert(schema.projects) + .values({ orgId, name, slug, projectContext: body.project_context ?? "" }) + .returning(); + if (!project) throw new HTTPException(500, { message: "failed to create project" }); + + // Seed automation settings row so the worker doesn't need to special-case + // its absence (matches what ensureProjectForOrg does for the default). + await db + .insert(schema.projectAutomationSettings) + .values({ + projectId: project.id, + ...(body.automerge_fix_prs !== undefined + ? { autoMergeFixPrs: body.automerge_fix_prs } + : {}), + ...(body.automerge_method !== undefined + ? { autoMergeMethod: body.automerge_method } + : {}), + ...(body.pr_base_branch !== undefined + ? { prBaseBranch: parsePrBaseBranch(body.pr_base_branch) } + : {}), + }) + .onConflictDoNothing({ target: schema.projectAutomationSettings.projectId }); + + const automerge = await getAutomergeForProject(project.id); + log.info( + { + org_id: orgId, + project_id: project.id, + slug: project.slug, + mint_ingest_key: body.mint_ingest_key, + automerge_fix_prs: automerge.automerge_fix_prs, + automerge_method: automerge.automerge_method, + }, + "project created via management api", + ); + + const projectPayload = { + id: project.id, + name: project.name, + slug: project.slug, + project_context: project.projectContext, + automerge_fix_prs: automerge.automerge_fix_prs, + automerge_method: automerge.automerge_method, + pr_base_branch: automerge.pr_base_branch, + }; + + if (!body.mint_ingest_key) { + return c.json({ project: projectPayload, api_key: null }); + } + const minted = await mintApiKey({ projectId: project.id, name: "Initial ingest key" }); + return c.json({ + project: projectPayload, + api_key: { + id: minted.id, + name: minted.name, + key_prefix: minted.keyPrefix, + plaintext: minted.plaintext, + }, + }); + }, + ); + + app.get( + "/api/v1/projects", + describeRoute({ + tags: ["Projects"], + summary: "List projects in the org", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(projectListResponseSchema) } }, + }, + ...COMMON_ERRORS, + }, + }), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const rows = await db.query.projects.findMany({ + where: eq(schema.projects.orgId, orgId), + orderBy: [desc(schema.projects.createdAt)], + }); + if (rows.length === 0) { + return c.json({ projects: [] }); + } + const automationRows = await db.query.projectAutomationSettings.findMany({ + where: inArray( + schema.projectAutomationSettings.projectId, + rows.map((p) => p.id), + ), + }); + const automationByProject = new Map(automationRows.map((r) => [r.projectId, r])); + return c.json({ + projects: rows.map((p) => { + const auto = automationByProject.get(p.id); + return { + id: p.id, + name: p.name, + slug: p.slug, + project_context: p.projectContext, + created_at: p.createdAt.toISOString(), + automerge_fix_prs: auto?.autoMergeFixPrs ?? "never", + automerge_method: auto?.autoMergeMethod ?? "squash", + pr_base_branch: schema.normalizePrBaseBranch(auto?.prBaseBranch), + }; + }), + }); + }, + ); + + app.get( + "/api/v1/projects/:projectId", + describeRoute({ + tags: ["Projects"], + summary: "Get a project", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(projectResponseSchema) } }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + }, + }), + validator("param", projectIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + const project = await requireProjectInOrg(orgId, projectId); + const automerge = await getAutomergeForProject(project.id); + return c.json({ + project: { + id: project.id, + name: project.name, + slug: project.slug, + project_context: project.projectContext, + created_at: project.createdAt.toISOString(), + automerge_fix_prs: automerge.automerge_fix_prs, + automerge_method: automerge.automerge_method, + pr_base_branch: automerge.pr_base_branch, + }, + }); + }, + ); + + app.patch( + "/api/v1/projects/:projectId", + describeRoute({ + tags: ["Projects"], + summary: "Update a project", + description: "Partial update. Only fields present in the body are written.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(projectResponseSchema) } }, + }, + ...BAD_REQUEST, + ...COMMON_ERRORS, + ...NOT_FOUND, + ...CONFLICT, + }, + }), + validator("param", projectIdParamSchema), + validator("json", updateProjectInputSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + const project = await requireProjectInOrg(orgId, projectId); + const body = c.req.valid("json"); + + const projectPatch: Partial = {}; + if (body.name !== undefined) projectPatch.name = body.name.trim(); + if (body.project_context !== undefined) projectPatch.projectContext = body.project_context; + if (body.slug !== undefined) { + const slug = body.slug.trim().toLowerCase(); + if (slug !== project.slug) { + const clash = await db.query.projects.findFirst({ + where: and(eq(schema.projects.orgId, orgId), eq(schema.projects.slug, slug)), + }); + if (clash) throw new HTTPException(409, { message: "slug already in use in this org" }); + projectPatch.slug = slug; + } + } + + let updatedProject = project; + if (Object.keys(projectPatch).length > 0) { + const [row] = await db + .update(schema.projects) + .set(projectPatch) + .where(eq(schema.projects.id, project.id)) + .returning(); + if (!row) throw new HTTPException(404, { message: "project not found" }); + updatedProject = row; + } + + const prBaseBranch = parsePrBaseBranch(body.pr_base_branch); + if ( + body.automerge_fix_prs !== undefined || + body.automerge_method !== undefined || + prBaseBranch !== undefined + ) { + // Upsert so a project that somehow lacks an automation row still ends + // up with one carrying the requested values; non-provided fields fall + // back to schema defaults on insert and stay untouched on update. + const updatedAt = new Date(); + await db + .insert(schema.projectAutomationSettings) + .values({ + projectId: project.id, + ...(body.automerge_fix_prs !== undefined + ? { autoMergeFixPrs: body.automerge_fix_prs } + : {}), + ...(body.automerge_method !== undefined + ? { autoMergeMethod: body.automerge_method } + : {}), + ...(prBaseBranch !== undefined ? { prBaseBranch } : {}), + updatedAt, + }) + .onConflictDoUpdate({ + target: schema.projectAutomationSettings.projectId, + set: { + ...(body.automerge_fix_prs !== undefined + ? { autoMergeFixPrs: body.automerge_fix_prs } + : {}), + ...(body.automerge_method !== undefined + ? { autoMergeMethod: body.automerge_method } + : {}), + ...(prBaseBranch !== undefined ? { prBaseBranch } : {}), + updatedAt, + }, + }); + } + + const automerge = await getAutomergeForProject(project.id); + log.info( + { + org_id: orgId, + project_id: project.id, + updated_fields: { + name: projectPatch.name !== undefined, + slug: projectPatch.slug !== undefined, + project_context: projectPatch.projectContext !== undefined, + automerge_fix_prs: body.automerge_fix_prs !== undefined, + automerge_method: body.automerge_method !== undefined, + pr_base_branch: prBaseBranch !== undefined, + }, + }, + "project updated via management api", + ); + + return c.json({ + project: { + id: updatedProject.id, + name: updatedProject.name, + slug: updatedProject.slug, + project_context: updatedProject.projectContext, + created_at: updatedProject.createdAt.toISOString(), + automerge_fix_prs: automerge.automerge_fix_prs, + automerge_method: automerge.automerge_method, + pr_base_branch: automerge.pr_base_branch, + }, + }); + }, + ); + + app.post( + "/api/v1/projects/:projectId/api-keys", + describeRoute({ + tags: ["API keys"], + summary: "Mint a new ingest API key", + responses: { + 200: { + description: "Key minted (plaintext shown once)", + content: { "application/json": { schema: resolver(mintApiKeyResponseSchema) } }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + }, + }), + validator("param", projectIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + await requireProjectInOrg(orgId, projectId); + // Body is optional; parse manually so callers can omit it entirely. + const body = (await c.req.json().catch(() => ({}))) as { name?: unknown }; + const name = typeof body.name === "string" && body.name.trim() ? body.name.trim() : "API key"; + const minted = await mintApiKey({ projectId, name }); + return c.json({ + api_key: { + id: minted.id, + name: minted.name, + key_prefix: minted.keyPrefix, + plaintext: minted.plaintext, + }, + }); + }, + ); + + app.get( + "/api/v1/projects/:projectId/api-keys", + describeRoute({ + tags: ["API keys"], + summary: "List ingest API keys for a project", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(apiKeyListResponseSchema) } }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + }, + }), + validator("param", projectIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + await requireProjectInOrg(orgId, projectId); + const rows = await db.query.apiKeys.findMany({ + where: eq(schema.apiKeys.projectId, projectId), + orderBy: [desc(schema.apiKeys.createdAt)], + }); + return c.json({ + api_keys: rows.map((k) => ({ + id: k.id, + name: k.name, + key_prefix: k.keyPrefix, + last_used_at: k.lastUsedAt?.toISOString() ?? null, + revoked_at: k.revokedAt?.toISOString() ?? null, + created_at: k.createdAt.toISOString(), + })), + }); + }, + ); + + app.post( + "/api/v1/projects/:projectId/sourcemaps", + describeRoute({ + tags: ["Projects"], + summary: "Upload a source map artifact", + description: + "Uploads a compressed source map artifact for later issue symbolication. " + + "Accepts either a project-scoped `sl_public_*` ingest key for this project " + + "or a server-side `sl_management_*` key for the org.", + responses: { + 200: { + description: "Source map stored", + content: { "application/json": { schema: resolver(okResponseSchema) } }, + }, + ...BAD_REQUEST, + ...COMMON_ERRORS, + ...NOT_FOUND, + }, + }), + validator("param", projectIdParamSchema), + validator("json", sourceMapUploadSchema), + async (c) => { + const vars = c.var as MgmtVars; + const { projectId } = c.req.valid("param"); + if (vars.sourceMapUploadProjectId) { + if (vars.sourceMapUploadProjectId !== projectId) { + throw new HTTPException(404, { message: "project not found" }); + } + } else { + if (!vars.managementOrgId || !vars.managementKeyId) { + throw new HTTPException(401, { message: "missing upload authorization" }); + } + await requireProjectInOrg(vars.managementOrgId, projectId); + } + if (!sourceMapObjectStore) { + throw new HTTPException(503, { + message: "source map storage is not configured", + }); + } + const artifact = await storeSourceMapArtifact({ + database: db, + projectId, + uploadedByOrgApiKeyId: vars.managementKeyId ?? null, + objectStore: sourceMapObjectStore, + input: c.req.valid("json"), + }); + return c.json({ + ok: true, + artifact: { + id: artifact.id, + project_id: artifact.projectId, + platform: artifact.platform, + release: artifact.release, + dist: artifact.dist, + debug_id: artifact.debugId, + map_file: artifact.mapFile, + source_map_hash: artifact.sourceMapHash, + source_map_bytes: artifact.sourceMapBytes, + storage_bucket: artifact.storageBucket, + storage_key: artifact.storageKey, + created_at: artifact.createdAt.toISOString(), + updated_at: artifact.updatedAt.toISOString(), + }, + }); + }, + ); + + app.post( + "/api/v1/integrations/github/install-url", + describeRoute({ + tags: ["GitHub integration"], + summary: "Mint an org-scoped GitHub App install URL", + description: + "Resulting install is owned by the org and can be granted to multiple " + + "projects. `return_url` host must be in the org's allowlist.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(installUrlResponseSchema) } }, + }, + ...BAD_REQUEST, + ...COMMON_ERRORS, + ...SERVICE_UNAVAILABLE, + }, + }), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + // Body is optional; parse manually. + const body = (await c.req.json().catch(() => ({}))) as { return_url?: unknown }; + const returnUrl = typeof body.return_url === "string" ? body.return_url : null; + if (returnUrl) await assertReturnUrlAllowed(orgId, returnUrl); + const result = buildGithubMgmtInstallUrl({ scope: "org", orgId, returnUrl }); + if (!result) throw new HTTPException(503, { message: "github app not configured" }); + log.info({ org_id: orgId, return_url: returnUrl }, "org-scoped github install url minted"); + return c.json({ install_url: result.url }); + }, + ); + + app.post( + "/api/v1/projects/:projectId/integrations/github/install-url", + describeRoute({ + tags: ["GitHub integration"], + summary: "Mint a project-scoped GitHub App install URL", + description: + "Resulting install is bound to one project and is NOT listed by " + + "`GET /api/v1/integrations/github/installations`.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(installUrlResponseSchema) } }, + }, + ...BAD_REQUEST, + ...COMMON_ERRORS, + ...NOT_FOUND, + ...SERVICE_UNAVAILABLE, + }, + }), + validator("param", projectIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + await requireProjectInOrg(orgId, projectId); + const body = (await c.req.json().catch(() => ({}))) as { return_url?: unknown }; + const returnUrl = typeof body.return_url === "string" ? body.return_url : null; + if (returnUrl) await assertReturnUrlAllowed(orgId, returnUrl); + const result = buildGithubMgmtInstallUrl({ scope: "project", projectId, returnUrl }); + if (!result) throw new HTTPException(503, { message: "github app not configured" }); + log.info( + { org_id: orgId, project_id: projectId, return_url: returnUrl }, + "project-scoped github install url minted", + ); + return c.json({ install_url: result.url }); + }, + ); + + app.get( + "/api/v1/integrations/github/installations", + describeRoute({ + tags: ["GitHub integration"], + summary: "List org-scoped GitHub installs", + description: "Project-scoped installs and revoked / suspended installs are excluded.", + responses: { + 200: { + description: "OK", + content: { + "application/json": { + schema: resolver(githubInstallationListResponseSchema), + }, + }, + }, + ...COMMON_ERRORS, + }, + }), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + return c.json(await listOrgScopedInstalls(orgId)); + }, + ); + + app.get( + "/api/v1/integrations/github/installations/:installationRowId/repos", + describeRoute({ + tags: ["GitHub integration"], + summary: "List repos an install covers (live)", + description: + "Live call to GitHub. Capped at 1000 repos; `truncated=true` means " + + "more exist. You can still grant a beyond-cap repo by passing its " + + "numeric ID to the grant endpoint (O(1) lookup).", + responses: { + 200: { + description: "OK", + content: { + "application/json": { schema: resolver(githubRepoListResponseSchema) }, + }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + ...BAD_GATEWAY, + }, + }), + validator("param", installationRowIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { installationRowId } = c.req.valid("param"); + return c.json(await listOrgScopedInstallRepos(orgId, installationRowId)); + }, + ); + + app.post( + "/api/v1/projects/:projectId/github/repos", + describeRoute({ + tags: ["GitHub integration"], + summary: "Grant a project access to a repo", + description: + "Validates the install belongs to this org and the repo is covered " + + "by it (live GitHub check) so a leaked management key can't grant " + + "access to arbitrary repo IDs.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(grantRepoResponseSchema) } }, + }, + ...BAD_REQUEST, + ...COMMON_ERRORS, + ...NOT_FOUND, + ...BAD_GATEWAY, + }, + }), + validator("param", projectIdParamSchema), + validator("json", grantRepoInputSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + const body = c.req.valid("json"); + return c.json( + await grantRepoToProject({ + orgId, + projectId, + body: { installation_id: body.installation_id, repo_id: body.repo_id }, + }), + ); + }, + ); + + app.delete( + "/api/v1/projects/:projectId/github/repos/:repoId", + describeRoute({ + tags: ["GitHub integration"], + summary: "Revoke a project's grant on a repo", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(okResponseSchema) } }, + }, + ...BAD_REQUEST, + ...COMMON_ERRORS, + ...NOT_FOUND, + }, + }), + validator("param", repoIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const keyId = (c.var as MgmtVars).managementKeyId; + const { projectId, repoId } = c.req.valid("param"); + return c.json( + await revokeProjectRepoGrant({ + orgId, + projectId, + repoIdParam: repoId, + actor: { kind: "management_key", id: keyId }, + }), + ); + }, + ); + + app.get( + "/api/v1/projects/:projectId/github/repos", + describeRoute({ + tags: ["GitHub integration"], + summary: "List repo grants on a project", + description: "Grants whose underlying install has been revoked are filtered out.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(grantListResponseSchema) } }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + }, + }), + validator("param", projectIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + return c.json(await listProjectGithubGrants(orgId, projectId)); + }, + ); + + // ── Telemetry read API ────────────────────────────────────────────────── + // Generic GET endpoints for reading traces / logs / metrics from a project. + // Same auth as the rest of /api/v1/* (sl_management_* keys). Consumers + // include the superlog-dialtone uptime monitor, but these are first-class + // public endpoints — anyone with a management key can use them. + + app.get( + "/api/v1/projects/:projectId/traces/:traceId", + describeRoute({ + tags: ["Telemetry read"], + summary: "Get a trace by id", + description: "Returns all spans and correlated logs for the given trace.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(telemetryReadResponseSchema) } }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + ...BAD_REQUEST, + }, + }), + validator("param", traceByIdParamSchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId, traceId } = c.req.valid("param"); + await requireProjectInOrg(orgId, projectId); + const detail = await getTraceDetail(ch, projectId, traceId); + const spans = (detail.spans as unknown[]) ?? []; + if (spans.length === 0) throw new HTTPException(404, { message: "trace not found" }); + return c.json(detail); + }, + ); + + app.get( + "/api/v1/projects/:projectId/logs", + describeRoute({ + tags: ["Telemetry read"], + summary: "Query logs", + description: + "Returns log rows filtered by any combination of trace_id, service, severity, " + + "free-text search, and time range. Newest first.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(telemetryReadResponseSchema) } }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + ...BAD_REQUEST, + }, + }), + validator("param", projectIdParamSchema), + validator("query", logsQuerySchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + const q = c.req.valid("query"); + await requireProjectInOrg(orgId, projectId); + const items = await queryLogs(ch, projectId, { + range: { since: q.from, until: q.to }, + service: q.service, + severity: q.severity, + search: q.search, + traceId: q.trace_id, + limit: q.limit, + }); + return c.json({ items }); + }, + ); + + app.get( + "/api/v1/projects/:projectId/metrics", + describeRoute({ + tags: ["Telemetry read"], + summary: "Query metric data points", + description: + "Returns metric data points across sum/gauge/histogram tables, filtered by " + + "metric name and (optionally) service / time range.", + responses: { + 200: { + description: "OK", + content: { "application/json": { schema: resolver(telemetryReadResponseSchema) } }, + }, + ...COMMON_ERRORS, + ...NOT_FOUND, + ...BAD_REQUEST, + }, + }), + validator("param", projectIdParamSchema), + validator("query", metricsQuerySchema), + async (c) => { + const orgId = (c.var as MgmtVars).managementOrgId; + const { projectId } = c.req.valid("param"); + const q = c.req.valid("query"); + await requireProjectInOrg(orgId, projectId); + const rows = await queryMetrics(ch, projectId, { + metricName: q.name, + service: q.service, + range: { since: q.from, until: q.to }, + limit: q.limit, + }); + return c.json({ items: rows }); + }, + ); +} + +// Resolves an install row by UUID, ensures it belongs to the authed org AND +// is org-scoped (project_id NULL). Project-scoped installs are private to one +// project and never grantable to others. +async function requireOrgScopedInstall( + orgId: string, + installationRowId: string, +): Promise { + const install = await db.query.githubInstallations.findFirst({ + where: eq(schema.githubInstallations.id, installationRowId), + }); + // Same "not found" message regardless of why so we don't leak existence of + // other orgs' installs. + if (!install || install.orgId !== orgId || install.projectId !== null || install.revokedAt) { + throw new HTTPException(404, { message: "org-scoped installation not found" }); + } + return install; +} + +// Shared helpers — called from both management-API (org-key) and dashboard +// (cookie-session) handlers so behavior stays in sync between the two surfaces. + +async function listOrgScopedInstalls(orgId: string): Promise<{ + installations: { + id: string; + installation_id: number; + account_login: string | null; + account_type: string | null; + created_at: string; + }[]; +}> { + const rows = await db.query.githubInstallations.findMany({ + where: and( + eq(schema.githubInstallations.orgId, orgId), + isNull(schema.githubInstallations.projectId), + isNull(schema.githubInstallations.revokedAt), + ), + orderBy: [desc(schema.githubInstallations.createdAt)], + }); + return { + installations: rows.map((r) => ({ + id: r.id, + installation_id: r.installationId, + account_login: r.accountLogin, + account_type: r.accountType, + created_at: r.createdAt.toISOString(), + })), + }; +} + +async function listOrgScopedInstallRepos( + orgId: string, + installationRowId: string, +): Promise<{ + repos: { id: number; full_name: string; private: boolean }[]; + truncated: boolean; +}> { + const install = await requireOrgScopedInstall(orgId, installationRowId); + try { + const repos = await listCurrentInstallationRepos(install.installationId); + // listCurrentInstallationRepos caps at 10 pages × 100 = 1000 repos. + // If we hit exactly that, more pages likely exist — signal it. + const truncated = repos.length >= 1000; + return { + repos: repos.map((r) => ({ id: r.id, full_name: r.fullName, private: r.private })), + truncated, + }; + } catch (err) { + log.warn( + { err, org_id: orgId, installation_row_id: installationRowId }, + "live github repo lookup failed", + ); + throw new HTTPException(502, { message: "failed to fetch repos from github" }); + } +} + +// Marks an org-scoped install row as revoked. Idempotent on already-revoked +// rows (returns ok). Does not touch the install on GitHub — operator follows +// up at github.com/settings/installations to fully uninstall if needed. +async function revokeOrgScopedInstallation( + orgId: string, + installationRowId: string, +): Promise<{ ok: true }> { + const install = await requireOrgScopedInstall(orgId, installationRowId); + await db + .update(schema.githubInstallations) + .set({ revokedAt: new Date() }) + .where(eq(schema.githubInstallations.id, install.id)); + log.info( + { org_id: orgId, installation_row_id: install.id, installation_id: install.installationId }, + "org-scoped github installation revoked", + ); + return { ok: true }; +} + +async function grantRepoToProject(args: { + orgId: string; + projectId: string; + body: { installation_id?: unknown; repo_id?: unknown }; +}): Promise<{ + grant: { + id: string; + installation_id: string; + repo_id: number; + repo_full_name: string; + created_at: string; + }; +}> { + const { orgId, projectId, body } = args; + await requireProjectInOrg(orgId, projectId); + if (typeof body.installation_id !== "string") { + throw new HTTPException(400, { message: "installation_id (row UUID) is required" }); + } + const repoId = Number(body.repo_id); + if (!Number.isFinite(repoId) || repoId <= 0) { + throw new HTTPException(400, { message: "repo_id must be a positive integer" }); + } + const install = await requireOrgScopedInstall(orgId, body.installation_id); + + // Direct O(1) GitHub lookup — listCurrentInstallationRepos caps at 1000 + // repos, so a paginate-then-find approach would silently 404 valid repos + // beyond that cap. + let repo: Awaited>; + try { + repo = await fetchInstallationRepoById(install.installationId, repoId); + } catch (err) { + log.warn( + { err, org_id: orgId, installation_id: install.installationId, repo_id: repoId }, + "github repo verification failed", + ); + throw new HTTPException(502, { message: "failed to verify repo against github" }); + } + if (!repo) { + throw new HTTPException(404, { message: "repo not covered by this installation" }); + } + + const [row] = await db + .insert(schema.projectGithubRepos) + .values({ + projectId, + installationId: install.id, + githubRepoId: repo.id, + githubRepoFullName: repo.fullName, + }) + .onConflictDoUpdate({ + target: [schema.projectGithubRepos.projectId, schema.projectGithubRepos.githubRepoId], + set: { installationId: install.id, githubRepoFullName: repo.fullName }, + }) + .returning(); + if (!row) throw new HTTPException(500, { message: "failed to record grant" }); + log.info( + { org_id: orgId, project_id: projectId, repo_id: repo.id, repo: repo.fullName }, + "github repo granted to project", + ); + return { + grant: { + id: row.id, + installation_id: row.installationId, + repo_id: row.githubRepoId, + repo_full_name: row.githubRepoFullName, + created_at: row.createdAt.toISOString(), + }, + }; +} + +async function revokeProjectRepoGrant(args: { + orgId: string; + projectId: string; + repoIdParam: string; + actor: { kind: "management_key"; id: string } | { kind: "user"; id: string }; +}): Promise<{ ok: true }> { + const { orgId, projectId, repoIdParam, actor } = args; + await requireProjectInOrg(orgId, projectId); + const repoId = Number(repoIdParam); + if (!Number.isFinite(repoId) || repoId <= 0) { + throw new HTTPException(400, { message: "repoId must be a positive integer" }); + } + const result = await db + .delete(schema.projectGithubRepos) + .where( + and( + eq(schema.projectGithubRepos.projectId, projectId), + eq(schema.projectGithubRepos.githubRepoId, repoId), + ), + ) + .returning({ + id: schema.projectGithubRepos.id, + repoFullName: schema.projectGithubRepos.githubRepoFullName, + installationId: schema.projectGithubRepos.installationId, + }); + if (result.length === 0) { + throw new HTTPException(404, { message: "grant not found" }); + } + const removed = result[0]; + if (!removed) { + throw new HTTPException(404, { message: "grant not found" }); + } + log.info( + { + org_id: orgId, + project_id: projectId, + repo_id: repoId, + repo: removed.repoFullName, + installation_id: removed.installationId, + actor_kind: actor.kind, + actor_id: actor.id, + }, + "github repo grant revoked", + ); + return { ok: true }; +} + +async function listGrantsForInstallation( + orgId: string, + installationRowId: string, +): Promise<{ + grants: { + id: string; + project_id: string; + repo_id: number; + repo_full_name: string; + created_at: string; + }[]; +}> { + // requireOrgScopedInstall asserts the install belongs to this org and is + // org-scoped — otherwise we'd leak grants across orgs by row UUID. + const install = await requireOrgScopedInstall(orgId, installationRowId); + const rows = await db + .select({ + id: schema.projectGithubRepos.id, + projectId: schema.projectGithubRepos.projectId, + githubRepoId: schema.projectGithubRepos.githubRepoId, + githubRepoFullName: schema.projectGithubRepos.githubRepoFullName, + createdAt: schema.projectGithubRepos.createdAt, + }) + .from(schema.projectGithubRepos) + .innerJoin(schema.projects, eq(schema.projects.id, schema.projectGithubRepos.projectId)) + .where( + and( + eq(schema.projectGithubRepos.installationId, install.id), + eq(schema.projects.orgId, orgId), + ), + ) + .orderBy(desc(schema.projectGithubRepos.createdAt)); + return { + grants: rows.map((r) => ({ + id: r.id, + project_id: r.projectId, + repo_id: r.githubRepoId, + repo_full_name: r.githubRepoFullName, + created_at: r.createdAt.toISOString(), + })), + }; +} + +async function listProjectGithubGrants( + orgId: string, + projectId: string, +): Promise<{ + grants: { + id: string; + installation_id: string; + repo_id: number; + repo_full_name: string; + created_at: string; + }[]; +}> { + await requireProjectInOrg(orgId, projectId); + const rows = await db + .select({ + id: schema.projectGithubRepos.id, + installationId: schema.projectGithubRepos.installationId, + githubRepoId: schema.projectGithubRepos.githubRepoId, + githubRepoFullName: schema.projectGithubRepos.githubRepoFullName, + createdAt: schema.projectGithubRepos.createdAt, + }) + .from(schema.projectGithubRepos) + .innerJoin( + schema.githubInstallations, + eq(schema.githubInstallations.id, schema.projectGithubRepos.installationId), + ) + .where( + and( + eq(schema.projectGithubRepos.projectId, projectId), + isNull(schema.githubInstallations.revokedAt), + ), + ) + .orderBy(desc(schema.projectGithubRepos.createdAt)); + return { + grants: rows.map((r) => ({ + id: r.id, + installation_id: r.installationId, + repo_id: r.githubRepoId, + repo_full_name: r.githubRepoFullName, + created_at: r.createdAt.toISOString(), + })), + }; +} + +// Validates a customer-supplied return_url against the org's allowlist. +// Throws HTTPException(400) on any failure so the management API caller gets +// an actionable error. +// +// The management key alone is NOT sufficient to authorize a redirect — if +// it leaks, an attacker shouldn't be able to phish install completers off to +// arbitrary hosts. A dashboard admin must register each acceptable host on +// `orgs.allowed_return_url_hosts` first. +async function assertReturnUrlAllowed(orgId: string, returnUrl: string): Promise { + let parsed: URL; + try { + parsed = new URL(returnUrl); + } catch { + throw new HTTPException(400, { message: "return_url is not a valid URL" }); + } + if (parsed.protocol !== "https:" && parsed.protocol !== "http:") { + throw new HTTPException(400, { message: "return_url must be http or https" }); + } + if (parsed.username || parsed.password) { + throw new HTTPException(400, { message: "return_url must not include credentials" }); + } + const host = parsed.hostname.toLowerCase(); + const org = await db.query.orgs.findFirst({ where: eq(schema.orgs.id, orgId) }); + const allowed = (org?.allowedReturnUrlHosts ?? []).map((h) => h.toLowerCase()); + if (!allowed.includes(host)) { + throw new HTTPException(400, { + message: `return_url host "${host}" is not in this org's return URL allowlist`, + }); + } +} + +// Dashboard-facing endpoints for humans to mint/list/revoke org management +// keys. Mounted under the session-auth /api/* middleware. +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountOrgKeyManagementAuthed(app: Hono): void { + app.get("/api/org/api-keys", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ keys: [] }); + const rows = await db.query.orgApiKeys.findMany({ + where: eq(schema.orgApiKeys.orgId, ctx.orgId), + orderBy: [desc(schema.orgApiKeys.createdAt)], + }); + return c.json({ + keys: rows.map((k) => ({ + id: k.id, + name: k.name, + key_prefix: k.keyPrefix, + last_used_at: k.lastUsedAt?.toISOString() ?? null, + revoked_at: k.revokedAt?.toISOString() ?? null, + created_at: k.createdAt.toISOString(), + })), + }); + }); + + app.post("/api/org/api-keys", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + const body = (await c.req.json().catch(() => ({}))) as { name?: unknown }; + const name = typeof body.name === "string" && body.name.trim() ? body.name.trim() : "API key"; + const minted = await mintOrgApiKey({ + orgId: ctx.orgId, + name, + createdByUserId: ctx.userId, + }); + log.info( + { org_id: ctx.orgId, key_id: minted.id, created_by: ctx.userId, prefix: minted.keyPrefix }, + "org management key minted", + ); + return c.json({ + key: { + id: minted.id, + name: minted.name, + key_prefix: minted.keyPrefix, + plaintext: minted.plaintext, // shown once + created_at: minted.createdAt.toISOString(), + }, + }); + }); + + app.delete("/api/org/api-keys/:id", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + const id = c.req.param("id"); + // Scope by org_id so users can't revoke keys from other orgs by ID guess. + const result = await db + .update(schema.orgApiKeys) + .set({ revokedAt: new Date() }) + .where( + and( + eq(schema.orgApiKeys.id, id), + eq(schema.orgApiKeys.orgId, ctx.orgId), + isNull(schema.orgApiKeys.revokedAt), + ), + ) + .returning({ id: schema.orgApiKeys.id }); + if (result.length === 0) { + // Either wrong org, wrong id, or already revoked — return 404 either way + // so we don't leak existence of other orgs' keys. + throw new HTTPException(404, { message: "key not found" }); + } + return c.json({ ok: true }); + }); + + // Allowlist of hostnames that management-API mint endpoints may use as + // `return_url`. A human dashboard admin must register a host before a key + // holder can ever redirect to it — closes the open-redirect path otherwise + // available to anyone who obtains a management key. + app.get("/api/org/return-url-hosts", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ hosts: [] }); + const org = await db.query.orgs.findFirst({ where: eq(schema.orgs.id, ctx.orgId) }); + return c.json({ hosts: org?.allowedReturnUrlHosts ?? [] }); + }); + + app.put("/api/org/return-url-hosts", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + const body = (await c.req.json().catch(() => ({}))) as { hosts?: unknown }; + if (!Array.isArray(body.hosts)) { + throw new HTTPException(400, { message: "hosts must be a string[]" }); + } + const normalized: string[] = []; + for (const raw of body.hosts) { + if (typeof raw !== "string") { + throw new HTTPException(400, { message: "hosts must be a string[]" }); + } + const host = raw.trim().toLowerCase(); + if (!isValidHostname(host)) { + throw new HTTPException(400, { message: `invalid hostname: ${raw}` }); + } + if (!normalized.includes(host)) normalized.push(host); + } + await db + .update(schema.orgs) + .set({ allowedReturnUrlHosts: normalized }) + .where(eq(schema.orgs.id, ctx.orgId)); + log.info( + { org_id: ctx.orgId, hosts: normalized, set_by: ctx.userId }, + "return URL allowlist updated", + ); + return c.json({ hosts: normalized }); + }); + + // Mints an org-scoped GitHub install URL the same way the management API + // does, but auth-gated on a Better Auth session instead of an `sl_management_*` + // key. Lets a dashboard admin set up the org-level GitHub install without + // first minting a management key just to run one curl. + app.post("/api/org/github/install-url", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + const result = buildGithubMgmtInstallUrl({ + scope: "org", + orgId: ctx.orgId, + returnUrl: null, + }); + if (!result) throw new HTTPException(503, { message: "github app not configured" }); + log.info( + { org_id: ctx.orgId, requested_by: ctx.userId }, + "org-scoped github install url minted via dashboard", + ); + return c.json({ install_url: result.url }); + }); + + // Session-authed twins of the org-scoped GitHub install + grant management + // endpoints under /api/v1/*. The dashboard uses these so the user doesn't + // need to mint a management key to manage installs/grants from the UI. + app.get("/api/org/github/installations", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ installations: [] }); + return c.json(await listOrgScopedInstalls(ctx.orgId)); + }); + + app.get("/api/org/github/installations/:rowId/repos", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + return c.json(await listOrgScopedInstallRepos(ctx.orgId, c.req.param("rowId"))); + }); + + app.get("/api/org/github/installations/:rowId/grants", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + return c.json(await listGrantsForInstallation(ctx.orgId, c.req.param("rowId"))); + }); + + app.delete("/api/org/github/installations/:rowId", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + return c.json(await revokeOrgScopedInstallation(ctx.orgId, c.req.param("rowId"))); + }); + + app.get("/api/org/projects/:projectId/github/repos", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ grants: [] }); + return c.json(await listProjectGithubGrants(ctx.orgId, c.req.param("projectId"))); + }); + + app.post("/api/org/projects/:projectId/github/repos", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + const body = (await c.req.json().catch(() => ({}))) as { + installation_id?: unknown; + repo_id?: unknown; + }; + return c.json( + await grantRepoToProject({ orgId: ctx.orgId, projectId: c.req.param("projectId"), body }), + ); + }); + + app.delete("/api/org/projects/:projectId/github/repos/:repoId", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(404, { message: "no org for user" }); + return c.json( + await revokeProjectRepoGrant({ + orgId: ctx.orgId, + projectId: c.req.param("projectId"), + repoIdParam: c.req.param("repoId"), + actor: { kind: "user", id: ctx.userId }, + }), + ); + }); +} + +// RFC 1123 hostname validation. No leading/trailing dot, no double dots, each +// label is 1-63 alphanumeric chars + interior hyphens, total length ≤253. +function isValidHostname(host: string): boolean { + if (host.length === 0 || host.length > 253) return false; + if (host.startsWith(".") || host.endsWith(".") || host.includes("..")) return false; + const labelRe = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/; + return host.split(".").every((label) => labelRe.test(label)); +} + +async function requireProjectInOrg(orgId: string, projectId: string): Promise { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + if (project.orgId !== orgId) { + throw new HTTPException(404, { message: "project not found" }); + } + return project; +} + +async function resolveUserOrg( + c: Context<{ Variables: DashboardVars }>, +): Promise<{ userId: string; orgId: string } | null> { + const userId = c.var.userId; + if (!userId) return null; + const ctx = await resolveActiveOrgContext({ + userId, + preferredOrgId: c.var.orgId, + }).catch(() => null); + if (!ctx) return null; + return { userId: ctx.user.id, orgId: ctx.org.id }; +} diff --git a/superlog/apps/api/src/mcp/alerts.ts b/superlog/apps/api/src/mcp/alerts.ts new file mode 100644 index 0000000000000000000000000000000000000000..a755b3bf25dbbbbb39caf2521eaf79ba2a4bb773 --- /dev/null +++ b/superlog/apps/api/src/mcp/alerts.ts @@ -0,0 +1,250 @@ +import type { ClickHouseClient } from "@clickhouse/client"; +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { HTTPException } from "hono/http-exception"; +import { z } from "zod"; +import { + alertAggregationSchema, + alertComparatorSchema, + alertFilterSchema, + alertGroupModeSchema, + alertInputSchema, + alertSourceSchema, + createAlertRecord, + deleteAlertRecord, + getAlertWithFirings, + listAlertsForProject, + previewAlert, + testAlertById, + updateAlertRecord, +} from "../alerts-service.js"; +import { assertProjectAccess } from "./projects.js"; + +const projectIdSchema = z + .string() + .uuid() + .optional() + .describe( + "Project to operate on. Defaults to the session's active project. Use list_projects to discover ids.", + ); + +const alertIdSchema = z.string().uuid().describe("Alert id"); + +// Shape (not z.object) for MCP tools that take the full alert body. +const alertInputShape = { + name: z.string().min(1).max(200), + source: alertSourceSchema.describe("Telemetry source: 'logs', 'traces', or 'metric'"), + aggregation: alertAggregationSchema.describe( + "'count' for logs/traces; 'sum' or 'avg' for metric", + ), + comparator: alertComparatorSchema.describe( + "'gt' fires when value > threshold; 'lt' is the opposite", + ), + threshold: z.number().finite(), + enabled: z.boolean().optional(), + metric_name: z + .string() + .max(200) + .nullable() + .optional() + .describe("Required when source = 'metric'"), + filter: alertFilterSchema + .optional() + .describe("Equality filters narrowing the data the alert evaluates"), + group_by: z + .string() + .max(200) + .nullable() + .optional() + .describe("Resource attribute to group by, e.g. 'service.name'"), + group_mode: alertGroupModeSchema + .optional() + .describe("'single' rolls up everything; 'per_group' fires per distinct group_by value"), + window_minutes: z + .number() + .int() + .min(1) + .max(1440) + .optional() + .describe("Evaluation window. Default 5"), + evaluation_interval_seconds: z.number().int().min(15).max(3600).optional(), +} as const; + +type AlertInputArgs = { + name?: string; + source?: z.infer; + aggregation?: z.infer; + comparator?: z.infer; + threshold?: number; + enabled?: boolean; + metric_name?: string | null; + filter?: z.infer; + group_by?: string | null; + group_mode?: z.infer; + window_minutes?: number; + evaluation_interval_seconds?: number; +}; + +function toAlertInput(args: AlertInputArgs): z.infer { + const partial = { + name: args.name, + source: args.source, + aggregation: args.aggregation, + comparator: args.comparator, + threshold: args.threshold, + enabled: args.enabled, + metricName: args.metric_name, + filter: args.filter, + groupBy: args.group_by, + groupMode: args.group_mode, + windowMinutes: args.window_minutes, + evaluationIntervalSeconds: args.evaluation_interval_seconds, + }; + return alertInputSchema.parse(partial); +} + +function toAlertPatch(args: AlertInputArgs): Partial> { + const patch: Partial> = {}; + if (args.name !== undefined) patch.name = args.name; + if (args.source !== undefined) patch.source = args.source; + if (args.aggregation !== undefined) patch.aggregation = args.aggregation; + if (args.comparator !== undefined) patch.comparator = args.comparator; + if (args.threshold !== undefined) patch.threshold = args.threshold; + if (args.enabled !== undefined) patch.enabled = args.enabled; + if (args.metric_name !== undefined) patch.metricName = args.metric_name; + if (args.filter !== undefined) patch.filter = args.filter; + if (args.group_by !== undefined) patch.groupBy = args.group_by; + if (args.group_mode !== undefined) patch.groupMode = args.group_mode; + if (args.window_minutes !== undefined) patch.windowMinutes = args.window_minutes; + if (args.evaluation_interval_seconds !== undefined) { + patch.evaluationIntervalSeconds = args.evaluation_interval_seconds; + } + return alertInputSchema.partial().parse(patch); +} + +const text = (v: unknown) => ({ content: [{ type: "text" as const, text: JSON.stringify(v) }] }); + +export function registerAlertTools( + server: McpServer, + session: { userId: string; activeProjectId: string }, + ch: ClickHouseClient, +): void { + const resolve = async (explicit: string | undefined): Promise => { + const id = explicit ?? session.activeProjectId; + await assertProjectAccess(session.userId, id); + return id; + }; + + server.registerTool( + "list_alerts", + { + title: "List alerts", + description: "List all alerts in the active project (or the project_id you pass).", + inputSchema: { project_id: projectIdSchema }, + }, + async (input) => text(await listAlertsForProject(await resolve(input.project_id))), + ); + + server.registerTool( + "get_alert", + { + title: "Get alert", + description: "Fetch a single alert plus its 50 most recent firings.", + inputSchema: { project_id: projectIdSchema, id: alertIdSchema }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const alert = await getAlertWithFirings(projectId, input.id); + if (!alert) throw new HTTPException(404, { message: "alert not found" }); + return text(alert); + }, + ); + + server.registerTool( + "create_alert", + { + title: "Create alert", + description: + "Create an alert. For logs/traces sources aggregation must be 'count'; for metric source it must be 'sum' or 'avg' and metric_name is required.", + inputSchema: { project_id: projectIdSchema, ...alertInputShape }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const created = await createAlertRecord(projectId, session.userId, toAlertInput(input)); + return text(created); + }, + ); + + server.registerTool( + "update_alert", + { + title: "Update alert", + description: + "Patch an alert. Provide only the fields you want to change. Validation runs on the merged result.", + inputSchema: { + project_id: projectIdSchema, + id: alertIdSchema, + name: alertInputShape.name.optional(), + source: alertInputShape.source.optional(), + aggregation: alertInputShape.aggregation.optional(), + comparator: alertInputShape.comparator.optional(), + threshold: alertInputShape.threshold.optional(), + enabled: alertInputShape.enabled, + metric_name: alertInputShape.metric_name, + filter: alertInputShape.filter, + group_by: alertInputShape.group_by, + group_mode: alertInputShape.group_mode, + window_minutes: alertInputShape.window_minutes, + evaluation_interval_seconds: alertInputShape.evaluation_interval_seconds, + }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const updated = await updateAlertRecord(projectId, input.id, toAlertPatch(input)); + if (!updated) throw new HTTPException(404, { message: "alert not found" }); + return text(updated); + }, + ); + + server.registerTool( + "delete_alert", + { + title: "Delete alert", + description: "Delete an alert by id.", + inputSchema: { project_id: projectIdSchema, id: alertIdSchema }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + await deleteAlertRecord(projectId, input.id, session.userId); + return text({ ok: true }); + }, + ); + + server.registerTool( + "preview_alert", + { + title: "Preview alert", + description: + "Evaluate a draft alert spec against current data without saving. Returns whether it would breach right now.", + inputSchema: { project_id: projectIdSchema, ...alertInputShape }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + return text(await previewAlert(ch, projectId, toAlertInput(input))); + }, + ); + + server.registerTool( + "test_alert", + { + title: "Test alert", + description: "Re-evaluate a saved alert against current data and return the result.", + inputSchema: { project_id: projectIdSchema, id: alertIdSchema }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const result = await testAlertById(ch, projectId, input.id); + if (!result) throw new HTTPException(404, { message: "alert not found" }); + return text(result); + }, + ); +} diff --git a/superlog/apps/api/src/mcp/clickhouse.test.ts b/superlog/apps/api/src/mcp/clickhouse.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..0cbef67eb39b5a9fbe6ce74ff769451bc81f0cad --- /dev/null +++ b/superlog/apps/api/src/mcp/clickhouse.test.ts @@ -0,0 +1,338 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import type { ClickHouseClient } from "@clickhouse/client"; +import { + countSeries, + fieldColumnExpr, + listAttributeKeys, + listAttributeValues, + metricSeries, + queryLogs, + queryMetrics, + queryTraces, +} from "./clickhouse.js"; + +function fakeClickhouse(capture: { query?: string; params?: Record }) { + return { + async query(input: { query: string; query_params?: Record }) { + capture.query = input.query; + capture.params = input.query_params; + return { + async json() { + return []; + }, + }; + }, + } as unknown as ClickHouseClient; +} + +// queryMetrics fans out across four metric tables, so a single-slot capture +// would only retain the last query. This collects every query it runs. +function fakeClickhouseMulti(queries: string[]) { + return { + async query(input: { query: string; query_params?: Record }) { + queries.push(input.query); + return { + async json() { + return []; + }, + }; + }, + } as unknown as ClickHouseClient; +} + +test("countSeries groups traces by span attributes when groupBy uses attr prefix", async () => { + const capture: { query?: string; params?: Record } = {}; + + await countSeries( + fakeClickhouse(capture), + "project-1", + "traces", + { range: { since: "now() - INTERVAL 1 HOUR", until: "now()" } }, + "attr:superlog.endpoint", + { n: 1, unit: "MINUTE" }, + ); + + assert.match(capture.query ?? "", /SpanAttributes\[\{groupKey:String\}\]/); + assert.equal(capture.params?.groupKey, "superlog.endpoint"); +}); + +test("countSeries groups traces by prefixed span attributes", async () => { + const capture: { query?: string; params?: Record } = {}; + + await countSeries( + fakeClickhouse(capture), + "project-1", + "traces", + { range: { since: "now() - INTERVAL 1 HOUR", until: "now()" } }, + "span.session.id", + { n: 1, unit: "MINUTE" }, + ); + + assert.match(capture.query ?? "", /SpanAttributes\[\{groupKey:String\}\]/); + assert.equal(capture.params?.groupKey, "session.id"); +}); + +test("countSeries groups logs by prefixed log attributes", async () => { + const capture: { query?: string; params?: Record } = {}; + + await countSeries( + fakeClickhouse(capture), + "project-1", + "logs", + { range: { since: "now() - INTERVAL 1 HOUR", until: "now()" } }, + "log.session.id", + { n: 1, unit: "MINUTE" }, + ); + + assert.match(capture.query ?? "", /LogAttributes\[\{groupKey:String\}\]/); + assert.equal(capture.params?.groupKey, "session.id"); +}); + +test("countSeries groups logs by log attributes when groupBy uses attr prefix", async () => { + const capture: { query?: string; params?: Record } = {}; + + await countSeries( + fakeClickhouse(capture), + "project-1", + "logs", + { range: { since: "now() - INTERVAL 1 HOUR", until: "now()" } }, + "attr:log.level", + { n: 1, unit: "MINUTE" }, + ); + + assert.match(capture.query ?? "", /LogAttributes\[\{groupKey:String\}\]/); + assert.equal(capture.params?.groupKey, "log.level"); +}); + +test("listAttributeKeys includes prefixed span attributes for trace exploration", async () => { + const capture: { query?: string; params?: Record } = {}; + + await listAttributeKeys( + fakeClickhouse(capture), + "project-1", + { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + "traces", + ); + + assert.match(capture.query ?? "", /mapKeys\(ResourceAttributes\)/); + assert.match(capture.query ?? "", /mapKeys\(SpanAttributes\)/); + assert.match(capture.query ?? "", /concat\('span\.', k\)/); +}); + +test("listAttributeKeys caps the rows scanned per source so high-volume projects don't time out", async () => { + const capture: { query?: string; params?: Record } = {}; + + await listAttributeKeys( + fakeClickhouse(capture), + "project-1", + { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + "traces", + ); + + // Each per-source key scan reads at most ATTRIBUTE_KEY_SCAN_ROW_CAP rows + // before arrayJoin/group, so the query stays ~1s instead of 15-30s. + const limitMatches = (capture.query ?? "").match(/LIMIT 1000000/g) ?? []; + // resource.* from traces + span.* from traces = two capped scans. + assert.equal(limitMatches.length, 2); +}); + +test("listAttributeValues resolves prefixed span attributes", async () => { + const capture: { query?: string; params?: Record } = {}; + + await listAttributeValues( + fakeClickhouse(capture), + "project-1", + "span.session.id", + { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + 200, + "traces", + ); + + assert.match(capture.query ?? "", /SpanAttributes\[\{key:String\}\]/); + assert.equal(capture.params?.key, "session.id"); +}); + +test("queryTraces filters by prefixed span attributes", async () => { + const capture: { query?: string; params?: Record } = {}; + + await queryTraces(fakeClickhouse(capture), "project-1", { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + resourceAttrs: [{ key: "span.session.id", value: "s1" }], + limit: 50, + }); + + assert.match( + capture.query ?? "", + /SpanAttributes\[\{sattr_k_0:String\}\] = \{sattr_v_0:String\}/, + ); + assert.equal(capture.params?.sattr_k_0, "session.id"); + assert.equal(capture.params?.sattr_v_0, "s1"); +}); + +test("fieldColumnExpr allowlists identifier columns per source", () => { + assert.equal(fieldColumnExpr("trace_id", "logs"), "TraceId"); + assert.equal(fieldColumnExpr("span_id", "logs"), "SpanId"); + assert.equal(fieldColumnExpr("severity_number", "logs"), "toString(SeverityNumber)"); + assert.equal(fieldColumnExpr("trace_id", "traces"), "TraceId"); + assert.equal(fieldColumnExpr("severity_number", "traces"), null); + assert.equal(fieldColumnExpr("unknown", "logs"), null); +}); + +test("queryLogs filters by field.trace_id against the TraceId column", async () => { + const capture: { query?: string; params?: Record } = {}; + + await queryLogs(fakeClickhouse(capture), "project-1", { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + resourceAttrs: [{ key: "field.trace_id", value: "abc123" }], + limit: 50, + }); + + assert.match(capture.query ?? "", /TraceId = \{fattr_v_0:String\}/); + assert.equal(capture.params?.fattr_v_0, "abc123"); +}); + +test("queryLogs filters by field.severity_number via a string-cast column", async () => { + const capture: { query?: string; params?: Record } = {}; + + await queryLogs(fakeClickhouse(capture), "project-1", { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + resourceAttrs: [{ key: "field.severity_number", value: "9" }], + limit: 50, + }); + + assert.match(capture.query ?? "", /toString\(SeverityNumber\) = \{fattr_v_0:String\}/); + assert.equal(capture.params?.fattr_v_0, "9"); +}); + +test("queryTraces filters by field.span_id, ignoring non-applicable field keys", async () => { + const capture: { query?: string; params?: Record } = {}; + + await queryTraces(fakeClickhouse(capture), "project-1", { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + resourceAttrs: [ + { key: "field.span_id", value: "span-9" }, + { key: "field.severity_number", value: "9" }, + ], + limit: 50, + }); + + assert.match(capture.query ?? "", /SpanId = \{fattr_v_0:String\}/); + assert.equal(capture.params?.fattr_v_0, "span-9"); + // severity_number isn't a traces column, so it must not produce a condition. + assert.doesNotMatch(capture.query ?? "", /SeverityNumber/); +}); + +test("metricSeries can exclude resource attributes by substring", async () => { + const capture: { query?: string; params?: Record } = {}; + + await metricSeries( + fakeClickhouse(capture), + "project-1", + "superlog.worker.cursor_lag_ms", + { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + resourceAttrs: [{ key: "host.name", value: ".local", op: "not_contains" }], + }, + undefined, + { n: 1, unit: "MINUTE" }, + "max", + ); + + assert.match( + capture.query ?? "", + /positionCaseInsensitive\(ResourceAttributes\[\{attr_k_0:String\}\], \{attr_v_0:String\}\) = 0/, + ); + assert.equal(capture.params?.attr_k_0, "host.name"); + assert.equal(capture.params?.attr_v_0, ".local"); +}); + +test("metricSeries spreads cumulative monotonic sum increases across the interval each sample covers", async () => { + const queries: string[] = []; + + await metricSeries( + fakeClickhouseMulti(queries), + "project-1", + "superlog.proxy.ingest.requests", + { range: { since: "now() - INTERVAL 1 HOUR", until: "now()" } }, + "attr:tenant.org.name", + { n: 1, unit: "MINUTE" }, + "sum", + ); + + const sumQuery = queries.find((q) => q.includes("FROM otel_metrics_sum")); + assert.ok(sumQuery, "expected a sum metric query"); + assert.match(sumQuery, /AggregationTemporality = 2/); + assert.match(sumQuery, /IsMonotonic/); + // Per-sample increase (delta) from the cumulative value. + assert.match(sumQuery, /lagInFrame\(toNullable\(Value\), 1, NULL\)/); + assert.match(sumQuery, /Value - previous_value/); + // First sample of a series has no predecessor: only count it if the series + // actually started inside the window. + assert.match(sumQuery, /StartTimeUnix >= now\(\) - INTERVAL 1 HOUR/); + // The increase is spread over the wall-clock interval (prev sample -> this + // sample) by weighting each render bucket's overlap with that interval — + // this is what removes the "comb" when the step is finer than the export + // interval. Needs the previous sample's timestamp and an overlap weight. + assert.match(sumQuery, /lagInFrame\(TimeUnix, 1, TimeUnix\)/); + assert.match(sumQuery, /ARRAY JOIN spread/); + // Interval math is in nanoseconds (1 MINUTE step = 60e9 ns) so sub-second + // sample intervals aren't quantized away. + assert.match(sumQuery, /toUnixTimestamp64Nano\(prev_time\)/); + assert.match(sumQuery, /least\(b, g \+ 60000000000\) - greatest\(a, g\)/); + assert.match(sumQuery, /\/ dt/); + // Non-cumulative / non-monotonic points are still summed as-is. + assert.match(sumQuery, /NOT \(AggregationTemporality = 2 AND IsMonotonic\)/); + assert.match(sumQuery, /Attributes\[\{groupKey:String\}\] AS group_key/); + assert.equal(queries.length, 4); +}); + +test("queryTraces returns resource attributes and flattened exception fields", async () => { + const capture: { query?: string; params?: Record } = {}; + + await queryTraces(fakeClickhouse(capture), "project-1", { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + limit: 50, + }); + + assert.match(capture.query ?? "", /SpanAttributes AS span_attrs/); + assert.match(capture.query ?? "", /ResourceAttributes AS resource_attrs/); + assert.match(capture.query ?? "", /AS exception_type/); + assert.match(capture.query ?? "", /AS exception_message/); + assert.match(capture.query ?? "", /AS exception_stacktrace/); +}); + +test("queryMetrics returns data-point attributes for every metric kind", async () => { + const queries: string[] = []; + + await queryMetrics(fakeClickhouseMulti(queries), "project-1", { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + limit: 100, + }); + + assert.equal(queries.length, 4); + for (const q of queries) { + assert.match(q, /Attributes AS attributes/); + assert.match(q, /ResourceAttributes AS resource_attrs/); + } +}); + +test("queryMetrics surfaces sum/min/max for histogram points", async () => { + const queries: string[] = []; + + await queryMetrics(fakeClickhouseMulti(queries), "project-1", { + range: { since: "now() - INTERVAL 1 HOUR", until: "now()" }, + limit: 100, + }); + + const histogramQuery = queries.find((q) => q.includes("'histogram' AS kind")); + assert.ok(histogramQuery, "expected a histogram query"); + assert.match(histogramQuery, /Count AS count/); + assert.match(histogramQuery, /Sum AS sum/); + assert.match(histogramQuery, /Min AS min/); + assert.match(histogramQuery, /Max AS max/); + + const gaugeQuery = queries.find((q) => q.includes("'gauge' AS kind")); + assert.ok(gaugeQuery, "expected a gauge query"); + assert.match(gaugeQuery, /Value AS value/); +}); diff --git a/superlog/apps/api/src/mcp/clickhouse.ts b/superlog/apps/api/src/mcp/clickhouse.ts new file mode 100644 index 0000000000000000000000000000000000000000..a1548d111eb473b11fe3a2865a1f6222e6005b67 --- /dev/null +++ b/superlog/apps/api/src/mcp/clickhouse.ts @@ -0,0 +1,1444 @@ +import type { ClickHouseClient } from "@clickhouse/client"; + +export type TimeRange = { since?: string; until?: string }; +export type ResourceAttrFilter = { + key: string; + value: string; + op?: "eq" | "neq" | "not_contains"; +}; + +type AttributeColumn = "ResourceAttributes" | "SpanAttributes" | "LogAttributes"; +// `field` is not an attribute map — it routes a `field.` filter key to a +// top-level column (TraceId, SpanId, SeverityNumber) via the fieldColumnExpr +// allowlist below, so the explore UI can filter on identifiers, not just attrs. +type AttributeScope = "resource" | "span" | "log" | "field"; +type ParsedAttributeKey = { scope: AttributeScope; key: string }; + +export type FieldFilterSource = "logs" | "traces"; + +// Allowlist mapping a `field.` filter key to the ClickHouse column +// expression it compares against (as a String). Returns null for anything not +// on the list so an arbitrary `field.*` key can never reach the query — the +// value is always bound as a parameter, the column expression never is. +export function fieldColumnExpr(field: string, source: FieldFilterSource): string | null { + switch (field) { + case "trace_id": + return "TraceId"; + case "span_id": + return "SpanId"; + case "severity_number": + // SeverityNumber only exists on logs; cast so the String param compares. + return source === "logs" ? "toString(SeverityNumber)" : null; + default: + return null; + } +} + +const RELATIVE_TIME_EXPR_RE = + /^now\(\)(?:\s*-\s*INTERVAL\s+(?:[1-9][0-9]*)\s+(?:SECOND|MINUTE|HOUR|DAY|WEEK|MONTH))?$/i; + +function timeBoundExpr(value: string, paramName: "since" | "until"): string { + const normalized = value.trim().replace(/\s+/g, " "); + if (RELATIVE_TIME_EXPR_RE.test(normalized)) return normalized; + return `parseDateTime64BestEffortOrZero({${paramName}:String})`; +} + +function resolveRange(range?: TimeRange): { + sinceSql: string; + untilSql: string; + sinceExpr: string; + untilExpr: string; +} { + const since = range?.since ?? "now() - INTERVAL 1 HOUR"; + const until = range?.until ?? "now()"; + return { + sinceSql: since, + untilSql: until, + sinceExpr: timeBoundExpr(since, "since"), + untilExpr: timeBoundExpr(until, "until"), + }; +} + +function attrConds( + attrs: ResourceAttrFilter[] | undefined, + column: AttributeColumn = "ResourceAttributes", + paramPrefix = "attr", +): { + conds: string[]; + params: Record; +} { + const conds: string[] = []; + const params: Record = {}; + if (!attrs) return { conds, params }; + attrs.forEach((a, i) => { + const kName = `${paramPrefix}_k_${i}`; + const vName = `${paramPrefix}_v_${i}`; + if (a.op === "neq") { + conds.push(`${column}[{${kName}:String}] != {${vName}:String}`); + } else if (a.op === "not_contains") { + conds.push(`positionCaseInsensitive(${column}[{${kName}:String}], {${vName}:String}) = 0`); + } else { + conds.push(`${column}[{${kName}:String}] = {${vName}:String}`); + } + params[kName] = a.key; + params[vName] = a.value; + }); + return { conds, params }; +} + +function parseAttributeKey(key: string): ParsedAttributeKey { + if (key.startsWith("resource.")) return { scope: "resource", key: key.slice("resource.".length) }; + if (key.startsWith("span.")) return { scope: "span", key: key.slice("span.".length) }; + if (key.startsWith("log.")) return { scope: "log", key: key.slice("log.".length) }; + if (key.startsWith("field.")) return { scope: "field", key: key.slice("field.".length) }; + return { scope: "resource", key }; +} + +function splitAttrs( + attrs: ResourceAttrFilter[] | undefined, +): Record { + const out: Record = { + resource: [], + span: [], + log: [], + field: [], + }; + for (const attr of attrs ?? []) { + const parsed = parseAttributeKey(attr.key); + out[parsed.scope].push({ ...attr, key: parsed.key }); + } + return out; +} + +// Build equality conditions for `field.*` filters against top-level columns. +// Only keys on the fieldColumnExpr allowlist for this source produce a +// condition; everything else is silently dropped. Op is ignored — identifier +// filters are equality-only. +function fieldConds( + attrs: ResourceAttrFilter[], + source: FieldFilterSource, + paramPrefix = "fattr", +): { conds: string[]; params: Record } { + const conds: string[] = []; + const params: Record = {}; + attrs.forEach((a, i) => { + const expr = fieldColumnExpr(a.key, source); + if (!expr) return; + const vName = `${paramPrefix}_v_${i}`; + conds.push(`${expr} = {${vName}:String}`); + params[vName] = a.value; + }); + return { conds, params }; +} + +function groupExprForAttribute( + groupBy: string | undefined, + source: SeriesSource, +): { expr: string; params: Record } { + if (groupBy === "service.name" || groupBy === "service") { + return { expr: "ServiceName", params: {} }; + } + if (groupBy?.startsWith("attr:")) { + return { + expr: + source === "logs" + ? "LogAttributes[{groupKey:String}]" + : "SpanAttributes[{groupKey:String}]", + params: { groupKey: groupBy.slice("attr:".length) }, + }; + } + if (groupBy) { + const parsed = parseAttributeKey(groupBy); + if (parsed.scope === "resource") { + return { expr: "ResourceAttributes[{groupKey:String}]", params: { groupKey: parsed.key } }; + } + if (parsed.scope === "log" && source === "logs") { + return { expr: "LogAttributes[{groupKey:String}]", params: { groupKey: parsed.key } }; + } + if (parsed.scope === "span" && source === "traces") { + return { expr: "SpanAttributes[{groupKey:String}]", params: { groupKey: parsed.key } }; + } + } + return { expr: "''", params: {} }; +} + +export async function queryLogs( + ch: ClickHouseClient, + projectId: string, + params: { + range?: TimeRange; + service?: string; + severity?: string; + search?: string; + traceId?: string; + resourceAttrs?: ResourceAttrFilter[]; + logAttrs?: ResourceAttrFilter[]; + limit: number; + }, +) { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(params.range); + const split = splitAttrs(params.resourceAttrs); + const attr = attrConds(split.resource); + const logAttr = attrConds([...split.log, ...(params.logAttrs ?? [])], "LogAttributes", "lattr"); + const field = fieldConds(split.field, "logs"); + const conds: string[] = [ + "ResourceAttributes['superlog.project_id'] = {projectId:String}", + `Timestamp >= ${sinceExpr}`, + `Timestamp <= ${untilExpr}`, + ...attr.conds, + ...logAttr.conds, + ...field.conds, + ]; + if (params.service) conds.push("ServiceName = {service:String}"); + if (params.severity) conds.push("upper(SeverityText) = upper({severity:String})"); + if (params.search) conds.push("positionCaseInsensitive(Body, {search:String}) > 0"); + if (params.traceId) conds.push("TraceId = {traceId:String}"); + + const query = ` + SELECT + toString(Timestamp) AS timestamp, + ServiceName AS service, + SeverityText AS severity, + toUInt8(SeverityNumber) AS severity_number, + Body AS body, + TraceId AS trace_id, + SpanId AS span_id, + LogAttributes AS log_attrs, + ResourceAttributes AS resource_attrs, + LogAttributes['exception.type'] AS exception_type, + LogAttributes['exception.message'] AS exception_message, + LogAttributes['exception.stacktrace'] AS exception_stacktrace + FROM otel_logs + WHERE ${conds.join(" AND ")} + ORDER BY Timestamp DESC + LIMIT {limit:UInt32} + `; + const r = await ch.query({ + query, + query_params: { + projectId, + since: sinceSql, + until: untilSql, + service: params.service ?? "", + severity: params.severity ?? "", + search: params.search ?? "", + traceId: params.traceId ?? "", + limit: params.limit, + ...attr.params, + ...logAttr.params, + ...field.params, + }, + format: "JSONEachRow", + }); + return r.json(); +} + +export async function queryTraces( + ch: ClickHouseClient, + projectId: string, + params: { + range?: TimeRange; + service?: string; + spanName?: string; + statusCode?: string; + minDurationMs?: number; + resourceAttrs?: ResourceAttrFilter[]; + spanAttrs?: ResourceAttrFilter[]; + limit: number; + }, +) { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(params.range); + const split = splitAttrs(params.resourceAttrs); + const attr = attrConds(split.resource); + const spanAttr = attrConds( + [...split.span, ...(params.spanAttrs ?? [])], + "SpanAttributes", + "sattr", + ); + const field = fieldConds(split.field, "traces"); + const conds: string[] = [ + "ResourceAttributes['superlog.project_id'] = {projectId:String}", + `Timestamp >= ${sinceExpr}`, + `Timestamp <= ${untilExpr}`, + ...attr.conds, + ...spanAttr.conds, + ...field.conds, + ]; + if (params.service) conds.push("ServiceName = {service:String}"); + if (params.spanName) conds.push("SpanName = {spanName:String}"); + if (params.statusCode) conds.push("StatusCode = {statusCode:String}"); + if (typeof params.minDurationMs === "number") { + conds.push("Duration >= {minDurationNs:UInt64}"); + } + + const query = ` + SELECT + toString(Timestamp) AS timestamp, + TraceId AS trace_id, + SpanId AS span_id, + ParentSpanId AS parent_span_id, + ServiceName AS service, + SpanName AS span_name, + SpanKind AS span_kind, + StatusCode AS status_code, + StatusMessage AS status_message, + Duration / 1000000 AS duration_ms, + SpanAttributes AS span_attrs, + ResourceAttributes AS resource_attrs, + indexOf(Events.Name, 'exception') AS exception_event_index, + if(exception_event_index = 0, '', Events.Attributes[exception_event_index]['exception.type']) AS exception_type, + if(exception_event_index = 0, '', Events.Attributes[exception_event_index]['exception.message']) AS exception_message, + if(exception_event_index = 0, '', Events.Attributes[exception_event_index]['exception.stacktrace']) AS exception_stacktrace + FROM otel_traces + WHERE ${conds.join(" AND ")} + ORDER BY Timestamp DESC + LIMIT {limit:UInt32} + `; + const r = await ch.query({ + query, + query_params: { + projectId, + since: sinceSql, + until: untilSql, + service: params.service ?? "", + spanName: params.spanName ?? "", + statusCode: params.statusCode ?? "", + minDurationNs: Math.round((params.minDurationMs ?? 0) * 1_000_000), + limit: params.limit, + ...attr.params, + ...spanAttr.params, + ...field.params, + }, + format: "JSONEachRow", + }); + return r.json(); +} + +export async function queryTracesAggregated( + ch: ClickHouseClient, + projectId: string, + params: { + range?: TimeRange; + service?: string; + spanName?: string; + statusCode?: string; + minDurationMs?: number; + resourceAttrs?: ResourceAttrFilter[]; + limit: number; + }, +) { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(params.range); + const split = splitAttrs(params.resourceAttrs); + const attr = attrConds(split.resource); + const spanAttr = attrConds(split.span, "SpanAttributes", "sattr"); + const field = fieldConds(split.field, "traces"); + // Outer scope: trace-level. We aggregate over every span of every matching + // trace in the window so span_count / duration_ms / error_count describe the + // whole trace rather than only the spans matching span-level filters. + const outerConds: string[] = [ + "ResourceAttributes['superlog.project_id'] = {projectId:String}", + `Timestamp >= ${sinceExpr}`, + `Timestamp <= ${untilExpr}`, + ...attr.conds, + ]; + // Inner scope: span-level filters pick which TraceIds qualify. Identifier + // (field.*) filters like span_id are span-level too. + const innerConds: string[] = [...outerConds, ...spanAttr.conds, ...field.conds]; + if (params.service) innerConds.push("ServiceName = {service:String}"); + if (params.spanName) innerConds.push("SpanName = {spanName:String}"); + if (params.statusCode) innerConds.push("StatusCode = {statusCode:String}"); + const hasSpanLevelFilter = !!( + params.service || + params.spanName || + params.statusCode || + spanAttr.conds.length || + field.conds.length + ); + + // After GROUP BY TraceId, filter by total duration if requested. + const havingMinDuration = + typeof params.minDurationMs === "number" && params.minDurationMs > 0 + ? `HAVING duration_ms >= ${Math.round(params.minDurationMs * 1000) / 1000}` + : ""; + + const traceIdSubquery = hasSpanLevelFilter + ? `AND TraceId IN ( + SELECT DISTINCT TraceId FROM otel_traces + WHERE ${innerConds.join(" AND ")} + )` + : ""; + + const query = ` + SELECT + TraceId AS trace_id, + toString(min(Timestamp)) AS start_time, + argMin(SpanName, Timestamp) AS root_span_name, + argMin(ServiceName, Timestamp) AS root_service, + argMin(StatusCode, Timestamp) AS root_status_code, + count() AS span_count, + countIf(StatusCode = 'STATUS_CODE_ERROR') AS error_count, + uniqExact(ServiceName) AS service_count, + toFloat64( + max(toUnixTimestamp64Nano(Timestamp) + Duration) - + min(toUnixTimestamp64Nano(Timestamp)) + ) / 1000000 AS duration_ms + FROM otel_traces + WHERE ${outerConds.join(" AND ")} + ${traceIdSubquery} + GROUP BY TraceId + ${havingMinDuration} + ORDER BY min(Timestamp) DESC + LIMIT {limit:UInt32} + `; + const r = await ch.query({ + query, + query_params: { + projectId, + since: sinceSql, + until: untilSql, + service: params.service ?? "", + spanName: params.spanName ?? "", + statusCode: params.statusCode ?? "", + limit: params.limit, + ...attr.params, + ...spanAttr.params, + ...field.params, + }, + format: "JSONEachRow", + }); + return r.json(); +} + +export async function getTraceDetail(ch: ClickHouseClient, projectId: string, traceId: string) { + const spansQ = ch.query({ + query: ` + SELECT + toString(Timestamp) AS timestamp, + toString(toUnixTimestamp64Nano(Timestamp)) AS start_ns, + TraceId AS trace_id, + SpanId AS span_id, + ParentSpanId AS parent_span_id, + ServiceName AS service, + SpanName AS span_name, + SpanKind AS span_kind, + StatusCode AS status_code, + StatusMessage AS status_message, + toString(Duration) AS duration_ns, + toFloat64(Duration) / 1000000 AS duration_ms, + SpanAttributes AS span_attrs, + ResourceAttributes AS resource_attrs, + indexOf(Events.Name, 'exception') AS exception_event_index, + if(exception_event_index = 0, '', Events.Attributes[exception_event_index]['exception.type']) AS exception_type, + if(exception_event_index = 0, '', Events.Attributes[exception_event_index]['exception.message']) AS exception_message, + if(exception_event_index = 0, '', Events.Attributes[exception_event_index]['exception.stacktrace']) AS exception_stacktrace + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND TraceId = {traceId:String} + ORDER BY Timestamp ASC, SpanId ASC + LIMIT 5000 + `, + query_params: { projectId, traceId }, + format: "JSONEachRow", + }); + + const logsQ = ch.query({ + query: ` + SELECT + toString(Timestamp) AS timestamp, + toString(toUnixTimestamp64Nano(Timestamp)) AS ts_ns, + ServiceName AS service, + SeverityText AS severity, + Body AS body, + TraceId AS trace_id, + SpanId AS span_id, + LogAttributes AS log_attrs, + ResourceAttributes AS resource_attrs, + LogAttributes['exception.type'] AS exception_type, + LogAttributes['exception.message'] AS exception_message, + LogAttributes['exception.stacktrace'] AS exception_stacktrace + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND TraceId = {traceId:String} + ORDER BY Timestamp ASC + LIMIT 5000 + `, + query_params: { projectId, traceId }, + format: "JSONEachRow", + }); + + const [spansR, logsR] = await Promise.all([spansQ, logsQ]); + const spans = await spansR.json(); + const logs = await logsR.json(); + return { spans, logs }; +} + +export async function queryMetrics( + ch: ClickHouseClient, + projectId: string, + params: { + metricName?: string; + service?: string; + range?: TimeRange; + resourceAttrs?: ResourceAttrFilter[]; + limit: number; + }, +) { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(params.range); + const attr = attrConds(params.resourceAttrs); + const results: Record[] = []; + + for (const { table, kind } of METRIC_TABLES) { + const conds: string[] = [ + "ResourceAttributes['superlog.project_id'] = {projectId:String}", + `TimeUnix >= ${sinceExpr}`, + `TimeUnix <= ${untilExpr}`, + ...attr.conds, + ]; + if (params.metricName) conds.push("MetricName = {metricName:String}"); + if (params.service) conds.push("ResourceAttributes['service.name'] = {service:String}"); + + // Histograms/summaries have no scalar Value; surface the rolled-up + // Count/Sum (and Min/Max for histograms) so a point conveys more than just + // "an observation happened". Min/Max don't exist on the summary table. + const valueExpr = + kind === "histogram" + ? "NULL AS value, Count AS count, Sum AS sum, Min AS min, Max AS max" + : kind === "summary" + ? "NULL AS value, Count AS count, Sum AS sum, NULL AS min, NULL AS max" + : "Value AS value, NULL AS count, NULL AS sum, NULL AS min, NULL AS max"; + + const query = ` + SELECT + '${kind}' AS kind, + toString(TimeUnix) AS timestamp, + MetricName AS metric_name, + MetricUnit AS unit, + ResourceAttributes['service.name'] AS service, + ${valueExpr}, + Attributes AS attributes, + ResourceAttributes AS resource_attrs + FROM ${table} + WHERE ${conds.join(" AND ")} + ORDER BY TimeUnix DESC + LIMIT {limit:UInt32} + `; + + try { + const r = await ch.query({ + query, + query_params: { + projectId, + since: sinceSql, + until: untilSql, + metricName: params.metricName ?? "", + service: params.service ?? "", + limit: params.limit, + ...attr.params, + }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as Record[]; + results.push(...rows); + } catch (err) { + // metric tables may not exist if no metrics of this kind have been ingested yet + if (!(err instanceof Error && /UNKNOWN_TABLE|doesn't exist/i.test(err.message))) throw err; + } + } + + results.sort((a, b) => String(b.timestamp).localeCompare(String(a.timestamp))); + return results.slice(0, params.limit); +} + +export async function listServices(ch: ClickHouseClient, projectId: string, range?: TimeRange) { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(range); + const query = ` + SELECT DISTINCT ServiceName AS service + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND ServiceName != '' + ORDER BY service + LIMIT 200 + `; + const r = await ch.query({ + query, + query_params: { projectId, since: sinceSql, until: untilSql }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { service: string }[]; + return rows.map((r) => r.service); +} + +// Discovering which attribute keys exist only needs a representative sample of +// rows, not every row in the window. High-volume projects produce millions of +// spans/logs per hour, and reading the full ResourceAttributes/SpanAttributes +// map columns across all of them took 15-30s — past the 10s ClickHouse +// request_timeout — so the explore filter dropdown 500'd. Capping the rows each +// scan reads before the arrayJoin/group keeps the query ~1s while still +// surfacing effectively every key: ClickHouse reads parts in parallel, so the +// cap samples across the window rather than just the head. Counts become +// approximate, which is fine for ordering the dropdown. Low-volume projects read +// fewer rows than the cap and stay exact. +const ATTRIBUTE_KEY_SCAN_ROW_CAP = 1_000_000; + +export async function listAttributeKeys( + ch: ClickHouseClient, + projectId: string, + range?: TimeRange, + source?: SeriesSource | "metrics", +): Promise<{ key: string; count: number }[]> { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(range); + const resourceFromLogs = source === undefined || source === "logs" || source === "metrics"; + const resourceFromTraces = source === undefined || source === "traces" || source === "metrics"; + // Reads at most ATTRIBUTE_KEY_SCAN_ROW_CAP rows from `table`, then expands the + // chosen map column's keys. `prefix` namespaces keys by scope (resource./span./log.); + // pass "" to emit the bare key (the unscoped `source === undefined` case). + const keyScan = (table: string, column: string, prefix: string): string => { + const keyExpr = prefix ? `concat('${prefix}', k)` : "k"; + return ` + SELECT ${keyExpr} AS k, count() AS c FROM ( + SELECT mapKeys(${column}) AS mk + FROM ${table} + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + LIMIT ${ATTRIBUTE_KEY_SCAN_ROW_CAP} + ) ARRAY JOIN mk AS k + GROUP BY k`; + }; + const subqueries: string[] = []; + if (source === undefined) { + subqueries.push(keyScan("otel_logs", "ResourceAttributes", "")); + subqueries.push(keyScan("otel_traces", "ResourceAttributes", "")); + } else { + if (resourceFromLogs) { + subqueries.push(keyScan("otel_logs", "ResourceAttributes", "resource.")); + } + if (source === "logs") { + subqueries.push(keyScan("otel_logs", "LogAttributes", "log.")); + } + if (resourceFromTraces) { + subqueries.push(keyScan("otel_traces", "ResourceAttributes", "resource.")); + } + if (source === "traces") { + subqueries.push(keyScan("otel_traces", "SpanAttributes", "span.")); + } + } + const query = ` + SELECT k, sum(c) AS c FROM ( + ${subqueries.join("\n UNION ALL\n")} + ) + WHERE k != 'superlog.project_id' AND k != 'resource.superlog.project_id' AND k != '' + GROUP BY k + ORDER BY c DESC + LIMIT 200 + `; + const r = await ch.query({ + query, + query_params: { projectId, since: sinceSql, until: untilSql }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { k: string; c: string | number }[]; + return rows.map((row) => ({ key: row.k, count: Number(row.c) })); +} + +export async function listAttributeValues( + ch: ClickHouseClient, + projectId: string, + key: string, + range?: TimeRange, + limit = 200, + source?: SeriesSource | "metrics", +): Promise<{ value: string; count: number }[]> { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(range); + const parsed = parseAttributeKey(key); + const keyParam = parsed.key; + const subqueries: string[] = []; + if (parsed.scope === "resource") { + if (source === undefined || source === "logs" || source === "metrics") { + subqueries.push(` + SELECT ResourceAttributes[{key:String}] AS v, count() AS c + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(ResourceAttributes, {key:String}) + GROUP BY v`); + } + if (source === undefined || source === "traces" || source === "metrics") { + subqueries.push(` + SELECT ResourceAttributes[{key:String}] AS v, count() AS c + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(ResourceAttributes, {key:String}) + GROUP BY v`); + } + } else if (parsed.scope === "log" && source === "logs") { + subqueries.push(` + SELECT LogAttributes[{key:String}] AS v, count() AS c + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(LogAttributes, {key:String}) + GROUP BY v`); + } else if (parsed.scope === "span" && source === "traces") { + subqueries.push(` + SELECT SpanAttributes[{key:String}] AS v, count() AS c + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(SpanAttributes, {key:String}) + GROUP BY v`); + } + if (subqueries.length === 0) return []; + const query = ` + SELECT v, sum(c) AS c FROM ( + ${subqueries.join("\n UNION ALL\n")} + ) + WHERE v != '' + GROUP BY v + ORDER BY c DESC + LIMIT {limit:UInt32} + `; + const r = await ch.query({ + query, + query_params: { projectId, key: keyParam, since: sinceSql, until: untilSql, limit }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { v: string; c: string | number }[]; + return rows.map((row) => ({ value: row.v, count: Number(row.c) })); +} + +export type MetricKind = "gauge" | "sum" | "histogram" | "summary"; +export type MetricName = { name: string; kind: MetricKind; unit: string }; +export type MetricSeriesRow = { bucket: string; group: string; value: number }; + +export const METRIC_AGGREGATIONS = ["sum", "avg", "min", "max", "p95", "p99"] as const; +export type MetricAggregation = (typeof METRIC_AGGREGATIONS)[number]; + +const METRIC_TABLES: { table: string; kind: MetricKind }[] = [ + { table: "otel_metrics_gauge", kind: "gauge" }, + { table: "otel_metrics_sum", kind: "sum" }, + { table: "otel_metrics_histogram", kind: "histogram" }, + { table: "otel_metrics_summary", kind: "summary" }, +]; + +// Default per-kind aggregation when the caller doesn't specify one. +const DEFAULT_AGG_EXPR: Record = { + gauge: "avg(Value)", + sum: "sum(Value)", + histogram: "toFloat64(sum(Count))", + summary: "avg(Sum)", +}; + +// Per-aggregation, per-kind ClickHouse expression. `null` means "this aggregation +// is not supported on this metric kind" — we skip the table for that query. +// +// Histograms and summaries have no scalar Value column. We map sum/avg onto the +// rolled-up Sum/Count columns. min/max use Min/Max where present (histogram only). +// True quantile reconstruction from histogram bucket arrays / summary +// ValueAtQuantiles is non-trivial and intentionally not supported here. +const AGG_EXPR: Record>> = { + sum: { + gauge: "sum(Value)", + sum: "sum(Value)", + histogram: "sum(Sum)", + summary: "sum(Sum)", + }, + avg: { + gauge: "avg(Value)", + sum: "avg(Value)", + histogram: "sum(Sum) / nullIf(toFloat64(sum(Count)), 0)", + summary: "sum(Sum) / nullIf(toFloat64(sum(Count)), 0)", + }, + min: { + gauge: "min(Value)", + sum: "min(Value)", + histogram: "min(Min)", + }, + max: { + gauge: "max(Value)", + sum: "max(Value)", + histogram: "max(Max)", + }, + p95: { + gauge: "quantile(0.95)(Value)", + sum: "quantile(0.95)(Value)", + // histogram handled via ARRAY JOIN path below — see histogramQuantileQuery. + histogram: "__histogram_quantile__", + }, + p99: { + gauge: "quantile(0.99)(Value)", + sum: "quantile(0.99)(Value)", + histogram: "__histogram_quantile__", + }, +}; + +// Histograms have no scalar Value column — quantiles must be reconstructed from +// BucketCounts + ExplicitBounds. We approximate by treating each bucket's upper +// bound as its representative value (the overflow bucket falls back to Max, +// or the largest finite bound if Max wasn't recorded), then run +// quantileExactWeighted with bucket counts as weights. This biases the result +// up by less than one bucket width — the same approximation Prometheus's +// histogram_quantile uses, minus the within-bucket linear interpolation. +function histogramQuantileQuery(args: { + table: string; + step: Step; + groupExpr: string; + conds: string[]; + q: number; +}): string { + const { table, step, groupExpr, conds, q } = args; + return ` + SELECT + toString(toStartOfInterval(TimeUnix, INTERVAL ${step.n} ${step.unit})) AS bucket, + ${groupExpr} AS group_key, + quantileExactWeighted(${q})( + if( + idx <= length(ExplicitBounds), + ExplicitBounds[idx], + if(Max > 0, Max, ExplicitBounds[length(ExplicitBounds)]) + ), + BucketCounts[idx] + ) AS v + FROM ${table} + ARRAY JOIN arrayEnumerate(BucketCounts) AS idx + WHERE ${conds.join(" AND ")} AND BucketCounts[idx] > 0 + GROUP BY bucket, group_key + ORDER BY bucket ASC + LIMIT 10000 + `; +} + +// Cumulative monotonic counters (OTel temporality=2, IsMonotonic) report a +// running total per series. To chart them we need the *increase* per render +// bucket. The naive approach — diff consecutive samples and drop each diff into +// the single bucket the later sample lands in — produces a "comb" whenever the +// render step is finer than the export interval: every bucket without a sample +// renders as zero, so a 60s-exported counter drawn at a 30s step alternates +// full/empty bars that read as two interleaved series. +// +// Instead we spread each sample's increase across the wall-clock interval it +// actually covers (previous sample -> this sample), à la Prometheus rate(), +// weighting by how much each render bucket overlaps that interval. A 60s +// increase straddling two 30s buckets contributes ~half to each, so the series +// is continuous. The spread is conservative: the weights for one interval sum +// to its full duration, so the total increase over the range is unchanged — +// only its distribution across buckets is smoothed. When the step is coarser +// than the export interval the whole interval lands in one bucket and this +// collapses back to the plain per-bucket delta. +function cumulativeMonotonicSumQuery(args: { + table: string; + step: Step; + groupExpr: string; + conds: string[]; + sinceExpr: string; +}): string { + const { table, step, groupExpr, conds, sinceExpr } = args; + const where = conds.join(" AND "); + // Bucket arithmetic is done in nanoseconds (TimeUnix is DateTime64) so that + // sub-second sample intervals aren't quantized away — truncating to whole + // seconds can collapse a short interval to zero duration and silently drop + // its increase. + const stepNs = stepSeconds(step) * 1_000_000_000; + return ` + SELECT + bucket, + group_key, + sum(v) AS v + FROM ( + SELECT + toString(toStartOfInterval(toDateTime(intDiv(sp.1, 1000000000)), INTERVAL ${step.n} ${step.unit})) AS bucket, + group_key, + sp.2 AS v + FROM ( + SELECT + group_key, + if( + previous_value IS NULL, + -- First sample of a series: no interval to spread over. Only count + -- it when the series started inside the window, dropped into the + -- bucket the sample lands in. + [ tuple(intDiv(b, ${stepNs}) * ${stepNs}, if(StartTimeUnix >= ${sinceExpr}, Value, 0)) ], + -- Spread the increase across every step-aligned bucket the interval + -- (a, b] touches, weighted by overlap nanos / interval nanos. + arrayMap( + g -> tuple(g, delta * (least(b, g + ${stepNs}) - greatest(a, g)) / dt), + arrayMap( + i -> first_bucket + i * ${stepNs}, + range(toUInt32(intDiv(intDiv(b - 1, ${stepNs}) * ${stepNs} - first_bucket, ${stepNs}) + 1)) + ) + ) + ) AS spread + FROM ( + SELECT + group_key, + StartTimeUnix, + Value, + previous_value, + if(Value >= previous_value, Value - previous_value, 0) AS delta, + toUnixTimestamp64Nano(prev_time) AS a, + toUnixTimestamp64Nano(TimeUnix) AS b, + greatest(toUnixTimestamp64Nano(TimeUnix) - toUnixTimestamp64Nano(prev_time), 1) AS dt, + intDiv(toUnixTimestamp64Nano(prev_time), ${stepNs}) * ${stepNs} AS first_bucket + FROM ( + SELECT + TimeUnix, + StartTimeUnix, + Value, + ${groupExpr} AS group_key, + lagInFrame(toNullable(Value), 1, NULL) OVER series AS previous_value, + lagInFrame(TimeUnix, 1, TimeUnix) OVER series AS prev_time + FROM ${table} + WHERE ${where} + AND AggregationTemporality = 2 + AND IsMonotonic + WINDOW series AS ( + PARTITION BY cityHash64( + ServiceName, + MetricName, + MetricUnit, + toString(ResourceAttributes), + toString(Attributes), + toString(StartTimeUnix) + ) + ORDER BY TimeUnix ASC + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW + ) + ) + ) + ) + ARRAY JOIN spread AS sp + + UNION ALL + + SELECT + toString(toStartOfInterval(TimeUnix, INTERVAL ${step.n} ${step.unit})) AS bucket, + ${groupExpr} AS group_key, + Value AS v + FROM ${table} + WHERE ${where} + AND NOT (AggregationTemporality = 2 AND IsMonotonic) + ) + GROUP BY bucket, group_key + ORDER BY bucket ASC + LIMIT 10000 + `; +} + +export async function listMetricNames( + ch: ClickHouseClient, + projectId: string, + range?: TimeRange, +): Promise { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(range); + const results: MetricName[] = []; + for (const { table, kind } of METRIC_TABLES) { + try { + const r = await ch.query({ + query: ` + SELECT MetricName AS name, MetricUnit AS unit, count() AS c + FROM ${table} + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND TimeUnix >= ${sinceExpr} + AND TimeUnix <= ${untilExpr} + GROUP BY name, unit + ORDER BY c DESC + LIMIT 200 + `, + query_params: { projectId, since: sinceSql, until: untilSql }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { name: string; unit: string; c: string | number }[]; + for (const row of rows) results.push({ name: row.name, kind, unit: row.unit }); + } catch (err) { + if (!(err instanceof Error && /UNKNOWN_TABLE|doesn't exist/i.test(err.message))) throw err; + } + } + return results; +} + +export type MetricSeriesFilter = { + range?: TimeRange; + service?: string; + resourceAttrs?: ResourceAttrFilter[]; +}; + +export async function metricSeries( + ch: ClickHouseClient, + projectId: string, + metricName: string, + filter: MetricSeriesFilter, + groupBy: string | undefined, + step: Step, + aggregation?: MetricAggregation, +): Promise { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(filter.range); + const attr = attrConds(filter.resourceAttrs); + + let groupExpr = "''"; + const groupParams: Record = {}; + if (groupBy === "service.name" || groupBy === "service") { + groupExpr = "ServiceName"; + } else if (groupBy?.startsWith("attr:")) { + // `attr:` groups by metric data-point attributes, not resource + // attributes — needed when the per-observation dimension differs from + // the producing service (e.g. `attr:tenant.org.name` for self-emitted + // gauges that fan out across orgs). + groupExpr = "Attributes[{groupKey:String}]"; + groupParams.groupKey = groupBy.slice("attr:".length); + } else if (groupBy) { + groupExpr = "ResourceAttributes[{groupKey:String}]"; + groupParams.groupKey = groupBy; + } + + const results: MetricSeriesRow[] = []; + for (const { table, kind } of METRIC_TABLES) { + const valueExpr = aggregation ? AGG_EXPR[aggregation][kind] : DEFAULT_AGG_EXPR[kind]; + if (!valueExpr) continue; + const conds: string[] = [ + "ResourceAttributes['superlog.project_id'] = {projectId:String}", + `TimeUnix >= ${sinceExpr}`, + `TimeUnix <= ${untilExpr}`, + "MetricName = {metricName:String}", + ...attr.conds, + ]; + if (filter.service) conds.push("ServiceName = {service:String}"); + const query = + kind === "histogram" && (aggregation === "p95" || aggregation === "p99") + ? histogramQuantileQuery({ + table, + step, + groupExpr, + conds, + q: aggregation === "p95" ? 0.95 : 0.99, + }) + : kind === "sum" && (!aggregation || aggregation === "sum") + ? cumulativeMonotonicSumQuery({ + table, + step, + groupExpr, + conds, + sinceExpr, + }) + : ` + SELECT + toString(toStartOfInterval(TimeUnix, INTERVAL ${step.n} ${step.unit})) AS bucket, + ${groupExpr} AS group_key, + ${valueExpr} AS v + FROM ${table} + WHERE ${conds.join(" AND ")} + GROUP BY bucket, group_key + ORDER BY bucket ASC + LIMIT 10000 + `; + try { + const r = await ch.query({ + query, + query_params: { + projectId, + since: sinceSql, + until: untilSql, + metricName, + service: filter.service ?? "", + ...attr.params, + ...groupParams, + }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { + bucket: string; + group_key: string; + v: string | number | null; + }[]; + for (const row of rows) { + if (row.v === null) continue; + const value = Number(row.v); + if (!Number.isFinite(value)) continue; + results.push({ bucket: row.bucket, group: row.group_key, value }); + } + } catch (err) { + if ( + !( + err instanceof Error && + /UNKNOWN_TABLE|UNKNOWN_IDENTIFIER|doesn't exist/i.test(err.message) + ) + ) + throw err; + } + } + results.sort((a, b) => a.bucket.localeCompare(b.bucket)); + return results; +} + +export type SeriesSource = "logs" | "traces"; + +export type SeriesFilter = { + range?: TimeRange; + service?: string; + resourceAttrs?: ResourceAttrFilter[]; + search?: string; + severity?: string; + spanName?: string; + statusCode?: string; + minDurationMs?: number; +}; + +export type StepUnit = "SECOND" | "MINUTE" | "HOUR" | "DAY"; +export type Step = { n: number; unit: StepUnit }; + +const STEP_LADDER: Step[] = [ + { n: 1, unit: "SECOND" }, + { n: 5, unit: "SECOND" }, + { n: 15, unit: "SECOND" }, + { n: 30, unit: "SECOND" }, + { n: 1, unit: "MINUTE" }, + { n: 5, unit: "MINUTE" }, + { n: 15, unit: "MINUTE" }, + { n: 30, unit: "MINUTE" }, + { n: 1, unit: "HOUR" }, + { n: 3, unit: "HOUR" }, + { n: 6, unit: "HOUR" }, + { n: 12, unit: "HOUR" }, + { n: 1, unit: "DAY" }, +]; + +function stepSeconds(step: Step): number { + const mult = + step.unit === "SECOND" ? 1 : step.unit === "MINUTE" ? 60 : step.unit === "HOUR" ? 3600 : 86400; + return step.n * mult; +} + +export function pickStep(rangeSeconds: number, targetBuckets = 120): Step { + const ideal = Math.max(1, rangeSeconds / targetBuckets); + for (const s of STEP_LADDER) { + if (stepSeconds(s) >= ideal) return s; + } + return STEP_LADDER[STEP_LADDER.length - 1] ?? { n: 1, unit: "DAY" }; +} + +export async function countSeries( + ch: ClickHouseClient, + projectId: string, + source: SeriesSource, + filter: SeriesFilter, + groupBy: string | undefined, + step: Step, +): Promise<{ bucket: string; group: string; count: number }[]> { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(filter.range); + const split = splitAttrs(filter.resourceAttrs); + const attr = attrConds(split.resource); + const eventAttr = + source === "logs" + ? attrConds(split.log, "LogAttributes", "event_attr") + : attrConds(split.span, "SpanAttributes", "event_attr"); + const field = fieldConds(split.field, source === "logs" ? "logs" : "traces"); + const table = source === "logs" ? "otel_logs" : "otel_traces"; + const conds: string[] = [ + "ResourceAttributes['superlog.project_id'] = {projectId:String}", + `Timestamp >= ${sinceExpr}`, + `Timestamp <= ${untilExpr}`, + ...attr.conds, + ...eventAttr.conds, + ...field.conds, + ]; + if (filter.service) conds.push("ServiceName = {service:String}"); + if (source === "logs") { + if (filter.severity) conds.push("upper(SeverityText) = upper({severity:String})"); + if (filter.search) conds.push("positionCaseInsensitive(Body, {search:String}) > 0"); + } else { + if (filter.spanName) conds.push("SpanName = {spanName:String}"); + if (filter.statusCode) conds.push("StatusCode = {statusCode:String}"); + if (typeof filter.minDurationMs === "number") { + conds.push("Duration >= {minDurationNs:UInt64}"); + } + } + + const group = groupExprForAttribute(groupBy, source); + + const query = ` + SELECT + toString(toStartOfInterval(Timestamp, INTERVAL ${step.n} ${step.unit})) AS bucket, + ${group.expr} AS group_key, + count() AS c + FROM ${table} + WHERE ${conds.join(" AND ")} + GROUP BY bucket, group_key + ORDER BY bucket ASC + LIMIT 10000 + `; + + const r = await ch.query({ + query, + query_params: { + projectId, + since: sinceSql, + until: untilSql, + service: filter.service ?? "", + severity: filter.severity ?? "", + search: filter.search ?? "", + spanName: filter.spanName ?? "", + statusCode: filter.statusCode ?? "", + minDurationNs: Math.round((filter.minDurationMs ?? 0) * 1_000_000), + ...attr.params, + ...eventAttr.params, + ...field.params, + ...group.params, + }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { bucket: string; group_key: string; c: string | number }[]; + return rows.map((row) => ({ bucket: row.bucket, group: row.group_key, count: Number(row.c) })); +} + +// ----------------------------------------------------------------------------- +// Issue filter picker: keys, values, and recent-event preview drawn from +// ERROR events only. These mirror exactly what the worker considers an "error" +// in tickSpans / tickLogs (apps/worker/src/index.ts) so the picker shows the +// same population the filter actually applies to. +// ----------------------------------------------------------------------------- + +// Suggestions are drawn from ALL events in the window (not just errors) so the +// user can pre-configure a filter like env:prod before any errors have +// occurred. The filter itself only ever takes effect on errors — see the +// preview query below, which IS errors-only so the user can sanity-check what +// will actually be dropped. +export async function listIssueFilterAttributeKeys( + ch: ClickHouseClient, + projectId: string, + range?: TimeRange, +): Promise<{ key: string; count: number }[]> { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(range); + const query = ` + SELECT k, sum(c) AS c FROM ( + SELECT arrayJoin(mapKeys(ResourceAttributes)) AS k, count() AS c + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + GROUP BY k + UNION ALL + SELECT arrayJoin(mapKeys(LogAttributes)) AS k, count() AS c + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + GROUP BY k + UNION ALL + SELECT arrayJoin(mapKeys(ResourceAttributes)) AS k, count() AS c + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + GROUP BY k + UNION ALL + SELECT arrayJoin(mapKeys(SpanAttributes)) AS k, count() AS c + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + GROUP BY k + ) + WHERE k != 'superlog.project_id' AND k != '' + GROUP BY k + ORDER BY c DESC + LIMIT 200 + `; + const r = await ch.query({ + query, + query_params: { projectId, since: sinceSql, until: untilSql }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { k: string; c: string | number }[]; + return rows.map((row) => ({ key: row.k, count: Number(row.c) })); +} + +export async function listIssueFilterAttributeValues( + ch: ClickHouseClient, + projectId: string, + key: string, + range?: TimeRange, + limit = 200, +): Promise<{ value: string; count: number }[]> { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(range); + const query = ` + SELECT v, sum(c) AS c FROM ( + SELECT ResourceAttributes[{key:String}] AS v, count() AS c + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(ResourceAttributes, {key:String}) + GROUP BY v + UNION ALL + SELECT LogAttributes[{key:String}] AS v, count() AS c + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(LogAttributes, {key:String}) + GROUP BY v + UNION ALL + SELECT ResourceAttributes[{key:String}] AS v, count() AS c + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(ResourceAttributes, {key:String}) + GROUP BY v + UNION ALL + SELECT SpanAttributes[{key:String}] AS v, count() AS c + FROM otel_traces + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND mapContains(SpanAttributes, {key:String}) + GROUP BY v + ) + WHERE v != '' + GROUP BY v + ORDER BY c DESC + LIMIT {limit:UInt32} + `; + const r = await ch.query({ + query, + query_params: { projectId, key, since: sinceSql, until: untilSql, limit }, + format: "JSONEachRow", + }); + const rows = (await r.json()) as { v: string; c: string | number }[]; + return rows.map((row) => ({ value: row.v, count: Number(row.c) })); +} + +export type IssueFilterClause = { key: string; value: string }; + +export type IssueFilterConfig = { + includeLogs: IssueFilterClause[]; + includeSpans: IssueFilterClause[]; + excludeLogs: IssueFilterClause[]; + excludeSpans: IssueFilterClause[]; +}; + +export type IssueFilterPreviewEvent = { + kind: "log" | "span"; + ts: string; + service: string; + message: string; + exception_type: string; + attrs: Record; +}; + +// Returns the most recent ERROR events that survive the filter: +// - dropped if ANY exclude-clause for its kind matches +// - if include-clause list for its kind is non-empty, must match at least one +// Empty config = preview unfiltered errors. +export async function previewIssueFilterMatches( + ch: ClickHouseClient, + projectId: string, + config: IssueFilterConfig, + range?: TimeRange, + limit = 10, +): Promise { + const { sinceSql, untilSql, sinceExpr, untilExpr } = resolveRange(range); + const params: Record = { + projectId, + since: sinceSql, + until: untilSql, + limit, + }; + // For each clause: case-insensitive key match across two attribute maps. + // matchInMap returns true if any (key, value) entry in the map satisfies + // lower(key) = clause.key AND value = clause.value. + let nextParamIdx = 0; + function registerClause(clause: IssueFilterClause): { k: string; v: string } { + const kName = `clause_k_${nextParamIdx}`; + const vName = `clause_v_${nextParamIdx}`; + params[kName] = clause.key.toLowerCase(); + params[vName] = clause.value; + nextParamIdx += 1; + return { k: kName, v: vName }; + } + function matchInMap(col: string, p: { k: string; v: string }): string { + return `arrayExists( + i -> lower(mapKeys(${col})[i]) = {${p.k}:String} AND mapValues(${col})[i] = {${p.v}:String}, + arrayEnumerate(mapKeys(${col})) + )`; + } + function clauseSql( + clauses: IssueFilterClause[], + resourceCol: "ResourceAttributes", + attrCol: "LogAttributes" | "SpanAttributes", + ): string[] { + return clauses.map((clause) => { + const p = registerClause(clause); + return `(${matchInMap(resourceCol, p)} OR ${matchInMap(attrCol, p)})`; + }); + } + const logIncludes = clauseSql(config.includeLogs, "ResourceAttributes", "LogAttributes"); + const logExcludes = clauseSql(config.excludeLogs, "ResourceAttributes", "LogAttributes"); + const spanIncludes = clauseSql(config.includeSpans, "ResourceAttributes", "SpanAttributes"); + const spanExcludes = clauseSql(config.excludeSpans, "ResourceAttributes", "SpanAttributes"); + + // Includes are OR-within-bucket; excludes are NOT (any-match). + const logFilterParts: string[] = []; + if (logIncludes.length) logFilterParts.push(`(${logIncludes.join(" OR ")})`); + if (logExcludes.length) logFilterParts.push(`NOT (${logExcludes.join(" OR ")})`); + const spanFilterParts: string[] = []; + if (spanIncludes.length) spanFilterParts.push(`(${spanIncludes.join(" OR ")})`); + if (spanExcludes.length) spanFilterParts.push(`NOT (${spanExcludes.join(" OR ")})`); + const logFilter = logFilterParts.length ? `AND ${logFilterParts.join(" AND ")}` : ""; + const spanFilter = spanFilterParts.length ? `AND ${spanFilterParts.join(" AND ")}` : ""; + + const query = ` + SELECT * FROM ( + SELECT + 'log' AS kind, + toString(Timestamp) AS ts, + ServiceName AS service, + substring(Body, 1, 400) AS message, + coalesce(LogAttributes['exception.type'], '') AS exception_type, + mapConcat(ResourceAttributes, LogAttributes) AS attrs + FROM otel_logs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND SeverityNumber >= 17 + ${logFilter} + ORDER BY Timestamp DESC + LIMIT {limit:UInt32} + UNION ALL + SELECT + 'span' AS kind, + toString(Timestamp) AS ts, + ServiceName AS service, + substring(coalesce(event_attrs['exception.message'], SpanName), 1, 400) AS message, + coalesce(event_attrs['exception.type'], '') AS exception_type, + mapConcat(ResourceAttributes, SpanAttributes) AS attrs + FROM otel_traces + ARRAY JOIN Events.Name AS event_name, Events.Attributes AS event_attrs + WHERE ResourceAttributes['superlog.project_id'] = {projectId:String} + AND Timestamp >= ${sinceExpr} + AND Timestamp <= ${untilExpr} + AND event_name = 'exception' + ${spanFilter} + ORDER BY Timestamp DESC + LIMIT {limit:UInt32} + ) + ORDER BY ts DESC + LIMIT {limit:UInt32} + `; + const r = await ch.query({ query, query_params: params, format: "JSONEachRow" }); + const rows = (await r.json()) as Array<{ + kind: "log" | "span"; + ts: string; + service: string; + message: string; + exception_type: string; + attrs: Record; + }>; + return rows; +} diff --git a/superlog/apps/api/src/mcp/config.ts b/superlog/apps/api/src/mcp/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b71193020fdd858529fae930cd94029ca65a540 --- /dev/null +++ b/superlog/apps/api/src/mcp/config.ts @@ -0,0 +1,15 @@ +export type McpConfig = { + apiBaseUrl: string; + webOrigin: string; + resource: string; +}; + +export function loadMcpConfig(): McpConfig { + const apiBaseUrl = (process.env.API_BASE_URL ?? "http://localhost:4100").replace(/\/$/, ""); + const webOrigin = (process.env.WEB_ORIGIN ?? "http://localhost:5173").replace(/\/$/, ""); + return { + apiBaseUrl, + webOrigin, + resource: `${apiBaseUrl}/mcp`, + }; +} diff --git a/superlog/apps/api/src/mcp/dashboards.ts b/superlog/apps/api/src/mcp/dashboards.ts new file mode 100644 index 0000000000000000000000000000000000000000..cbda09729b4e4a32dfb2c36ed6ea1dca91427303 --- /dev/null +++ b/superlog/apps/api/src/mcp/dashboards.ts @@ -0,0 +1,185 @@ +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { HTTPException } from "hono/http-exception"; +import { z } from "zod"; +import { + addDashboardWidget, + createDashboard, + dashboardWidgetConfigSchema, + dashboardWidgetLayoutSchema, + dashboardWidgetTypeSchema, + deleteDashboard, + deleteDashboardWidget, + getDashboardWithWidgets, + listDashboardsForProject, + updateDashboard, + updateDashboardWidget, +} from "../dashboards-service.js"; +import { assertProjectAccess } from "./projects.js"; + +const projectIdSchema = z + .string() + .uuid() + .optional() + .describe( + "Project to operate on. Defaults to the session's active project. Use list_projects to discover ids.", + ); + +const text = (v: unknown) => ({ content: [{ type: "text" as const, text: JSON.stringify(v) }] }); + +export function registerDashboardTools( + server: McpServer, + session: { userId: string; activeProjectId: string }, +): void { + const resolve = async (explicit: string | undefined): Promise => { + const id = explicit ?? session.activeProjectId; + await assertProjectAccess(session.userId, id); + return id; + }; + + server.registerTool( + "list_dashboards", + { + title: "List dashboards", + description: "List dashboards in the active project (or project_id).", + inputSchema: { project_id: projectIdSchema }, + }, + async (input) => text(await listDashboardsForProject(await resolve(input.project_id))), + ); + + server.registerTool( + "get_dashboard", + { + title: "Get dashboard", + description: "Fetch a dashboard with its widgets.", + inputSchema: { project_id: projectIdSchema, id: z.string().uuid() }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const dashboard = await getDashboardWithWidgets(projectId, input.id); + if (!dashboard) throw new HTTPException(404, { message: "dashboard not found" }); + return text(dashboard); + }, + ); + + server.registerTool( + "create_dashboard", + { + title: "Create dashboard", + description: "Create an empty dashboard. Slug is generated from the name.", + inputSchema: { + project_id: projectIdSchema, + name: z.string().min(1).max(120), + }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + return text(await createDashboard(projectId, session.userId, { name: input.name })); + }, + ); + + server.registerTool( + "update_dashboard", + { + title: "Update dashboard", + description: "Rename a dashboard.", + inputSchema: { + project_id: projectIdSchema, + id: z.string().uuid(), + name: z.string().min(1).max(120), + }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const updated = await updateDashboard(projectId, input.id, { name: input.name }); + if (!updated) throw new HTTPException(404, { message: "dashboard not found" }); + return text(updated); + }, + ); + + server.registerTool( + "delete_dashboard", + { + title: "Delete dashboard", + description: "Delete a dashboard and all its widgets.", + inputSchema: { project_id: projectIdSchema, id: z.string().uuid() }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + await deleteDashboard(projectId, input.id); + return text({ ok: true }); + }, + ); + + server.registerTool( + "add_dashboard_widget", + { + title: "Add dashboard widget", + description: + "Append a widget to a dashboard. Widget types: timeseries_count, timeseries_metric, trace_table, log_table, markdown.", + inputSchema: { + project_id: projectIdSchema, + dashboard_id: z.string().uuid(), + type: dashboardWidgetTypeSchema, + title: z.string().min(1).max(200), + config: dashboardWidgetConfigSchema, + layout: dashboardWidgetLayoutSchema, + }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const widget = await addDashboardWidget(projectId, input.dashboard_id, { + type: input.type, + title: input.title, + config: input.config, + layout: input.layout, + }); + if (!widget) throw new HTTPException(404, { message: "dashboard not found" }); + return text(widget); + }, + ); + + server.registerTool( + "update_dashboard_widget", + { + title: "Update dashboard widget", + description: "Patch a widget's title, config, or layout.", + inputSchema: { + project_id: projectIdSchema, + dashboard_id: z.string().uuid(), + widget_id: z.string().uuid(), + title: z.string().min(1).max(200).optional(), + config: dashboardWidgetConfigSchema.optional(), + layout: dashboardWidgetLayoutSchema.optional(), + }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const widget = await updateDashboardWidget(projectId, input.dashboard_id, input.widget_id, { + title: input.title, + config: input.config, + layout: input.layout, + }); + if (!widget) throw new HTTPException(404, { message: "widget not found" }); + return text(widget); + }, + ); + + server.registerTool( + "delete_dashboard_widget", + { + title: "Delete dashboard widget", + description: "Remove a widget from a dashboard.", + inputSchema: { + project_id: projectIdSchema, + dashboard_id: z.string().uuid(), + widget_id: z.string().uuid(), + }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const ok = await deleteDashboardWidget(projectId, input.dashboard_id, input.widget_id); + if (!ok) throw new HTTPException(404, { message: "dashboard not found" }); + return text({ ok: true }); + }, + ); +} diff --git a/superlog/apps/api/src/mcp/incidents.ts b/superlog/apps/api/src/mcp/incidents.ts new file mode 100644 index 0000000000000000000000000000000000000000..7f62e5a540f3a345fe91a8ca7ad3a5280cb9f9ef --- /dev/null +++ b/superlog/apps/api/src/mcp/incidents.ts @@ -0,0 +1,121 @@ +import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { db, schema } from "@superlog/db"; +import { eq } from "drizzle-orm"; +import { HTTPException } from "hono/http-exception"; +import { z } from "zod"; +import { getIncidentDetail } from "../incidents/detail.js"; +import { searchIncidents } from "../incidents/search.js"; +import { assertProjectAccess } from "./projects.js"; + +const projectIdSchema = z + .string() + .uuid() + .optional() + .describe( + "Project to search. Defaults to the session's active project. Use list_projects to discover ids.", + ); + +const text = (v: unknown) => ({ content: [{ type: "text" as const, text: JSON.stringify(v) }] }); + +export function registerIncidentTools( + server: McpServer, + session: { userId: string; activeProjectId: string; allowedOrgId?: string }, +): void { + // For org-scoped MCP tokens, reject any project outside the token's org — + // even one the user is individually a member of. Mirrors the boundary every + // telemetry tool enforces via server.ts's resolveProject. Both an explicit + // project_id (search_incidents) and an incident's resolved project + // (get_incident, which takes a bare global id) must pass this. + const assertTokenScope = async (projectId: string): Promise => { + if (!session.allowedOrgId) return; + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project || project.orgId !== session.allowedOrgId) { + throw new HTTPException(403, { message: "project is outside this MCP token's org scope" }); + } + }; + + const resolve = async (explicit: string | undefined): Promise => { + const id = explicit ?? session.activeProjectId; + await assertTokenScope(id); + await assertProjectAccess(session.userId, id); + return id; + }; + + server.registerTool( + "get_incident", + { + title: "Get incident", + description: + "Fetch one incident by its id — the uuid in a superlog.sh/incidents/ link — and everything needed to explain it. " + + "No project_id is required; the project is resolved from the incident. Returns: the incident summary with the agent's findings (root_cause_text, agent_summary, estimated_impact_text) and its project_id; every linked issue with a stored telemetry `sample` (trace_id, span_id, stacktrace, span/log/resource attributes); and a pointer to the latest investigation run. " + + "To pull live telemetry, take a sample's trace_id and call query_traces, or filter query_logs/query_traces by the issue's service + exception type — passing the returned project_id.", + inputSchema: { + incident_id: z.string().uuid().describe("Incident id (the uuid from the incident URL)."), + }, + }, + async (input) => { + const detail = await getIncidentDetail(input.incident_id); + if (!detail) throw new HTTPException(404, { message: "incident not found" }); + await assertProjectAccess(session.userId, detail.incident.projectId); + await assertTokenScope(detail.incident.projectId); + return text(detail); + }, + ); + + server.registerTool( + "search_incidents", + { + title: "Search incidents", + description: + "Search incidents in the active project (or project_id). Incidents are auto-grouped error/anomaly investigations; each row carries the agent's findings (agent_summary, root_cause_text) when available. " + + "Filter by status, severity, service, a free-text substring over title/codename, and a last_seen time window. Results are newest-activity-first. " + + "By default agent-classified noise (status='autoresolved_noise') is hidden; pass status='all' to include it or status='autoresolved_noise' to inspect just the noise pile. " + + "Use get_incident to drill into a single incident's linked issues and telemetry.", + inputSchema: { + project_id: projectIdSchema, + status: z + .enum(["open", "resolved", "autoresolved_noise", "merged", "all"]) + .optional() + .describe( + "Incident status filter. Omit to see everything except auto-classified noise; 'all' includes noise.", + ), + severity: z + .enum(["SEV-1", "SEV-2", "SEV-3"]) + .optional() + .describe("Filter by assigned severity."), + service: z + .string() + .optional() + .describe("Exact match on the incident's primary service.name."), + query: z + .string() + .optional() + .describe("Case-insensitive substring matched against incident title and codename."), + since: z + .string() + .optional() + .describe("ISO-8601 timestamp; only incidents with last_seen >= since are returned."), + until: z + .string() + .optional() + .describe("ISO-8601 timestamp; only incidents with last_seen <= until are returned."), + limit: z.number().int().positive().max(200).default(50), + }, + }, + async (input) => { + const projectId = await resolve(input.project_id); + const incidents = await searchIncidents(projectId, { + status: input.status, + severity: input.severity, + service: input.service, + query: input.query, + since: input.since, + until: input.until, + limit: input.limit, + }); + return text({ count: incidents.length, incidents }); + }, + ); +} diff --git a/superlog/apps/api/src/mcp/index.ts b/superlog/apps/api/src/mcp/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..86bf83f685470cfe0d15fdd0e7756ac6982a00ae --- /dev/null +++ b/superlog/apps/api/src/mcp/index.ts @@ -0,0 +1,140 @@ +import type { ClickHouseClient } from "@clickhouse/client"; +import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js"; +import { db, hashToken, schema } from "@superlog/db"; +import { eq } from "drizzle-orm"; +import type { Hono } from "hono"; +import { logger } from "../logger.js"; +import { loadMcpConfig, type McpConfig } from "./config.js"; +import { mountOauthDecision, mountOauthEndpoints, mountOauthMetadata } from "./oauth.js"; +import { createMcpServerForSession } from "./server.js"; + +const log = logger.child({ scope: "mcp-bearer" }); + +type TokenContext = { + tokenId: string; + projectId: string; + userId: string; + clientId: string; + scope: string | null; + resource: string; + allowedOrgId?: string; + telemetryOnly?: boolean; +}; + +export function mountMcpPublic>(app: T, ch: ClickHouseClient): void { + const cfg = loadMcpConfig(); + + mountOauthMetadata(app, cfg); + mountOauthEndpoints(app, cfg); + + app.all("/mcp", async (c) => { + const header = c.req.header("authorization"); + if (!header?.toLowerCase().startsWith("bearer ")) { + return unauthorized(cfg, "no bearer token", { method: c.req.method }); + } + const token = header.slice(7).trim(); + const resolved = await resolveToken(token, cfg); + if ("reason" in resolved) { + return unauthorized(cfg, resolved.reason, { + method: c.req.method, + tokenPrefix: token.slice(0, 20), + }); + } + const tokenCtx = resolved; + + const transport = new WebStandardStreamableHTTPServerTransport({ + sessionIdGenerator: undefined, + }); + const server = createMcpServerForSession({ + ch, + userId: tokenCtx.userId, + tokenId: tokenCtx.tokenId, + activeProjectId: tokenCtx.projectId, + allowedOrgId: tokenCtx.allowedOrgId, + telemetryOnly: tokenCtx.telemetryOnly, + }); + // handleRequest returns immediately with a Response wrapping a ReadableStream + // (Content-Type: text/event-stream). The server writes JSON-RPC responses + // into that stream asynchronously, so we cannot close the server here — + // doing so would tear down the stream before the client reads it. Tie the + // server lifetime to the transport instead. + transport.onclose = () => { + void server.close().catch(() => {}); + }; + await server.connect(transport); + return await transport.handleRequest(c.req.raw, { + authInfo: { + token, + clientId: tokenCtx.clientId, + scopes: tokenCtx.scope ? tokenCtx.scope.split(" ") : [], + resource: new URL(tokenCtx.resource), + }, + }); + }); +} + +export function mountMcpAuthed( + app: Hono<{ Variables: { userId: string; orgId: string | null } }>, +): void { + const cfg = loadMcpConfig(); + mountOauthDecision(app, cfg); +} + +async function resolveToken( + token: string, + cfg: McpConfig, +): Promise { + const row = await db.query.mcpOauthTokens.findFirst({ + where: eq(schema.mcpOauthTokens.accessHash, hashToken(token)), + }); + if (!row) return { reason: "token not found" }; + if (row.revokedAt) return { reason: "token revoked" }; + if (row.accessExpiresAt.getTime() < Date.now()) return { reason: "token expired" }; + // Compare the stored resource leniently: normalize trailing slashes and + // accept the API origin as an alias for the MCP endpoint. Older tokens + // issued before canonicalization might have non-canonical values stored. + const stored = row.resource.replace(/\/+$/, ""); + if (stored !== cfg.resource && stored !== cfg.apiBaseUrl) { + return { reason: `resource mismatch (stored=${row.resource})` }; + } + return { + tokenId: row.id, + projectId: row.projectId, + userId: row.userId, + clientId: row.clientId, + scope: row.scope, + resource: row.resource, + allowedOrgId: parseOrgScope(row.scope), + telemetryOnly: hasScopePart(row.scope, "superlog:telemetry"), + }; +} + +function parseOrgScope(scope: string | null): string | undefined { + const prefix = "superlog:org:"; + return scope + ?.split(/\s+/) + .find((part) => part.startsWith(prefix)) + ?.slice(prefix.length); +} + +function hasScopePart(scope: string | null, expected: string): boolean { + return scope?.split(/\s+/).includes(expected) ?? false; +} + +function unauthorized( + cfg: McpConfig, + description: string, + extras: Record = {}, +): Response { + log.warn({ ...extras, description }, "mcp 401"); + const wwwAuth = [ + `Bearer realm="mcp"`, + `resource_metadata="${cfg.apiBaseUrl}/.well-known/oauth-protected-resource"`, + `error="invalid_token"`, + `error_description="${description.replace(/"/g, "'")}"`, + ].join(", "); + return new Response(JSON.stringify({ error: "invalid_token", error_description: description }), { + status: 401, + headers: { "content-type": "application/json", "www-authenticate": wwwAuth }, + }); +} diff --git a/superlog/apps/api/src/mcp/oauth.ts b/superlog/apps/api/src/mcp/oauth.ts new file mode 100644 index 0000000000000000000000000000000000000000..3782ee91b02d40436ccf307aa1c3607548ed8013 --- /dev/null +++ b/superlog/apps/api/src/mcp/oauth.ts @@ -0,0 +1,488 @@ +import { createHash, randomBytes } from "node:crypto"; +import { + db, + generateMcpAccessToken, + generateMcpRefreshToken, + hashToken, + schema, + syncLoopsContactForUserProject, +} from "@superlog/db"; +import { and, eq } from "drizzle-orm"; +import type { Hono } from "hono"; +import type { Context } from "hono"; +import { HTTPException } from "hono/http-exception"; +import { logger } from "../logger.js"; +import { resolveActiveOrgContext } from "../org-context.js"; +import type { McpConfig } from "./config.js"; + +const log = logger.child({ scope: "mcp-oauth" }); + +const ACCESS_TTL_SECONDS = 60 * 60; +const REFRESH_TTL_SECONDS = 60 * 60 * 24 * 30; +const CODE_TTL_SECONDS = 60 * 5; + +type AuthorizeParams = { + clientId: string; + redirectUri: string; + state: string | null; + codeChallenge: string; + codeChallengeMethod: string; + resource: string; + receivedResources: string[]; + scope: string | null; +}; + +// Per RFC 8707 the resource indicator is compared by simple-string-comparison +// after canonicalization. We canonicalize by stripping trailing slashes and +// accept the API origin as an alias for the MCP endpoint, since several MCP +// clients in the wild derive the resource from the server's host rather than +// the MCP endpoint path. The stored value on issued tokens is always the +// canonical cfg.resource regardless of which alias the client sent. +// +// We also tolerate the resource indicator being entirely absent: some clients +// (e.g. Codex CLI as of 2026-05) don't propagate it from the protected-resource +// metadata into the authorize/token requests. In that case we fall back to +// cfg.resource — issued tokens are still bound server-side to that single +// resource, so the practical attack surface from confused-deputy redirection +// is unchanged. A *wrong* resource still hard-fails. +function normalizeResource(value: string): string { + return value.trim().replace(/\/+$/, ""); +} + +function resourceMatches(value: string, cfg: McpConfig): boolean { + const n = normalizeResource(value); + if (!n) return false; + return n === cfg.resource || n === cfg.apiBaseUrl; +} + +function pickMatchingResource(values: string[], cfg: McpConfig): string | null { + if (values.length === 0) return cfg.resource; + for (const v of values) if (resourceMatches(v, cfg)) return cfg.resource; + return null; +} + +export function mountOauthMetadata(app: Hono, cfg: McpConfig) { + app.get("/.well-known/oauth-protected-resource", (c) => + c.json({ + resource: cfg.resource, + authorization_servers: [cfg.apiBaseUrl], + bearer_methods_supported: ["header"], + scopes_supported: ["mcp:read"], + }), + ); + + app.get("/.well-known/oauth-authorization-server", (c) => + c.json({ + issuer: cfg.apiBaseUrl, + authorization_endpoint: `${cfg.apiBaseUrl}/oauth/authorize`, + token_endpoint: `${cfg.apiBaseUrl}/oauth/token`, + registration_endpoint: `${cfg.apiBaseUrl}/oauth/register`, + response_types_supported: ["code"], + grant_types_supported: ["authorization_code", "refresh_token"], + code_challenge_methods_supported: ["S256"], + token_endpoint_auth_methods_supported: ["none"], + scopes_supported: ["mcp:read"], + }), + ); +} + +export function mountOauthEndpoints(app: Hono, cfg: McpConfig) { + app.post("/oauth/register", async (c) => { + const body = (await c.req.json().catch(() => null)) as { + client_name?: string; + redirect_uris?: unknown; + token_endpoint_auth_method?: string; + } | null; + if (!body) return oauthError(c, 400, "invalid_client_metadata", "invalid JSON body"); + + const redirectUris = Array.isArray(body.redirect_uris) + ? body.redirect_uris.filter((u): u is string => typeof u === "string") + : []; + if (redirectUris.length === 0) { + return oauthError(c, 400, "invalid_redirect_uri", "redirect_uris is required"); + } + for (const uri of redirectUris) { + if (!isValidRedirectUri(uri)) { + return oauthError(c, 400, "invalid_redirect_uri", `invalid redirect_uri: ${uri}`); + } + } + + const tokenAuthMethod = body.token_endpoint_auth_method ?? "none"; + if (tokenAuthMethod !== "none") { + return oauthError( + c, + 400, + "invalid_client_metadata", + "only token_endpoint_auth_method=none is supported", + ); + } + + const name = (body.client_name ?? "MCP client").slice(0, 200); + const [client] = await db + .insert(schema.mcpOauthClients) + .values({ name, redirectUris, tokenEndpointAuthMethod: "none" }) + .returning(); + if (!client) throw new HTTPException(500, { message: "failed to register client" }); + + return c.json({ + client_id: client.id, + client_name: client.name, + redirect_uris: client.redirectUris, + token_endpoint_auth_method: "none", + grant_types: ["authorization_code", "refresh_token"], + response_types: ["code"], + client_id_issued_at: Math.floor(client.createdAt.getTime() / 1000), + }); + }); + + app.get("/oauth/authorize", async (c) => { + const params = readAuthorizeParams(c); + const err = await validateAuthorizeParams(params, cfg); + if (err) return oauthError(c, 400, err.code, err.description); + + const target = new URL(`${cfg.webOrigin}/oauth/consent`); + target.searchParams.set("client_id", params.clientId); + target.searchParams.set("redirect_uri", params.redirectUri); + target.searchParams.set("code_challenge", params.codeChallenge); + target.searchParams.set("code_challenge_method", params.codeChallengeMethod); + target.searchParams.set("resource", params.resource); + if (params.state) target.searchParams.set("state", params.state); + if (params.scope) target.searchParams.set("scope", params.scope); + return c.redirect(target.toString(), 302); + }); + + app.post("/oauth/token", async (c) => { + const form = await c.req.parseBody(); + const grantType = stringField(form, "grant_type"); + if (grantType === "authorization_code") { + return handleCodeGrant(c, cfg, form); + } + if (grantType === "refresh_token") { + return handleRefreshGrant(c, cfg, form); + } + return oauthError(c, 400, "unsupported_grant_type", `unsupported grant_type: ${grantType}`); + }); +} + +export function mountOauthDecision( + app: Hono<{ Variables: { userId: string; orgId: string | null } }>, + cfg: McpConfig, +) { + app.get("/api/mcp/oauth/client/:clientId", async (c) => { + const clientId = c.req.param("clientId"); + const client = await db.query.mcpOauthClients.findFirst({ + where: eq(schema.mcpOauthClients.id, clientId), + }); + if (!client) throw new HTTPException(404, { message: "client not found" }); + return c.json({ id: client.id, name: client.name }); + }); + + app.post("/api/mcp/oauth/decision", async (c) => { + const body = (await c.req.json().catch(() => null)) as { + client_id?: string; + redirect_uri?: string; + state?: string | null; + code_challenge?: string; + code_challenge_method?: string; + resource?: string; + scope?: string | null; + project_id?: string; + decision?: "allow" | "deny"; + } | null; + if (!body) throw new HTTPException(400, { message: "invalid json" }); + + const receivedResource = body.resource ?? ""; + const params: AuthorizeParams = { + clientId: body.client_id ?? "", + redirectUri: body.redirect_uri ?? "", + state: body.state ?? null, + codeChallenge: body.code_challenge ?? "", + codeChallengeMethod: body.code_challenge_method ?? "", + resource: receivedResource, + receivedResources: receivedResource ? [receivedResource] : [], + scope: body.scope ?? null, + }; + const paramsErr = await validateAuthorizeParams(params, cfg); + if (paramsErr) throw new HTTPException(400, { message: paramsErr.description }); + + if (body.decision === "deny") { + const redir = buildErrorRedirect(params, "access_denied", "user denied consent"); + return c.json({ redirect_uri: redir }); + } + if (!body.project_id) throw new HTTPException(400, { message: "project_id is required" }); + + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, body.project_id), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + + const ctx = await resolveActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }).catch(() => null); + if (!ctx || ctx.org.id !== project.orgId) { + throw new HTTPException(403, { message: "no access to project" }); + } + const user = ctx.user; + + const code = randomBytes(32).toString("base64url"); + await db.insert(schema.mcpOauthCodes).values({ + code, + clientId: params.clientId, + userId: user.id, + projectId: project.id, + redirectUri: params.redirectUri, + codeChallenge: params.codeChallenge, + codeChallengeMethod: params.codeChallengeMethod, + resource: params.resource, + scope: params.scope, + expiresAt: new Date(Date.now() + CODE_TTL_SECONDS * 1000), + }); + + const url = new URL(params.redirectUri); + url.searchParams.set("code", code); + if (params.state) url.searchParams.set("state", params.state); + return c.json({ redirect_uri: url.toString() }); + }); +} + +async function handleCodeGrant(c: Context, cfg: McpConfig, form: Record) { + const code = stringField(form, "code"); + const redirectUri = stringField(form, "redirect_uri"); + const codeVerifier = stringField(form, "code_verifier"); + const clientId = stringField(form, "client_id"); + const resource = stringField(form, "resource"); + + if (!code || !redirectUri || !codeVerifier || !clientId) { + return oauthError(c, 400, "invalid_request", "missing required parameters"); + } + if (resource && !resourceMatches(resource, cfg)) { + return oauthError( + c, + 400, + "invalid_target", + `resource does not match MCP server; received: ${resource}`, + ); + } + + const row = await db.query.mcpOauthCodes.findFirst({ + where: eq(schema.mcpOauthCodes.code, code), + }); + if (!row) return oauthError(c, 400, "invalid_grant", "code not found"); + if (row.usedAt) return oauthError(c, 400, "invalid_grant", "code already used"); + if (row.expiresAt.getTime() < Date.now()) { + return oauthError(c, 400, "invalid_grant", "code expired"); + } + if (row.clientId !== clientId) return oauthError(c, 400, "invalid_grant", "client_id mismatch"); + if (row.redirectUri !== redirectUri) { + return oauthError(c, 400, "invalid_grant", "redirect_uri mismatch"); + } + if (!verifyPkce(codeVerifier, row.codeChallenge, row.codeChallengeMethod)) { + return oauthError(c, 400, "invalid_grant", "PKCE verification failed"); + } + + await db + .update(schema.mcpOauthCodes) + .set({ usedAt: new Date() }) + .where(eq(schema.mcpOauthCodes.code, code)); + + const tokens = await issueTokens({ + clientId: row.clientId, + userId: row.userId, + projectId: row.projectId, + resource: row.resource, + scope: row.scope, + }); + return c.json(tokens); +} + +async function handleRefreshGrant(c: Context, cfg: McpConfig, form: Record) { + const refreshToken = stringField(form, "refresh_token"); + const clientId = stringField(form, "client_id"); + const resource = stringField(form, "resource"); + if (!refreshToken || !clientId) { + return oauthError(c, 400, "invalid_request", "missing refresh_token or client_id"); + } + if (resource && !resourceMatches(resource, cfg)) { + return oauthError( + c, + 400, + "invalid_target", + `resource does not match MCP server; received: ${resource}`, + ); + } + + const refreshHash = hashToken(refreshToken); + const row = await db.query.mcpOauthTokens.findFirst({ + where: eq(schema.mcpOauthTokens.refreshHash, refreshHash), + }); + if (!row) return oauthError(c, 400, "invalid_grant", "refresh token not found"); + if (row.revokedAt) return oauthError(c, 400, "invalid_grant", "refresh token revoked"); + if (row.clientId !== clientId) return oauthError(c, 400, "invalid_grant", "client_id mismatch"); + if (row.refreshExpiresAt && row.refreshExpiresAt.getTime() < Date.now()) { + return oauthError(c, 400, "invalid_grant", "refresh token expired"); + } + + await db + .update(schema.mcpOauthTokens) + .set({ revokedAt: new Date() }) + .where(eq(schema.mcpOauthTokens.id, row.id)); + + const tokens = await issueTokens({ + clientId: row.clientId, + userId: row.userId, + projectId: row.projectId, + resource: row.resource, + scope: row.scope, + }); + return c.json(tokens); +} + +async function issueTokens(params: { + clientId: string; + userId: string; + projectId: string; + resource: string; + scope: string | null; +}): Promise<{ + access_token: string; + refresh_token: string; + token_type: "Bearer"; + expires_in: number; + scope?: string; +}> { + const access = generateMcpAccessToken(); + const refresh = generateMcpRefreshToken(); + await db.insert(schema.mcpOauthTokens).values({ + accessHash: access.hash, + refreshHash: refresh.hash, + clientId: params.clientId, + userId: params.userId, + projectId: params.projectId, + resource: params.resource, + scope: params.scope, + accessExpiresAt: new Date(Date.now() + ACCESS_TTL_SECONDS * 1000), + refreshExpiresAt: new Date(Date.now() + REFRESH_TTL_SECONDS * 1000), + }); + void syncLoopsContactForUserProject({ + userId: params.userId, + projectId: params.projectId, + }).catch((err) => + log.warn({ err, user_id: params.userId }, "loops contact sync failed after mcp install"), + ); + return { + access_token: access.plaintext, + refresh_token: refresh.plaintext, + token_type: "Bearer", + expires_in: ACCESS_TTL_SECONDS, + ...(params.scope ? { scope: params.scope } : {}), + }; +} + +function readAuthorizeParams(c: Context): AuthorizeParams { + const q = c.req.query(); + // RFC 8707 allows the resource parameter to be repeated. c.req.query() only + // returns the first occurrence, so use c.req.queries() to see them all. + const received = c.req.queries("resource") ?? []; + return { + clientId: q.client_id ?? "", + redirectUri: q.redirect_uri ?? "", + state: q.state ?? null, + codeChallenge: q.code_challenge ?? "", + codeChallengeMethod: q.code_challenge_method ?? "", + resource: received[0] ?? "", + receivedResources: received, + scope: q.scope ?? null, + }; +} + +async function validateAuthorizeParams( + params: AuthorizeParams, + cfg: McpConfig, +): Promise<{ code: string; description: string } | null> { + if (!params.clientId) return { code: "invalid_request", description: "client_id is required" }; + if (!params.redirectUri) { + return { code: "invalid_request", description: "redirect_uri is required" }; + } + if (params.codeChallengeMethod !== "S256") { + return { + code: "invalid_request", + description: "code_challenge_method must be S256", + }; + } + if (!params.codeChallenge) { + return { code: "invalid_request", description: "code_challenge is required" }; + } + const matched = pickMatchingResource(params.receivedResources, cfg); + if (!matched) { + return { + code: "invalid_target", + description: `resource must be ${cfg.resource}; received: ${params.receivedResources.join(", ")}`, + }; + } + // Canonicalize so downstream storage always uses cfg.resource regardless of + // which alias the client sent. + params.resource = matched; + const client = await db.query.mcpOauthClients.findFirst({ + where: eq(schema.mcpOauthClients.id, params.clientId), + }); + if (!client) return { code: "invalid_request", description: "unknown client_id" }; + if (!client.redirectUris.includes(params.redirectUri)) { + return { code: "invalid_request", description: "redirect_uri not registered" }; + } + return null; +} + +function verifyPkce(verifier: string, challenge: string, method: string): boolean { + if (method !== "S256") return false; + const computed = createHash("sha256").update(verifier).digest("base64url"); + return timingSafeEq(computed, challenge); +} + +function timingSafeEq(a: string, b: string): boolean { + if (a.length !== b.length) return false; + let out = 0; + for (let i = 0; i < a.length; i++) out |= a.charCodeAt(i) ^ b.charCodeAt(i); + return out === 0; +} + +function isValidRedirectUri(uri: string): boolean { + try { + const u = new URL(uri); + if (u.protocol === "https:") return true; + if (u.protocol === "http:" && (u.hostname === "localhost" || u.hostname === "127.0.0.1")) { + return true; + } + return false; + } catch { + return false; + } +} + +function buildErrorRedirect(params: AuthorizeParams, code: string, description: string): string { + const url = new URL(params.redirectUri); + url.searchParams.set("error", code); + url.searchParams.set("error_description", description); + if (params.state) url.searchParams.set("state", params.state); + return url.toString(); +} + +function stringField(form: Record, key: string): string { + const v = form[key]; + return typeof v === "string" ? v : ""; +} + +function oauthError(c: Context, status: 400 | 401, code: string, description: string) { + log.warn( + { + method: c.req.method, + path: c.req.path, + query: c.req.url.split("?")[1] ?? "", + status, + code, + description, + }, + "oauth error", + ); + return c.json({ error: code, error_description: description }, status); +} diff --git a/superlog/apps/api/src/mcp/projects.ts b/superlog/apps/api/src/mcp/projects.ts new file mode 100644 index 0000000000000000000000000000000000000000..de3445d9e6a3475cdd5c86d2681432e678ea688d --- /dev/null +++ b/superlog/apps/api/src/mcp/projects.ts @@ -0,0 +1,76 @@ +import { db, schema } from "@superlog/db"; +import { and, eq, inArray } from "drizzle-orm"; +import { HTTPException } from "hono/http-exception"; + +export type AccessibleProject = { + id: string; + name: string; + slug: string; + orgId: string; + orgName: string; + orgSlug: string; +}; + +export async function listAccessibleProjects(userId: string): Promise { + const memberships = await db.query.orgMembers.findMany({ + where: eq(schema.orgMembers.userId, userId), + }); + if (memberships.length === 0) return []; + const orgIds = memberships.map((m) => m.orgId); + + const orgs = await db.query.orgs.findMany({ + where: inArray(schema.orgs.id, orgIds), + }); + const orgById = new Map(orgs.map((o) => [o.id, o])); + + const projects = await db.query.projects.findMany({ + where: inArray(schema.projects.orgId, orgIds), + }); + + return projects + .map((p) => { + const o = orgById.get(p.orgId); + if (!o) return null; + return { + id: p.id, + name: p.name, + slug: p.slug, + orgId: o.id, + orgName: o.name, + orgSlug: o.slug, + }; + }) + .filter((x): x is AccessibleProject => x !== null); +} + +export async function assertProjectAccess(userId: string, projectId: string): Promise { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + + const membership = await db.query.orgMembers.findFirst({ + where: and( + eq(schema.orgMembers.userId, userId), + eq(schema.orgMembers.orgId, project.orgId), + ), + }); + if (!membership) throw new HTTPException(403, { message: "no access to project" }); +} + +export async function setActiveProjectForToken( + tokenId: string, + userId: string, + projectId: string, +): Promise { + await assertProjectAccess(userId, projectId); + await db + .update(schema.mcpOauthTokens) + .set({ projectId }) + .where(eq(schema.mcpOauthTokens.id, tokenId)); + + const projects = await listAccessibleProjects(userId); + const found = projects.find((p) => p.id === projectId); + if (!found) throw new HTTPException(500, { message: "project vanished after switch" }); + return found; +} diff --git a/superlog/apps/api/src/mcp/server.ts b/superlog/apps/api/src/mcp/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..fbd54c478083e07da80ed1d5e83de0cc7e67fb25 --- /dev/null +++ b/superlog/apps/api/src/mcp/server.ts @@ -0,0 +1,287 @@ +import type { ClickHouseClient } from "@clickhouse/client"; +import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; +import { db, schema } from "@superlog/db"; +import { eq } from "drizzle-orm"; +import { z } from "zod"; +import { registerAlertTools } from "./alerts.js"; +import { listServices, queryLogs, queryMetrics, queryTraces } from "./clickhouse.js"; +import { registerDashboardTools } from "./dashboards.js"; +import { registerIncidentTools } from "./incidents.js"; +import { + assertProjectAccess, + listAccessibleProjects, + setActiveProjectForToken, +} from "./projects.js"; + +const timeRangeSchema = z + .object({ + since: z + .string() + .describe( + "ISO-8601 timestamp or ClickHouse time expression (e.g. 'now() - INTERVAL 1 HOUR'). Defaults to 1 hour ago.", + ) + .optional(), + until: z + .string() + .describe("ISO-8601 timestamp or ClickHouse time expression. Defaults to 'now()'.") + .optional(), + }) + .optional(); + +const resourceAttrsSchema = z + .array( + z.object({ + key: z.string(), + value: z.string(), + op: z.enum(["eq", "neq", "not_contains"]).optional(), + }), + ) + .optional() + .describe( + "Filters on OTel resource attributes, e.g. [{key:'deployment.environment', value:'prod'}]. Optional op supports eq, neq, and not_contains.", + ); + +const spanAttrsSchema = z + .array(z.object({ key: z.string(), value: z.string() })) + .optional() + .describe( + "Equality filters on per-span attributes (SpanAttributes), e.g. [{key:'http.response.status_code', value:'410'}] or [{key:'http.route', value:'/api/signup-intents/:id/claim'}]. Use this when you need to filter spans by HTTP status code, route template, method, db statement, etc. — those live in SpanAttributes, not the span's StatusCode (which only encodes the OTel-level OK/ERROR/UNSET).", + ); + +const logAttrsSchema = z + .array(z.object({ key: z.string(), value: z.string() })) + .optional() + .describe( + "Equality filters on per-log-record attributes (LogAttributes), e.g. [{key:'event.name', value:'auth.failure'}]. Distinct from resource_attrs (which apply to the emitting service) and from Body substring search.", + ); + +const projectIdSchema = z + .string() + .uuid() + .optional() + .describe( + "Project to query. Defaults to the session's active project. Use list_projects to discover ids and set_active_project to switch the default.", + ); + +export type McpSession = { + ch: ClickHouseClient; + userId: string; + tokenId: string; + /** Mutable: updated by set_active_project so subsequent calls see the new default. */ + activeProjectId: string; + allowedOrgId?: string; + telemetryOnly?: boolean; +}; + +export function createMcpServerForSession(session: McpSession): McpServer { + const server = new McpServer({ name: "superlog", version: "0.1.0" }); + + const assertTokenScope = async (projectId: string): Promise => { + if (!session.allowedOrgId) return; + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project || project.orgId !== session.allowedOrgId) { + throw new Error("project is outside this MCP token's org scope"); + } + }; + + const resolveProject = async (explicit: string | undefined): Promise => { + const id = explicit ?? session.activeProjectId; + await assertTokenScope(id); + await assertProjectAccess(session.userId, id); + return id; + }; + + server.registerTool( + "query_logs", + { + title: "Query logs", + description: + "Search OpenTelemetry logs. Targets the session's active project unless project_id is given. Error rows include flattened exception_type, exception_message, and exception_stacktrace fields when present.", + inputSchema: { + project_id: projectIdSchema, + range: timeRangeSchema, + service: z.string().optional().describe("Filter by service.name"), + severity: z + .string() + .optional() + .describe("Filter by severity text (e.g. 'ERROR', 'WARN', 'INFO')"), + search: z.string().optional().describe("Case-insensitive substring match on log body"), + resource_attrs: resourceAttrsSchema, + log_attrs: logAttrsSchema, + limit: z.number().int().positive().max(500).default(50), + }, + }, + async (input) => { + const projectId = await resolveProject(input.project_id); + const rows = await queryLogs(session.ch, projectId, { + range: input.range, + service: input.service, + severity: input.severity, + search: input.search, + resourceAttrs: input.resource_attrs, + logAttrs: input.log_attrs, + limit: input.limit, + }); + return { content: [{ type: "text", text: JSON.stringify(rows) }] }; + }, + ); + + server.registerTool( + "query_traces", + { + title: "Query traces", + description: + "Search OpenTelemetry spans. Targets the session's active project unless project_id is given. Spans with exception events include flattened exception_type, exception_message, and exception_stacktrace fields when present.", + inputSchema: { + project_id: projectIdSchema, + range: timeRangeSchema, + service: z.string().optional(), + span_name: z.string().optional(), + status_code: z + .enum(["STATUS_CODE_OK", "STATUS_CODE_ERROR", "STATUS_CODE_UNSET"]) + .optional() + .describe( + "OTel span status (not HTTP status). By the OTel HTTP semconv, only 5xx server responses auto-set ERROR — 4xx (including 410) stays UNSET. To find spans by HTTP status code, use span_attrs with key 'http.response.status_code'.", + ), + min_duration_ms: z.number().nonnegative().optional(), + resource_attrs: resourceAttrsSchema, + span_attrs: spanAttrsSchema, + limit: z.number().int().positive().max(500).default(50), + }, + }, + async (input) => { + const projectId = await resolveProject(input.project_id); + const rows = await queryTraces(session.ch, projectId, { + range: input.range, + service: input.service, + spanName: input.span_name, + statusCode: input.status_code, + minDurationMs: input.min_duration_ms, + resourceAttrs: input.resource_attrs, + spanAttrs: input.span_attrs, + limit: input.limit, + }); + return { content: [{ type: "text", text: JSON.stringify(rows) }] }; + }, + ); + + server.registerTool( + "query_metrics", + { + title: "Query metrics", + description: + "Fetch recent metric points across gauge/sum/histogram/summary tables. Targets the session's active project unless project_id is given. Each point includes its data-point `attributes` (the per-series dimensions like route/status/tenant) and `resource_attrs`. gauge/sum points carry a scalar `value`; histogram/summary points carry `count` and `sum` (plus `min`/`max` for histograms) instead, since they have no scalar value.", + inputSchema: { + project_id: projectIdSchema, + metric_name: z.string().optional(), + service: z.string().optional(), + range: timeRangeSchema, + resource_attrs: resourceAttrsSchema, + limit: z.number().int().positive().max(500).default(100), + }, + }, + async (input) => { + const projectId = await resolveProject(input.project_id); + const rows = await queryMetrics(session.ch, projectId, { + metricName: input.metric_name, + service: input.service, + range: input.range, + resourceAttrs: input.resource_attrs, + limit: input.limit, + }); + return { content: [{ type: "text", text: JSON.stringify(rows) }] }; + }, + ); + + server.registerTool( + "list_services", + { + title: "List services", + description: "List distinct service.name values emitting telemetry in the given window.", + inputSchema: { + project_id: projectIdSchema, + range: timeRangeSchema, + }, + }, + async (input) => { + const projectId = await resolveProject(input.project_id); + const services = await listServices(session.ch, projectId, input.range); + return { content: [{ type: "text", text: JSON.stringify(services) }] }; + }, + ); + + server.registerTool( + "list_projects", + { + title: "List projects", + description: + "List every project the authenticated user can access, across all of their orgs. The active project is marked.", + inputSchema: {}, + }, + async () => { + const projects = (await listAccessibleProjects(session.userId)).filter( + (p) => !session.allowedOrgId || p.orgId === session.allowedOrgId, + ); + const payload = projects.map((p) => ({ + ...p, + active: p.id === session.activeProjectId, + })); + return { content: [{ type: "text", text: JSON.stringify(payload) }] }; + }, + ); + + server.registerTool( + "get_active_project", + { + title: "Get active project", + description: "Return the project that tools default to when project_id is omitted.", + inputSchema: {}, + }, + async () => { + const projects = (await listAccessibleProjects(session.userId)).filter( + (p) => !session.allowedOrgId || p.orgId === session.allowedOrgId, + ); + const active = projects.find((p) => p.id === session.activeProjectId) ?? null; + return { + content: [ + { + type: "text", + text: JSON.stringify(active ?? { id: session.activeProjectId }), + }, + ], + }; + }, + ); + + server.registerTool( + "set_active_project", + { + title: "Set active project", + description: + "Change the default project for subsequent tool calls in this session. Persists for the lifetime of the access token.", + inputSchema: { + project_id: z.string().uuid().describe("Project id from list_projects"), + }, + }, + async (input) => { + await assertTokenScope(input.project_id); + const project = await setActiveProjectForToken( + session.tokenId, + session.userId, + input.project_id, + ); + session.activeProjectId = project.id; + return { content: [{ type: "text", text: JSON.stringify(project) }] }; + }, + ); + + if (!session.telemetryOnly) { + registerAlertTools(server, session, session.ch); + registerDashboardTools(server, session); + registerIncidentTools(server, session); + } + + return server; +} diff --git a/superlog/apps/api/src/net.ts b/superlog/apps/api/src/net.ts new file mode 100644 index 0000000000000000000000000000000000000000..847910584d16ec5eab1936528de60148229c5066 --- /dev/null +++ b/superlog/apps/api/src/net.ts @@ -0,0 +1,49 @@ +import dns from "node:dns"; + +// Bypass Railway's in-container resolver, which returns stale/mis-routed +// answers for api.anthropic.com that land on CF anycast IPs not +// authorized for Anthropic's zone — Cloudflare then rejects the TLS +// handshake with Error 1000 ("DNS points to prohibited IP"). Pinning the +// resolver to Cloudflare + Google fixes the A record, and the lookup +// patch below forces IPv4 so undici can't prefer an AAAA with the same +// problem. +dns.setServers(["1.1.1.1", "8.8.8.8"]); + +// Prefer IPv4 via c-ares `resolve4` over getaddrinfo. Also matters on local +// networks where getaddrinfo returns AAAA-only for hosts with no global v6 route. +// biome-ignore lint/suspicious/noExplicitAny: matches Node's overloaded lookup signature +const origLookup = dns.lookup as any; + +// biome-ignore lint/suspicious/noExplicitAny: matches Node's overloaded lookup signature +(dns as any).lookup = function patchedLookup( + hostname: string, + optsOrCb: unknown, + maybeCb?: unknown, +) { + const cb = (typeof optsOrCb === "function" ? optsOrCb : maybeCb) as ( + err: NodeJS.ErrnoException | null, + address?: string | { address: string; family: number }[], + family?: number, + ) => void; + const opts = (typeof optsOrCb === "function" ? {} : optsOrCb) as { + all?: boolean; + family?: number; + }; + + if (opts.family === 6) { + return origLookup(hostname, opts, cb); + } + + dns.resolve4(hostname, (err, addrs) => { + if (!err && addrs?.length) { + if (opts.all) { + return cb( + null, + addrs.map((a) => ({ address: a, family: 4 })), + ); + } + return cb(null, addrs[0], 4); + } + origLookup(hostname, opts, cb); + }); +}; diff --git a/superlog/apps/api/src/org-context.ts b/superlog/apps/api/src/org-context.ts new file mode 100644 index 0000000000000000000000000000000000000000..08cd07953dec60eb4b242108f512f6491a056be6 --- /dev/null +++ b/superlog/apps/api/src/org-context.ts @@ -0,0 +1,109 @@ +import { db, schema } from "@superlog/db"; +import { and, eq } from "drizzle-orm"; + +// Org context resolution backed by Better Auth's session + organization +// plugin. Replaces the old Clerk-driven resolveActiveOrgContext in +// clerk-orgs.ts: identity now comes from our local `users` + `org_members` +// tables, so this is a pure DB read with no upstream sync calls. + +type SyncedUser = typeof schema.users.$inferSelect; +type SyncedOrg = typeof schema.orgs.$inferSelect; +type SyncedProject = typeof schema.projects.$inferSelect; + +type ResolveActiveOrgOptions = { + userId: string; + preferredOrgId?: string | null; + preferredProjectId?: string | null; +}; + +export type ActiveOrgContext = { + user: SyncedUser; + org: SyncedOrg; + project: SyncedProject; +}; + +export type MaybeActiveOrgContext = + | ActiveOrgContext + | { user: SyncedUser; org: null; project: null }; + +async function ensureProjectForOrg(orgId: string): Promise { + const existing = await db.query.projects.findFirst({ + where: eq(schema.projects.orgId, orgId), + }); + if (existing) return existing; + + const inserted = await db + .insert(schema.projects) + .values({ orgId, name: "Default", slug: "default" }) + .returning(); + const project = inserted[0]; + if (!project) throw new Error("failed to create default project"); + + await db + .insert(schema.projectAutomationSettings) + .values({ projectId: project.id }) + .onConflictDoNothing({ target: schema.projectAutomationSettings.projectId }); + + return project; +} + +async function resolveProjectForOrg( + orgId: string, + preferredProjectId: string | null, +): Promise { + if (preferredProjectId) { + const candidate = await db.query.projects.findFirst({ + where: and(eq(schema.projects.id, preferredProjectId), eq(schema.projects.orgId, orgId)), + }); + if (candidate) return candidate; + } + return ensureProjectForOrg(orgId); +} + +// Returns the user's active org + project, or `org: null, project: null` when +// the user hasn't created their first org yet. Use this on endpoints that +// must keep working for pre-org users (currently only /api/me — every other +// endpoint requires an org and uses resolveActiveOrgContext). +export async function resolveMaybeActiveOrgContext( + options: ResolveActiveOrgOptions, +): Promise { + const user = await db.query.users.findFirst({ where: eq(schema.users.id, options.userId) }); + if (!user) throw new Error(`user ${options.userId} not found`); + + const preferredProjectId = options.preferredProjectId ?? user.activeProjectId ?? null; + + if (options.preferredOrgId) { + const membership = await db.query.orgMembers.findFirst({ + where: and( + eq(schema.orgMembers.userId, options.userId), + eq(schema.orgMembers.orgId, options.preferredOrgId), + ), + }); + if (membership) { + const org = await db.query.orgs.findFirst({ where: eq(schema.orgs.id, membership.orgId) }); + if (org) { + const project = await resolveProjectForOrg(org.id, preferredProjectId); + return { user, org, project }; + } + } + } + + const firstMembership = await db.query.orgMembers.findFirst({ + where: eq(schema.orgMembers.userId, options.userId), + }); + + if (!firstMembership) return { user, org: null, project: null }; + + const org = await db.query.orgs.findFirst({ where: eq(schema.orgs.id, firstMembership.orgId) }); + if (!org) throw new Error("org membership references missing org"); + const project = await resolveProjectForOrg(org.id, preferredProjectId); + return { user, org, project }; +} + +export async function resolveActiveOrgContext( + options: ResolveActiveOrgOptions, +): Promise { + const ctx = await resolveMaybeActiveOrgContext(options); + if (!ctx.org) throw new Error("no organization access"); + return ctx; +} diff --git a/superlog/apps/api/src/settings.ts b/superlog/apps/api/src/settings.ts new file mode 100644 index 0000000000000000000000000000000000000000..3003ece1d4d06b92fd074818ff8842b347097c09 --- /dev/null +++ b/superlog/apps/api/src/settings.ts @@ -0,0 +1,513 @@ +import { db, encryptIntegrationSecret, schema } from "@superlog/db"; +import { and, asc, eq, inArray, isNull } from "drizzle-orm"; +import type { Hono } from "hono"; +import type { Context } from "hono"; +import { INTEGRATION_MANIFESTS } from "./integrations-manifest.js"; +import { resolveActiveOrgContext } from "./org-context.js"; + +type Vars = { userId: string; orgId: string | null }; + +const ORG_INSTRUCTIONS_MAX_LEN = 8000; +const PROJECT_CONTEXT_MAX_LEN = 8000; + +const PROJECT_SLUG_RE = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; +const PROJECT_NAME_MAX_LEN = 80; + +function slugifyProjectName(name: string): string { + const base = name + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 40); + return base || "project"; +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountSettingsAuthed(app: Hono): void { + app.get("/api/org/agent-settings", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ customInstructions: "" }); + const row = await db.query.orgAgentSettings.findFirst({ + where: eq(schema.orgAgentSettings.orgId, ctx.orgId), + }); + return c.json({ customInstructions: row?.customInstructions ?? "" }); + }); + + app.put("/api/org/agent-settings", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const body = (await c.req.json().catch(() => ({}))) as { + customInstructions?: unknown; + }; + if (typeof body.customInstructions !== "string") { + return c.json({ error: "customInstructions must be a string" }, 400); + } + const customInstructions = body.customInstructions.slice(0, ORG_INSTRUCTIONS_MAX_LEN); + await db + .insert(schema.orgAgentSettings) + .values({ orgId: ctx.orgId, customInstructions }) + .onConflictDoUpdate({ + target: schema.orgAgentSettings.orgId, + set: { customInstructions, updatedAt: new Date() }, + }); + return c.json({ customInstructions }); + }); + + app.get("/api/org/digest", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) { + return c.json({ + enabled: false, + channelId: null, + channelName: null, + installationId: null, + lastRunAt: null, + }); + } + const row = await db.query.orgAgentSettings.findFirst({ + where: eq(schema.orgAgentSettings.orgId, ctx.orgId), + }); + return c.json({ + enabled: row?.digestEnabled ?? false, + channelId: row?.digestSlackChannelId ?? null, + channelName: row?.digestSlackChannelName ?? null, + installationId: row?.digestSlackInstallationId ?? null, + lastRunAt: row?.digestLastRunAt?.toISOString() ?? null, + }); + }); + + app.put("/api/org/digest", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const body = (await c.req.json().catch(() => ({}))) as { + enabled?: unknown; + channelId?: unknown; + channelName?: unknown; + }; + const enabled = typeof body.enabled === "boolean" ? body.enabled : undefined; + const channelIdRaw = + body.channelId === null + ? null + : typeof body.channelId === "string" + ? body.channelId + : undefined; + const channelNameRaw = + body.channelName === null + ? null + : typeof body.channelName === "string" + ? body.channelName + : undefined; + + // Digest is org-scoped today; pick any active slack install in the org + // by joining through projects. (One install per project — for orgs with + // multiple projects + multiple installs this returns an arbitrary one, + // same ambiguity as the previous org-scoped lookup.) + const installs = await db + .select({ + id: schema.slackInstallations.id, + }) + .from(schema.slackInstallations) + .innerJoin(schema.projects, eq(schema.projects.id, schema.slackInstallations.projectId)) + .where(and(eq(schema.projects.orgId, ctx.orgId), isNull(schema.slackInstallations.revokedAt))) + .limit(1); + const install = installs[0] ?? null; + + if (enabled === true && !channelIdRaw && !install) { + return c.json({ error: "Slack must be installed to enable the digest" }, 400); + } + + const update: Partial = { updatedAt: new Date() }; + if (enabled !== undefined) update.digestEnabled = enabled; + if (channelIdRaw !== undefined) { + update.digestSlackChannelId = channelIdRaw; + update.digestSlackInstallationId = channelIdRaw ? (install?.id ?? null) : null; + } + if (channelNameRaw !== undefined) update.digestSlackChannelName = channelNameRaw; + + await db + .insert(schema.orgAgentSettings) + .values({ + orgId: ctx.orgId, + digestEnabled: enabled ?? false, + digestSlackChannelId: channelIdRaw ?? null, + digestSlackChannelName: channelNameRaw ?? null, + digestSlackInstallationId: + channelIdRaw && install ? install.id : channelIdRaw === null ? null : null, + }) + .onConflictDoUpdate({ + target: schema.orgAgentSettings.orgId, + set: update, + }); + + const row = await db.query.orgAgentSettings.findFirst({ + where: eq(schema.orgAgentSettings.orgId, ctx.orgId), + }); + return c.json({ + enabled: row?.digestEnabled ?? false, + channelId: row?.digestSlackChannelId ?? null, + channelName: row?.digestSlackChannelName ?? null, + installationId: row?.digestSlackInstallationId ?? null, + lastRunAt: row?.digestLastRunAt?.toISOString() ?? null, + }); + }); + + app.post("/api/org/digest/run-now", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const row = await db.query.orgAgentSettings.findFirst({ + where: eq(schema.orgAgentSettings.orgId, ctx.orgId), + }); + if (!row?.digestSlackChannelId || !row?.digestSlackInstallationId) { + return c.json({ error: "configure a Slack channel for the digest first" }, 400); + } + // Worker fires next tick when last_run_at is null. We also bump enabled to + // true so manual runs work even if the user hasn't flipped the toggle yet. + await db + .update(schema.orgAgentSettings) + .set({ digestEnabled: true, digestLastRunAt: null, updatedAt: new Date() }) + .where(eq(schema.orgAgentSettings.orgId, ctx.orgId)); + return c.json({ ok: true }); + }); + + app.get("/api/org/projects", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ projects: [] }); + const rows = await db.query.projects.findMany({ + where: eq(schema.projects.orgId, ctx.orgId), + orderBy: [asc(schema.projects.createdAt)], + }); + return c.json({ + projects: rows.map((p) => ({ + id: p.id, + name: p.name, + slug: p.slug, + projectContext: p.projectContext, + })), + }); + }); + + app.post("/api/org/projects", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const body = (await c.req.json().catch(() => ({}))) as { + name?: unknown; + slug?: unknown; + projectContext?: unknown; + }; + const name = typeof body.name === "string" ? body.name.trim() : ""; + if (!name) return c.json({ error: "name is required" }, 400); + if (name.length > PROJECT_NAME_MAX_LEN) { + return c.json({ error: `name must be ≤ ${PROJECT_NAME_MAX_LEN} chars` }, 400); + } + const slugInput = + typeof body.slug === "string" && body.slug.trim() + ? body.slug.trim().toLowerCase() + : slugifyProjectName(name); + if (!PROJECT_SLUG_RE.test(slugInput) || slugInput.length > 40) { + return c.json({ error: "slug must be lowercase alphanumeric + dashes, max 40 chars" }, 400); + } + const existing = await db.query.projects.findFirst({ + where: and(eq(schema.projects.orgId, ctx.orgId), eq(schema.projects.slug, slugInput)), + }); + if (existing) return c.json({ error: "slug already in use in this org" }, 409); + + const [project] = await db + .insert(schema.projects) + .values({ + orgId: ctx.orgId, + name, + slug: slugInput, + projectContext: + typeof body.projectContext === "string" + ? body.projectContext.slice(0, PROJECT_CONTEXT_MAX_LEN) + : "", + }) + .returning(); + if (!project) return c.json({ error: "failed to create project" }, 500); + await db + .insert(schema.projectAutomationSettings) + .values({ projectId: project.id }) + .onConflictDoNothing({ target: schema.projectAutomationSettings.projectId }); + return c.json({ + project: { + id: project.id, + name: project.name, + slug: project.slug, + projectContext: project.projectContext, + }, + }); + }); + + app.patch("/api/org/projects/:projectId", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const projectId = c.req.param("projectId"); + const target = await db.query.projects.findFirst({ + where: and(eq(schema.projects.id, projectId), eq(schema.projects.orgId, ctx.orgId)), + }); + if (!target) return c.json({ error: "project not found" }, 404); + + const body = (await c.req.json().catch(() => ({}))) as { + name?: unknown; + slug?: unknown; + projectContext?: unknown; + }; + const patch: Partial = {}; + if (typeof body.name === "string") { + const name = body.name.trim(); + if (!name) return c.json({ error: "name cannot be empty" }, 400); + if (name.length > PROJECT_NAME_MAX_LEN) { + return c.json({ error: `name must be ≤ ${PROJECT_NAME_MAX_LEN} chars` }, 400); + } + patch.name = name; + } + if (typeof body.slug === "string") { + const slug = body.slug.trim().toLowerCase(); + if (!PROJECT_SLUG_RE.test(slug) || slug.length > 40) { + return c.json({ error: "slug must be lowercase alphanumeric + dashes, max 40 chars" }, 400); + } + if (slug !== target.slug) { + const clash = await db.query.projects.findFirst({ + where: and(eq(schema.projects.orgId, ctx.orgId), eq(schema.projects.slug, slug)), + }); + if (clash) return c.json({ error: "slug already in use in this org" }, 409); + patch.slug = slug; + } + } + if (typeof body.projectContext === "string") { + patch.projectContext = body.projectContext.slice(0, PROJECT_CONTEXT_MAX_LEN); + } + if (Object.keys(patch).length === 0) { + return c.json({ + project: { + id: target.id, + name: target.name, + slug: target.slug, + projectContext: target.projectContext, + }, + }); + } + const [updated] = await db + .update(schema.projects) + .set(patch) + .where(eq(schema.projects.id, target.id)) + .returning(); + // A concurrent DELETE between the findFirst above and this UPDATE leaves + // `updated` undefined — return a clean 404 rather than a TypeError 500. + if (!updated) return c.json({ error: "project not found" }, 404); + return c.json({ + project: { + id: updated.id, + name: updated.name, + slug: updated.slug, + projectContext: updated.projectContext, + }, + }); + }); + + app.delete("/api/org/projects/:projectId", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const projectId = c.req.param("projectId"); + + // The count-check and the delete must be atomic, or two concurrent + // deletes in a 2-project org can both pass the `> 1` guard and leave + // the org with zero projects. Wrap in a tx and take SELECT FOR UPDATE + // locks on every project row in this org — any concurrent delete of a + // sibling will block until our tx commits, at which point its count + // sees the post-delete state. + const result = await db.transaction(async (tx) => { + const target = await tx.query.projects.findFirst({ + where: and(eq(schema.projects.id, projectId), eq(schema.projects.orgId, ctx.orgId)), + }); + if (!target) return { status: 404 as const, body: { error: "project not found" } }; + const locked = await tx + .select({ id: schema.projects.id }) + .from(schema.projects) + .where(eq(schema.projects.orgId, ctx.orgId)) + .for("update"); + if (locked.length <= 1) { + return { + status: 409 as const, + body: { error: "cannot delete the last project in an org" }, + }; + } + await tx.delete(schema.projects).where(eq(schema.projects.id, target.id)); + return { status: 200 as const, body: { ok: true } }; + }); + return c.json(result.body, result.status); + }); + + app.get("/api/org/integrations", async (c) => { + const ctx = await resolveUserOrg(c); + const installed = ctx + ? await db.query.orgIntegrations.findMany({ + where: eq(schema.orgIntegrations.orgId, ctx.orgId), + }) + : []; + const installedBySlug = new Map(installed.map((row) => [row.slug, row])); + const presentSecrets = ctx + ? await db.query.orgIntegrationSecrets.findMany({ + where: + installed.length > 0 + ? inArray( + schema.orgIntegrationSecrets.orgIntegrationId, + installed.map((row) => row.id), + ) + : undefined, + }) + : []; + const presentByIntegrationId = new Map>(); + for (const s of presentSecrets) { + const set = presentByIntegrationId.get(s.orgIntegrationId) ?? new Set(); + set.add(s.secretName); + presentByIntegrationId.set(s.orgIntegrationId, set); + } + + const items = Object.values(INTEGRATION_MANIFESTS).map((manifest) => { + const row = installedBySlug.get(manifest.slug); + const present = row + ? (presentByIntegrationId.get(row.id) ?? new Set()) + : new Set(); + return { + slug: manifest.slug, + name: manifest.name, + description: manifest.description, + installed: !!row, + enabled: row?.enabled ?? false, + required_secrets: manifest.required_secrets.map((spec) => ({ + name: spec.name, + description: spec.description, + present: present.has(spec.name), + })), + }; + }); + return c.json({ integrations: items }); + }); + + app.put("/api/org/integrations/:slug", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const slug = c.req.param("slug"); + const manifest = INTEGRATION_MANIFESTS[slug]; + if (!manifest) return c.json({ error: "unknown integration" }, 404); + + const body = (await c.req.json().catch(() => ({}))) as { + enabled?: unknown; + secrets?: unknown; + }; + const enabled = typeof body.enabled === "boolean" ? body.enabled : undefined; + const secrets = + body.secrets && typeof body.secrets === "object" && !Array.isArray(body.secrets) + ? (body.secrets as Record) + : null; + + if (secrets) { + for (const key of Object.keys(secrets)) { + if (!manifest.required_secrets.some((s) => s.name === key)) { + return c.json({ error: `unknown secret: ${key}` }, 400); + } + const value = secrets[key]; + if (value !== null && typeof value !== "string") { + return c.json({ error: `secret ${key} must be a string or null` }, 400); + } + } + } + + const existing = await db.query.orgIntegrations.findFirst({ + where: and( + eq(schema.orgIntegrations.orgId, ctx.orgId), + eq(schema.orgIntegrations.slug, slug), + ), + }); + + const integrationRow = existing + ? ( + await db + .update(schema.orgIntegrations) + .set({ + enabled: enabled ?? existing.enabled, + updatedAt: new Date(), + }) + .where(eq(schema.orgIntegrations.id, existing.id)) + .returning() + )[0]! + : ( + await db + .insert(schema.orgIntegrations) + .values({ + orgId: ctx.orgId, + slug, + enabled: enabled ?? true, + }) + .returning() + )[0]!; + + if (secrets) { + for (const [name, value] of Object.entries(secrets)) { + if (value === null) { + await db + .delete(schema.orgIntegrationSecrets) + .where( + and( + eq(schema.orgIntegrationSecrets.orgIntegrationId, integrationRow.id), + eq(schema.orgIntegrationSecrets.secretName, name), + ), + ); + continue; + } + if (typeof value !== "string" || value.length === 0) continue; + const cipher = encryptIntegrationSecret(value); + await db + .insert(schema.orgIntegrationSecrets) + .values({ + orgIntegrationId: integrationRow.id, + secretName: name, + ciphertext: cipher.ciphertext, + nonce: cipher.nonce, + keyVersion: cipher.keyVersion, + }) + .onConflictDoUpdate({ + target: [ + schema.orgIntegrationSecrets.orgIntegrationId, + schema.orgIntegrationSecrets.secretName, + ], + set: { + ciphertext: cipher.ciphertext, + nonce: cipher.nonce, + keyVersion: cipher.keyVersion, + updatedAt: new Date(), + }, + }); + } + } + + return c.json({ ok: true }); + }); + + app.delete("/api/org/integrations/:slug", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const slug = c.req.param("slug"); + if (!INTEGRATION_MANIFESTS[slug]) return c.json({ error: "unknown integration" }, 404); + await db + .delete(schema.orgIntegrations) + .where( + and(eq(schema.orgIntegrations.orgId, ctx.orgId), eq(schema.orgIntegrations.slug, slug)), + ); + return c.json({ ok: true }); + }); +} + +async function resolveUserOrg( + c: Context<{ Variables: Vars }>, +): Promise<{ userId: string; orgId: string } | null> { + const userId = c.var.userId; + if (!userId) return null; + const ctx = await resolveActiveOrgContext({ + userId, + preferredOrgId: c.var.orgId, + }).catch(() => null); + if (!ctx) return null; + return { userId: ctx.user.id, orgId: ctx.org.id }; +} diff --git a/superlog/apps/api/src/signup-intents.test.ts b/superlog/apps/api/src/signup-intents.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..6a0faa44234069aa859a2da082987df0ea4612e6 --- /dev/null +++ b/superlog/apps/api/src/signup-intents.test.ts @@ -0,0 +1,28 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { + normalizeSignupIntentKeyHash, + normalizeSignupIntentKeyPrefix, +} from "./signup-intents.js"; + +test("signup intent key prefix accepts generated public ingest key prefixes", () => { + assert.equal(normalizeSignupIntentKeyPrefix("sl_public_abc123"), "sl_public_abc123"); +}); + +test("signup intent key prefix keeps legacy ingest key compatibility", () => { + assert.equal(normalizeSignupIntentKeyPrefix("superlog_live_abc123"), "superlog_live_abc123"); +}); + +test("signup intent key prefix rejects full tokens and malformed prefixes", () => { + assert.equal(normalizeSignupIntentKeyPrefix("sl_public_abc123extra"), null); + assert.equal(normalizeSignupIntentKeyPrefix("sl_private_abc123"), null); + assert.equal(normalizeSignupIntentKeyPrefix("sl_public_abc12!"), null); + assert.equal(normalizeSignupIntentKeyPrefix(null), null); +}); + +test("signup intent key hash requires sha256 hex and normalizes case", () => { + const upper = "A".repeat(64); + assert.equal(normalizeSignupIntentKeyHash(upper), upper.toLowerCase()); + assert.equal(normalizeSignupIntentKeyHash("a".repeat(63)), null); + assert.equal(normalizeSignupIntentKeyHash("g".repeat(64)), null); +}); diff --git a/superlog/apps/api/src/signup-intents.ts b/superlog/apps/api/src/signup-intents.ts new file mode 100644 index 0000000000000000000000000000000000000000..88a9c311366bc2f229dc8d524237903f68da5afc --- /dev/null +++ b/superlog/apps/api/src/signup-intents.ts @@ -0,0 +1,20 @@ +import { API_KEY_PREFIX, LEGACY_API_KEY_PREFIX } from "@superlog/db/keys"; + +const KEY_PREFIX_SUFFIX_RE = /^[A-Za-z0-9_-]{6}$/; +const SHA256_HEX_RE = /^[a-f0-9]{64}$/i; + +export function normalizeSignupIntentKeyHash(value: unknown): string | null { + return typeof value === "string" && SHA256_HEX_RE.test(value) ? value.toLowerCase() : null; +} + +export function normalizeSignupIntentKeyPrefix(value: unknown): string | null { + if (typeof value !== "string") return null; + + const tokenPrefix = [API_KEY_PREFIX, LEGACY_API_KEY_PREFIX].find((prefix) => + value.startsWith(prefix), + ); + if (!tokenPrefix) return null; + + const suffix = value.slice(tokenPrefix.length); + return KEY_PREFIX_SUFFIX_RE.test(suffix) ? value : null; +} diff --git a/superlog/apps/api/src/slack-oauth-callback.test.ts b/superlog/apps/api/src/slack-oauth-callback.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..e8f5b65a66868732b547c236a33511c6762c1f1d --- /dev/null +++ b/superlog/apps/api/src/slack-oauth-callback.test.ts @@ -0,0 +1,45 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { Hono } from "hono"; + +// Importing slack.ts pulls in @superlog/db, whose client throws at import time +// when DATABASE_URL is unset. postgres-js connects lazily, so a dummy value is +// enough — the failure branches under test never touch the database. +process.env.DATABASE_URL ??= "postgres://localhost:5434/superlog"; +process.env.BETTER_AUTH_SECRET ??= "test-better-auth-secret"; +process.env.SLACK_CLIENT_ID = "slack-client"; +process.env.SLACK_CLIENT_SECRET = "slack-secret"; +process.env.STATE_SIGNING_SECRET = "state-secret"; +process.env.WEB_ORIGIN = "https://app.example.test"; + +async function mountCallback(): Promise { + const { mountSlackPublic } = await import("./slack.js"); + const app = new Hono(); + mountSlackPublic(app); + return app; +} + +test("oauth callback with an invalid/expired state redirects back to the app with ?slack=error", async () => { + const app = await mountCallback(); + // A garbage state fails HMAC verification — the same code path a user hits + // when their signed state has expired (they lingered >10 min on Slack's + // consent screen). This must bounce them back to the app with a retryable + // error, not dead-end on a bare JSON 400. + const res = await app.request("/slack/oauth/callback?code=abc&state=not-a-valid-state"); + assert.equal(res.status, 302); + assert.equal(res.headers.get("location"), "https://app.example.test/?slack=error"); +}); + +test("oauth callback with a Slack error param redirects back with ?slack=denied", async () => { + const app = await mountCallback(); + const res = await app.request("/slack/oauth/callback?error=access_denied"); + assert.equal(res.status, 302); + assert.equal(res.headers.get("location"), "https://app.example.test/?slack=denied"); +}); + +test("oauth callback with no code redirects back with ?slack=error", async () => { + const app = await mountCallback(); + const res = await app.request("/slack/oauth/callback?state=whatever"); + assert.equal(res.status, 302); + assert.equal(res.headers.get("location"), "https://app.example.test/?slack=error"); +}); diff --git a/superlog/apps/api/src/slack.test.ts b/superlog/apps/api/src/slack.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..45c917ac2cf677fd7a8044f6d9f74dfe240b0b1a --- /dev/null +++ b/superlog/apps/api/src/slack.test.ts @@ -0,0 +1,178 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; + +// slack.ts transitively imports the db client, which throws at import time +// without a connection string. Set a dummy URL before the dynamic import (the +// porsager client connects lazily, so these pure-function tests never open a +// socket). Same dynamic-import pattern as detail.test.ts / loops.test.ts. +process.env.DATABASE_URL ??= "postgres://localhost:5434/superlog"; +process.env.BETTER_AUTH_SECRET ??= "test-better-auth-secret-with-enough-length"; +const { preferPinnedInstallation } = await import("./slack.js"); + +type FakeResponse = { ok: boolean; channels?: unknown[]; error?: string; cursor?: string }; + +function fakeFetch(pages: FakeResponse[]) { + const calls: URL[] = []; + let i = 0; + const fetchImpl: typeof fetch = async (input) => { + calls.push(input as URL); + const page = pages[i++] ?? { ok: true, channels: [] }; + const body: Record = { ok: page.ok }; + if (page.error) body.error = page.error; + if (page.channels) body.channels = page.channels; + if (page.cursor) body.response_metadata = { next_cursor: page.cursor }; + return { json: async () => body } as unknown as Response; + }; + return { fetchImpl, calls }; +} + +// Regression guard: a workspace installed into multiple Superlog projects owns +// several non-revoked `slack_installations` rows (upsertInstallation keys by +// project). Slack only keeps the most-recently-refreshed bot token live, so an +// unordered team-wide lookup can hand back a stale row whose token fails every +// API call with `invalid_auth` — which is exactly what broke the incident +// feedback modal (views.open -> invalid_auth). Incidents/proposals pin the +// exact installation that posted their thread, so that pin must win. +test("prefers the installation pinned to the incident over a team-wide match", () => { + const pinned = { id: "pinned", botAccessToken: "live" }; + const teamFallback = { id: "other", botAccessToken: "stale" }; + assert.equal(preferPinnedInstallation(pinned, teamFallback), pinned); +}); + +test("falls back to the team match when the incident has no pinned installation", () => { + const teamFallback = { id: "other", botAccessToken: "stale" }; + assert.equal(preferPinnedInstallation(null, teamFallback), teamFallback); +}); + +test("returns null when neither a pin nor a team match resolves", () => { + assert.equal(preferPinnedInstallation(null, null), null); +}); + +test("Slack resolve clicks on noise incidents refresh resolved-side effects", async () => { + const { resolveSlackResolveClickDisposition } = await import("./slack.js"); + + assert.equal(resolveSlackResolveClickDisposition("autoresolved_noise"), "refresh_side_effects"); +}); + +test("Slack resolve clicks on open incidents perform a fresh resolve", async () => { + const { resolveSlackResolveClickDisposition } = await import("./slack.js"); + + assert.equal(resolveSlackResolveClickDisposition("open"), "resolve"); +}); + +test("listSlackChannels requests both public and private channels", async () => { + const { listSlackChannels } = await import("./slack.js"); + const { fetchImpl, calls } = fakeFetch([{ ok: true, channels: [] }]); + + await listSlackChannels("xoxb-token", fetchImpl); + + assert.equal(calls.length, 1); + assert.equal(calls[0]?.searchParams.get("types"), "public_channel,private_channel"); + assert.equal(calls[0]?.searchParams.get("exclude_archived"), "true"); +}); + +test("listSlackChannels follows cursor pagination and aggregates all channels", async () => { + const { listSlackChannels } = await import("./slack.js"); + const { fetchImpl, calls } = fakeFetch([ + { + ok: true, + channels: [{ id: "C1", name: "general", is_private: false }], + cursor: "page2", + }, + { + ok: true, + channels: [{ id: "G1", name: "secret-room", is_private: true }], + }, + ]); + + const result = await listSlackChannels("xoxb-token", fetchImpl); + + assert.equal(result.ok, true); + assert.equal(calls.length, 2); + assert.equal(calls[1]?.searchParams.get("cursor"), "page2"); + assert.ok(result.ok); + assert.deepEqual(result.channels, [ + { id: "C1", name: "general", isPrivate: false }, + { id: "G1", name: "secret-room", isPrivate: true }, + ]); + // the private channel must survive into the final list + assert.ok(result.channels.some((c) => c.isPrivate && c.name === "secret-room")); +}); + +test("listSlackChannels returns the Slack error without paginating further", async () => { + const { listSlackChannels } = await import("./slack.js"); + const { fetchImpl, calls } = fakeFetch([{ ok: false, error: "token_revoked" }]); + + const result = await listSlackChannels("xoxb-token", fetchImpl); + + assert.equal(result.ok, false); + assert.equal(calls.length, 1); + assert.ok(!result.ok); + assert.equal(result.error, "token_revoked"); +}); + +// Regression guard: clicking Send on the Slack incident feedback modal kept +// surfacing "We had some trouble connecting. Try again?". Slack's +// view_submission ack contract requires an EMPTY 200 body to close the modal; +// our route was returning `{"ok":true}`, which Slack treats as an invalid +// response and refuses to close. The ack body must be empty. +test("view_submission ack is an empty 200 body (closes the Slack modal)", async () => { + const { Hono } = await import("hono"); + const { mountSlackPublic } = await import("./slack.js"); + + const secret = "test-slack-signing-secret"; + process.env.SLACK_SIGNING_SECRET = secret; + + const app = new Hono(); + mountSlackPublic(app); + + // Empty feedback value → handler returns before any DB access, isolating the + // ack-body behavior we care about. + const payload = { + type: "view_submission", + view: { + callback_id: "feedback_modal:incident-123", + state: { values: { feedback_body: { value: { value: "" } } } }, + }, + user: { id: "U1" }, + team: { id: "T1" }, + }; + const rawBody = `payload=${encodeURIComponent(JSON.stringify(payload))}`; + const ts = Math.floor(Date.now() / 1000).toString(); + const crypto = await import("node:crypto"); + const sig = `v0=${crypto + .createHmac("sha256", secret) + .update(`v0:${ts}:${rawBody}`) + .digest("hex")}`; + + const res = await app.request("/slack/interactivity", { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + "x-slack-signature": sig, + "x-slack-request-timestamp": ts, + }, + body: rawBody, + }); + + assert.equal(res.status, 200); + assert.equal(await res.text(), ""); +}); + +test("listSlackChannels returns an error when the page cap is exhausted", async () => { + const { listSlackChannels } = await import("./slack.js"); + const { fetchImpl, calls } = fakeFetch( + Array.from({ length: 50 }, (_, i) => ({ + ok: true, + channels: [{ id: `C${i}`, name: `channel-${i}` }], + cursor: `page-${i + 1}`, + })), + ); + + const result = await listSlackChannels("xoxb-token", fetchImpl); + + assert.equal(calls.length, 50); + assert.equal(result.ok, false); + assert.ok(!result.ok); + assert.equal(result.error, "pagination_limit_exceeded"); +}); diff --git a/superlog/apps/api/src/slack.ts b/superlog/apps/api/src/slack.ts new file mode 100644 index 0000000000000000000000000000000000000000..241c76d032214cf69abe9a9eb941ec7e80162f87 --- /dev/null +++ b/superlog/apps/api/src/slack.ts @@ -0,0 +1,1066 @@ +import crypto from "node:crypto"; +import { + confirmResolutionProposal, + db, + dismissResolutionProposal, + resolveIncident, + schema, + syncLoopsContactsForOrg, +} from "@superlog/db"; +import { and, desc, eq, isNull, sql } from "drizzle-orm"; +import type { Hono } from "hono"; +import type { Context } from "hono"; +import { HTTPException } from "hono/http-exception"; +import { recordFeedback } from "./feedback.js"; +import { getDeviceFlow, getSkillDeviceForIntegration } from "./gateway.js"; +import { closeAgentPullRequestOnGithub } from "./github.js"; +import { runResolvedIncidentSideEffectsForIncident } from "./incidents/resolution-side-effects.js"; +import { logger } from "./logger.js"; +import { resolveActiveOrgContext } from "./org-context.js"; + +const log = logger.child({ scope: "slack" }); + +const SCOPES = + "chat:write,chat:write.public,channels:read,groups:read,channels:history,groups:history"; + +type Vars = { userId: string; orgId: string | null }; + +export type SlackResolveClickDisposition = "resolve" | "refresh_side_effects"; + +export function resolveSlackResolveClickDisposition(status: string): SlackResolveClickDisposition { + return status === "open" ? "resolve" : "refresh_side_effects"; +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountSlackPublic(app: Hono): void { + const clientId = process.env.SLACK_CLIENT_ID; + const clientSecret = process.env.SLACK_CLIENT_SECRET; + const signingSecret = process.env.SLACK_SIGNING_SECRET; + const redirectUrl = + process.env.SLACK_OAUTH_REDIRECT_URL ?? "http://localhost:4100/slack/oauth/callback"; + const stateSecret = process.env.STATE_SIGNING_SECRET; + const webOrigin = process.env.WEB_ORIGIN ?? "http://localhost:5173"; + + if (!clientId || !clientSecret) { + log.warn("SLACK_CLIENT_ID/SECRET not set — /slack/oauth/callback disabled"); + } + + // Public Slack-install kickoff for the agent skill: skill receives the + // user_code from the device flow and opens this URL in the user's browser + // post-pairing. We look up the org from the user_code, sign cli-kind state, + // and redirect to Slack's OAuth. Mirrors `/github/install?user_code=…`. + app.get("/slack/install", (c) => { + if (!clientId || !stateSecret) { + return c.json({ error: "slack not configured" }, 503); + } + const callbackRedirectUrl = resolveSlackRedirectUrl(c, redirectUrl); + const userCode = (c.req.query("user_code") ?? "").toUpperCase(); + const device = getSkillDeviceForIntegration(userCode); + if (!device) return c.json({ error: "unknown or not-ready device code" }, 404); + const state = signState( + { orgId: device.orgId, projectId: device.projectId, userId: null, userCode }, + stateSecret, + ); + const url = new URL("https://slack.com/oauth/v2/authorize"); + url.searchParams.set("client_id", clientId); + url.searchParams.set("scope", SCOPES); + url.searchParams.set("redirect_uri", callbackRedirectUrl); + url.searchParams.set("state", state); + return c.redirect(url.toString(), 302); + }); + + app.get("/slack/oauth/callback", async (c) => { + if (!clientId || !clientSecret || !stateSecret) { + return c.json({ error: "slack not configured" }, 503); + } + const callbackWebOrigin = resolveCallbackWebOrigin(c, webOrigin); + const callbackRedirectUrl = resolveSlackRedirectUrl(c, redirectUrl); + const host = c.req.header("host") ?? null; + const err = c.req.query("error"); + if (err) { + log.warn({ error: err, host }, "slack oauth callback denied at slack"); + return c.redirect(`${callbackWebOrigin}/?slack=denied`, 302); + } + + const code = c.req.query("code"); + const state = c.req.query("state") ?? ""; + if (!code) { + log.warn({ host }, "slack oauth callback missing code"); + return c.redirect(`${callbackWebOrigin}/?slack=error`, 302); + } + + const decoded = verifyState(state, stateSecret); + if (!decoded) { + // State failed HMAC verification or aged past its 10-minute TTL — the + // latter is what a user hits when they linger on Slack's consent screen + // (e.g. waiting on workspace-admin approval) and then return. Bounce them + // back to the app with a retryable error instead of dead-ending on a bare + // JSON 400, and log it so connect drop-offs are diagnosable. + log.warn({ host }, "slack oauth callback rejected: invalid or expired state"); + return c.redirect(`${callbackWebOrigin}/?slack=error`, 302); + } + const orgId = decoded.orgId; + const projectId = decoded.projectId; + log.info( + { org_id: orgId, project_id: projectId, host: c.req.header("host") ?? null }, + "slack oauth callback received", + ); + + const res = await fetch("https://slack.com/api/oauth.v2.access", { + method: "POST", + headers: { "content-type": "application/x-www-form-urlencoded" }, + body: new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + code, + redirect_uri: callbackRedirectUrl, + }), + }); + const data = (await res.json()) as SlackOAuthResponse; + if (!data.ok || !data.access_token || !data.team?.id) { + log.error({ error: data.error ?? "no_access_token" }, "oauth exchange failed"); + return c.redirect(`${callbackWebOrigin}/?slack=error`, 302); + } + + await upsertInstallation({ + projectId, + teamId: data.team.id, + teamName: data.team.name ?? null, + botUserId: data.bot_user_id ?? null, + botAccessToken: data.access_token, + scope: data.scope ?? null, + installedByUserId: decoded.userId, + }); + log.info( + { + org_id: orgId, + project_id: projectId, + team_id: data.team.id, + team_name: data.team.name ?? null, + installed_by: decoded.userId, + }, + "slack installed", + ); + void syncLoopsContactsForOrg({ orgId, appUrl: webOrigin }).catch((err) => { + log.warn({ err, org_id: orgId }, "loops contact sync failed after slack connect"); + }); + + // Skill-driven install: bounce the user back to /activate so they see a + // consistent "you're connected" page tied to the agent flow they came + // from. CLI/dashboard-driven install lands on the dashboard as before. + if (decoded.userCode) { + const flow = getDeviceFlow(decoded.userCode); + const flowQuery = flow === "skill" ? "&flow=skill" : ""; + return c.redirect( + `${callbackWebOrigin}/activate?code=${decoded.userCode}${flowQuery}&slack=done`, + 302, + ); + } + return c.redirect(`${callbackWebOrigin}/?slack=installed`, 302); + }); + + app.post("/slack/events", async (c) => { + if (!signingSecret) return c.json({ error: "slack signing secret not configured" }, 503); + + const rawBody = await c.req.text(); + if (!verifySlackSignature(c, signingSecret, rawBody)) { + log.warn({ path: "/slack/events" }, "slack signature verification failed"); + return c.json({ error: "invalid slack signature" }, 401); + } + + const payload = JSON.parse(rawBody) as SlackEventEnvelope; + if (payload.type === "url_verification" && typeof payload.challenge === "string") { + return c.json({ challenge: payload.challenge }); + } + if (payload.type !== "event_callback") return c.json({ ok: true }); + + try { + await handleSlackEventEnvelope(payload); + } catch (err) { + log.error( + { err, event_type: payload.event?.type, event_id: payload.event_id }, + "slack event handler failed", + ); + throw err; + } + return c.json({ ok: true }); + }); + + app.post("/slack/interactivity", async (c) => { + if (!signingSecret) return c.json({ error: "slack signing secret not configured" }, 503); + + const rawBody = await c.req.text(); + if (!verifySlackSignature(c, signingSecret, rawBody)) { + return c.json({ error: "invalid slack signature" }, 401); + } + + const form = new URLSearchParams(rawBody); + const payloadRaw = form.get("payload"); + if (!payloadRaw) return c.json({ ok: true }); + const payload = JSON.parse(payloadRaw) as SlackInteractivityPayload; + + try { + if (payload.type === "block_actions") { + await handleSlackBlockActions(payload); + } else if (payload.type === "view_submission") { + await handleSlackViewSubmission(payload); + } + } catch (err) { + log.error({ err, type: payload.type }, "slack interactivity handler failed"); + } + + // view_submission has a strict ack contract: to close the modal, respond + // HTTP 200 with an EMPTY body. Any non-empty body that isn't a recognized + // `response_action` makes Slack surface "We had some trouble connecting. + // Try again?" and leave the modal open — which is exactly what broke the + // incident feedback modal's Send step (we were returning `{"ok":true}`). + // block_actions has no such constraint (Slack ignores the ack body), so an + // empty 200 is a valid ack there too — return one for every interactivity + // type to stay on the safe side of the contract. + return c.body(null, 200); + }); +} + +// Block_actions arrive when someone clicks a non-URL button in a message. +// Recognized action_ids (all encoded by the worker's incidentBlocks builder +// or the sweep proposal posting): +// - `give_feedback:` → opens a feedback modal +// - `resolve_incident:` → flips the incident to resolved +// attributed to the Slack user who clicked +async function handleSlackBlockActions(payload: SlackInteractivityPayload): Promise { + const action = payload.actions?.[0]; + if (!action) return; + const actionId = action.action_id ?? ""; + + if (actionId.startsWith("resolve_incident:")) { + const incidentId = actionId.slice("resolve_incident:".length); + if (incidentId) await handleSlackResolveIncident(incidentId, payload); + return; + } + + if (actionId.startsWith("resolve_proposal_confirm:")) { + const proposalId = actionId.slice("resolve_proposal_confirm:".length); + if (proposalId) await handleProposalDecision(proposalId, "confirm", payload); + return; + } + if (actionId.startsWith("resolve_proposal_dismiss:")) { + const proposalId = actionId.slice("resolve_proposal_dismiss:".length); + if (proposalId) await handleProposalDecision(proposalId, "dismiss", payload); + return; + } + + if (!actionId.startsWith("give_feedback:")) return; + const incidentId = actionId.slice("give_feedback:".length); + if (!incidentId) return; + + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, incidentId), + }); + if (!incident) { + log.warn({ incidentId }, "give_feedback click for unknown incident"); + return; + } + const installation = await installationForIncident({ + pinnedId: incident.slackInstallationId, + teamId: payload.team?.id ?? "", + }); + if (!installation) { + log.warn({ team_id: payload.team?.id, incidentId }, "no installation for feedback modal"); + return; + } + + const view = { + type: "modal", + callback_id: `feedback_modal:${incidentId}`, + title: { type: "plain_text", text: "Send feedback" }, + submit: { type: "plain_text", text: "Send" }, + close: { type: "plain_text", text: "Cancel" }, + blocks: [ + { + type: "section", + text: { + type: "mrkdwn", + text: `*Feedback on incident:*\n_${truncateModalText(incident.title)}_\nGoes straight to the Superlog team.`, + }, + }, + { + type: "input", + block_id: "feedback_body", + label: { type: "plain_text", text: "What's on your mind?" }, + element: { + type: "plain_text_input", + action_id: "value", + multiline: true, + max_length: 3000, + placeholder: { + type: "plain_text", + text: "What worked, what didn't, what's missing…", + }, + }, + }, + ], + }; + + const res = await fetch("https://slack.com/api/views.open", { + method: "POST", + headers: { + "content-type": "application/json; charset=utf-8", + authorization: `Bearer ${installation.botAccessToken}`, + }, + body: JSON.stringify({ trigger_id: payload.trigger_id, view }), + }); + const data = (await res.json()) as { ok: boolean; error?: string }; + if (!data.ok) { + log.warn({ error: data.error, incidentId }, "views.open failed for feedback modal"); + } +} + +// Handle a `resolve_incident:` block_actions click. The Slack +// button has a confirm dialog client-side, so by the time we see this the +// user has already double-confirmed. Path: +// 1. Look up the incident + the Slack installation for the team +// 2. Call resolveIncident() — idempotent against concurrent clicks +// 3. Post a threaded "Resolved by @user" reply for an audit trail visible +// in Slack (the row in `incidents.resolved_*` is the structured truth) +// 4. Update the root message in-place so the status badge reflects closure +// and the Resolve button disappears +// +// All Slack side effects are best-effort: a chat.postMessage / chat.update +// failure (channel archived, bot kicked, etc.) doesn't unwind the DB resolve. +// The user can always reopen via recurrence; what we don't want is the DB +// saying open while Slack thinks resolved (or vice-versa) on a transient +// failure. +async function handleSlackResolveIncident( + incidentId: string, + payload: SlackInteractivityPayload, +): Promise { + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, incidentId), + }); + if (!incident) { + log.warn({ incidentId }, "resolve_incident click for unknown incident"); + return; + } + if (resolveSlackResolveClickDisposition(incident.status) === "refresh_side_effects") { + log.info( + { incidentId, status: incident.status }, + "resolve_incident click on already-closed incident, refreshing side effects", + ); + await runSlackResolvedIncidentSideEffects(incidentId); + return; + } + + const slackUserId = payload.user?.id ?? null; + const slackUserName = payload.user?.name ?? null; + const attribution = slackUserId ? `<@${slackUserId}>` : (slackUserName ?? "a teammate"); + + const { resolved } = await resolveIncident({ + incidentId, + kind: "slack_manual", + reasonCode: "slack_manual", + reasonText: `Resolved from Slack by ${slackUserName ?? slackUserId ?? "unknown user"}.`, + resolvedBySlackUserId: slackUserId, + // No investigation context here — the incident may or may not have one; + // the resolved_* columns on incidents are the audit-of-record for manual + // resolves. Skip the investigation event to avoid coupling to a possibly- + // unrelated latest investigation. + }); + if (!resolved) { + log.info({ incidentId }, "resolve_incident click lost race with concurrent close"); + return; + } + + await runSlackResolvedIncidentSideEffects(incidentId); + + const installation = await installationForIncident({ + pinnedId: incident.slackInstallationId, + teamId: payload.team?.id ?? "", + }); + if (!installation) { + log.warn({ team_id: payload.team?.id, incidentId }, "no installation to post resolve reply"); + return; + } + if (incident.slackChannelId && incident.slackThreadTs) { + await postSlackThreadReply({ + botToken: installation.botAccessToken, + channel: incident.slackChannelId, + threadTs: incident.slackThreadTs, + text: `:white_check_mark: Incident resolved by ${attribution}. If the underlying error reappears it will re-open automatically.`, + }); + } +} + +async function runSlackResolvedIncidentSideEffects(incidentId: string): Promise { + await runResolvedIncidentSideEffectsForIncident({ + incidentId, + closePullRequest: (pr) => + closeAgentPullRequestOnGithub({ + installationId: pr.githubInstallationId, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + }), + }); +} + +// Confirm / Dismiss buttons on a sweep-agent resolution proposal posted +// into the incident's Slack thread. The proposal row is the audit record; +// confirming additionally closes the incident via resolveIncident(). +// We always edit the proposal message in place so the buttons disappear +// and the surfaced text reflects the decision — clicking the same button +// twice (or the other after a decision) becomes a visible no-op. +async function handleProposalDecision( + proposalId: string, + decision: "confirm" | "dismiss", + payload: SlackInteractivityPayload, +): Promise { + const slackUserId = payload.user?.id ?? null; + const slackUserName = payload.user?.name ?? null; + const actor = { slackUserId, displayName: slackUserName }; + const result = + decision === "confirm" + ? await confirmResolutionProposal({ proposalId, actor }) + : await dismissResolutionProposal({ proposalId, actor }); + if (!result.ok) { + // Decision rejected (race with another click, unknown id, already + // decided). Stop here so we don't overwrite the Slack message with a + // status that doesn't match the actual proposal state. + log.info( + { proposalId, decision, reason: result.reason }, + "proposal decision rejected (race or unknown id)", + ); + return; + } + if (decision === "confirm" && result.incidentId) { + await runResolvedIncidentSideEffectsForIncident({ + incidentId: result.incidentId, + closePullRequest: (pr) => + closeAgentPullRequestOnGithub({ + installationId: pr.githubInstallationId, + repoFullName: pr.repoFullName, + prNumber: pr.prNumber, + }), + }); + } + // Re-render the proposal message: drop the buttons, swap in a status line + // crediting the deciding user. The message lives in the incident thread, + // so this update is non-destructive — the original incident root + // message and earlier thread activity are untouched. + const proposal = await db.query.incidentResolutionProposals.findFirst({ + where: eq(schema.incidentResolutionProposals.id, proposalId), + }); + if (!proposal?.slackChannelId || !proposal.slackMessageTs) return; + + const installation = await installationForIncident({ + pinnedId: proposal.slackInstallationId, + teamId: payload.team?.id ?? "", + }); + if (!installation) return; + + const attribution = slackUserId ? `<@${slackUserId}>` : (slackUserName ?? "a teammate"); + const headerEmoji = decision === "confirm" ? ":white_check_mark:" : ":x:"; + const headerText = + decision === "confirm" + ? `${headerEmoji} *Resolution confirmed* by ${attribution}` + : `${headerEmoji} *Proposal dismissed* by ${attribution}`; + const footer = + decision === "confirm" + ? "Incident closed. If the underlying error recurs it will reopen automatically." + : "Incident left open. We won't propose resolution again for 24h."; + + const updatedBlocks: unknown[] = [ + { + type: "section", + text: { + type: "mrkdwn", + text: [ + headerText, + proposal.proposedReasonText, + `_Reason: \`${proposal.proposedReasonCode}\`_`, + footer, + ].join("\n"), + }, + }, + ]; + try { + await fetch("https://slack.com/api/chat.update", { + method: "POST", + headers: { + "content-type": "application/json; charset=utf-8", + authorization: `Bearer ${installation.botAccessToken}`, + }, + body: JSON.stringify({ + channel: proposal.slackChannelId, + ts: proposal.slackMessageTs, + text: `${headerText} — ${proposal.proposedReasonText}`, + blocks: updatedBlocks, + }), + }); + } catch (err) { + log.warn({ err, proposalId }, "proposal message re-render failed"); + } +} + +async function postSlackThreadReply(opts: { + botToken: string; + channel: string; + threadTs: string; + text: string; +}): Promise { + try { + const res = await fetch("https://slack.com/api/chat.postMessage", { + method: "POST", + headers: { + "content-type": "application/json; charset=utf-8", + authorization: `Bearer ${opts.botToken}`, + }, + body: JSON.stringify({ + channel: opts.channel, + thread_ts: opts.threadTs, + text: opts.text, + }), + }); + const data = (await res.json()) as { ok: boolean; error?: string }; + if (!data.ok) { + log.warn( + { error: data.error, channel: opts.channel, thread_ts: opts.threadTs }, + "thread reply post failed", + ); + } + } catch (err) { + log.warn({ err, channel: opts.channel }, "chat.postMessage threw"); + } +} + +async function handleSlackViewSubmission(payload: SlackInteractivityPayload): Promise { + const callbackId = payload.view?.callback_id ?? ""; + if (!callbackId.startsWith("feedback_modal:")) return; + const incidentId = callbackId.slice("feedback_modal:".length); + if (!incidentId) return; + const body = payload.view?.state?.values?.feedback_body?.value?.value?.trim() ?? ""; + if (!body) return; + + const incident = await db.query.incidents.findFirst({ + where: eq(schema.incidents.id, incidentId), + }); + const project = incident + ? await db.query.projects.findFirst({ + where: eq(schema.projects.id, incident.projectId), + }) + : null; + + await recordFeedback({ + kind: "incident", + refId: incidentId, + refRepo: null, + source: "slack_button", + body, + authorUserId: null, + authorExternal: { + slackUserId: payload.user?.id, + slackTeamId: payload.team?.id, + }, + orgId: project?.orgId ?? null, + projectId: project?.id ?? null, + }); +} + +async function findInstallationForTeam(teamId: string) { + if (!teamId) return null; + return db.query.slackInstallations.findFirst({ + where: and( + eq(schema.slackInstallations.teamId, teamId), + isNull(schema.slackInstallations.revokedAt), + ), + // When a team owns multiple non-revoked rows (the same workspace installed + // into several projects) Slack keeps only the most-recently-minted bot + // token live, so order by token-refresh recency — `installedAt`, which is + // set on every (re)auth, NOT `createdAt`, which the in-place token refresh + // leaves stale. Legacy rows predating `installedAt` are NULL, so fall back + // to `createdAt` for them via coalesce rather than letting NULLs sort last. + // Still best-effort: for incident-scoped actions prefer + // installationForIncident, which uses the exact pinned installation. This + // team lookup is only the legacy/unpinned fallback. + orderBy: desc( + sql`coalesce(${schema.slackInstallations.installedAt}, ${schema.slackInstallations.createdAt})`, + ), + }); +} + +// Apply the installation-selection precedence for incident-scoped Slack +// interactions: the installation pinned to the incident/proposal — the exact +// workspace + bot token that posted the thread — wins over any team-wide match. +// +// Why this matters: a workspace can be installed into more than one project, +// and `upsertInstallation` keys rows by project (unique on project_id+team_id), +// so one Slack team can own several non-revoked `slack_installations` rows. +// Slack issues a fresh bot token on each (re)install and invalidates the prior +// token, so only one of those rows holds a live token at a time. A team-wide +// `findFirst` can therefore return a stale row whose token fails every Slack +// API call with `invalid_auth` — which is exactly what silently broke the +// incident feedback modal (views.open -> invalid_auth, so the modal never +// opened and the click looked like a no-op). The pin is exact, so honour it +// first; the team match is only a fallback for legacy rows written before the +// pin existed. +export function preferPinnedInstallation( + pinned: T | null | undefined, + teamFallback: T | null | undefined, +): T | null { + return pinned ?? teamFallback ?? null; +} + +// Resolve the Slack installation to act through for an incident or proposal, +// preferring its pinned installation id (see preferPinnedInstallation). The +// team lookup only runs when there is no usable pin. +async function installationForIncident(opts: { pinnedId: string | null; teamId: string }) { + const pinned = opts.pinnedId + ? await db.query.slackInstallations.findFirst({ + where: and( + eq(schema.slackInstallations.id, opts.pinnedId), + isNull(schema.slackInstallations.revokedAt), + ), + }) + : null; + return preferPinnedInstallation( + pinned, + pinned ? null : await findInstallationForTeam(opts.teamId), + ); +} + +function truncateModalText(text: string): string { + return text.length > 200 ? `${text.slice(0, 197)}…` : text; +} + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountSlackAuthed(app: Hono): void { + const clientId = process.env.SLACK_CLIENT_ID; + const redirectUrl = + process.env.SLACK_OAUTH_REDIRECT_URL ?? "http://localhost:4100/slack/oauth/callback"; + const stateSecret = process.env.STATE_SIGNING_SECRET; + + app.get("/api/slack/installation", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ installed: false }); + const row = await findInstallation(ctx.projectId); + if (!row) return c.json({ installed: false }); + return c.json({ + installed: true, + teamId: row.teamId, + teamName: row.teamName, + }); + }); + + app.post("/api/slack/install-url", async (c) => { + if (!clientId || !stateSecret) { + return c.json({ error: "slack not configured" }, 503); + } + const callbackRedirectUrl = resolveSlackRedirectUrl(c, redirectUrl); + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + + const state = signState( + { orgId: ctx.orgId, projectId: ctx.projectId, userId: ctx.userId }, + stateSecret, + ); + const url = new URL("https://slack.com/oauth/v2/authorize"); + url.searchParams.set("client_id", clientId); + url.searchParams.set("scope", SCOPES); + url.searchParams.set("redirect_uri", callbackRedirectUrl); + url.searchParams.set("state", state); + log.info( + { org_id: ctx.orgId, project_id: ctx.projectId, redirect_uri: callbackRedirectUrl }, + "slack install url created", + ); + return c.json({ url: url.toString() }); + }); + + app.post("/api/slack/uninstall", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const row = await findInstallation(ctx.projectId); + if (!row) return c.json({ ok: true }); + + // Best-effort remote revoke; don't block on failure. + try { + await fetch("https://slack.com/api/auth.revoke", { + method: "POST", + headers: { authorization: `Bearer ${row.botAccessToken}` }, + }); + } catch (e) { + log.warn({ err: e }, "auth.revoke failed"); + } + + await db + .update(schema.slackInstallations) + .set({ revokedAt: new Date() }) + .where(eq(schema.slackInstallations.id, row.id)); + return c.json({ ok: true }); + }); + + app.get("/api/slack/channels", async (c) => { + const ctx = await resolveUserOrg(c); + if (!ctx) return c.json({ error: "no org for user" }, 404); + const row = await findInstallation(ctx.projectId); + if (!row) return c.json({ error: "slack not installed" }, 404); + + const result = await listSlackChannels(row.botAccessToken); + if (!result.ok) { + log.warn({ team_id: row.teamId, error: result.error }, "slack conversations.list failed"); + if (result.error === "not_authed" || result.error === "token_revoked") { + await db + .update(schema.slackInstallations) + .set({ revokedAt: new Date() }) + .where(eq(schema.slackInstallations.id, row.id)); + } + return c.json({ error: result.error }, 502); + } + return c.json({ channels: result.channels }); + }); + + app.get("/api/projects/:projectId/slack-route", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const install = await findInstallation(projectId); + if (!install || !install.channelId) return c.json({ configured: false }); + return c.json({ + configured: true, + channelId: install.channelId, + channelName: install.channelName, + }); + }); + + app.put("/api/projects/:projectId/slack-route", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const install = await findInstallation(projectId); + if (!install) return c.json({ error: "slack not installed" }, 400); + + const body = (await c.req.json().catch(() => ({}))) as { + channelId?: unknown; + channelName?: unknown; + }; + const channelId = typeof body.channelId === "string" ? body.channelId : ""; + const channelName = typeof body.channelName === "string" ? body.channelName : null; + if (!channelId) return c.json({ error: "channelId required" }, 400); + + await db + .update(schema.slackInstallations) + .set({ channelId, channelName }) + .where(eq(schema.slackInstallations.id, install.id)); + return c.json({ ok: true, channelId, channelName }); + }); + + app.delete("/api/projects/:projectId/slack-route", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const install = await findInstallation(projectId); + if (install) { + await db + .update(schema.slackInstallations) + .set({ channelId: null, channelName: null }) + .where(eq(schema.slackInstallations.id, install.id)); + } + return c.json({ ok: true }); + }); +} + +async function findInstallation(projectId: string) { + return db.query.slackInstallations.findFirst({ + where: and( + eq(schema.slackInstallations.projectId, projectId), + isNull(schema.slackInstallations.revokedAt), + ), + }); +} + +async function upsertInstallation(v: { + projectId: string; + teamId: string; + teamName: string | null; + botUserId: string | null; + botAccessToken: string; + scope: string | null; + installedByUserId: string | null; +}): Promise { + await db + .insert(schema.slackInstallations) + .values({ + projectId: v.projectId, + teamId: v.teamId, + teamName: v.teamName, + botUserId: v.botUserId, + botAccessToken: v.botAccessToken, + scope: v.scope, + installedByUserId: v.installedByUserId, + installedAt: new Date(), + }) + .onConflictDoUpdate({ + target: [schema.slackInstallations.projectId, schema.slackInstallations.teamId], + set: { + teamName: v.teamName, + botUserId: v.botUserId, + botAccessToken: v.botAccessToken, + scope: v.scope, + installedByUserId: v.installedByUserId, + revokedAt: null, + // Reinstall mints a fresh bot token and invalidates the old one, so + // record the refresh time — this is what the team-wide fallback orders + // by to find the row holding the currently-live token. + installedAt: new Date(), + }, + }); +} + +async function handleSlackEventEnvelope(payload: SlackEventEnvelope): Promise { + const event = payload.event; + if (!event || event.type !== "message") return; + if (event.subtype || event.bot_id) return; + if (!event.channel || !event.thread_ts || !event.ts || event.thread_ts === event.ts) return; + if (typeof event.text !== "string" || event.text.trim().length === 0) return; + + const incident = await db.query.incidents.findFirst({ + where: and( + eq(schema.incidents.slackChannelId, event.channel), + eq(schema.incidents.slackThreadTs, event.thread_ts), + ), + }); + if (!incident) return; + + const agentRun = await db.query.agentRuns.findFirst({ + where: eq(schema.agentRuns.incidentId, incident.id), + orderBy: [desc(schema.agentRuns.createdAt)], + }); + if (!agentRun || agentRun.state !== "awaiting_human") return; + + await db + .insert(schema.incidentEvents) + .values({ + agentRunId: agentRun.id, + kind: "human_reply", + summary: event.text.trim(), + detail: { + slackEventId: payload.event_id ?? null, + slackUserId: event.user ?? null, + slackChannelId: event.channel, + slackThreadTs: event.thread_ts, + slackMessageTs: event.ts, + }, + dedupeKey: payload.event_id + ? `slack:${payload.event_id}` + : `slack:${event.channel}:${event.ts}`, + }) + .onConflictDoNothing({ + target: [schema.incidentEvents.agentRunId, schema.incidentEvents.dedupeKey], + }); +} + +async function resolveUserOrg( + c: Context<{ Variables: Vars }>, +): Promise<{ userId: string; orgId: string; projectId: string } | null> { + const userId = c.var.userId; + if (!userId) return null; + const ctx = await resolveActiveOrgContext({ + userId, + preferredOrgId: c.var.orgId, + }).catch(() => null); + if (!ctx) return null; + return { userId: ctx.user.id, orgId: ctx.org.id, projectId: ctx.project.id }; +} + +async function requireProjectAccess( + c: Context<{ Variables: Vars }>, + projectId: string, +): Promise<{ userId: string; orgId: string }> { + const ctx = await resolveUserOrg(c); + if (!ctx) throw new HTTPException(401, { message: "not authenticated" }); + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + if (project.orgId !== ctx.orgId) throw new HTTPException(403, { message: "forbidden" }); + return ctx; +} + +// `userId` is the installer when the install was kicked off from the +// dashboard's authed flow; for the skill kickoff we don't have a signed-in +// user at issue time so it can be null. `userCode` is set only for +// skill-flow installs and is what the callback uses to bounce the user +// back to /activate on completion. +type StatePayload = { + orgId: string; + projectId: string; + userId: string | null; + userCode?: string; +}; + +function signState(p: StatePayload, secret: string): string { + const body = `${p.orgId}.${p.projectId}.${p.userId ?? ""}.${p.userCode ?? ""}.${Date.now()}`; + const sig = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + return `${Buffer.from(body, "utf8").toString("base64url")}.${sig}`; +} + +function verifyState(state: string, secret: string): StatePayload | null { + const [payloadB64, sig] = state.split("."); + if (!payloadB64 || !sig) return null; + const body = Buffer.from(payloadB64, "base64url").toString("utf8"); + const expected = crypto.createHmac("sha256", secret).update(body).digest("base64url"); + const provided = Buffer.from(sig); + const expectedBuf = Buffer.from(expected); + if (provided.length !== expectedBuf.length) return null; + if (!crypto.timingSafeEqual(provided, expectedBuf)) return null; + const parts = body.split("."); + // Current format is `${orgId}.${projectId}.${userId}.${userCode}.${ts}` (5 + // parts). Older 3- or 4-part states (no projectId) are no longer accepted — + // they expire after 10 min anyway, so the only impact is users who started + // an install flow within ~10 min of the deploy seeing an "invalid state" + // error and having to click install again. + if (parts.length !== 5) return null; + const [orgId, projectId, userId, userCodeRaw, tsRaw] = parts as [ + string, + string, + string, + string, + string, + ]; + if (!orgId || !projectId || !tsRaw) return null; + const ts = Number(tsRaw); + if (!Number.isFinite(ts) || Date.now() - ts > 10 * 60 * 1000) return null; + return { orgId, projectId, userId: userId || null, userCode: userCodeRaw || undefined }; +} + +function resolveCallbackWebOrigin(c: Context, configuredWebOrigin: string): string { + const host = c.req.header("host") ?? ""; + if ( + host === "localhost:4100" || + host === "127.0.0.1:4100" || + configuredWebOrigin.endsWith(".superlog.localhost:1355") + ) { + return "http://localhost:5173"; + } + return configuredWebOrigin; +} + +function resolveSlackRedirectUrl(c: Context, configuredRedirectUrl: string): string { + const origin = c.req.header("origin") ?? ""; + const host = c.req.header("host") ?? ""; + if ( + origin === "http://localhost:5173" || + origin === "http://127.0.0.1:5173" || + host === "localhost:4100" || + host === "127.0.0.1:4100" + ) { + return "http://localhost:4100/slack/oauth/callback"; + } + return configuredRedirectUrl; +} + +function verifySlackSignature(c: Context, signingSecret: string, rawBody: string): boolean { + const signature = c.req.header("x-slack-signature"); + const timestamp = c.req.header("x-slack-request-timestamp"); + if (!signature || !timestamp) return false; + + const timestampSeconds = Number(timestamp); + if (!Number.isFinite(timestampSeconds)) return false; + if (Math.abs(Math.floor(Date.now() / 1000) - timestampSeconds) > 60 * 5) return false; + + const base = `v0:${timestamp}:${rawBody}`; + const expected = `v0=${crypto.createHmac("sha256", signingSecret).update(base).digest("hex")}`; + const providedBuffer = Buffer.from(signature, "utf8"); + const expectedBuffer = Buffer.from(expected, "utf8"); + if (providedBuffer.length !== expectedBuffer.length) return false; + return crypto.timingSafeEqual(providedBuffer, expectedBuffer); +} + +type SlackOAuthResponse = { + ok: boolean; + error?: string; + access_token?: string; + scope?: string; + bot_user_id?: string; + team?: { id?: string; name?: string }; +}; + +type SlackConversationsList = { + ok: boolean; + error?: string; + channels?: { id: string; name: string; is_private?: boolean }[]; + response_metadata?: { next_cursor?: string }; +}; + +export type SlackChannelSummary = { id: string; name: string; isPrivate: boolean }; + +export type ListSlackChannelsResult = + | { ok: true; channels: SlackChannelSummary[] } + | { ok: false; error: string }; + +// Slack's conversations.list returns at most `limit` channels per page; a big +// workspace needs cursor pagination or the list silently truncates — and a +// private channel the bot was invited to can fall off the end and "disappear" +// from the dropdown. Walk every page (capped) and aggregate. Note: even with +// groups:read, Slack only returns private channels the bot is a *member* of, +// so the user still has to `/invite` the bot to a private channel for it to +// show up at all. +export async function listSlackChannels( + token: string, + fetchImpl: typeof fetch = fetch, +): Promise { + const channels: SlackChannelSummary[] = []; + let cursor: string | undefined; + // Hard page cap (200 * 50 = 10k channels) so a misbehaving cursor can't loop. + for (let page = 0; page < 50; page++) { + const url = new URL("https://slack.com/api/conversations.list"); + url.searchParams.set("types", "public_channel,private_channel"); + url.searchParams.set("exclude_archived", "true"); + url.searchParams.set("limit", "200"); + if (cursor) url.searchParams.set("cursor", cursor); + const res = await fetchImpl(url, { + headers: { authorization: `Bearer ${token}` }, + }); + const data = (await res.json()) as SlackConversationsList; + if (!data.ok) return { ok: false, error: data.error ?? "unknown" }; + for (const ch of data.channels ?? []) { + channels.push({ id: ch.id, name: ch.name, isPrivate: ch.is_private ?? false }); + } + cursor = data.response_metadata?.next_cursor || undefined; + if (!cursor) break; + } + if (cursor) return { ok: false, error: "pagination_limit_exceeded" }; + return { ok: true, channels }; +} + +// Slack interactivity envelope. `view.state.values` is keyed by block_id +// then action_id; for the feedback modal that's +// `state.values.feedback_body.value.value` (block_id="feedback_body", +// action_id="value", input type plain_text_input). +type SlackInteractivityPayload = { + type?: string; + trigger_id?: string; + team?: { id?: string }; + user?: { id?: string; name?: string }; + actions?: Array<{ action_id?: string; value?: string }>; + view?: { + callback_id?: string; + state?: { + values?: { + feedback_body?: { + value?: { value?: string }; + }; + }; + }; + }; +}; + +type SlackEventEnvelope = { + type?: string; + challenge?: string; + event_id?: string; + event?: { + type?: string; + subtype?: string; + text?: string; + channel?: string; + thread_ts?: string; + ts?: string; + user?: string; + bot_id?: string; + }; +}; diff --git a/superlog/apps/api/src/sourcemaps.test.ts b/superlog/apps/api/src/sourcemaps.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..10e487bfe37948c35af02925e53f1df798790cb4 --- /dev/null +++ b/superlog/apps/api/src/sourcemaps.test.ts @@ -0,0 +1,87 @@ +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { test } from "node:test"; +import { gunzipSync } from "node:zlib"; +import { + type SourceMapObjectStore, + prepareSourceMapUpload, + sourceMapObjectKey, + sourceMapUploadSchema, +} from "./sourcemaps.js"; + +const sourceMap = JSON.stringify({ + version: 3, + debugId: "debug-123", + sources: ["app/index.tsx"], + mappings: "AAAA", +}); + +test("prepareSourceMapUpload verifies source map hash and compresses content", () => { + const input = sourceMapUploadSchema.parse({ + platform: "ios", + release: "app@1.0.0+1", + debugId: "debug-123", + mapFile: "dist/ios-main.hbc.map", + sourceMap, + sourceMapHash: createHash("sha256").update(sourceMap).digest("hex"), + sourceMapBytes: Buffer.byteLength(sourceMap), + }); + + const prepared = prepareSourceMapUpload(input); + + assert.equal(prepared.sourceMapBytes, Buffer.byteLength(sourceMap)); + assert.equal(prepared.input.release, "app@1.0.0+1"); + assert.equal(gunzipSync(prepared.content).toString("utf8"), sourceMap); +}); + +test("prepareSourceMapUpload rejects mismatched hashes", () => { + const input = sourceMapUploadSchema.parse({ + platform: "ios", + release: "app@1.0.0+1", + mapFile: "dist/ios-main.hbc.map", + sourceMap, + sourceMapHash: "0".repeat(64), + sourceMapBytes: Buffer.byteLength(sourceMap), + }); + + assert.throws(() => prepareSourceMapUpload(input), /sourceMapHash/); +}); + +test("sourceMapObjectKey builds deterministic project-scoped S3 keys", () => { + assert.equal( + sourceMapObjectKey({ + prefix: "/source-maps/", + projectId: "project-123", + platform: "ios/simulator", + sourceMapHash: "abcdef".padEnd(64, "0"), + }), + "source-maps/project-123/ios_simulator/ab/abcdef0000000000000000000000000000000000000000000000000000000000.map.gz", + ); +}); + +test("source map object stores receive compressed content outside Postgres", async () => { + const input = sourceMapUploadSchema.parse({ + platform: "ios", + release: "app@1.0.0+1", + mapFile: "dist/ios-main.hbc.map", + sourceMap, + sourceMapHash: createHash("sha256").update(sourceMap).digest("hex"), + sourceMapBytes: Buffer.byteLength(sourceMap), + }); + const prepared = prepareSourceMapUpload(input); + const stored: { bytes: Buffer; projectId: string }[] = []; + const store: SourceMapObjectStore = { + async putSourceMapObject(upload) { + stored.push({ bytes: upload.artifact.content, projectId: upload.projectId }); + return { bucket: "source-map-bucket", key: "source-maps/project/hash.map.gz" }; + }, + }; + + const object = await store.putSourceMapObject({ projectId: "project-123", artifact: prepared }); + + assert.equal(object.bucket, "source-map-bucket"); + assert.equal(stored[0]?.projectId, "project-123"); + const storedObject = stored[0]; + assert.ok(storedObject); + assert.equal(gunzipSync(storedObject.bytes).toString("utf8"), sourceMap); +}); diff --git a/superlog/apps/api/src/sourcemaps.ts b/superlog/apps/api/src/sourcemaps.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69afd37d823ce6a73e945dfef651cd1f3ebaeb0 --- /dev/null +++ b/superlog/apps/api/src/sourcemaps.ts @@ -0,0 +1,236 @@ +import { createHash } from "node:crypto"; +import { gzipSync } from "node:zlib"; +import { GetObjectCommand, PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import type { DB } from "@superlog/db"; +import * as schema from "@superlog/db/schema"; +import { and, eq } from "drizzle-orm"; +import { z } from "zod"; + +const MAX_SOURCE_MAP_BYTES = 25 * 1024 * 1024; + +export const sourceMapUploadSchema = z.object({ + platform: z.string().min(1).max(32), + release: z.string().min(1).max(200), + dist: z.string().min(1).max(200).optional(), + debugId: z.string().min(1).max(200).optional(), + bundleFile: z.string().min(1).max(500).optional(), + mapFile: z.string().min(1).max(500), + sourceMap: z.string().min(2), + sourceMapHash: z.string().regex(/^[a-f0-9]{64}$/), + sourceMapBytes: z.number().int().positive().max(MAX_SOURCE_MAP_BYTES), +}); + +export type SourceMapUploadInput = z.infer; + +export type StoredSourceMapObject = { + bucket: string; + key: string; +}; + +export type SourceMapObjectStore = { + putSourceMapObject(input: { + projectId: string; + artifact: PreparedSourceMapUpload; + }): Promise; +}; + +export type SourceMapObjectReader = { + getSourceMapObject(input: StoredSourceMapObject): Promise; +}; + +export class S3SourceMapObjectStore implements SourceMapObjectStore, SourceMapObjectReader { + private readonly s3: S3Client; + + constructor( + private readonly config: { + bucket: string; + prefix?: string; + region?: string; + endpoint?: string; + }, + ) { + if (!config.bucket) throw new Error("source map bucket is required"); + this.s3 = new S3Client({ + region: config.region, + endpoint: config.endpoint, + forcePathStyle: Boolean(config.endpoint), + }); + } + + async putSourceMapObject(input: { + projectId: string; + artifact: PreparedSourceMapUpload; + }): Promise { + const key = sourceMapObjectKey({ + prefix: this.config.prefix ?? "source-maps", + projectId: input.projectId, + platform: input.artifact.input.platform, + sourceMapHash: input.artifact.sourceMapHash, + }); + await this.s3.send( + new PutObjectCommand({ + Bucket: this.config.bucket, + Key: key, + Body: input.artifact.content, + ContentType: "application/json", + ContentEncoding: "gzip", + Metadata: { + project_id: input.projectId, + platform: input.artifact.input.platform, + release: input.artifact.input.release, + source_map_hash: input.artifact.sourceMapHash, + }, + }), + ); + return { bucket: this.config.bucket, key }; + } + + async getSourceMapObject(input: StoredSourceMapObject): Promise { + const output = await this.s3.send( + new GetObjectCommand({ + Bucket: input.bucket, + Key: input.key, + }), + ); + if (!output.Body) throw new Error("source map object response is missing body"); + return Buffer.from(await output.Body.transformToByteArray()); + } +} + +export function sourceMapObjectStoreFromEnv( + env: NodeJS.ProcessEnv, +): (SourceMapObjectStore & SourceMapObjectReader) | null { + const bucket = env.SOURCE_MAP_BUCKET; + if (!bucket) return null; + return new S3SourceMapObjectStore({ + bucket, + prefix: env.SOURCE_MAP_PREFIX || "source-maps", + region: env.AWS_REGION || env.AWS_DEFAULT_REGION || undefined, + endpoint: env.AWS_ENDPOINT_URL_S3 || env.S3_ENDPOINT_URL || undefined, + }); +} + +export type PreparedSourceMapUpload = { + input: SourceMapUploadInput; + content: Buffer; + sourceMapHash: string; + sourceMapBytes: number; +}; + +export function prepareSourceMapUpload(input: SourceMapUploadInput): { + input: SourceMapUploadInput; + content: Buffer; + sourceMapHash: string; + sourceMapBytes: number; +} { + const sourceMapBytes = Buffer.byteLength(input.sourceMap); + if (sourceMapBytes !== input.sourceMapBytes) { + throw new Error("sourceMapBytes does not match sourceMap byte length"); + } + const sourceMapHash = createHash("sha256").update(input.sourceMap).digest("hex"); + if (sourceMapHash !== input.sourceMapHash) { + throw new Error("sourceMapHash does not match sourceMap content"); + } + const parsed = JSON.parse(input.sourceMap) as { sources?: unknown }; + if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.sources)) { + throw new Error("sourceMap must be a JSON source map with a sources array"); + } + return { + input, + content: gzipSync(input.sourceMap), + sourceMapHash, + sourceMapBytes, + }; +} + +export async function storeSourceMapArtifact(opts: { + database: DB; + projectId: string; + uploadedByOrgApiKeyId: string | null; + objectStore: SourceMapObjectStore; + input: SourceMapUploadInput; +}): Promise { + const database = opts.database; + const prepared = prepareSourceMapUpload(opts.input); + const storedObject = await opts.objectStore.putSourceMapObject({ + projectId: opts.projectId, + artifact: prepared, + }); + const now = new Date(); + + if (opts.input.debugId) { + const existing = await database.query.sourceMapArtifacts.findFirst({ + where: and( + eq(schema.sourceMapArtifacts.projectId, opts.projectId), + eq(schema.sourceMapArtifacts.debugId, opts.input.debugId), + ), + }); + if (existing) { + const [row] = await database + .update(schema.sourceMapArtifacts) + .set({ + platform: opts.input.platform, + release: opts.input.release, + dist: opts.input.dist ?? null, + bundleFile: opts.input.bundleFile ?? null, + mapFile: opts.input.mapFile, + sourceMapHash: prepared.sourceMapHash, + sourceMapBytes: prepared.sourceMapBytes, + storageBucket: storedObject.bucket, + storageKey: storedObject.key, + contentEncoding: "gzip", + uploadedByOrgApiKeyId: opts.uploadedByOrgApiKeyId, + updatedAt: now, + }) + .where(eq(schema.sourceMapArtifacts.id, existing.id)) + .returning(); + if (!row) throw new Error("failed to update source map artifact"); + return row; + } + } + + const [row] = await database + .insert(schema.sourceMapArtifacts) + .values({ + projectId: opts.projectId, + platform: opts.input.platform, + release: opts.input.release, + dist: opts.input.dist ?? null, + debugId: opts.input.debugId ?? null, + bundleFile: opts.input.bundleFile ?? null, + mapFile: opts.input.mapFile, + sourceMapHash: prepared.sourceMapHash, + sourceMapBytes: prepared.sourceMapBytes, + storageBucket: storedObject.bucket, + storageKey: storedObject.key, + contentEncoding: "gzip", + uploadedByOrgApiKeyId: opts.uploadedByOrgApiKeyId, + }) + .returning(); + if (!row) throw new Error("failed to insert source map artifact"); + return row; +} + +export function sourceMapObjectKey(input: { + prefix: string; + projectId: string; + platform: string; + sourceMapHash: string; +}): string { + const prefix = trimSlashes(input.prefix) || "source-maps"; + return [ + prefix, + input.projectId, + sanitizePathSegment(input.platform), + input.sourceMapHash.slice(0, 2), + `${input.sourceMapHash}.map.gz`, + ].join("/"); +} + +function sanitizePathSegment(value: string): string { + return value.replace(/[^a-zA-Z0-9._-]/g, "_"); +} + +function trimSlashes(value: string): string { + return value.replace(/^\/+|\/+$/g, ""); +} diff --git a/superlog/apps/api/src/staff.ts b/superlog/apps/api/src/staff.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0131eaf0384bb68f277aba5f5d0e6abc779e0f8 --- /dev/null +++ b/superlog/apps/api/src/staff.ts @@ -0,0 +1,28 @@ +import { db, schema } from "@superlog/db"; +import { eq } from "drizzle-orm"; +import { HTTPException } from "hono/http-exception"; + +// Staff gate for the remaining operational routes. +// +// Staff is anyone whose user row has "admin" in the Better Auth admin plugin's +// `role` column (comma-separated list). Grant/revoke at runtime via SQL or +// `authClient.admin.setRole` — no redeploy required. +export function userIsStaff(role: string | null | undefined): boolean { + if (!role) return false; + return role.split(",").some((r) => r.trim() === "admin"); +} + +export async function isStaff(userId: string): Promise { + const user = await db.query.users.findFirst({ where: eq(schema.users.id, userId) }); + // Banned admins lose access here too — Better Auth's session middleware + // already gates banned users, but defense-in-depth in case that gate is + // ever bypassed or misconfigured. + if (!user || user.banned) return false; + return userIsStaff(user.role); +} + +export async function requireStaff(userId: string): Promise { + if (!(await isStaff(userId))) { + throw new HTTPException(403, { message: "admin access required" }); + } +} diff --git a/superlog/apps/api/src/symbolication.test.ts b/superlog/apps/api/src/symbolication.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c1dd0f16f9900527f82a898aac1afcf1c479705 --- /dev/null +++ b/superlog/apps/api/src/symbolication.test.ts @@ -0,0 +1,331 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { gzipSync } from "node:zlib"; +import type { DB, IssueSample } from "@superlog/db"; +import type * as schema from "@superlog/db/schema"; +import { + findSourceMapArtifact, + symbolicateIssueSample, + symbolicateStacktraceWithArtifact, + symbolicateTelemetrySample, + symbolicationAttrsForSample, +} from "./symbolication.js"; + +const sourceMap = JSON.stringify({ + version: 3, + file: "index.android.bundle", + sources: ["app/index.tsx"], + names: ["HomeScreen"], + mappings: "AAAAA", +}); + +const artifact = { + id: "artifact-1", + projectId: "project-1", + platform: "android", + release: "juno@1.2.3", + dist: null, + debugId: null, + bundleFile: "index.android.bundle", + mapFile: "index.android.bundle.map", + sourceMapHash: "a".repeat(64), + sourceMapBytes: Buffer.byteLength(sourceMap), + storageBucket: "source-map-bucket", + storageKey: "source-maps/project-1/android/hash.map.gz", + contentEncoding: "gzip", + uploadedByOrgApiKeyId: null, + createdAt: new Date("2026-06-02T00:00:00.000Z"), + updatedAt: new Date("2026-06-02T00:00:00.000Z"), +} satisfies schema.SourceMapArtifact; + +test("symbolicateStacktraceWithArtifact rewrites generated stack frames", () => { + const result = symbolicateStacktraceWithArtifact({ + stacktrace: "TypeError: bad\n at useMemoCache (index.android.bundle:1:1)", + sourceMap, + artifact, + }); + + assert.ok(result); + assert.equal(result.stacktrace, "TypeError: bad\n at HomeScreen (app/index.tsx:1:1)"); + assert.deepEqual(result.frames[0], { + functionName: "HomeScreen", + source: "app/index.tsx", + line: 1, + column: 1, + generatedFile: "index.android.bundle", + generatedLine: 1, + generatedColumn: 1, + }); +}); + +test("symbolicateStacktraceWithArtifact infers original function names from source content", () => { + const sourceMapWithoutNames = JSON.stringify({ + version: 3, + file: "entry.js", + sources: ["/app/(tabs)/index.tsx"], + sourcesContent: [ + [ + "async function emitError() {", + " const superlog = await ensureSuperlog();", + " superlog?.captureException(new Error('Expo SDK demo error'), { component: 'home' });", + "}", + ].join("\n"), + ], + names: [], + mappings: "AAAA", + }); + + const result = symbolicateStacktraceWithArtifact({ + stacktrace: "Error: Expo SDK demo error\n at L (entry.js:1:1)", + sourceMap: sourceMapWithoutNames, + artifact: { ...artifact, platform: "web" }, + }); + + assert.ok(result); + assert.equal( + result.stacktrace, + "Error: Expo SDK demo error\n at emitError (/app/(tabs)/index.tsx:1:1)", + ); + assert.equal(result.frames[0]?.functionName, "emitError"); +}); + +test("symbolicationAttrsForSample extracts release, platform, dist, and debug id", () => { + const sample = { + kind: "log", + service: "juno", + severity: "ERROR", + message: "bad", + body: "bad", + exceptionType: "TypeError", + topFrame: null, + normalizedFrames: [], + stacktrace: "TypeError: bad\n at index.android.bundle:1:1", + seenAt: "2026-06-02T00:00:00.000Z", + logAttrs: { + "service.version": "juno@1.2.3", + "device.platform": "Android", + "expo.update_id": "update-1", + "sourcemap.debug_id": "debug-1", + }, + resourceAttrs: null, + } satisfies IssueSample; + + assert.deepEqual(symbolicationAttrsForSample(sample), { + debugId: "debug-1", + release: "juno@1.2.3", + dist: "update-1", + platform: "android", + }); +}); + +test("symbolicateIssueSample loads matching source map object and symbolicates", async () => { + const sample = { + kind: "log", + service: "juno", + severity: "ERROR", + message: "bad", + body: "bad", + exceptionType: "TypeError", + topFrame: null, + normalizedFrames: [], + stacktrace: "TypeError: bad\n at useMemoCache (index.android.bundle:1:1)", + seenAt: "2026-06-02T00:00:00.000Z", + logAttrs: { + "service.version": "juno@1.2.3", + "device.platform": "android", + }, + resourceAttrs: null, + } satisfies IssueSample; + const database = { + query: { + sourceMapArtifacts: { + findFirst: async () => null, + findMany: async () => [artifact], + }, + }, + } as unknown as DB; + + const result = await symbolicateIssueSample({ + database, + objectReader: { + async getSourceMapObject(input) { + assert.equal(input.bucket, "source-map-bucket"); + assert.equal(input.key, "source-maps/project-1/android/hash.map.gz"); + return gzipSync(sourceMap); + }, + }, + projectId: "project-1", + sample, + }); + + assert.ok(result); + assert.equal(result.artifact.id, "artifact-1"); + assert.equal(result.frames[0]?.source, "app/index.tsx"); +}); + +test("symbolicateTelemetrySample symbolicates logs without issue rows", async () => { + const database = { + query: { + sourceMapArtifacts: { + findFirst: async () => null, + findMany: async () => [artifact], + }, + }, + } as unknown as DB; + + const result = await symbolicateTelemetrySample({ + database, + objectReader: { + async getSourceMapObject(input) { + assert.equal(input.bucket, "source-map-bucket"); + assert.equal(input.key, "source-maps/project-1/android/hash.map.gz"); + return gzipSync(sourceMap); + }, + }, + projectId: "project-1", + sample: { + stacktrace: "TypeError: bad\n at useMemoCache (index.android.bundle:1:1)", + logAttrs: { + "service.version": "juno@1.2.3", + "device.platform": "android", + }, + resourceAttrs: null, + }, + }); + + assert.ok(result); + assert.equal(result.artifact.id, "artifact-1"); + assert.equal(result.frames[0]?.source, "app/index.tsx"); +}); + +test("symbolicateTelemetrySample returns null when a log has no stacktrace", async () => { + const result = await symbolicateTelemetrySample({ + database: {} as DB, + objectReader: null, + projectId: "project-1", + sample: { + stacktrace: null, + logAttrs: null, + resourceAttrs: null, + }, + }); + + assert.equal(result, null); +}); + +test("findSourceMapArtifact prefers artifact matching generated stack frame file", async () => { + const entryArtifact = { + ...artifact, + id: "entry-artifact", + platform: "web", + bundleFile: "dist/_expo/static/js/web/entry-abc123.js", + mapFile: "dist/_expo/static/js/web/entry-abc123.js.map", + createdAt: new Date("2026-06-02T00:00:00.000Z"), + updatedAt: new Date("2026-06-02T00:00:00.000Z"), + } satisfies schema.SourceMapArtifact; + const indexArtifact = { + ...artifact, + id: "index-artifact", + platform: "web", + bundleFile: "dist/_expo/static/js/web/index-def456.js", + mapFile: "dist/_expo/static/js/web/index-def456.js.map", + createdAt: new Date("2026-06-02T00:01:00.000Z"), + updatedAt: new Date("2026-06-02T00:01:00.000Z"), + } satisfies schema.SourceMapArtifact; + const database = { + query: { + sourceMapArtifacts: { + findFirst: async () => null, + findMany: async () => [indexArtifact, entryArtifact], + }, + }, + } as unknown as DB; + + const result = await findSourceMapArtifact({ + database, + projectId: "project-1", + attrs: { + debugId: null, + release: "juno@1.2.3", + dist: null, + platform: "web", + }, + stacktrace: + "TypeError: bad\n at useMemoCache (https://app.example.com/_expo/static/js/web/entry-abc123.js:1:1)", + }); + + assert.equal(result?.id, "entry-artifact"); +}); + +test("findSourceMapArtifact falls back to generated stack frame file when release is missing", async () => { + const entryArtifact = { + ...artifact, + id: "entry-artifact", + platform: "web", + release: "expo-test-2@local", + bundleFile: "dist-superlog/_expo/static/js/web/entry-90d9514ed4f128f73d2feaf2e08ff315.js", + mapFile: "dist-superlog/_expo/static/js/web/entry-90d9514ed4f128f73d2feaf2e08ff315.js.map", + createdAt: new Date("2026-06-02T00:00:00.000Z"), + updatedAt: new Date("2026-06-02T00:00:00.000Z"), + } satisfies schema.SourceMapArtifact; + const database = { + query: { + sourceMapArtifacts: { + findFirst: async () => null, + findMany: async () => [entryArtifact], + }, + }, + } as unknown as DB; + + const result = await findSourceMapArtifact({ + database, + projectId: "project-1", + attrs: { + debugId: null, + release: null, + dist: null, + platform: null, + }, + stacktrace: + "Error: Expo SDK demo error\n at L (http://localhost:8093/_expo/static/js/web/entry-90d9514ed4f128f73d2feaf2e08ff315.js:1095:1077)", + }); + + assert.equal(result?.id, "entry-artifact"); +}); + +test("findSourceMapArtifact falls back to generated stack frame file when release attrs do not match upload release", async () => { + const entryArtifact = { + ...artifact, + id: "entry-artifact", + platform: "web", + release: "expo-test-2@local", + dist: null, + bundleFile: "dist-superlog/_expo/static/js/web/entry-90d9514ed4f128f73d2feaf2e08ff315.js", + mapFile: "dist-superlog/_expo/static/js/web/entry-90d9514ed4f128f73d2feaf2e08ff315.js.map", + createdAt: new Date("2026-06-02T00:00:00.000Z"), + updatedAt: new Date("2026-06-02T00:00:00.000Z"), + } satisfies schema.SourceMapArtifact; + const database = { + query: { + sourceMapArtifacts: { + findFirst: async () => null, + findMany: async (_query: unknown) => [entryArtifact], + }, + }, + } as unknown as DB; + + const result = await findSourceMapArtifact({ + database, + projectId: "project-1", + attrs: { + debugId: null, + release: "1.0.0", + dist: "embedded", + platform: "web", + }, + stacktrace: + "Error: Expo SDK demo error\n at L (http://localhost:8093/_expo/static/js/web/entry-90d9514ed4f128f73d2feaf2e08ff315.js:1095:1077)", + }); + + assert.equal(result?.id, "entry-artifact"); +}); diff --git a/superlog/apps/api/src/symbolication.ts b/superlog/apps/api/src/symbolication.ts new file mode 100644 index 0000000000000000000000000000000000000000..8c6377c5dc56683e203b11b25632fd7dc9cd3332 --- /dev/null +++ b/superlog/apps/api/src/symbolication.ts @@ -0,0 +1,399 @@ +import { gunzipSync } from "node:zlib"; +import { GREATEST_LOWER_BOUND, TraceMap, originalPositionFor } from "@jridgewell/trace-mapping"; +import type { SourceMapInput } from "@jridgewell/trace-mapping"; +import type { DB, IssueSample } from "@superlog/db"; +import * as schema from "@superlog/db/schema"; +import { and, desc, eq } from "drizzle-orm"; +import type { SourceMapObjectReader } from "./sourcemaps.js"; + +export type SymbolicatedFrame = { + functionName: string | null; + source: string; + line: number; + column: number; + generatedFile: string; + generatedLine: number; + generatedColumn: number; +}; + +export type IssueSymbolication = { + artifact: { + id: string; + release: string; + dist: string | null; + platform: string; + debugId: string | null; + }; + stacktrace: string; + frames: SymbolicatedFrame[]; +}; + +type StackFrameLine = { + raw: string; + prefix: string; + functionName: string | null; + file: string; + line: number; + column: number; + suffix: string; +}; + +type SymbolicationAttrs = { + debugId: string | null; + release: string | null; + dist: string | null; + platform: string | null; +}; + +type RawSourceMap = { + sources?: unknown; + sourcesContent?: unknown; +}; + +type TelemetrySymbolicationSample = { + stacktrace: string | null; + logAttrs?: Record | null; + resourceAttrs?: Record | null; + spanAttrs?: Record | null; +}; + +export async function symbolicateIssueSample(opts: { + database: DB; + objectReader: SourceMapObjectReader | null; + projectId: string; + sample: IssueSample | null | undefined; +}): Promise { + return symbolicateTelemetrySample(opts); +} + +export async function symbolicateTelemetrySample(opts: { + database: DB; + objectReader: SourceMapObjectReader | null; + projectId: string; + sample: TelemetrySymbolicationSample | null | undefined; +}): Promise { + if (!opts.objectReader || !opts.sample?.stacktrace) return null; + + const attrs = symbolicationAttrsForSample(opts.sample); + const artifact = await findSourceMapArtifact({ + database: opts.database, + projectId: opts.projectId, + attrs, + stacktrace: opts.sample.stacktrace, + }); + if (!artifact) return null; + + const gzippedMap = await opts.objectReader.getSourceMapObject({ + bucket: artifact.storageBucket, + key: artifact.storageKey, + }); + const mapJson = gunzipSync(gzippedMap).toString("utf8"); + return symbolicateStacktraceWithArtifact({ + stacktrace: opts.sample.stacktrace, + sourceMap: mapJson, + artifact, + }); +} + +export async function findSourceMapArtifact(opts: { + database: DB; + projectId: string; + attrs: SymbolicationAttrs; + stacktrace?: string | null; +}): Promise { + const stackFiles = stackFrameFiles(opts.stacktrace); + if (opts.attrs.debugId) { + const byDebugId = await opts.database.query.sourceMapArtifacts.findFirst({ + where: and( + eq(schema.sourceMapArtifacts.projectId, opts.projectId), + eq(schema.sourceMapArtifacts.debugId, opts.attrs.debugId), + ), + }); + if (byDebugId) return byDebugId; + } + + if (!opts.attrs.release) return findProjectArtifactMatchingStackFile(opts, stackFiles); + + const rows = await opts.database.query.sourceMapArtifacts.findMany({ + where: and( + eq(schema.sourceMapArtifacts.projectId, opts.projectId), + eq(schema.sourceMapArtifacts.release, opts.attrs.release), + ), + orderBy: [desc(schema.sourceMapArtifacts.createdAt)], + limit: 20, + }); + + const platform = opts.attrs.platform?.toLowerCase() ?? null; + const dist = opts.attrs.dist ?? null; + const candidates = rows.filter((row) => { + if (platform && row.platform.toLowerCase() !== platform) return false; + if (dist && row.dist !== dist) return false; + return true; + }); + const matchingCandidate = candidates.find((row) => artifactMatchesStackFile(row, stackFiles)); + if (matchingCandidate) return matchingCandidate; + const projectStackMatch = await findProjectArtifactMatchingStackFile(opts, stackFiles); + if (projectStackMatch) return projectStackMatch; + return candidates[0] ?? null; +} + +async function findProjectArtifactMatchingStackFile( + opts: { + database: DB; + projectId: string; + }, + stackFiles: string[], +): Promise { + if (stackFiles.length === 0) return null; + const rows = await opts.database.query.sourceMapArtifacts.findMany({ + where: eq(schema.sourceMapArtifacts.projectId, opts.projectId), + orderBy: [desc(schema.sourceMapArtifacts.createdAt)], + limit: 100, + }); + return rows.find((row) => artifactMatchesStackFile(row, stackFiles)) ?? null; +} + +export function symbolicateStacktraceWithArtifact(opts: { + stacktrace: string; + sourceMap: string; + artifact: Pick; +}): IssueSymbolication | null { + const parsedSourceMap = JSON.parse(opts.sourceMap) as SourceMapInput & RawSourceMap; + const traceMap = new TraceMap(parsedSourceMap); + const frames: SymbolicatedFrame[] = []; + const lines = opts.stacktrace.split("\n").map((line) => { + const frame = parseStackFrameLine(line); + if (!frame) return line; + + const original = originalPositionFor(traceMap, { + line: frame.line, + column: Math.max(0, frame.column - 1), + bias: GREATEST_LOWER_BOUND, + }); + if (!original.source || !original.line || original.column == null) return line; + + const functionName = + original.name ?? + inferOriginalFunctionName(parsedSourceMap, original.source, original.line) ?? + frame.functionName; + const symbolicated: SymbolicatedFrame = { + functionName, + source: original.source, + line: original.line, + column: original.column + 1, + generatedFile: frame.file, + generatedLine: frame.line, + generatedColumn: frame.column, + }; + frames.push(symbolicated); + const displayName = symbolicated.functionName ?? frame.functionName; + const location = `${symbolicated.source}:${symbolicated.line}:${symbolicated.column}`; + if (displayName) return `${frame.prefix}${displayName} (${location})${frame.suffix}`; + return `${frame.prefix}${location}${frame.suffix}`; + }); + + if (frames.length === 0) return null; + return { + artifact: { + id: opts.artifact.id, + release: opts.artifact.release, + dist: opts.artifact.dist, + platform: opts.artifact.platform, + debugId: opts.artifact.debugId, + }, + stacktrace: lines.join("\n"), + frames, + }; +} + +export function symbolicationAttrsForSample( + sample: TelemetrySymbolicationSample, +): SymbolicationAttrs { + const attrs = { + ...sample.resourceAttrs, + ...sample.logAttrs, + ...((sample as IssueSample & { spanAttrs?: Record | null }).spanAttrs ?? {}), + }; + return { + debugId: firstAttr(attrs, [ + "debug_id", + "debugId", + "superlog.debug_id", + "sourcemap.debug_id", + "sentry.debug_id", + "hermes.debug_id", + ]), + release: firstAttr(attrs, ["service.version", "release", "app.version", "superlog.release"]), + dist: firstAttr(attrs, [ + "dist", + "release.dist", + "superlog.dist", + "expo.update_id", + "expo.update_group_id", + ]), + platform: normalizePlatform( + firstAttr(attrs, ["device.platform", "platform", "os.type", "expo.platform"]), + ), + }; +} + +function parseStackFrameLine(line: string): StackFrameLine | null { + const withFunction = line.match(/^(\s*at\s+)(.*?)\s+\((.*):(\d+):(\d+)\)(.*)$/); + if (withFunction) { + return { + raw: line, + prefix: `${withFunction[1] ?? ""}`, + functionName: withFunction[2] ?? null, + file: withFunction[3] ?? "", + line: Number(withFunction[4]), + column: Number(withFunction[5]), + suffix: withFunction[6] ?? "", + }; + } + + const bare = line.match(/^(\s*at\s+)(.*):(\d+):(\d+)(.*)$/); + if (!bare) return null; + return { + raw: line, + prefix: `${bare[1] ?? ""}`, + functionName: null, + file: bare[2] ?? "", + line: Number(bare[3]), + column: Number(bare[4]), + suffix: bare[5] ?? "", + }; +} + +function firstAttr(attrs: Record, keys: string[]): string | null { + for (const key of keys) { + const value = attrs[key]; + if (value) return value; + } + return null; +} + +function normalizePlatform(value: string | null): string | null { + if (!value) return null; + const lower = value.toLowerCase(); + if (lower.includes("ios")) return "ios"; + if (lower.includes("android")) return "android"; + if (lower.includes("web")) return "web"; + return lower; +} + +function stackFrameFiles(stacktrace: string | null | undefined): string[] { + if (!stacktrace) return []; + return stacktrace + .split("\n") + .map((line) => parseStackFrameLine(line)?.file) + .filter((file): file is string => Boolean(file)); +} + +function artifactMatchesStackFile( + artifact: schema.SourceMapArtifact, + stackFiles: string[], +): boolean { + const artifactPath = normalizeGeneratedFilePath(artifact.bundleFile); + if (!artifactPath) return false; + + const artifactBasename = basename(artifactPath); + return stackFiles.some((file) => { + const stackPath = normalizeGeneratedFilePath(file); + if (!stackPath) return false; + if (stackPath === artifactPath || stackPath.endsWith(`/${artifactPath}`)) return true; + return Boolean(artifactBasename && basename(stackPath) === artifactBasename); + }); +} + +function normalizeGeneratedFilePath(value: string | null | undefined): string | null { + if (!value) return null; + const trimmed = value.split(/[?#]/, 1)[0]?.trim(); + if (!trimmed) return null; + + try { + const url = new URL(trimmed); + return trimSlashes(url.pathname); + } catch { + return trimSlashes(trimmed); + } +} + +function trimSlashes(value: string): string { + return value.replace(/^\/+/, ""); +} + +function basename(value: string): string { + return value.split("/").filter(Boolean).at(-1) ?? value; +} + +function inferOriginalFunctionName( + sourceMap: RawSourceMap, + source: string, + line: number, +): string | null { + if (!Array.isArray(sourceMap.sources) || !Array.isArray(sourceMap.sourcesContent)) return null; + const sourceIndex = findSourceIndex(sourceMap.sources, source); + if (sourceIndex < 0) return null; + const content = sourceMap.sourcesContent[sourceIndex]; + if (typeof content !== "string") return null; + + const lines = content.split("\n"); + let braceDepth = 0; + for (let index = Math.min(line - 1, lines.length - 1); index >= 0; index -= 1) { + const sourceLine = lines[index] ?? ""; + const name = functionNameFromSourceLine(sourceLine); + if (name && braceDepth === 0) return name; + braceDepth += countChar(sourceLine, "}") - countChar(sourceLine, "{"); + if (braceDepth < 0) braceDepth = 0; + } + return null; +} + +function countChar(value: string, char: "{" | "}"): number { + let count = 0; + for (const candidate of value) { + if (candidate === char) count += 1; + } + return count; +} + +function findSourceIndex(sources: unknown[], source: string): number { + const exact = sources.findIndex((candidate) => candidate === source); + if (exact >= 0) return exact; + + const normalizedSource = normalizeGeneratedFilePath(source); + if (!normalizedSource) return -1; + return sources.findIndex((candidate) => { + if (typeof candidate !== "string") return false; + return normalizeGeneratedFilePath(candidate) === normalizedSource; + }); +} + +function functionNameFromSourceLine(line: string): string | null { + const declaration = line.match(/\b(?:async\s+)?function\s+([A-Za-z_$][\w$]*)\s*\(/); + if (declaration?.[1]) return declaration[1]; + + const assignedFunction = line.match( + /\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s+)?function(?:\s+[A-Za-z_$][\w$]*)?\s*\(/, + ); + if (assignedFunction?.[1]) return assignedFunction[1]; + + const arrow = line.match( + /\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>/, + ); + if (arrow?.[1]) return arrow[1]; + + const propertyArrow = line.match( + /^\s*([A-Za-z_$][\w$]*)\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>/, + ); + if (propertyArrow?.[1]) return propertyArrow[1]; + + const method = line.match(/^\s*(?:async\s+)?([A-Za-z_$][\w$]*)\s*\([^)]*\)\s*\{/); + if (method?.[1] && !isControlKeyword(method[1])) return method[1]; + + return null; +} + +function isControlKeyword(value: string): boolean { + return ["if", "for", "while", "switch", "catch", "function"].includes(value); +} diff --git a/superlog/apps/api/src/system-capabilities.test.ts b/superlog/apps/api/src/system-capabilities.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..e1131d96d23d64b012f02b3aa8c6170b4a00b9d1 --- /dev/null +++ b/superlog/apps/api/src/system-capabilities.test.ts @@ -0,0 +1,30 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { buildSystemCapabilities } from "./system-capabilities.js"; + +test("system capabilities default to the open-core community edition", () => { + assert.deepEqual(buildSystemCapabilities({}), { + edition: "community", + billing: "none", + managedAgents: false, + ossAgents: true, + cloudUpgradeLinks: true, + }); +}); + +test("system capabilities expose cloud billing and managed agents when explicitly enabled", () => { + assert.deepEqual( + buildSystemCapabilities({ + SUPERLOG_EDITION: "cloud", + SUPERLOG_BILLING_PROVIDER: "stripe", + SUPERLOG_MANAGED_AGENTS_ENABLED: "true", + }), + { + edition: "cloud", + billing: "stripe", + managedAgents: true, + ossAgents: true, + cloudUpgradeLinks: false, + }, + ); +}); diff --git a/superlog/apps/api/src/system-capabilities.ts b/superlog/apps/api/src/system-capabilities.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0ce4ee8ddc98f6d9870dc1783925432d8fef477 --- /dev/null +++ b/superlog/apps/api/src/system-capabilities.ts @@ -0,0 +1,41 @@ +export type SuperlogEdition = "community" | "cloud" | "private"; +export type BillingProvider = "none" | "stripe"; + +export type SystemCapabilities = { + edition: SuperlogEdition; + billing: BillingProvider; + managedAgents: boolean; + ossAgents: boolean; + cloudUpgradeLinks: boolean; +}; + +type CapabilityEnv = Partial< + Pick< + NodeJS.ProcessEnv, + "SUPERLOG_EDITION" | "SUPERLOG_BILLING_PROVIDER" | "SUPERLOG_MANAGED_AGENTS_ENABLED" + > +>; + +export function buildSystemCapabilities(env: CapabilityEnv = process.env): SystemCapabilities { + const edition = parseEdition(env.SUPERLOG_EDITION); + const billing = parseBillingProvider(env.SUPERLOG_BILLING_PROVIDER); + const managedAgents = env.SUPERLOG_MANAGED_AGENTS_ENABLED === "true"; + + return { + edition, + billing, + managedAgents, + ossAgents: true, + cloudUpgradeLinks: edition === "community", + }; +} + +function parseEdition(value: string | undefined): SuperlogEdition { + if (value === "cloud" || value === "private" || value === "community") return value; + return "community"; +} + +function parseBillingProvider(value: string | undefined): BillingProvider { + if (value === "stripe") return "stripe"; + return "none"; +} diff --git a/superlog/apps/api/src/webhooks.ts b/superlog/apps/api/src/webhooks.ts new file mode 100644 index 0000000000000000000000000000000000000000..3856c2994419ea4eebf5b7556965c6c6999cde30 --- /dev/null +++ b/superlog/apps/api/src/webhooks.ts @@ -0,0 +1,232 @@ +import { + db, + enqueueRedelivery, + enqueueTestDelivery, + generateWebhookSecret, + schema, +} from "@superlog/db"; +import { and, desc, eq } from "drizzle-orm"; +import type { Hono } from "hono"; +import type { Context } from "hono"; +import { HTTPException } from "hono/http-exception"; +import { resolveActiveOrgContext } from "./org-context.js"; + +type Vars = { userId: string; orgId: string | null }; + +// biome-ignore lint/suspicious/noExplicitAny: Hono Variables invariance. +export function mountWebhooks(app: Hono): void { + async function requireProjectAccess(c: Context<{ Variables: Vars }>, projectId: string) { + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + }); + if (!project) throw new HTTPException(404, { message: "project not found" }); + const ctx = await resolveActiveOrgContext({ + userId: c.var.userId, + preferredOrgId: c.var.orgId, + }); + if (project.orgId !== ctx.org.id) throw new HTTPException(403, { message: "forbidden" }); + return project; + } + + app.get("/api/projects/:projectId/webhooks", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const rows = await db.query.webhookEndpoints.findMany({ + where: eq(schema.webhookEndpoints.projectId, projectId), + orderBy: (t, { desc }) => [desc(t.createdAt)], + }); + return c.json( + rows.map((r) => ({ + id: r.id, + url: r.url, + description: r.description, + enabledEvents: r.enabledEvents, + disabledAt: r.disabledAt, + createdAt: r.createdAt, + updatedAt: r.updatedAt, + })), + ); + }); + + app.post("/api/projects/:projectId/webhooks", async (c) => { + const projectId = c.req.param("projectId"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as { + url?: unknown; + description?: unknown; + }; + const url = typeof body.url === "string" ? body.url.trim() : ""; + if (!url) throw new HTTPException(400, { message: "url required" }); + try { + const parsed = new URL(url); + if (parsed.protocol !== "https:" && parsed.protocol !== "http:") { + throw new Error("invalid protocol"); + } + } catch { + throw new HTTPException(400, { message: "url must be a valid http(s) URL" }); + } + const description = + typeof body.description === "string" ? body.description.slice(0, 500) : null; + const secret = generateWebhookSecret(); + const [row] = await db + .insert(schema.webhookEndpoints) + .values({ projectId, url, description, secret }) + .returning(); + if (!row) throw new HTTPException(500, { message: "failed to create endpoint" }); + return c.json({ + id: row.id, + url: row.url, + description: row.description, + enabledEvents: row.enabledEvents, + disabledAt: row.disabledAt, + createdAt: row.createdAt, + updatedAt: row.updatedAt, + secret: row.secret, + }); + }); + + app.patch("/api/projects/:projectId/webhooks/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireProjectAccess(c, projectId); + const body = (await c.req.json().catch(() => ({}))) as { + url?: unknown; + description?: unknown; + disabled?: unknown; + }; + const patch: Partial = { updatedAt: new Date() }; + if (typeof body.url === "string") { + const url = body.url.trim(); + try { + new URL(url); + } catch { + throw new HTTPException(400, { message: "invalid url" }); + } + patch.url = url; + } + if (typeof body.description === "string") patch.description = body.description.slice(0, 500); + if (typeof body.disabled === "boolean") patch.disabledAt = body.disabled ? new Date() : null; + const [row] = await db + .update(schema.webhookEndpoints) + .set(patch) + .where( + and(eq(schema.webhookEndpoints.id, id), eq(schema.webhookEndpoints.projectId, projectId)), + ) + .returning(); + if (!row) throw new HTTPException(404, { message: "endpoint not found" }); + return c.json({ + id: row.id, + url: row.url, + description: row.description, + enabledEvents: row.enabledEvents, + disabledAt: row.disabledAt, + createdAt: row.createdAt, + updatedAt: row.updatedAt, + }); + }); + + app.post("/api/projects/:projectId/webhooks/:id/rotate-secret", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireProjectAccess(c, projectId); + const secret = generateWebhookSecret(); + const [row] = await db + .update(schema.webhookEndpoints) + .set({ secret, updatedAt: new Date() }) + .where( + and(eq(schema.webhookEndpoints.id, id), eq(schema.webhookEndpoints.projectId, projectId)), + ) + .returning(); + if (!row) throw new HTTPException(404, { message: "endpoint not found" }); + return c.json({ id: row.id, secret }); + }); + + app.delete("/api/projects/:projectId/webhooks/:id", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireProjectAccess(c, projectId); + await db + .delete(schema.webhookEndpoints) + .where( + and(eq(schema.webhookEndpoints.id, id), eq(schema.webhookEndpoints.projectId, projectId)), + ); + return c.json({ ok: true }); + }); + + app.post("/api/projects/:projectId/webhooks/:id/test", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireProjectAccess(c, projectId); + const endpoint = await db.query.webhookEndpoints.findFirst({ + where: and( + eq(schema.webhookEndpoints.id, id), + eq(schema.webhookEndpoints.projectId, projectId), + ), + }); + if (!endpoint) throw new HTTPException(404, { message: "endpoint not found" }); + const delivery = await enqueueTestDelivery(endpoint.id); + return c.json({ deliveryId: delivery?.id ?? null }); + }); + + app.get("/api/projects/:projectId/webhooks/:id/deliveries", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + await requireProjectAccess(c, projectId); + const endpoint = await db.query.webhookEndpoints.findFirst({ + where: and( + eq(schema.webhookEndpoints.id, id), + eq(schema.webhookEndpoints.projectId, projectId), + ), + }); + if (!endpoint) throw new HTTPException(404, { message: "endpoint not found" }); + const rows = await db.query.webhookDeliveries.findMany({ + where: eq(schema.webhookDeliveries.endpointId, endpoint.id), + orderBy: [desc(schema.webhookDeliveries.createdAt)], + limit: 50, + }); + return c.json( + rows.map((d) => ({ + id: d.id, + eventType: d.eventType, + status: d.status, + attemptCount: d.attemptCount, + nextAttemptAt: d.nextAttemptAt, + lastAttemptAt: d.lastAttemptAt, + lastResponseStatus: d.lastResponseStatus, + lastResponseBody: d.lastResponseBody, + lastError: d.lastError, + deliveredAt: d.deliveredAt, + createdAt: d.createdAt, + })), + ); + }); + + app.get("/api/projects/:projectId/webhooks/:id/deliveries/:deliveryId", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + const deliveryId = c.req.param("deliveryId"); + await requireProjectAccess(c, projectId); + const delivery = await db.query.webhookDeliveries.findFirst({ + where: eq(schema.webhookDeliveries.id, deliveryId), + }); + if (!delivery || delivery.endpointId !== id) { + throw new HTTPException(404, { message: "delivery not found" }); + } + return c.json(delivery); + }); + + app.post("/api/projects/:projectId/webhooks/:id/deliveries/:deliveryId/redeliver", async (c) => { + const projectId = c.req.param("projectId"); + const id = c.req.param("id"); + const deliveryId = c.req.param("deliveryId"); + await requireProjectAccess(c, projectId); + const original = await db.query.webhookDeliveries.findFirst({ + where: eq(schema.webhookDeliveries.id, deliveryId), + }); + if (!original || original.endpointId !== id) { + throw new HTTPException(404, { message: "delivery not found" }); + } + const fresh = await enqueueRedelivery(deliveryId); + return c.json({ deliveryId: fresh?.id ?? null }); + }); +} diff --git a/superlog/apps/api/tracing.ts b/superlog/apps/api/tracing.ts new file mode 100644 index 0000000000000000000000000000000000000000..14718c0373b8f7a2de352fb73e65bfd03845b142 --- /dev/null +++ b/superlog/apps/api/tracing.ts @@ -0,0 +1,147 @@ +// OpenTelemetry bootstrap. Loaded via `node --import ./tracing.ts` (or tsx). +// Loads dotenv first so OTEL_* env vars set in .env / .env.superlog / +// .env.local are visible before the SDK reads process.env. +// Uses HTTP/protobuf exporters (no gRPC). +import "dotenv/config"; +import { config as loadDotenv } from "dotenv"; +const portlessPort = process.env.PORTLESS_URL ? process.env.PORT : undefined; +// .env.superlog holds the OTLP endpoint + ingest auth header; it's the +// dedicated home for OTel config so it doesn't collide with app .env. +loadDotenv({ path: ".env.superlog" }); +// .env.local wins so per-developer dogfood / worktree overrides take effect. +loadDotenv({ path: ".env.local", override: true }); +if (process.env.SUPERLOG_ENV_FILE) { + loadDotenv({ path: process.env.SUPERLOG_ENV_FILE, override: true }); +} +if (portlessPort) process.env.PORT = portlessPort; + +// Always stamp an `env` resource attribute so every span/log/metric we emit is +// filterable by deployment environment. SUPERLOG_ENV is the explicit knob; +// RAILWAY_ENVIRONMENT_NAME / NODE_ENV are the fallbacks; "development" is the +// last resort so we never emit telemetry without an env. +const deploymentEnv = + process.env.SUPERLOG_ENV || + process.env.RAILWAY_ENVIRONMENT_NAME || + process.env.NODE_ENV || + "development"; + +// Only ship telemetry from prod. Local dev (any non-production env) is muted +// so worktrees, branch checkouts, etc. don't pollute the prod Superlog +// project — see incident 779a80aa where local ECONNREFUSED storms were +// counted against an unrelated prod incident. Setting OTEL_SDK_DISABLED +// before any OTel import makes NodeSDK.start() a no-op; we also skip the +// manually-wired LoggerProvider below so its BatchLogRecordProcessor never +// starts. To dogfood from a local checkout, set SUPERLOG_ENV=production in +// apps/api/.env.local. +const telemetryEnabled = deploymentEnv === "production"; +if (!telemetryEnabled) { + process.env.OTEL_SDK_DISABLED = "true"; + console.warn( + `[otel] deployment env is "${deploymentEnv}" — telemetry disabled (set SUPERLOG_ENV=production to enable)`, + ); +} + +import { DiagConsoleLogger, DiagLogLevel, diag } from "@opentelemetry/api"; +import { logs } from "@opentelemetry/api-logs"; +import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; +import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http"; +import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; +import { resourceFromAttributes } from "@opentelemetry/resources"; +import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs"; +import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"; +import { NodeSDK } from "@opentelemetry/sdk-node"; +import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions"; + +if (process.env.OTEL_DIAG_DEBUG === "1") { + diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); +} + +if (telemetryEnabled) { + const serviceName = process.env.OTEL_SERVICE_NAME ?? "@superlog/api"; + const serviceInstanceId = + process.env.OTEL_SERVICE_INSTANCE_ID || + process.env.RAILWAY_REPLICA_ID || + process.env.RAILWAY_DEPLOYMENT_ID || + process.env.HOSTNAME; + const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT; + const rawHeaders = process.env.OTEL_EXPORTER_OTLP_HEADERS ?? ""; + + // OTel uses "k1=v1,k2=v2" in OTEL_EXPORTER_OTLP_HEADERS. Convert to a record + // so we can hand it to the exporter constructor. The SDK already does this + // for some signals, but being explicit is safer across exporter versions. + const headers: Record = {}; + for (const pair of rawHeaders.split(",")) { + const trimmed = pair.trim(); + if (!trimmed) continue; + const eq = trimmed.indexOf("="); + if (eq === -1) continue; + const key = trimmed.slice(0, eq).trim(); + const value = trimmed.slice(eq + 1).trim(); + if (key) headers[key] = value; + } + + const traceExporter = new OTLPTraceExporter({ + url: endpoint ? `${endpoint.replace(/\/$/, "")}/v1/traces` : undefined, + headers, + }); + + const metricExporter = new OTLPMetricExporter({ + url: endpoint ? `${endpoint.replace(/\/$/, "")}/v1/metrics` : undefined, + headers, + }); + + const logExporter = new OTLPLogExporter({ + url: endpoint ? `${endpoint.replace(/\/$/, "")}/v1/logs` : undefined, + headers, + }); + + const resource = resourceFromAttributes({ + [ATTR_SERVICE_NAME]: serviceName, + "deployment.environment.name": deploymentEnv, + env: deploymentEnv, + ...(serviceInstanceId ? { "service.instance.id": serviceInstanceId } : {}), + }); + + // SDK-Node owns traces + metrics. Logs we wire up manually so we can register + // a global LoggerProvider for `@opentelemetry/api-logs` consumers. + const loggerProvider = new LoggerProvider({ + resource, + processors: [new BatchLogRecordProcessor(logExporter)], + }); + logs.setGlobalLoggerProvider(loggerProvider); + + const sdk = new NodeSDK({ + resource, + traceExporter, + metricReader: new PeriodicExportingMetricReader({ + exporter: metricExporter, + exportIntervalMillis: 60_000, + }), + instrumentations: [ + getNodeAutoInstrumentations({ + // fs is extremely chatty in dev (every tsx watch reload). + "@opentelemetry/instrumentation-fs": { enabled: false }, + }), + ], + }); + + sdk.start(); + + const shutdown = async () => { + try { + await sdk.shutdown(); + await loggerProvider.shutdown(); + } catch (err) { + // Don't crash shutdown on a flush failure. + console.error("[otel] shutdown error", err); + } + }; + + process.once("SIGTERM", () => { + void shutdown().finally(() => process.exit(0)); + }); + process.once("SIGINT", () => { + void shutdown().finally(() => process.exit(0)); + }); +} diff --git a/superlog/apps/api/tsconfig.json b/superlog/apps/api/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..84e48f162cef1eee7326fb9c528d529db85006cd --- /dev/null +++ b/superlog/apps/api/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "types": ["node"] + }, + "include": ["src/**/*"] +} diff --git a/superlog/apps/proxy/Dockerfile b/superlog/apps/proxy/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..13e5266bee3df79fb34f39eca3c04d8a6ec147d4 --- /dev/null +++ b/superlog/apps/proxy/Dockerfile @@ -0,0 +1,23 @@ +# Build context: repo root. Build with `docker build -f apps/proxy/Dockerfile .` +FROM node:20-slim + +WORKDIR /app + +RUN corepack enable && corepack prepare pnpm@9.12.0 --activate + +COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ +COPY apps/proxy/package.json apps/proxy/ +COPY packages/db/package.json packages/db/ +COPY packages/fingerprint/package.json packages/fingerprint/ + +RUN pnpm install --frozen-lockfile --filter @superlog/proxy... + +COPY tsconfig.base.json ./ +COPY apps/proxy apps/proxy +COPY packages/db packages/db +COPY packages/fingerprint packages/fingerprint + +ENV PORT=4000 +EXPOSE 4000 + +CMD ["pnpm", "--filter", "@superlog/proxy", "start"] diff --git a/superlog/apps/proxy/node_modules/.bin/pino b/superlog/apps/proxy/node_modules/.bin/pino new file mode 100644 index 0000000000000000000000000000000000000000..dc3214724f83daa042ee09d324798cbf76e71918 --- /dev/null +++ b/superlog/apps/proxy/node_modules/.bin/pino @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules/pino/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules/pino/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/pino@10.3.1/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../pino/bin.js" "$@" +else + exec node "$basedir/../pino/bin.js" "$@" +fi diff --git a/superlog/apps/proxy/node_modules/.bin/tsc b/superlog/apps/proxy/node_modules/.bin/tsc new file mode 100644 index 0000000000000000000000000000000000000000..5a3027f858d7058aef8886d341f0b32c85ab95db --- /dev/null +++ b/superlog/apps/proxy/node_modules/.bin/tsc @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" +else + exec node "$basedir/../typescript/bin/tsc" "$@" +fi diff --git a/superlog/apps/proxy/node_modules/.bin/tsserver b/superlog/apps/proxy/node_modules/.bin/tsserver new file mode 100644 index 0000000000000000000000000000000000000000..95999db035aafe7ad567730b16e83c6114b243ae --- /dev/null +++ b/superlog/apps/proxy/node_modules/.bin/tsserver @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" +else + exec node "$basedir/../typescript/bin/tsserver" "$@" +fi diff --git a/superlog/apps/proxy/node_modules/.bin/tsx b/superlog/apps/proxy/node_modules/.bin/tsx new file mode 100644 index 0000000000000000000000000000000000000000..82e6578c601cd86d9e2b3768fd274df4f0f6d556 --- /dev/null +++ b/superlog/apps/proxy/node_modules/.bin/tsx @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/dist/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/dist/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@" +else + exec node "$basedir/../tsx/dist/cli.mjs" "$@" +fi diff --git a/superlog/apps/proxy/package.json b/superlog/apps/proxy/package.json new file mode 100644 index 0000000000000000000000000000000000000000..0153b37b45ae3cdf1bfa807bcab56c5f60a615c1 --- /dev/null +++ b/superlog/apps/proxy/package.json @@ -0,0 +1,42 @@ +{ + "name": "@superlog/proxy", + "version": "0.0.0", + "private": true, + "license": "Apache-2.0", + "type": "module", + "scripts": { + "dev": "tsx watch --import ./tracing.ts src/index.ts", + "start": "tsx --import ./tracing.ts src/index.ts", + "test:ingest-queue": "tsx --test src/ingest-queue.test.ts", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.1053.0", + "@aws-sdk/client-sqs": "^3.1053.0", + "@aws-sdk/lib-storage": "3.1053.0", + "@hono/node-server": "^1.13.7", + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/api-logs": "^0.215.0", + "@opentelemetry/auto-instrumentations-node": "^0.73.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.215.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.215.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.215.0", + "@opentelemetry/otlp-transformer": "0.215.0", + "@opentelemetry/resources": "^2.7.0", + "@opentelemetry/sdk-logs": "^0.215.0", + "@opentelemetry/sdk-metrics": "^2.7.0", + "@opentelemetry/sdk-node": "^0.215.0", + "@opentelemetry/semantic-conventions": "^1.40.0", + "@superlog/db": "workspace:*", + "@superlog/fingerprint": "workspace:*", + "dotenv": "^17.4.2", + "drizzle-orm": "^0.45.2", + "hono": "^4.6.12", + "pino": "^10.3.1" + }, + "devDependencies": { + "@types/node": "^22.10.1", + "tsx": "^4.19.2", + "typescript": "^5.7.2" + } +} diff --git a/superlog/apps/proxy/src/billing/ingest-entitlement.test.ts b/superlog/apps/proxy/src/billing/ingest-entitlement.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..6a3554b9fc88ce4a7c254c728e7f8003c2f21d15 --- /dev/null +++ b/superlog/apps/proxy/src/billing/ingest-entitlement.test.ts @@ -0,0 +1,119 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + type IngestSignal, + createEntitlementCache, + createIngestEntitlementGate, + signalForPath, +} from "./ingest-entitlement.js"; + +const flush = () => new Promise((r) => setTimeout(r, 0)); + +test("signalForPath maps OTLP endpoints to billing signals", () => { + assert.equal(signalForPath("/v1/traces"), "spans"); + assert.equal(signalForPath("/v1/logs"), "logs"); + assert.equal(signalForPath("/v1/metrics"), "metric_points"); + assert.equal(signalForPath("/v1/whatever"), null); +}); + +test("cache miss fails OPEN, then reflects the refreshed verdict (blocked)", async () => { + let checks = 0; + const gate = createEntitlementCache({ + lookupOrgId: async () => "orgA", + check: async () => { + checks += 1; + return false; // free org over cap + }, + }); + // First request: nothing cached → allow (fail-open) + schedule refresh. + assert.equal(gate.allows("p1", "spans"), true); + await flush(); + // After the background refresh resolved, the org is blocked. + assert.equal(gate.allows("p1", "spans"), false); + assert.equal(checks, 1); +}); + +test("within TTL it serves from cache without re-checking", async () => { + let checks = 0; + let t = 1000; + const gate = createEntitlementCache({ + lookupOrgId: async () => "orgA", + check: async () => { + checks += 1; + return true; + }, + ttlMs: 60_000, + now: () => t, + }); + gate.allows("p1", "spans"); + await flush(); + t += 30_000; // still within ttl + gate.allows("p1", "spans"); + gate.allows("p1", "spans"); + await flush(); + assert.equal(checks, 1); +}); + +test("re-checks after the TTL expires", async () => { + let checks = 0; + let t = 1000; + const gate = createEntitlementCache({ + lookupOrgId: async () => "orgA", + check: async () => { + checks += 1; + return true; + }, + ttlMs: 60_000, + now: () => t, + }); + gate.allows("p1", "spans"); + await flush(); + t += 61_000; // past ttl + gate.allows("p1", "spans"); + await flush(); + assert.equal(checks, 2); +}); + +test("unknown org (no mapping) always allows", async () => { + const gate = createEntitlementCache({ + lookupOrgId: async () => null, + check: async () => false, + }); + gate.allows("p1", "spans"); + await flush(); + assert.equal(gate.allows("p1", "spans"), true); +}); + +test("check error fails OPEN (billing outage never blocks ingest)", async () => { + const gate = createEntitlementCache({ + lookupOrgId: async () => "orgA", + check: async () => { + throw new Error("autumn down"); + }, + }); + gate.allows("p1", "spans"); + await flush(); + assert.equal(gate.allows("p1", "spans"), true); +}); + +test("no AUTUMN_SECRET_KEY → gate disabled (null), never blocks", () => { + const gate = createIngestEntitlementGate({ + lookupOrgForProject: async () => ({ orgId: "orgA" }), + secretKey: null, + }); + assert.equal(gate, null); +}); + +test("gate is null unless BILLING_ENFORCEMENT_ENABLED — metering on, blocking off", () => { + const opts = { lookupOrgForProject: async () => ({ orgId: "orgA" }), secretKey: "am_sk_test_x" }; + const prev = process.env.BILLING_ENFORCEMENT_ENABLED; + try { + delete process.env.BILLING_ENFORCEMENT_ENABLED; + assert.equal(createIngestEntitlementGate(opts), null); // keyed but not enforcing → no block + process.env.BILLING_ENFORCEMENT_ENABLED = "true"; + assert.notEqual(createIngestEntitlementGate(opts), null); // enforcing → real gate + } finally { + if (prev === undefined) delete process.env.BILLING_ENFORCEMENT_ENABLED; + else process.env.BILLING_ENFORCEMENT_ENABLED = prev; + } +}); diff --git a/superlog/apps/proxy/src/billing/ingest-entitlement.ts b/superlog/apps/proxy/src/billing/ingest-entitlement.ts new file mode 100644 index 0000000000000000000000000000000000000000..a064e4561c43c0f7120f824466be1fb8b4eb9e6f --- /dev/null +++ b/superlog/apps/proxy/src/billing/ingest-entitlement.ts @@ -0,0 +1,126 @@ +// Ingest entitlement gate for the free-tier telemetry hard-block. The proxy is +// the latency-critical, shared-event-loop ingest edge (it has been OOM'd under +// burst before), so Autumn MUST stay off the synchronous path: `allows()` is a +// pure in-memory cache read that returns instantly, fails OPEN on anything it +// doesn't know, and only schedules a background refresh. The next requests see +// the refreshed verdict. A few seconds of boundary overage is fine; a blocking +// network call or a billing outage taking ingest down is not. +// +// Only an explicit Autumn `allowed: false` (free org past its monthly cap) +// blocks; unknown orgs, missing config, and refresh errors all allow. +import { logger } from "../logger.js"; + +export type IngestSignal = "spans" | "logs" | "metric_points"; + +export function signalForPath(path: string): IngestSignal | null { + if (path === "/v1/traces") return "spans"; + if (path === "/v1/logs") return "logs"; + if (path === "/v1/metrics") return "metric_points"; + return null; +} + +export type IngestEntitlementGate = { + // Sync, hot-path. Cached verdict; defaults to allow on miss/unknown/error. + allows(projectId: string, signal: IngestSignal): boolean; +}; + +type Entry = { allowed: boolean; expiresAt: number }; + +const DEFAULT_TTL_MS = 60_000; +const ERROR_TTL_MS = 15_000; // retry sooner after an error, but don't hammer + +export function createEntitlementCache(deps: { + // Resolve the Autumn customer (org) for a project. null → allow. + lookupOrgId: (projectId: string) => Promise; + // Ask Autumn whether the org may still ingest this signal. + check: (orgId: string, featureId: IngestSignal) => Promise; + ttlMs?: number; + now?: () => number; +}): IngestEntitlementGate { + const ttlMs = deps.ttlMs ?? DEFAULT_TTL_MS; + const now = deps.now ?? Date.now; + const cache = new Map(); + const inflight = new Set(); + + // Bound memory in the long-lived proxy: evict the oldest entry once a NEW key + // would push past the cap (Map preserves insertion order). 50k keys (~16k + // projects × 3 signals) is far above any realistic active set within one TTL. + const MAX_ENTRIES = 50_000; + function setEntry(key: string, entry: Entry): void { + if (!cache.has(key) && cache.size >= MAX_ENTRIES) { + const oldest = cache.keys().next().value; + if (oldest !== undefined) cache.delete(oldest); + } + cache.set(key, entry); + } + + function refresh(key: string, projectId: string, signal: IngestSignal): void { + if (inflight.has(key)) return; + inflight.add(key); + void (async () => { + try { + const orgId = await deps.lookupOrgId(projectId); + const allowed = orgId ? await deps.check(orgId, signal) : true; + setEntry(key, { allowed, expiresAt: now() + ttlMs }); + } catch (err) { + // Fail open: never let a billing/lookup error block customer telemetry. + setEntry(key, { allowed: true, expiresAt: now() + ERROR_TTL_MS }); + logger.warn( + { scope: "billing.ingest_gate", projectId, signal, err: err instanceof Error ? err.message : String(err) }, + "entitlement refresh failed; allowing ingest (fail-open)", + ); + } finally { + inflight.delete(key); + } + })(); + } + + return { + allows(projectId, signal) { + const key = `${projectId}:${signal}`; + const entry = cache.get(key); + if (!entry || entry.expiresAt <= now()) { + refresh(key, projectId, signal); // async; never awaited on the hot path + } + // Use the last-known verdict (so a blocked org stays blocked across the + // refresh), defaulting to allow when we've never resolved it. + return entry ? entry.allowed : true; + }, + }; +} + +// Autumn /check for a feature. Returns true unless Autumn explicitly says false. +function createAutumnCheck(secretKey: string, fetchImpl: typeof fetch = fetch) { + return async (orgId: string, featureId: IngestSignal): Promise => { + const res = await fetchImpl("https://api.useautumn.com/v1/check", { + method: "POST", + headers: { Authorization: `Bearer ${secretKey}`, "Content-Type": "application/json" }, + body: JSON.stringify({ customer_id: orgId, feature_id: featureId }), + }); + if (!res.ok) throw new Error(`autumn /check -> ${res.status}`); + const body = (await res.json()) as { allowed?: boolean }; + return body.allowed !== false; + }; +} + +// Returns null when AUTUMN_SECRET_KEY is unset — no billing, no blocking +// (dev/worktrees/self-hosted ingest unaffected). Also returns null unless +// BILLING_ENFORCEMENT_ENABLED is "true": the hard-block is gated SEPARATELY from +// metering, so we can turn billing on (the worker feeder still meters usage and +// bills paying customers) without 402-capping anyone's ingest. Flip the env to +// "true" when ready to actually enforce the Free caps. +export function createIngestEntitlementGate(opts: { + lookupOrgForProject: (projectId: string) => Promise<{ orgId: string } | null>; + secretKey?: string | null; + ttlMs?: number; + fetchImpl?: typeof fetch; +}): IngestEntitlementGate | null { + const secretKey = (opts.secretKey ?? process.env.AUTUMN_SECRET_KEY)?.trim(); + if (!secretKey) return null; + if (process.env.BILLING_ENFORCEMENT_ENABLED !== "true") return null; + return createEntitlementCache({ + lookupOrgId: async (projectId) => (await opts.lookupOrgForProject(projectId))?.orgId ?? null, + check: createAutumnCheck(secretKey, opts.fetchImpl), + ttlMs: opts.ttlMs, + }); +} diff --git a/superlog/apps/proxy/src/body-capture.test.ts b/superlog/apps/proxy/src/body-capture.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..63fc8e7e6ff40932fa93383342b009323c0eb521 --- /dev/null +++ b/superlog/apps/proxy/src/body-capture.test.ts @@ -0,0 +1,134 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { + EmptyBodyError, + PayloadTooLargeError, + type SpillSink, + captureBody, +} from "./body-capture.js"; + +function source(...chunks: Array): AsyncIterable { + return (async function* () { + for (const chunk of chunks) { + yield typeof chunk === "string" ? Buffer.from(chunk) : chunk; + } + })(); +} + +class FakeSink implements SpillSink { + written: Buffer[] = []; + finished = false; + aborted = false; + async write(chunk: Uint8Array): Promise { + this.written.push(Buffer.from(chunk)); + } + async finish(): Promise { + this.finished = true; + } + async abort(): Promise { + this.aborted = true; + } + get bytes(): number { + return this.written.reduce((n, b) => n + b.length, 0); + } +} + +test("buffers a small body fully in memory and never opens a spill sink", async () => { + let created = 0; + const result = await captureBody(source("hello ", "world"), { + inlineThresholdBytes: 100, + maxBytes: 1000, + createSpillSink: () => { + created += 1; + return new FakeSink(); + }, + }); + + assert.equal(created, 0); + assert.equal(result.storage, "buffer"); + assert.equal(result.totalBytes, 11); + assert.equal(result.buffer?.toString(), "hello world"); +}); + +test("spills to the sink once the body exceeds the inline threshold, flushing the buffered prefix", async () => { + const sink = new FakeSink(); + const result = await captureBody(source("AAAA", "BBBB", "CCCC"), { + inlineThresholdBytes: 5, // "AAAA" (4) fits; adding "BBBB" crosses → spill + maxBytes: 1000, + createSpillSink: () => sink, + }); + + assert.equal(result.storage, "spilled"); + assert.equal(result.totalBytes, 12); + // Every byte, including the buffered "AAAA" prefix, reaches the sink in order. + assert.equal(Buffer.concat(sink.written).toString(), "AAAABBBBCCCC"); + assert.equal(sink.finished, true); + assert.equal(sink.aborted, false); +}); + +test("rejects a body over maxBytes with PayloadTooLargeError and aborts the spill", async () => { + const sink = new FakeSink(); + await assert.rejects( + captureBody(source("X".repeat(6), "Y".repeat(6)), { + inlineThresholdBytes: 4, // spills early + maxBytes: 8, + createSpillSink: () => sink, + }), + (err: unknown) => { + assert.ok(err instanceof PayloadTooLargeError); + assert.equal(err.limitBytes, 8); + return true; + }, + ); + assert.equal(sink.aborted, true); + assert.equal(sink.finished, false); +}); + +test("enforces maxBytes even when still buffering (never spilled)", async () => { + await assert.rejects( + captureBody(source("X".repeat(10)), { + inlineThresholdBytes: 1000, // high → stays in buffer mode + maxBytes: 5, + createSpillSink: () => new FakeSink(), + }), + PayloadTooLargeError, + ); +}); + +test("accepts a body exactly at maxBytes", async () => { + const result = await captureBody(source("X".repeat(8)), { + inlineThresholdBytes: 1000, + maxBytes: 8, + createSpillSink: () => new FakeSink(), + }); + assert.equal(result.storage, "buffer"); + assert.equal(result.totalBytes, 8); +}); + +test("aborts the sink when finish() fails, so a failed spill leaves nothing dangling", async () => { + const sink = new FakeSink(); + const finishError = new Error("CompleteMultipartUpload failed"); + sink.finish = async () => { + throw finishError; + }; + await assert.rejects( + captureBody(source("AAAA", "BBBB", "CCCC"), { + inlineThresholdBytes: 5, // forces a spill + maxBytes: 1000, + createSpillSink: () => sink, + }), + (err: unknown) => err === finishError, + ); + assert.equal(sink.aborted, true); +}); + +test("treats a zero-byte body as an EmptyBodyError", async () => { + await assert.rejects( + captureBody(source(), { + inlineThresholdBytes: 100, + maxBytes: 1000, + createSpillSink: () => new FakeSink(), + }), + EmptyBodyError, + ); +}); diff --git a/superlog/apps/proxy/src/body-capture.ts b/superlog/apps/proxy/src/body-capture.ts new file mode 100644 index 0000000000000000000000000000000000000000..43f1a4971cd16a7380a5b8d4f617b7d701878092 --- /dev/null +++ b/superlog/apps/proxy/src/body-capture.ts @@ -0,0 +1,123 @@ +/** + * Bounded, streaming capture of a request body. + * + * The proxy must never hold an unbounded amount of memory per request. This + * reads the body incrementally and: + * + * - rejects anything larger than `maxBytes` (the hard accept/reject cut — the + * caller maps this to a 413), enforced as bytes arrive so it aborts at the + * cap instead of after buffering, and WITHOUT trusting Content-Length; + * - keeps small bodies (<= `inlineThresholdBytes`) in memory so the caller can + * take a fast inline path; + * - for anything larger, opens a {@link SpillSink} (e.g. a streaming S3 upload) + * and streams the body through it, so the bytes held in memory at any moment + * stay bounded by the spill sink's internal buffering, not the body size. + * + * The sink is injected so this stays edition-neutral and unit-testable: the + * cloud queue path provides an S3-backed sink; a sink could equally stream to + * the collector. Capture never references S3 directly. + */ + +export interface SpillSink { + /** Write a chunk. Should resolve only once the chunk is accepted (honoring + * the sink's own backpressure), so a slow sink throttles the source read. */ + write(chunk: Uint8Array): Promise; + /** Finalize the upload/forward. Called once, after the last chunk. */ + finish(): Promise; + /** Tear down a partial upload/forward on error. Must be idempotent-safe. */ + abort(): Promise; +} + +export type CaptureResult = + | { storage: "buffer"; buffer: Buffer; totalBytes: number } + | { storage: "spilled"; totalBytes: number }; + +export interface CaptureOptions { + /** Bodies at or below this many raw bytes are returned buffered in memory. */ + inlineThresholdBytes: number; + /** Hard ceiling. A body exceeding this is rejected with PayloadTooLargeError. */ + maxBytes: number; + /** Factory for the spill sink, invoked lazily only when a body spills. */ + createSpillSink: () => SpillSink; +} + +export class PayloadTooLargeError extends Error { + constructor( + readonly limitBytes: number, + readonly observedBytes: number, + ) { + super(`ingest body exceeds the ${limitBytes}-byte limit`); + this.name = "PayloadTooLargeError"; + } +} + +export class EmptyBodyError extends Error { + constructor() { + super("ingest body is empty; no records to forward"); + this.name = "EmptyBodyError"; + } +} + +export async function captureBody( + source: AsyncIterable, + opts: CaptureOptions, +): Promise { + const { inlineThresholdBytes, maxBytes, createSpillSink } = opts; + + const buffered: Buffer[] = []; + let bufferedBytes = 0; + let totalBytes = 0; + let sink: SpillSink | null = null; + + try { + for await (const raw of source) { + const chunk = Buffer.isBuffer(raw) ? raw : Buffer.from(raw); + if (chunk.length === 0) continue; + totalBytes += chunk.length; + if (totalBytes > maxBytes) { + throw new PayloadTooLargeError(maxBytes, totalBytes); + } + + const fitsInBuffer = sink === null && bufferedBytes + chunk.length <= inlineThresholdBytes; + if (fitsInBuffer) { + buffered.push(chunk); + bufferedBytes += chunk.length; + continue; + } + + if (sink === null) { + // Crossed the inline threshold: open the sink and flush the prefix we + // had been holding, in order, before continuing to stream. + sink = createSpillSink(); + for (const prefix of buffered) { + await sink.write(prefix); + } + buffered.length = 0; + bufferedBytes = 0; + } + await sink.write(chunk); + } + } catch (err) { + if (sink) { + await sink.abort().catch(() => {}); + } + throw err; + } + + if (sink) { + // Abort on a finish failure too (e.g. S3 CompleteMultipartUpload throwing), + // otherwise a failed spill leaves a dangling partial upload behind. + try { + await sink.finish(); + } catch (err) { + await sink.abort().catch(() => {}); + throw err; + } + return { storage: "spilled", totalBytes }; + } + + if (bufferedBytes === 0) { + throw new EmptyBodyError(); + } + return { storage: "buffer", buffer: Buffer.concat(buffered, bufferedBytes), totalBytes }; +} diff --git a/superlog/apps/proxy/src/env.ts b/superlog/apps/proxy/src/env.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5e10e9f55499f3f76ae6db5a1081fac9f6d7f77 --- /dev/null +++ b/superlog/apps/proxy/src/env.ts @@ -0,0 +1,8 @@ +import { config as loadDotenv } from "dotenv"; +const portlessPort = process.env.PORTLESS_URL ? process.env.PORT : undefined; +loadDotenv(); +loadDotenv({ path: ".env.local", override: true }); +if (process.env.SUPERLOG_ENV_FILE) { + loadDotenv({ path: process.env.SUPERLOG_ENV_FILE, override: true }); +} +if (portlessPort) process.env.PORT = portlessPort; diff --git a/superlog/apps/proxy/src/index.ts b/superlog/apps/proxy/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..723b14cb21aab448d79a5388cb8edd7a8689aa2d --- /dev/null +++ b/superlog/apps/proxy/src/index.ts @@ -0,0 +1,474 @@ +import "./env.js"; +import { Readable } from "node:stream"; +import { serve } from "@hono/node-server"; +import { type Span, SpanStatusCode, trace } from "@opentelemetry/api"; +import { hashApiKey, schema, syncLoopsContactsForProject } from "@superlog/db"; +import { db } from "@superlog/db"; +import { eq } from "drizzle-orm"; +import { Hono } from "hono"; +import type { Context } from "hono"; +import { cors } from "hono/cors"; +import { createIngestEntitlementGate, signalForPath } from "./billing/ingest-entitlement.js"; +import { EmptyBodyError, PayloadTooLargeError } from "./body-capture.js"; +import { stampIssueFingerprintsFailOpen } from "./ingest-fingerprints.js"; +import { IngestQueue, getIngestQueueConfig } from "./ingest-queue.js"; +import { logger } from "./logger.js"; +import { proxyOperationalRecorder } from "./operational-metrics.js"; +import { Semaphore } from "./semaphore.js"; +import { lookupOrgForProject, recordIngestRequest } from "./tenant-metrics.js"; + +const tracer = trace.getTracer("@superlog/proxy"); + +type Variables = { projectId: string }; + +const app = new Hono<{ Variables: Variables }>(); + +const COLLECTOR_URL = process.env.COLLECTOR_URL ?? "http://localhost:4318"; +const PORT = Number(process.env.PORT ?? 4000); +const ingestQueueConfig = getIngestQueueConfig(process.env); +const ingestQueue = ingestQueueConfig ? new IngestQueue(ingestQueueConfig, logger) : null; +// Free-tier ingest hard-block. Null (disabled) without AUTUMN_SECRET_KEY. The +// verdict is a cached, fail-open in-memory read — never a blocking call on the +// ingest hot path (see billing/ingest-entitlement.ts). +const ingestGate = createIngestEntitlementGate({ lookupOrgForProject }); + +// Bound how many ingest requests buffer/stream their bodies at once. Together +// with the per-request body cap (INGEST_MAX_BODY_BYTES) and S3 streaming for +// large bodies, this makes the proxy's memory a provable constant — roughly +// `permits × max_bytes_held_per_request` — so a burst can never OOM-kill the +// task (exit 137, the 2026-05-31 incident). Excess requests WAIT for a permit +// (backpressure) rather than being rejected; the body is only read once a permit +// is held, so waiters cost ~nothing. Default 64; tune via +// INGEST_MAX_INFLIGHT_REQUESTS, or set to 0 to disable. +const DEFAULT_MAX_INFLIGHT_REQUESTS = 64; +const MAX_INFLIGHT_REQUESTS = readNonNegativeIntEnv( + process.env.INGEST_MAX_INFLIGHT_REQUESTS, + DEFAULT_MAX_INFLIGHT_REQUESTS, +); +const requestSemaphore = new Semaphore(MAX_INFLIGHT_REQUESTS); + +// Hard per-request body ceiling for the no-queue (direct) path. The queue path +// enforces its own copy via IngestQueueConfig.maxBodyBytes; both read the same +// env so they stay in lockstep. Bodies above this get a 413 (a permanent 4xx — +// OTLP exporters drop rather than retry), which is the explicit "too big to +// accept" decision. 64 MiB sits above the largest legitimate payload (~38 MiB). +const MAX_BODY_BYTES = readNonNegativeIntEnv(process.env.INGEST_MAX_BODY_BYTES, 64 * 1024 * 1024); + +app.use( + "/v1/*", + cors({ + origin: "*", + allowHeaders: ["authorization", "content-type", "x-api-key", "traceparent", "tracestate"], + allowMethods: ["POST", "OPTIONS"], + }), +); + +app.use("/v1/*", async (c, next) => { + return tracer.startActiveSpan("auth.validate", async (span) => { + try { + const key = extractApiKey(c); + if (!key) { + span.setAttribute("auth.result", "missing_key"); + span.setStatus({ code: SpanStatusCode.ERROR, message: "missing api key" }); + return c.json({ error: "missing api key" }, 401); + } + + if (key === "SUPERLOG_TEST" || key.startsWith("superlog_test_")) { + span.setAttribute("auth.result", "test_key"); + const path = new URL(c.req.url).pathname; + if (path === "/v1/traces" || path === "/v1/logs" || path === "/v1/metrics") { + logger.info({ path }, "test key short-circuit"); + return new Response(new Uint8Array(0), { + status: 200, + headers: { "content-type": "application/x-protobuf" }, + }); + } + return c.json({ error: "test key only valid on /v1/{traces,logs,metrics}" }, 401); + } + + if (key.startsWith("superlog_cli_")) { + span.setAttribute("auth.result", "wrong_credential_type"); + span.setStatus({ code: SpanStatusCode.ERROR, message: "wrong credential type" }); + return c.json( + { + error: + "wrong credential type: this endpoint requires an ingest API key (sl_public_* or legacy superlog_live_*); superlog_cli_* tokens are for the gateway at api.superlog.sh", + }, + 401, + ); + } + + const row = await db.query.apiKeys.findFirst({ + where: eq(schema.apiKeys.keyHash, hashApiKey(key)), + }); + if (!row || row.revokedAt) { + span.setAttribute("auth.result", "invalid_key"); + span.setStatus({ code: SpanStatusCode.ERROR, message: "invalid api key" }); + return c.json({ error: "invalid api key" }, 401); + } + + span.setAttribute("auth.result", "ok"); + span.setAttribute("tenant.project_id", row.projectId); + c.set("projectId", row.projectId); + const isFirstUse = row.lastUsedAt === null; + void db + .update(schema.apiKeys) + .set({ lastUsedAt: new Date() }) + .where(eq(schema.apiKeys.id, row.id)) + .then(() => { + // Loops only needs the lifecycle nudge when telemetrySet flips false→true, i.e. on the + // first ingest for this key. Firing on every request hammers the Loops rate limit. + if (isFirstUse) return syncLoopsContactsForProject({ projectId: row.projectId }); + }) + .catch((err: unknown) => { + logger.error({ err }, "failed to update last_used_at or sync loops contact"); + }); + + await next(); + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + span.end(); + } + }); +}); + +app.post("/v1/traces", (c) => forward(c, "/v1/traces", "resourceSpans")); +app.post("/v1/logs", (c) => forward(c, "/v1/logs", "resourceLogs")); +app.post("/v1/metrics", (c) => forward(c, "/v1/metrics", "resourceMetrics")); + +app.get("/health", (c) => c.json({ ok: true })); + +function readNonNegativeIntEnv(value: string | undefined, fallback: number): number { + if (value === undefined) return fallback; + const parsed = Number.parseInt(value, 10); + return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback; +} + +/** The request body as a byte stream, or null when there is no body to read. */ +function requestBodyStream(c: Context<{ Variables: Variables }>): AsyncIterable | null { + const body = c.req.raw.body; + if (!body) return null; + return Readable.fromWeb( + body as Parameters[0], + ) as unknown as AsyncIterable; +} + +/** Buffer a stream fully, aborting at `maxBytes` (413) and on empty (400). */ +async function collectStreamWithCap( + source: AsyncIterable, + maxBytes: number, +): Promise { + const chunks: Buffer[] = []; + let total = 0; + for await (const raw of source) { + const chunk = Buffer.isBuffer(raw) ? raw : Buffer.from(raw); + if (chunk.length === 0) continue; + total += chunk.length; + if (total > maxBytes) throw new PayloadTooLargeError(maxBytes, total); + chunks.push(chunk); + } + if (total === 0) throw new EmptyBodyError(); + return Buffer.concat(chunks, total); +} + +/** + * Map a body-capture failure to a permanent (non-retryable) 4xx response: + * too-big → 413, empty → 400. Returns null for any other error so the caller + * rethrows it (those become 5xx and OTLP exporters retry). 413/400 are 4xx, so + * exporters drop the batch — correct, since neither will ever succeed on retry. + */ +function handleIngestBodyError( + err: unknown, + c: Context<{ Variables: Variables }>, + span: Span, + path: string, + projectId: string, +): { status: number; response: Response } | null { + if (err instanceof PayloadTooLargeError) { + span.setAttribute("ingest.too_large", true); + span.setAttribute("ingest.limit_bytes", err.limitBytes); + logger.warn( + { path, projectId, limitBytes: err.limitBytes, observedBytes: err.observedBytes }, + "rejecting oversize OTLP body", + ); + return { + status: 413, + response: c.json({ error: `request body exceeds the ${err.limitBytes}-byte limit` }, 413), + }; + } + if (err instanceof EmptyBodyError) { + span.setAttribute("ingest.empty_body", true); + logger.warn({ path, projectId }, "dropping empty OTLP request body"); + return { + status: 400, + response: c.json({ error: "empty OTLP request body; no records to ingest" }, 400), + }; + } + return null; +} + +function extractApiKey(c: Context): string | null { + const header = c.req.header("x-api-key"); + if (header) return header; + const auth = c.req.header("authorization"); + if (auth?.toLowerCase().startsWith("bearer ")) return auth.slice(7).trim(); + return null; +} + +async function forward(c: Context<{ Variables: Variables }>, path: string, rootKey: string) { + return tracer.startActiveSpan("ingest.forward", async (span) => { + const startedAt = performance.now(); + const projectId = c.var.projectId; + const contentType = c.req.header("content-type") ?? "application/x-protobuf"; + const contentEncoding = c.req.header("content-encoding"); + let responseStatus = 500; + let requestBytes = 0; + let storage: "direct" | "inline" | "s3" = "direct"; + + span.setAttribute("otlp.path", path); + span.setAttribute("otlp.root_key", rootKey); + span.setAttribute("tenant.project_id", projectId); + span.setAttribute("http.request.content_type", contentType); + if (contentEncoding) span.setAttribute("http.request.content_encoding", contentEncoding); + + // Wait for a concurrency permit before touching the body. Excess requests + // queue here cheaply (just a pending promise + their socket) instead of being + // rejected — backpressure, not shedding. The body is only read once a permit + // is held, so memory stays bounded by `permits × max-bytes-per-request`. + await requestSemaphore.acquire(); + + try { + // Free-tier hard-block: if the org has exhausted its monthly allowance for + // this signal, drop with a non-retryable 4xx (402) so OTLP exporters stop + // sending rather than retry-storm. Cached + fail-open, so this is a cheap + // in-memory read that never blocks on Autumn. + const signal = signalForPath(path); + if (ingestGate && signal && !ingestGate.allows(projectId, signal)) { + responseStatus = 402; + span.setAttribute("ingest.blocked", "quota_exceeded"); + logger.info({ path, projectId, signal }, "blocking ingest; org over plan quota"); + return c.json( + { error: "telemetry quota exceeded for this billing period; upgrade your plan to resume ingest" }, + 402, + ); + } + + const upstreamHeaders: Record = { + "content-type": contentType, + "x-superlog-project-id": projectId, + }; + if (contentEncoding) upstreamHeaders["content-encoding"] = contentEncoding; + + // Counter is best-effort — never block the ingest hot path on a metric or DB lookup. + void recordIngestRequest(path, projectId).catch((err: unknown) => { + logger.warn({ err, path, projectId }, "tenant counter increment failed"); + }); + + const bodyStream = requestBodyStream(c); + if (!bodyStream) { + responseStatus = 400; + span.setAttribute("ingest.empty_body", true); + logger.warn({ path, projectId }, "dropping OTLP request with no body"); + return c.json({ error: "empty OTLP request body; no records to ingest" }, 400); + } + + // Issue-fingerprint stamping deserializes the whole payload, so in queue mode it runs + // on the consumer (ingest-queue.ts) right before the collector POST — not here on the + // latency-critical ingest edge. The proxy streams raw bytes: small bodies are buffered + // and enqueued inline, larger ones stream straight to S3, so memory per request stays + // bounded regardless of body size. A body over the cap → 413; an empty one → 400. + if (ingestQueue) { + let result: { storage: "inline" | "s3"; bytes: number }; + try { + result = await tracer.startActiveSpan("ingest.queue_send", async (queueSpan) => { + try { + const r = await ingestQueue.enqueueStream({ + path, + projectId, + contentType, + contentEncoding, + body: bodyStream, + }); + queueSpan.setAttribute("ingest.queue.storage", r.storage); + return r; + } catch (err) { + queueSpan.recordException(err as Error); + queueSpan.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + queueSpan.end(); + } + }); + } catch (err) { + const handled = handleIngestBodyError(err, c, span, path, projectId); + if (handled) { + responseStatus = handled.status; + return handled.response; + } + throw err; + } + storage = result.storage; + requestBytes = result.bytes; + + span.setAttribute("ingest.queue.enabled", true); + span.setAttribute("ingest.queue.storage", storage); + responseStatus = 200; + logger.info({ path, projectId, storage }, "queued ingest payload"); + return new Response(new Uint8Array(0), { + status: 200, + headers: { "content-type": "application/x-protobuf" }, + }); + } + + // No queue (local dev / community direct mode): there is no consumer to stamp + // fingerprints and no S3 to spill to, so buffer the body (bounded by the cap → 413) + // and forward it straight to the collector. Memory here is bounded by + // `permits × MAX_BODY_BYTES`; operators on small boxes should size those envs down. + let bodyBuffer: Buffer; + try { + bodyBuffer = await collectStreamWithCap(bodyStream, MAX_BODY_BYTES); + } catch (err) { + const handled = handleIngestBodyError(err, c, span, path, projectId); + if (handled) { + responseStatus = handled.status; + return handled.response; + } + throw err; + } + requestBytes = bodyBuffer.byteLength; + + const stampedBody = stampIssueFingerprintsFailOpen( + { path, contentType, contentEncoding, body: bodyBuffer, projectId }, + logger, + ); + const res = await tracer.startActiveSpan("ingest.collector_post", async (postSpan) => { + postSpan.setAttribute("upstream.url", `${COLLECTOR_URL}${path}`); + try { + const r = await fetch(`${COLLECTOR_URL}${path}`, { + method: "POST", + headers: upstreamHeaders, + body: stampedBody, + }); + postSpan.setAttribute("http.response.status_code", r.status); + if (r.status >= 400) { + postSpan.setStatus({ + code: SpanStatusCode.ERROR, + message: `upstream collector returned ${r.status}`, + }); + } + return r; + } catch (err) { + postSpan.recordException(err as Error); + postSpan.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + postSpan.end(); + } + }); + + span.setAttribute("http.response.status_code", res.status); + responseStatus = res.status; + logger.info({ path, projectId, status: res.status }, "proxied"); + + const resHeaders = new Headers(); + const ct = res.headers.get("content-type"); + if (ct) resHeaders.set("content-type", ct); + + return new Response(res.body, { status: res.status, headers: resHeaders }); + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + // Release the permit once the body is fully read and forwarded. Released on + // every path (success, 4xx, throw) so a failing request can't leak permits + // and wedge the proxy into permanent backpressure. + requestSemaphore.release(); + + const durationMs = performance.now() - startedAt; + const emitOperationalMetric = (org?: { orgId: string; orgName: string } | null) => { + proxyOperationalRecorder.recordIngestRequest({ + path, + projectId, + orgId: org?.orgId, + orgName: org?.orgName, + statusCode: responseStatus, + durationMs, + requestBytes, + storage, + }); + }; + void lookupOrgForProject(projectId) + .then((org) => emitOperationalMetric(org)) + .catch((err: unknown) => { + logger.warn({ err, path, projectId }, "proxy ingest operational metric failed"); + emitOperationalMetric(); + }); + span.end(); + } + }); +} + +const server = serve({ fetch: app.fetch, port: PORT }); +// When deployed behind a load balancer (typically a 60s idle timeout), Node's +// default 5s keepAliveTimeout closes idle keep-alive sockets the balancer still +// considers pooled; reusing one then gets a RST and surfaces as a 502 to the +// client even though the app returned 200. Periodic OTLP metric exporters +// (default ~60s interval) hit this race the hardest. Keep the keep-alive +// comfortably above the balancer idle timeout: a thin (~5s) margin still leaks +// 502s in bursts where many wall-clock-aligned exporters reuse pooled sockets at +// once and the event loop is briefly busy, so we keep a wide margin. headersTimeout +// stays above keepAliveTimeout per Node's required ordering. +if ("keepAliveTimeout" in server) { + server.keepAliveTimeout = 75_000; + server.headersTimeout = 76_000; +} +if (ingestQueue && ingestQueueConfig?.consumerEnabled) { + ingestQueue.startConsumer(COLLECTOR_URL); +} +logger.info( + { + port: PORT, + collector: COLLECTOR_URL, + ingestQueueEnabled: Boolean(ingestQueue), + ingestQueueConsumerEnabled: Boolean(ingestQueue && ingestQueueConfig?.consumerEnabled), + }, + "superlog proxy listening", +); + +// Drain gracefully on the SIGTERM an ECS rolling deploy sends before SIGKILL: +// stop accepting new HTTP requests, then let the queue consumer finish (and +// delete) its in-flight messages. Without this the task is killed mid-batch and +// the received-but-undeleted SQS messages stay invisible for the full visibility +// timeout before redelivering — the sawtooth that pins ApproximateAgeOfOldestMessage +// and trips the ingest-lag page on every deploy. ECS's stopTimeout bounds how long +// we get; the consumer aborts its idle long-poll so the drain is fast in practice. +let shuttingDown = false; +async function shutdown(signal: NodeJS.Signals): Promise { + if (shuttingDown) return; + shuttingDown = true; + logger.info({ signal }, "received shutdown signal; draining"); + try { + await new Promise((resolve) => { + if ("close" in server && typeof server.close === "function") { + server.close(() => resolve()); + } else { + resolve(); + } + }); + if (ingestQueue && ingestQueueConfig?.consumerEnabled) { + await ingestQueue.stop(); + } + } catch (err) { + // Exit non-zero so a failed drain is visible rather than masquerading as a + // clean stop. + logger.error({ err }, "error during graceful shutdown"); + process.exit(1); + } + process.exit(0); +} +process.once("SIGTERM", () => void shutdown("SIGTERM")); +process.once("SIGINT", () => void shutdown("SIGINT")); diff --git a/superlog/apps/proxy/src/ingest-fingerprints.test.ts b/superlog/apps/proxy/src/ingest-fingerprints.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..8a0a0c678231b7aeae8d803f615fbf86847ac1eb --- /dev/null +++ b/superlog/apps/proxy/src/ingest-fingerprints.test.ts @@ -0,0 +1,270 @@ +import { strict as assert } from "node:assert"; +import { createRequire } from "node:module"; +import { test } from "node:test"; +import { + MAX_FINGERPRINT_BODY_BYTES, + stampIssueFingerprints, + stampIssueFingerprintsFailOpen, + stampIssueFingerprintsWithinLimit, +} from "./ingest-fingerprints.js"; + +function captureLogger() { + const calls: { level: "info" | "warn"; obj: Record; msg: string }[] = []; + return { + calls, + info: (obj: Record, msg: string) => calls.push({ level: "info", obj, msg }), + warn: (obj: Record, msg: string) => calls.push({ level: "warn", obj, msg }), + }; +} + +const require = createRequire(import.meta.url); +const otlpRoot = require("@opentelemetry/otlp-transformer/build/esm/generated/root.js"); +const ExportTraceServiceRequest = + otlpRoot.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; + +test("stampIssueFingerprints adds issue fingerprint attributes to JSON trace exceptions", () => { + const input = { + path: "/v1/traces", + contentType: "application/json", + body: Buffer.from( + JSON.stringify({ + resourceSpans: [ + { + scopeSpans: [ + { + spans: [ + { + events: [ + { + name: "exception", + attributes: [ + { key: "exception.type", value: { stringValue: "Error" } }, + { key: "exception.message", value: { stringValue: "boom 123" } }, + { + key: "exception.stacktrace", + value: { + stringValue: "Error: boom\n at fail (apps/api/src/foo.ts:10:2)", + }, + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }), + ), + }; + + const stamped = stampIssueFingerprints(input); + const payload = JSON.parse(stamped.body.toString("utf8")); + const attributes = payload.resourceSpans[0].scopeSpans[0].spans[0].events[0].attributes; + + assert.equal(stamped.stampedCount, 1); + assert.equal( + attributes.find((attr: { key: string }) => attr.key === "superlog.issue_fingerprint").value + .stringValue.length, + 16, + ); +}); + +test("stampIssueFingerprints adds issue fingerprint attributes to JSON error logs", () => { + const input = { + path: "/v1/logs", + contentType: "application/json", + body: Buffer.from( + JSON.stringify({ + resourceLogs: [ + { + resource: { + attributes: [{ key: "service.name", value: { stringValue: "superlog-api" } }], + }, + scopeLogs: [ + { + logRecords: [ + { + severityText: "ERROR", + body: { stringValue: "request failed for project 123" }, + attributes: [ + { key: "exception.type", value: { stringValue: "ForbiddenError" } }, + ], + }, + ], + }, + ], + }, + ], + }), + ), + }; + + const stamped = stampIssueFingerprints(input); + const payload = JSON.parse(stamped.body.toString("utf8")); + const attributes = payload.resourceLogs[0].scopeLogs[0].logRecords[0].attributes; + + assert.equal(stamped.stampedCount, 1); + assert.equal( + attributes.find((attr: { key: string }) => attr.key === "superlog.issue_fingerprint").value + .stringValue.length, + 16, + ); +}); + +test("stampIssueFingerprints adds issue fingerprint attributes to protobuf trace exceptions", () => { + const request = ExportTraceServiceRequest.create({ + resourceSpans: [ + { + scopeSpans: [ + { + spans: [ + { + events: [ + { + name: "exception", + attributes: [ + { key: "exception.type", value: { stringValue: "Error" } }, + { key: "exception.message", value: { stringValue: "boom 123" } }, + { + key: "exception.stacktrace", + value: { + stringValue: "Error: boom\n at fail (apps/api/src/foo.ts:10:2)", + }, + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }); + const body = Buffer.from(ExportTraceServiceRequest.encode(request).finish()); + + const stamped = stampIssueFingerprints({ + path: "/v1/traces", + contentType: "application/x-protobuf", + body, + }); + const decoded = ExportTraceServiceRequest.decode(stamped.body); + const attributes = decoded.resourceSpans[0].scopeSpans[0].spans[0].events[0].attributes; + + assert.equal(stamped.stampedCount, 1); + assert.equal( + attributes.find((attr: { key: string }) => attr.key === "superlog.issue_fingerprint").value + .stringValue.length, + 16, + ); +}); + +test("stampIssueFingerprintsWithinLimit skips bodies over the limit without parsing them", () => { + // An oversized body must never reach JSON.parse — that synchronous parse of a multi-MB + // payload is what spikes RSS and OOM-kills the process. Feed deliberately invalid JSON + // that exceeds the limit: if the guard parsed it, this would throw. + const oversized = Buffer.from(`{not valid json${"x".repeat(64)}`); + const stamped = stampIssueFingerprintsWithinLimit( + { path: "/v1/logs", contentType: "application/json", body: oversized }, + 32, + ); + + assert.equal(stamped.body, oversized); + assert.equal(stamped.stampedCount, 0); +}); + +test("stampIssueFingerprintsWithinLimit stamps bodies within the limit", () => { + const body = Buffer.from( + JSON.stringify({ + resourceLogs: [ + { + resource: { attributes: [{ key: "service.name", value: { stringValue: "api" } }] }, + scopeLogs: [ + { + logRecords: [ + { + severityText: "ERROR", + body: { stringValue: "boom" }, + attributes: [{ key: "exception.type", value: { stringValue: "Error" } }], + }, + ], + }, + ], + }, + ], + }), + ); + + const stamped = stampIssueFingerprintsWithinLimit({ + path: "/v1/logs", + contentType: "application/json", + body, + }); + + assert.equal(stamped.stampedCount, 1); + assert.ok(MAX_FINGERPRINT_BODY_BYTES > 0); +}); + +test("stampIssueFingerprintsFailOpen forwards the original body when stamping throws", () => { + // Malformed JSON makes stampIssueFingerprints throw; the consumer must still forward the + // payload verbatim rather than dropping it. + const body = Buffer.from('{"resourceLogs": broken'); + const logger = captureLogger(); + + const result = stampIssueFingerprintsFailOpen( + { path: "/v1/logs", contentType: "application/json", body, projectId: "p1" }, + logger, + ); + + assert.equal(result, body); + assert.equal(logger.calls.some((c) => c.level === "warn"), true); +}); + +test("stampIssueFingerprintsFailOpen returns the stamped body and logs on success", () => { + const body = Buffer.from( + JSON.stringify({ + resourceLogs: [ + { + resource: { attributes: [{ key: "service.name", value: { stringValue: "api" } }] }, + scopeLogs: [ + { + logRecords: [ + { + severityText: "ERROR", + body: { stringValue: "boom" }, + attributes: [{ key: "exception.type", value: { stringValue: "Error" } }], + }, + ], + }, + ], + }, + ], + }), + ); + const logger = captureLogger(); + + const result = stampIssueFingerprintsFailOpen( + { path: "/v1/logs", contentType: "application/json", body, projectId: "p1" }, + logger, + ); + + const stamped = JSON.parse(result.toString("utf8")); + const attrs = stamped.resourceLogs[0].scopeLogs[0].logRecords[0].attributes; + assert.ok(attrs.find((a: { key: string }) => a.key === "superlog.issue_fingerprint")); + assert.equal(logger.calls.some((c) => c.level === "info"), true); +}); + +test("stampIssueFingerprints leaves compressed payloads untouched", () => { + const body = Buffer.from("compressed"); + const stamped = stampIssueFingerprints({ + path: "/v1/traces", + contentType: "application/json", + contentEncoding: "gzip", + body, + }); + + assert.equal(stamped.body, body); + assert.equal(stamped.stampedCount, 0); +}); diff --git a/superlog/apps/proxy/src/ingest-fingerprints.ts b/superlog/apps/proxy/src/ingest-fingerprints.ts new file mode 100644 index 0000000000000000000000000000000000000000..b246ddd0662da39f8261800482e258d53c51c396 --- /dev/null +++ b/superlog/apps/proxy/src/ingest-fingerprints.ts @@ -0,0 +1,252 @@ +import { createRequire } from "node:module"; +import { fingerprint, fingerprintLog } from "@superlog/fingerprint"; + +const ISSUE_FINGERPRINT_ATTRIBUTE = "superlog.issue_fingerprint"; +const require = createRequire(import.meta.url); +const otlpRoot = require("@opentelemetry/otlp-transformer/build/esm/generated/root.js"); +const ExportTraceServiceRequest = + otlpRoot.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; + +type OtlpAnyValue = { + stringValue?: string; + intValue?: number | string; + doubleValue?: number; + boolValue?: boolean; +}; + +type OtlpKeyValue = { + key?: string; + value?: OtlpAnyValue; +}; + +type StampInput = { + path: string; + contentType: string; + contentEncoding?: string; + body: Buffer; +}; + +export type StampedIngestPayload = { + body: Buffer; + stampedCount: number; +}; + +// Fingerprint stamping deserializes the whole body (JSON.parse / protobuf decode) and +// re-serializes it. For a multi-MB OTLP batch that is a 100s-of-MB synchronous spike that +// blocks the event loop and can OOM-kill the process. Anything large enough to be offloaded +// to S3 (>240 KB inline budget) is far past the size of a normal error batch, so we skip +// enrichment for those rather than parse them. Inline queue bodies are always under this cap. +export const MAX_FINGERPRINT_BODY_BYTES = 256_000; + +export function stampIssueFingerprintsWithinLimit( + input: StampInput, + maxBytes: number = MAX_FINGERPRINT_BODY_BYTES, +): StampedIngestPayload { + if (input.body.byteLength > maxBytes) return { body: input.body, stampedCount: 0 }; + return stampIssueFingerprints(input); +} + +export interface FingerprintLogger { + info(obj: Record, msg: string): void; + warn(obj: Record, msg: string): void; +} + +// Enrichment must never break ingest: a malformed payload that throws during stamping is +// still forwarded verbatim (fail-open). Returns the body to send downstream. +export function stampIssueFingerprintsFailOpen( + input: StampInput & { projectId: string }, + logger: FingerprintLogger, +): Buffer { + try { + const stamped = stampIssueFingerprintsWithinLimit(input); + if (stamped.stampedCount > 0) { + logger.info( + { path: input.path, projectId: input.projectId, stampedCount: stamped.stampedCount }, + "stamped issue fingerprints on ingest payload", + ); + } + return stamped.body; + } catch (err) { + logger.warn( + { err, path: input.path, projectId: input.projectId, contentType: input.contentType }, + "failed to stamp issue fingerprints on ingest payload", + ); + return input.body; + } +} + +export function stampIssueFingerprints(input: StampInput): StampedIngestPayload { + if (input.contentEncoding) return { body: input.body, stampedCount: 0 }; + + if (input.path === "/v1/traces" && isJsonContentType(input.contentType)) { + return stampJsonTraceFingerprints(input.body); + } + if (input.path === "/v1/traces" && isProtobufContentType(input.contentType)) { + return stampProtobufTraceFingerprints(input.body); + } + if (input.path === "/v1/logs" && isJsonContentType(input.contentType)) { + return stampJsonLogFingerprints(input.body); + } + return { body: input.body, stampedCount: 0 }; +} + +function stampJsonTraceFingerprints(body: Buffer): StampedIngestPayload { + const payload = JSON.parse(body.toString("utf8")) as { + resourceSpans?: Array<{ + scopeSpans?: Array<{ + spans?: Array<{ + events?: Array<{ + name?: string; + attributes?: OtlpKeyValue[]; + }>; + }>; + }>; + }>; + }; + + let stampedCount = 0; + for (const resourceSpan of payload.resourceSpans ?? []) { + for (const scopeSpan of resourceSpan.scopeSpans ?? []) { + for (const span of scopeSpan.spans ?? []) { + for (const event of span.events ?? []) { + if (event.name !== "exception") continue; + const attrs = event.attributes ?? []; + const fp = fingerprint({ + type: stringAttribute(attrs, "exception.type") || "Error", + message: stringAttribute(attrs, "exception.message"), + stacktrace: stringAttribute(attrs, "exception.stacktrace"), + }); + event.attributes = setStringAttribute(attrs, ISSUE_FINGERPRINT_ATTRIBUTE, fp.hash); + stampedCount += 1; + } + } + } + } + + if (stampedCount === 0) return { body, stampedCount }; + return { body: Buffer.from(JSON.stringify(payload)), stampedCount }; +} + +function stampProtobufTraceFingerprints(body: Buffer): StampedIngestPayload { + const payload = ExportTraceServiceRequest.decode(body) as { + resourceSpans?: Array<{ + scopeSpans?: Array<{ + spans?: Array<{ + events?: Array<{ + name?: string; + attributes?: OtlpKeyValue[]; + }>; + }>; + }>; + }>; + }; + + let stampedCount = 0; + for (const resourceSpan of payload.resourceSpans ?? []) { + for (const scopeSpan of resourceSpan.scopeSpans ?? []) { + for (const span of scopeSpan.spans ?? []) { + for (const event of span.events ?? []) { + if (event.name !== "exception") continue; + const attrs = event.attributes ?? []; + const fp = fingerprint({ + type: stringAttribute(attrs, "exception.type") || "Error", + message: stringAttribute(attrs, "exception.message"), + stacktrace: stringAttribute(attrs, "exception.stacktrace"), + }); + event.attributes = setStringAttribute(attrs, ISSUE_FINGERPRINT_ATTRIBUTE, fp.hash); + stampedCount += 1; + } + } + } + } + + if (stampedCount === 0) return { body, stampedCount }; + return { body: Buffer.from(ExportTraceServiceRequest.encode(payload).finish()), stampedCount }; +} + +function stampJsonLogFingerprints(body: Buffer): StampedIngestPayload { + const payload = JSON.parse(body.toString("utf8")) as { + resourceLogs?: Array<{ + resource?: { attributes?: OtlpKeyValue[] }; + scopeLogs?: Array<{ + logRecords?: Array<{ + severityText?: string; + severityNumber?: number; + body?: OtlpAnyValue; + attributes?: OtlpKeyValue[]; + }>; + }>; + }>; + }; + + let stampedCount = 0; + for (const resourceLog of payload.resourceLogs ?? []) { + const service = + stringAttribute(resourceLog.resource?.attributes ?? [], "service.name") || "unknown"; + for (const scopeLog of resourceLog.scopeLogs ?? []) { + for (const logRecord of scopeLog.logRecords ?? []) { + const attrs = logRecord.attributes ?? []; + if (!isErrorLog(logRecord.severityNumber, logRecord.severityText, attrs)) continue; + const fp = fingerprintLog({ + service, + severity: logRecord.severityText || String(logRecord.severityNumber ?? ""), + body: stringValue(logRecord.body) ?? "", + exceptionType: stringAttribute(attrs, "exception.type"), + stacktrace: stringAttribute(attrs, "exception.stacktrace"), + }); + logRecord.attributes = setStringAttribute(attrs, ISSUE_FINGERPRINT_ATTRIBUTE, fp.hash); + stampedCount += 1; + } + } + } + + if (stampedCount === 0) return { body, stampedCount }; + return { body: Buffer.from(JSON.stringify(payload)), stampedCount }; +} + +function isJsonContentType(contentType: string): boolean { + return contentType.toLowerCase().includes("json"); +} + +function isProtobufContentType(contentType: string): boolean { + return contentType.toLowerCase().includes("protobuf"); +} + +function isErrorLog( + severityNumber: number | undefined, + severityText: string | undefined, + attrs: OtlpKeyValue[], +): boolean { + if (typeof severityNumber === "number" && severityNumber >= 17) return true; + const normalizedSeverity = severityText?.toUpperCase(); + if ( + normalizedSeverity === "ERROR" || + normalizedSeverity === "FATAL" || + normalizedSeverity === "CRITICAL" + ) { + return true; + } + return Boolean( + stringAttribute(attrs, "exception.type") || stringAttribute(attrs, "exception.stacktrace"), + ); +} + +function setStringAttribute(attrs: OtlpKeyValue[], key: string, value: string): OtlpKeyValue[] { + const next = attrs.filter((attr) => attr.key !== key); + next.push({ key, value: { stringValue: value } }); + return next; +} + +function stringAttribute(attrs: OtlpKeyValue[], key: string): string | null { + return stringValue(attrs.find((attr) => attr.key === key)?.value); +} + +function stringValue(value: OtlpAnyValue | undefined): string | null { + if (!value) return null; + if (typeof value.stringValue === "string") return value.stringValue; + if (typeof value.intValue === "number" || typeof value.intValue === "string") + return String(value.intValue); + if (typeof value.doubleValue === "number") return String(value.doubleValue); + if (typeof value.boolValue === "boolean") return String(value.boolValue); + return null; +} diff --git a/superlog/apps/proxy/src/ingest-queue.shutdown.test.ts b/superlog/apps/proxy/src/ingest-queue.shutdown.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..1c25fe5970da9aacf68410d8b7ec5f5fedacc506 --- /dev/null +++ b/superlog/apps/proxy/src/ingest-queue.shutdown.test.ts @@ -0,0 +1,113 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { setTimeout as delay } from "node:timers/promises"; +import { IngestQueue, type IngestQueueConfig, encodeIngestMessage } from "./ingest-queue.js"; + +const noopLogger = { info: () => {}, warn: () => {}, error: () => {} }; + +const config: IngestQueueConfig = { + queueUrl: "http://localhost/queue", + region: "us-west-2", + oversizePrefix: "otlp-oversize", + maxMessageBytes: 240_000, + maxBodyBytes: 10_000, + consumerEnabled: true, + waitTimeSeconds: 20, + visibilityTimeoutSeconds: 120, + batchSize: 1, + consumerConcurrency: 1, +}; + +const inlineBody = encodeIngestMessage( + { + path: "/v1/logs", + projectId: "project-1", + contentType: "application/x-protobuf", + body: Buffer.from("hello"), + }, + config, +).messageBody; + +/** + * Fake SQS that delivers exactly one message on the first ReceiveMessage and + * then blocks (like a real 20s long-poll) until the consumer's AbortController + * fires — at which point it rejects with an AbortError, exactly as the AWS SDK + * does when send() is aborted. Records every DeleteMessage. + */ +class FakeConsumerSqs { + receiveCount = 0; + deleted: string[] = []; + private delivered = false; + + // biome-ignore lint/suspicious/noExplicitAny: minimal AWS client test double + async send(cmd: any, opts?: { abortSignal?: AbortSignal }): Promise { + const name = cmd.constructor.name; + if (name === "ReceiveMessageCommand") { + this.receiveCount++; + if (!this.delivered) { + this.delivered = true; + return { + Messages: [{ MessageId: "m-1", ReceiptHandle: "r-1", Body: inlineBody }], + }; + } + return await new Promise((_resolve, reject) => { + const signal = opts?.abortSignal; + const abort = () => { + const err = new Error("Request aborted"); + err.name = "AbortError"; + reject(err); + }; + if (signal?.aborted) return abort(); + signal?.addEventListener("abort", abort, { once: true }); + }); + } + if (name === "DeleteMessageCommand") { + this.deleted.push(cmd.input.ReceiptHandle); + return {}; + } + throw new Error(`unexpected SQS command: ${name}`); + } +} + +async function waitFor(predicate: () => boolean, timeoutMs = 1_000): Promise { + const start = Date.now(); + while (!predicate()) { + if (Date.now() - start > timeoutMs) throw new Error("timed out waiting for condition"); + await delay(5); + } +} + +test("stop() drains the in-flight message and halts polling", async () => { + const queue = new IngestQueue(config, noopLogger); + const sqs = new FakeConsumerSqs(); + (queue as unknown as { sqs: FakeConsumerSqs }).sqs = sqs; + + const originalFetch = globalThis.fetch; + globalThis.fetch = (async () => new Response(new Uint8Array(0), { status: 200 })) as typeof fetch; + + try { + queue.startConsumer("http://collector.local"); + + // The first delivered message must be forwarded to the collector and then + // deleted from SQS before we initiate shutdown. + await waitFor(() => sqs.deleted.length === 1); + assert.deepEqual(sqs.deleted, ["r-1"]); + + const receivesBeforeStop = sqs.receiveCount; + await queue.stop(); + + // After draining, the loop must not issue any further ReceiveMessage calls. + await delay(50); + assert.equal( + sqs.receiveCount, + receivesBeforeStop, + "consumer must stop polling once stop() resolves", + ); + assert.equal(sqs.deleted.length, 1, "the in-flight message must remain deleted exactly once"); + + // stop() is idempotent. + await queue.stop(); + } finally { + globalThis.fetch = originalFetch; + } +}); diff --git a/superlog/apps/proxy/src/ingest-queue.stream.test.ts b/superlog/apps/proxy/src/ingest-queue.stream.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..c99a6676f18c69d39d8f5accb782341d564a0894 --- /dev/null +++ b/superlog/apps/proxy/src/ingest-queue.stream.test.ts @@ -0,0 +1,139 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { PayloadTooLargeError, type SpillSink } from "./body-capture.js"; +import { IngestQueue, type IngestQueueConfig, type SpillSinkFactory } from "./ingest-queue.js"; + +class FakeSqs { + sent: string[] = []; + // biome-ignore lint/suspicious/noExplicitAny: test double for the AWS client surface + async send(cmd: any): Promise { + if (cmd.constructor.name !== "SendMessageCommand") { + throw new Error(`unexpected SQS command: ${cmd.constructor.name}`); + } + this.sent.push(cmd.input.MessageBody); + return { MessageId: "m-1" }; + } +} + +class RecordingSink implements SpillSink { + written: Buffer[] = []; + finished = false; + aborted = false; + async write(chunk: Uint8Array): Promise { + this.written.push(Buffer.from(chunk)); + } + async finish(): Promise { + this.finished = true; + } + async abort(): Promise { + this.aborted = true; + } + get bytes(): number { + return this.written.reduce((n, b) => n + b.length, 0); + } +} + +const noopLogger = { info: () => {}, warn: () => {}, error: () => {} }; + +function buildQueue(overrides: Partial = {}): { + queue: IngestQueue; + sqs: FakeSqs; + sinks: RecordingSink[]; +} { + const config: IngestQueueConfig = { + queueUrl: "http://localhost/queue", + region: "us-west-2", + oversizeBucket: "test-bucket", + oversizePrefix: "otlp-oversize", + maxMessageBytes: 4000, // inline raw threshold ≈ floor((4000-1024)*3/4) = 2232 bytes + maxBodyBytes: 10_000, + consumerEnabled: false, + waitTimeSeconds: 20, + visibilityTimeoutSeconds: 120, + batchSize: 10, + consumerConcurrency: 4, + ...overrides, + }; + const sinks: RecordingSink[] = []; + const spillSinkFactory: SpillSinkFactory = () => { + const sink = new RecordingSink(); + sinks.push(sink); + return sink; + }; + const queue = new IngestQueue(config, noopLogger, spillSinkFactory); + const sqs = new FakeSqs(); + (queue as unknown as { sqs: FakeSqs }).sqs = sqs; + return { queue, sqs, sinks }; +} + +async function* streamOf(...chunks: string[]): AsyncIterable { + for (const chunk of chunks) yield Buffer.from(chunk); +} + +test("small body is buffered and enqueued inline, never opening a spill sink", async () => { + const { queue, sqs, sinks } = buildQueue(); + const result = await queue.enqueueStream({ + path: "/v1/traces", + projectId: "proj-1", + contentType: "application/x-protobuf", + body: streamOf("hello world"), + }); + + assert.equal(result.storage, "inline"); + assert.equal(result.bytes, 11); + assert.equal(sinks.length, 0, "small body must not spill"); + assert.equal(sqs.sent.length, 1); + const sent = sqs.sent[0]; + assert.ok(sent); + const msg = JSON.parse(sent); + assert.equal(msg.body.storage, "inline"); + assert.equal(Buffer.from(msg.body.base64, "base64").toString(), "hello world"); +}); + +test("large body streams to the spill sink and enqueues an s3 pointer with the byte count", async () => { + const { queue, sqs, sinks } = buildQueue(); + // 3000 raw bytes > the ~2232 inline threshold → spills. + const chunk = "X".repeat(1000); + const result = await queue.enqueueStream({ + path: "/v1/traces", + projectId: "proj-1", + contentType: "application/x-protobuf", + body: streamOf(chunk, chunk, chunk), + }); + + assert.equal(result.storage, "s3"); + assert.equal(result.bytes, 3000); + assert.equal(sinks.length, 1, "exactly one spill sink opened"); + const sink = sinks[0]; + assert.ok(sink); + assert.equal(sink.bytes, 3000, "every byte streamed through the sink intact"); + assert.equal(sink.finished, true); + assert.equal(sink.aborted, false); + + assert.equal(sqs.sent.length, 1); + const sent = sqs.sent[0]; + assert.ok(sent); + const msg = JSON.parse(sent); + assert.equal(msg.body.storage, "s3"); + assert.equal(msg.body.bucket, "test-bucket"); + assert.equal(msg.body.sizeBytes, 3000); + assert.match(msg.body.key, /^otlp-oversize\/\d{4}\/\d{2}\/\d{2}\/.+\.otlp$/); +}); + +test("a body over maxBodyBytes is rejected with PayloadTooLargeError and enqueues nothing", async () => { + // maxBodyBytes (2500) is below the inline threshold (~2232 from maxMessageBytes + // 4000), so the cap trips while still buffering. The spill-then-abort path is + // covered separately by the body-capture unit test; here we assert the invariant + // that an over-cap body never reaches the queue. + const { queue, sqs } = buildQueue({ maxBodyBytes: 2500 }); + await assert.rejects( + queue.enqueueStream({ + path: "/v1/traces", + projectId: "proj-1", + contentType: "application/x-protobuf", + body: streamOf("Y".repeat(1500), "Y".repeat(1500)), // 3000 > 2500 + }), + PayloadTooLargeError, + ); + assert.equal(sqs.sent.length, 0, "over-cap body must never reach the queue"); +}); diff --git a/superlog/apps/proxy/src/ingest-queue.test.ts b/superlog/apps/proxy/src/ingest-queue.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..3ad88b3f7b252b2f266d603679172845b2daceb5 --- /dev/null +++ b/superlog/apps/proxy/src/ingest-queue.test.ts @@ -0,0 +1,180 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { + PoisonMessageError, + describeCollectorFailure, + encodeIngestMessage, + getIngestQueueConfig, + isPermanentCollectorFailure, + isPoisonMessageError, + parseIngestMessage, + queueDeliveryMetricFromParsedMessage, +} from "./ingest-queue.js"; + +const baseInput = { + path: "/v1/logs", + projectId: "project-1", + contentType: "application/x-protobuf", + body: Buffer.from("hello"), +}; + +test("getIngestQueueConfig leaves direct forwarding enabled by default", () => { + assert.equal(getIngestQueueConfig({}), null); +}); + +test("getIngestQueueConfig reads bounded consumer concurrency", () => { + const config = getIngestQueueConfig({ + INGEST_QUEUE_URL: "https://sqs.us-west-2.amazonaws.com/123/superlog-test-ingest", + INGEST_QUEUE_CONSUMER_CONCURRENCY: "99", + }); + + assert.equal(config?.consumerConcurrency, 32); +}); + +test("encodeIngestMessage stores small payloads inline", () => { + const encoded = encodeIngestMessage( + baseInput, + { + maxMessageBytes: 240_000, + oversizePrefix: "otlp-oversize", + }, + new Date("2026-05-24T00:00:00.000Z"), + "payload-1", + ); + + assert.equal(encoded.storage, "inline"); + assert.equal(encoded.s3Object, undefined); + + const message = JSON.parse(encoded.messageBody); + assert.equal(message.body.storage, "inline"); + assert.equal(Buffer.from(message.body.base64, "base64").toString("utf8"), "hello"); +}); + +test("encodeIngestMessage offloads payloads that would exceed the SQS envelope budget", () => { + const encoded = encodeIngestMessage( + { ...baseInput, body: Buffer.alloc(32, 7), contentEncoding: "gzip" }, + { + maxMessageBytes: 10, + oversizeBucket: "superlog-ingest-oversize", + oversizePrefix: "/otlp-oversize/", + }, + new Date("2026-05-24T12:34:56.000Z"), + "payload-2", + ); + + assert.equal(encoded.storage, "s3"); + assert.equal(encoded.s3Object?.bucket, "superlog-ingest-oversize"); + assert.equal(encoded.s3Object?.key, "otlp-oversize/2026/05/24/payload-2.otlp"); + assert.equal(encoded.s3Object?.body.byteLength, 32); + + const message = JSON.parse(encoded.messageBody); + assert.equal(message.body.storage, "s3"); + assert.equal(message.body.bucket, "superlog-ingest-oversize"); + assert.equal(message.body.key, "otlp-oversize/2026/05/24/payload-2.otlp"); + assert.equal(message.contentEncoding, "gzip"); +}); + +test("describeCollectorFailure includes bounded collector response body", () => { + const failure = describeCollectorFailure(400, "bad request: invalid OTLP payload"); + + assert.equal(failure.message, "collector returned 400: bad request: invalid OTLP payload"); + assert.equal(failure.status, 400); + assert.equal(failure.body, "bad request: invalid OTLP payload"); +}); + +test("isPermanentCollectorFailure drops 4xx the collector can never accept on retry", () => { + // A real prod incident: a client sent http.response_content_length above uint64 max, + // the collector 400s the whole batch, and the consumer cycled the same message every + // 900s (visibility timeout) for ~12.5h before the DLQ — pinning oldest-message-age into + // a sawtooth. Re-sending identical bytes can never succeed, so 4xx must be dropped. + assert.equal(isPermanentCollectorFailure(400), true); + assert.equal(isPermanentCollectorFailure(401), true); + assert.equal(isPermanentCollectorFailure(403), true); + assert.equal(isPermanentCollectorFailure(404), true); + assert.equal(isPermanentCollectorFailure(413), true); + assert.equal(isPermanentCollectorFailure(422), true); +}); + +test("isPermanentCollectorFailure keeps retryable statuses on the queue", () => { + // 408/429 are backpressure/timeout signals and 5xx are transient — the same payload can + // succeed once the collector recovers, so these stay in the queue for redelivery. + assert.equal(isPermanentCollectorFailure(408), false); + assert.equal(isPermanentCollectorFailure(429), false); + assert.equal(isPermanentCollectorFailure(500), false); + assert.equal(isPermanentCollectorFailure(502), false); + assert.equal(isPermanentCollectorFailure(503), false); + assert.equal(isPermanentCollectorFailure(504), false); + // Not a failure status at all — defensively never treated as a permanent drop. + assert.equal(isPermanentCollectorFailure(200), false); +}); + +test("parseIngestMessage round-trips a well-formed inline message", () => { + const encoded = encodeIngestMessage( + baseInput, + { maxMessageBytes: 240_000, oversizePrefix: "otlp-oversize" }, + new Date("2026-05-24T00:00:00.000Z"), + "payload-ok", + ); + + const parsed = parseIngestMessage(encoded.messageBody); + assert.equal(parsed.path, "/v1/logs"); + assert.equal(parsed.body.storage, "inline"); +}); + +test("parseIngestMessage flags an empty inline body as a poison message", () => { + // An empty OTLP HTTP body base64-encodes to "" — there is nothing to forward and + // no retry can ever succeed, so it must be classified as poison (delete, not cycle). + const emptyBody = JSON.stringify({ + version: 1, + kind: "otlp", + path: "/v1/logs", + projectId: "project-1", + contentType: "application/json", + receivedAt: "2026-05-29T00:00:00.000Z", + body: { storage: "inline", base64: "" }, + }); + + assert.throws(() => parseIngestMessage(emptyBody), PoisonMessageError); + try { + parseIngestMessage(emptyBody); + } catch (err) { + assert.equal(isPoisonMessageError(err), true); + } +}); + +test("parseIngestMessage flags non-JSON message bodies as poison", () => { + assert.throws(() => parseIngestMessage("not json at all"), PoisonMessageError); +}); + +test("parseIngestMessage flags valid JSON with malformed envelope fields as poison", () => { + // Valid JSON, but `path` is a number — assertIngestMessage's `.startsWith` would throw a + // TypeError. A structurally-broken envelope can never succeed on retry, so it must be poison. + const malformed = JSON.stringify({ + version: 1, + kind: "otlp", + path: 123, + projectId: "project-1", + contentType: "application/json", + body: { storage: "inline", base64: "aGVsbG8=" }, + }); + + assert.throws(() => parseIngestMessage(malformed), PoisonMessageError); +}); + +test("isPoisonMessageError discriminates transient errors", () => { + assert.equal(isPoisonMessageError(new Error("collector returned 503")), false); + assert.equal(isPoisonMessageError(new PoisonMessageError("bad")), true); +}); + +test("queueDeliveryMetricFromParsedMessage ignores malformed parsed payloads", () => { + assert.equal( + queueDeliveryMetricFromParsedMessage( + { path: "/v1/logs", projectId: "project-1", body: {} }, + "delivery_error", + undefined, + 12, + 34, + ), + null, + ); +}); diff --git a/superlog/apps/proxy/src/ingest-queue.ts b/superlog/apps/proxy/src/ingest-queue.ts new file mode 100644 index 0000000000000000000000000000000000000000..18199e08befebc83c7191016f26c7e756f0acb36 --- /dev/null +++ b/superlog/apps/proxy/src/ingest-queue.ts @@ -0,0 +1,813 @@ +import { randomUUID } from "node:crypto"; +import { PassThrough } from "node:stream"; +import { setTimeout as sleep } from "node:timers/promises"; +import { + DeleteObjectCommand, + GetObjectCommand, + type GetObjectCommandOutput, + PutObjectCommand, + S3Client, +} from "@aws-sdk/client-s3"; +import { + DeleteMessageCommand, + type Message, + ReceiveMessageCommand, + type ReceiveMessageCommandOutput, + SQSClient, + SendMessageCommand, +} from "@aws-sdk/client-sqs"; +import { Upload } from "@aws-sdk/lib-storage"; +import { type SpillSink, captureBody } from "./body-capture.js"; +import { stampIssueFingerprintsFailOpen } from "./ingest-fingerprints.js"; +import { proxyOperationalRecorder } from "./operational-metrics.js"; + +const DEFAULT_MAX_MESSAGE_BYTES = 240_000; +// Hard ceiling on a single ingest body. Bodies above this are rejected at the +// edge (413) instead of accepted and buffered/streamed. Set well above the +// largest legitimate payload we have observed (~38 MiB). +const DEFAULT_MAX_BODY_BYTES = 64 * 1024 * 1024; +// Slack reserved for the JSON envelope (field names + metadata) when deciding +// the raw-byte threshold under which a base64 inline message still fits SQS. +const INLINE_ENVELOPE_SLACK_BYTES = 1_024; +// One S3 multipart part held in memory at a time per spilling upload, so a +// large body costs ~PART_SIZE of RSS regardless of its total size. +const SPILL_PART_SIZE_BYTES = 5 * 1024 * 1024; +const DEFAULT_WAIT_TIME_SECONDS = 20; +const DEFAULT_VISIBILITY_TIMEOUT_SECONDS = 120; +const DEFAULT_BATCH_SIZE = 10; +const DEFAULT_CONSUMER_CONCURRENCY = 4; +const MAX_COLLECTOR_ERROR_BODY_CHARS = 1_000; + +type LoggerLike = { + info: (obj: Record, msg: string) => void; + warn: (obj: Record, msg: string) => void; + error: (obj: Record, msg: string) => void; +}; + +export type IngestQueueConfig = { + queueUrl: string; + region?: string; + oversizeBucket?: string; + oversizePrefix: string; + maxMessageBytes: number; + maxBodyBytes: number; + consumerEnabled: boolean; + waitTimeSeconds: number; + visibilityTimeoutSeconds: number; + batchSize: number; + consumerConcurrency: number; +}; + +export type IngestQueueInput = { + path: string; + projectId: string; + contentType: string; + contentEncoding?: string; + body: Buffer; +}; + +type InlineBody = { + storage: "inline"; + base64: string; +}; + +type S3Body = { + storage: "s3"; + bucket: string; + key: string; + sizeBytes: number; +}; + +type IngestQueueMessage = { + version: 1; + kind: "otlp"; + path: string; + projectId: string; + contentType: string; + contentEncoding?: string; + receivedAt: string; + body: InlineBody | S3Body; +}; + +export type CollectorFailureDescription = { + message: string; + status: number; + body?: string; +}; + +export type EncodedIngestMessage = { + messageBody: string; + s3Object?: { + bucket: string; + key: string; + body: Buffer; + contentType: string; + }; + storage: "inline" | "s3"; +}; + +type QueueDeliveryMetric = { + path: string; + projectId: string; + storage: "inline" | "s3"; + outcome: "delivered" | "collector_error" | "invalid_message" | "delivery_error"; + collectorStatusCode?: number; + durationMs: number; + ageMs?: number; +}; + +export function getIngestQueueConfig(env: NodeJS.ProcessEnv): IngestQueueConfig | null { + const queueUrl = env.INGEST_QUEUE_URL; + if (!queueUrl) return null; + + return { + queueUrl, + region: env.AWS_REGION || env.AWS_DEFAULT_REGION || undefined, + oversizeBucket: env.INGEST_OVERSIZE_BUCKET || undefined, + oversizePrefix: env.INGEST_OVERSIZE_PREFIX || "otlp-oversize", + maxMessageBytes: readPositiveInt(env.INGEST_QUEUE_MAX_MESSAGE_BYTES, DEFAULT_MAX_MESSAGE_BYTES), + maxBodyBytes: readPositiveInt(env.INGEST_MAX_BODY_BYTES, DEFAULT_MAX_BODY_BYTES), + consumerEnabled: env.INGEST_QUEUE_CONSUMER_ENABLED !== "false", + waitTimeSeconds: readPositiveInt(env.INGEST_QUEUE_WAIT_TIME_SECONDS, DEFAULT_WAIT_TIME_SECONDS), + visibilityTimeoutSeconds: readPositiveInt( + env.INGEST_QUEUE_VISIBILITY_TIMEOUT_SECONDS, + DEFAULT_VISIBILITY_TIMEOUT_SECONDS, + ), + batchSize: Math.min(readPositiveInt(env.INGEST_QUEUE_BATCH_SIZE, DEFAULT_BATCH_SIZE), 10), + consumerConcurrency: Math.min( + readPositiveInt(env.INGEST_QUEUE_CONSUMER_CONCURRENCY, DEFAULT_CONSUMER_CONCURRENCY), + 32, + ), + }; +} + +export function encodeIngestMessage( + input: IngestQueueInput, + config: Pick, + now: Date = new Date(), + id: string = randomUUID(), +): EncodedIngestMessage { + const baseMessage = { + version: 1, + kind: "otlp", + path: input.path, + projectId: input.projectId, + contentType: input.contentType, + contentEncoding: input.contentEncoding, + receivedAt: now.toISOString(), + } satisfies Omit; + + const inlineMessage: IngestQueueMessage = { + ...baseMessage, + body: { + storage: "inline", + base64: input.body.toString("base64"), + }, + }; + const inlineBody = JSON.stringify(inlineMessage); + if (Buffer.byteLength(inlineBody) <= config.maxMessageBytes) { + return { messageBody: inlineBody, storage: "inline" }; + } + + if (!config.oversizeBucket) { + throw new Error( + `ingest message is ${Buffer.byteLength( + inlineBody, + )} bytes after encoding, exceeding INGEST_QUEUE_MAX_MESSAGE_BYTES=${config.maxMessageBytes}; set INGEST_OVERSIZE_BUCKET to enable S3 offload`, + ); + } + + const datePrefix = now.toISOString().slice(0, 10).replaceAll("-", "/"); + const key = `${trimSlashes(config.oversizePrefix)}/${datePrefix}/${id}.otlp`; + const s3Message: IngestQueueMessage = { + ...baseMessage, + body: { + storage: "s3", + bucket: config.oversizeBucket, + key, + sizeBytes: input.body.byteLength, + }, + }; + + return { + messageBody: JSON.stringify(s3Message), + storage: "s3", + s3Object: { + bucket: config.oversizeBucket, + key, + body: input.body, + contentType: input.contentType, + }, + }; +} + +/** + * A message that can never be delivered no matter how many times it is retried: + * unparseable JSON, wrong version/kind, or an empty body. These are dropped (deleted) + * on first receipt instead of cycling through 50 redeliveries to the DLQ — that churn + * is what pins tens of thousands of empty-body OTLP exports in-flight. + */ +export class PoisonMessageError extends Error { + constructor(message: string) { + super(message); + this.name = "PoisonMessageError"; + } +} + +export function isPoisonMessageError(err: unknown): err is PoisonMessageError { + return err instanceof PoisonMessageError; +} + +export function parseIngestMessage(body: string): IngestQueueMessage { + let parsed: IngestQueueMessage; + try { + parsed = JSON.parse(body) as IngestQueueMessage; + } catch (err) { + throw new PoisonMessageError(`ingest queue message is not valid JSON: ${(err as Error).message}`); + } + try { + assertIngestMessage(parsed); + } catch (err) { + // A structurally-broken envelope (e.g. wrong field types making assertions throw a + // TypeError) can never become valid on retry — treat any assertion failure as poison. + if (err instanceof PoisonMessageError) throw err; + throw new PoisonMessageError(`ingest queue message is malformed: ${(err as Error).message}`); + } + return parsed; +} + +/** + * Whether a collector HTTP status means the payload can never be accepted on retry. + * A 4xx (other than 408 Request Timeout and 429 Too Many Requests) is a permanent + * rejection of these exact bytes — e.g. the collector 400s a batch whose + * http.response_content_length overflows uint64. Re-delivering it just cycles the + * message through the 900s visibility timeout 50× before the DLQ, pinning + * ApproximateAgeOfOldestMessage into a sawtooth, so we drop it on first receipt. + * 408/429 (backpressure/timeout) and 5xx are transient and stay queued for retry. + */ +export function isPermanentCollectorFailure(status: number): boolean { + if (status === 408 || status === 429) return false; + return status >= 400 && status < 500; +} + +export function describeCollectorFailure( + status: number, + responseBody: string, +): CollectorFailureDescription { + const trimmedBody = responseBody.trim(); + const boundedBody = + trimmedBody.length > MAX_COLLECTOR_ERROR_BODY_CHARS + ? `${trimmedBody.slice(0, MAX_COLLECTOR_ERROR_BODY_CHARS)}...` + : trimmedBody; + + return { + message: boundedBody ? `collector returned ${status}: ${boundedBody}` : `collector returned ${status}`, + status, + ...(boundedBody ? { body: boundedBody } : {}), + }; +} + +/** Builds the {@link SpillSink} for a body that exceeds the inline threshold. + * Injectable so the streaming/enqueue logic can be tested without S3 (the + * default is an S3 multipart upload). */ +export type SpillSinkFactory = (params: { + bucket: string | undefined; + key: string; + contentType: string; +}) => SpillSink; + +export class IngestQueue { + private readonly sqs: SQSClient; + private readonly s3: S3Client; + // Raw-byte threshold below which a body's base64 inline envelope still fits + // within maxMessageBytes. Bodies at or under this are buffered in memory and + // sent inline; larger ones stream to S3. Derived from the SQS message budget. + private readonly inlineRawThreshold: number; + private readonly spillSinkFactory: SpillSinkFactory; + + constructor( + private readonly config: IngestQueueConfig, + private readonly logger: LoggerLike, + spillSinkFactory?: SpillSinkFactory, + ) { + const clientConfig = config.region ? { region: config.region } : {}; + this.sqs = new SQSClient(clientConfig); + this.s3 = new S3Client(clientConfig); + this.inlineRawThreshold = Math.max( + 0, + Math.floor(((config.maxMessageBytes - INLINE_ENVELOPE_SLACK_BYTES) * 3) / 4), + ); + this.spillSinkFactory = + spillSinkFactory ?? + (({ bucket, key, contentType }) => { + if (!bucket) { + throw new Error( + "ingest body exceeds the inline limit but INGEST_OVERSIZE_BUCKET is not set for S3 offload", + ); + } + return this.createS3SpillSink(bucket, key, contentType); + }); + } + + async enqueue(input: IngestQueueInput): Promise<"inline" | "s3"> { + const encoded = encodeIngestMessage(input, this.config); + let uploadedObject: EncodedIngestMessage["s3Object"]; + + try { + if (encoded.s3Object) { + uploadedObject = encoded.s3Object; + await this.s3.send( + new PutObjectCommand({ + Bucket: encoded.s3Object.bucket, + Key: encoded.s3Object.key, + Body: encoded.s3Object.body, + ContentType: encoded.s3Object.contentType, + }), + ); + } + + await this.sqs.send( + new SendMessageCommand({ + QueueUrl: this.config.queueUrl, + MessageBody: encoded.messageBody, + }), + ); + return encoded.storage; + } catch (err) { + if (uploadedObject) { + await this.deleteS3Object(uploadedObject.bucket, uploadedObject.key).catch((deleteErr) => { + this.logger.warn( + { err: deleteErr, bucket: uploadedObject?.bucket, key: uploadedObject?.key }, + "failed to clean up oversize ingest object after enqueue failure", + ); + }); + } + throw err; + } + } + + /** + * Stream a request body into the queue with bounded memory. Small bodies are + * buffered and sent inline (delegating to {@link enqueue} for the exact + * envelope-size decision); larger bodies stream straight to S3 via a multipart + * upload so the proxy never holds the whole payload. Throws PayloadTooLargeError + * for bodies over maxBodyBytes and EmptyBodyError for empty ones (the caller + * maps these to 413 / 400). + */ + async enqueueStream(input: { + path: string; + projectId: string; + contentType: string; + contentEncoding?: string; + body: AsyncIterable; + }): Promise<{ storage: "inline" | "s3"; bytes: number }> { + const now = new Date(); + const datePrefix = now.toISOString().slice(0, 10).replaceAll("-", "/"); + const key = `${trimSlashes(this.config.oversizePrefix)}/${datePrefix}/${randomUUID()}.otlp`; + const bucket = this.config.oversizeBucket; + + const result = await captureBody(input.body, { + inlineThresholdBytes: this.inlineRawThreshold, + maxBytes: this.config.maxBodyBytes, + createSpillSink: () => this.spillSinkFactory({ bucket, key, contentType: input.contentType }), + }); + + if (result.storage === "buffer") { + // Small enough to buffer: reuse the exact inline-vs-S3 envelope decision. + const storage = await this.enqueue({ + path: input.path, + projectId: input.projectId, + contentType: input.contentType, + contentEncoding: input.contentEncoding, + body: result.buffer, + }); + return { storage, bytes: result.totalBytes }; + } + + // Large body: already streamed to S3 by the sink. Enqueue the pointer. + if (!bucket) throw new Error("spilled body has no oversize bucket configured"); + const message: IngestQueueMessage = { + version: 1, + kind: "otlp", + path: input.path, + projectId: input.projectId, + contentType: input.contentType, + contentEncoding: input.contentEncoding, + receivedAt: now.toISOString(), + body: { storage: "s3", bucket, key, sizeBytes: result.totalBytes }, + }; + try { + await this.sqs.send( + new SendMessageCommand({ QueueUrl: this.config.queueUrl, MessageBody: JSON.stringify(message) }), + ); + } catch (err) { + // The object already landed; clean up the orphan so a failed enqueue does + // not leak S3 storage, mirroring enqueue()'s rollback. + await this.deleteS3Object(bucket, key).catch((deleteErr) => { + this.logger.warn( + { err: deleteErr, bucket, key }, + "failed to clean up oversize ingest object after enqueue failure", + ); + }); + throw err; + } + return { storage: "s3", bytes: result.totalBytes }; + } + + /** + * A {@link SpillSink} backed by a streaming S3 multipart upload. Only one part + * (SPILL_PART_SIZE_BYTES) is held in memory at a time, and `write` honors the + * PassThrough's backpressure so a slow upload throttles the source read. + */ + private createS3SpillSink(bucket: string, key: string, contentType: string): SpillSink { + const pass = new PassThrough(); + const upload = new Upload({ + client: this.s3, + params: { Bucket: bucket, Key: key, Body: pass, ContentType: contentType }, + partSize: SPILL_PART_SIZE_BYTES, + queueSize: 1, + }); + const done = upload.done(); + let uploadError: unknown; + // If the upload fails, surface it on the stream so in-flight writes reject + // instead of hanging; the trailing catch keeps `done` from going unhandled + // before finish()/abort() observes it. + done.catch((err) => { + uploadError = err; + if (!pass.destroyed) pass.destroy(err instanceof Error ? err : new Error(String(err))); + }); + + return { + write: (chunk) => + new Promise((resolve, reject) => { + if (uploadError) { + reject(uploadError); + return; + } + const flushed = pass.write(chunk, (err) => { + if (err) reject(err); + }); + if (flushed) resolve(); + else pass.once("drain", resolve); + }), + finish: async () => { + await new Promise((resolve, reject) => { + pass.end((err?: Error | null) => (err ? reject(err) : resolve())); + }); + await done; + }, + abort: async () => { + try { + await upload.abort(); + } catch { + // best-effort; the multipart upload may not have started a part yet. + } + if (!pass.destroyed) pass.destroy(); + }, + }; + } + + // Set by stop(); flips the consume loops out of their receive cycle so a + // rolling deploy can drain cleanly instead of abandoning in-flight messages. + private shuttingDown = false; + // Aborts an idle long-poll ReceiveMessage immediately on stop() so draining + // does not wait out the full waitTimeSeconds before the loop notices. + private readonly shutdownController = new AbortController(); + // Resolves once every consume loop has exited; stop() awaits it. + private consumersDone: Promise | null = null; + + startConsumer(collectorUrl: string): void { + const loops = Array.from({ length: this.config.consumerConcurrency }, (_, index) => + this.consumeLoop(collectorUrl, index + 1), + ); + // Surface an unexpected loop failure promptly: log it and flag a non-zero exit. + for (const loop of loops) { + loop.catch((err: unknown) => { + this.logger.error({ err }, "ingest queue consumer stopped unexpectedly"); + process.exitCode = 1; + }); + } + // Resolve only once EVERY loop has settled. allSettled neither short-circuits + // on the first rejection (so stop() never returns while a sibling loop is + // still draining) nor rejects itself (so there is no unhandled rejection when + // a loop fails and stop() is never called). + this.consumersDone = Promise.allSettled(loops).then(() => undefined); + } + + /** + * Drain the consumer for a graceful shutdown (e.g. SIGTERM from an ECS rolling + * deploy). Stops issuing new ReceiveMessage calls, aborts any idle long-poll, + * and waits for in-flight messages to finish processing — each delivered + * message is deleted before its loop exits. Without this, a deploy kills the + * task mid-batch and the received-but-undeleted messages stay invisible for the + * full visibility timeout before redelivering, which pins SQS + * ApproximateAgeOfOldestMessage into a sawtooth and trips the ingest-lag page. + * Idempotent. + */ + async stop(): Promise { + if (this.shuttingDown) return; + this.shuttingDown = true; + this.shutdownController.abort(); + this.logger.info( + { queueUrl: this.config.queueUrl }, + "ingest queue consumer draining in-flight messages", + ); + // consumersDone never rejects (see startConsumer); a loop failure is logged + // and surfaced as a non-zero exit there. + await this.consumersDone; + this.logger.info({ queueUrl: this.config.queueUrl }, "ingest queue consumer drained"); + } + + private async consumeLoop(collectorUrl: string, consumerId: number): Promise { + this.logger.info( + { + queueUrl: this.config.queueUrl, + consumerId, + waitTimeSeconds: this.config.waitTimeSeconds, + visibilityTimeoutSeconds: this.config.visibilityTimeoutSeconds, + batchSize: this.config.batchSize, + }, + "ingest queue consumer started", + ); + + while (!this.shuttingDown) { + let result: ReceiveMessageCommandOutput; + try { + result = await this.sqs.send( + new ReceiveMessageCommand({ + QueueUrl: this.config.queueUrl, + MaxNumberOfMessages: this.config.batchSize, + WaitTimeSeconds: this.config.waitTimeSeconds, + VisibilityTimeout: this.config.visibilityTimeoutSeconds, + }), + { abortSignal: this.shutdownController.signal }, + ); + } catch (err) { + // stop() aborts the in-flight long-poll; that surfaces here as an abort + // error. Exit cleanly when draining; otherwise preserve the previous + // crash-on-unexpected-failure behaviour. + if (this.shuttingDown) break; + throw err; + } + + // A batch received just before stop() is still drained: we finish + // processing (and deleting) it before the while-condition exits the loop. + const messages = result.Messages ?? []; + if (messages.length === 0) continue; + + await Promise.all(messages.map((message) => this.processMessage(message, collectorUrl))); + } + + this.logger.info( + { queueUrl: this.config.queueUrl, consumerId }, + "ingest queue consumer stopped", + ); + } + + private async processMessage(message: Message, collectorUrl: string): Promise { + const startedAt = performance.now(); + if (!message.Body) return; + + let parsed: IngestQueueMessage | undefined; + let collectorFailure: CollectorFailureDescription | undefined; + + try { + parsed = parseIngestMessage(message.Body); + + const rawBody = await this.readMessageBody(parsed); + // Stamp issue fingerprints here, off the proxy's ingest hot path. This deserializes + // the payload (size-guarded + fail-open inside the helper); a slow/OOM here only + // redelivers an SQS message rather than 502-ing live ingest traffic. + const body = stampIssueFingerprintsFailOpen( + { + path: parsed.path, + contentType: parsed.contentType, + contentEncoding: parsed.contentEncoding, + body: rawBody, + projectId: parsed.projectId, + }, + this.logger, + ); + const headers: Record = { + "content-type": parsed.contentType, + "x-superlog-project-id": parsed.projectId, + }; + if (parsed.contentEncoding) headers["content-encoding"] = parsed.contentEncoding; + + const response = await fetch(`${collectorUrl}${parsed.path}`, { + method: "POST", + headers, + body, + }); + if (!response.ok) { + collectorFailure = describeCollectorFailure( + response.status, + await readResponseBodyForLog(response), + ); + throw new Error(collectorFailure.message); + } + + if (!message.ReceiptHandle) throw new Error("SQS message is missing receipt handle"); + await this.sqs.send( + new DeleteMessageCommand({ + QueueUrl: this.config.queueUrl, + ReceiptHandle: message.ReceiptHandle, + }), + ); + + if (parsed.body.storage === "s3") { + await this.deleteS3Object(parsed.body.bucket, parsed.body.key); + } + + proxyOperationalRecorder.recordQueueDelivery({ + path: parsed.path, + projectId: parsed.projectId, + storage: parsed.body.storage, + outcome: "delivered", + collectorStatusCode: response.status, + durationMs: performance.now() - startedAt, + ageMs: ageMs(parsed.receivedAt), + }); + + this.logger.info( + { + path: parsed.path, + projectId: parsed.projectId, + storage: parsed.body.storage, + status: response.status, + }, + "delivered queued ingest payload", + ); + } catch (err) { + const poison = isPoisonMessageError(err); + // A collector 4xx (other than 408/429) rejects these exact bytes permanently, so it + // is as undeliverable as a poison envelope — drop it instead of cycling it to the DLQ. + const permanentCollectorRejection = + !poison && collectorFailure !== undefined && isPermanentCollectorFailure(collectorFailure.status); + const drop = poison || permanentCollectorRejection; + const metric = queueDeliveryMetricFromParsedMessage( + parsed, + poison ? "invalid_message" : collectorFailure ? "collector_error" : "delivery_error", + collectorFailure?.status, + performance.now() - startedAt, + parsed && typeof parsed === "object" && "receivedAt" in parsed + ? ageMs((parsed as { receivedAt?: unknown }).receivedAt) + : undefined, + ); + if (metric) { + proxyOperationalRecorder.recordQueueDelivery(metric); + } + this.logger.warn( + { + err, + poison, + permanentCollectorRejection, + messageId: message.MessageId, + collectorStatus: collectorFailure?.status, + collectorResponseBody: collectorFailure?.body, + path: parsed?.path, + projectId: parsed?.projectId, + contentType: parsed?.contentType, + contentEncoding: parsed?.contentEncoding, + storage: parsed?.body?.storage, + s3SizeBytes: parsed?.body?.storage === "s3" ? parsed.body.sizeBytes : undefined, + inlineBodyBase64Bytes: + parsed?.body?.storage === "inline" ? Buffer.byteLength(parsed.body.base64 ?? "") : undefined, + }, + poison + ? "dropping poison ingest message" + : permanentCollectorRejection + ? "dropping ingest message permanently rejected by collector" + : "failed to deliver queued ingest payload", + ); + + // An undeliverable message (poison envelope or permanent collector 4xx) can never + // succeed; leaving it in place means 50 redeliveries (15-min visibility each) before + // it reaches the DLQ, which pins oldest-message-age into a sawtooth and keeps the bad + // payload churning in-flight. Delete it immediately so it stops cycling. + if (drop && message.ReceiptHandle) { + const sqsDeleted = await this.sqs + .send( + new DeleteMessageCommand({ + QueueUrl: this.config.queueUrl, + ReceiptHandle: message.ReceiptHandle, + }), + ) + .then(() => true) + .catch((deleteErr: unknown) => { + this.logger.warn( + { err: deleteErr, messageId: message.MessageId }, + "failed to delete undeliverable ingest message", + ); + return false; + }); + // Only purge the S3 body once the queue message is actually gone. If the SQS delete + // failed, the message will be redelivered after the visibility timeout and still needs + // its body — deleting it here would strand the retry with a missing object until the DLQ. + if (sqsDeleted && parsed?.body?.storage === "s3" && parsed.body.bucket && parsed.body.key) { + await this.deleteS3Object(parsed.body.bucket, parsed.body.key).catch(() => {}); + } + } + } + } + + private async readMessageBody(message: IngestQueueMessage): Promise { + if (message.body.storage === "inline") { + return Buffer.from(message.body.base64, "base64"); + } + + const result = await this.s3.send( + new GetObjectCommand({ + Bucket: message.body.bucket, + Key: message.body.key, + }), + ); + return getObjectBodyToBuffer(result.Body); + } + + private async deleteS3Object(bucket: string, key: string): Promise { + await this.s3.send(new DeleteObjectCommand({ Bucket: bucket, Key: key })); + } +} + +async function readResponseBodyForLog(response: Response): Promise { + try { + return await response.text(); + } catch { + return ""; + } +} + +async function getObjectBodyToBuffer(body: GetObjectCommandOutput["Body"]): Promise { + if (!body) throw new Error("S3 object response is missing body"); + if ("transformToByteArray" in body && typeof body.transformToByteArray === "function") { + return Buffer.from(await body.transformToByteArray()); + } + + const chunks: Buffer[] = []; + for await (const chunk of body as AsyncIterable) { + chunks.push(Buffer.from(chunk)); + } + return Buffer.concat(chunks); +} + +function assertIngestMessage(message: IngestQueueMessage): void { + if (message.version !== 1 || message.kind !== "otlp") { + throw new PoisonMessageError("unsupported ingest queue message"); + } + if (!message.path.startsWith("/v1/")) { + throw new PoisonMessageError(`invalid ingest queue path: ${message.path}`); + } + if (!message.projectId || !message.contentType) { + throw new PoisonMessageError("ingest queue message is missing required metadata"); + } + if (message.body.storage === "inline" && !message.body.base64) { + throw new PoisonMessageError("inline ingest queue message is missing body"); + } + if (message.body.storage === "s3" && (!message.body.bucket || !message.body.key)) { + throw new PoisonMessageError("s3 ingest queue message is missing object pointer"); + } +} + +function readPositiveInt(value: string | undefined, fallback: number): number { + if (!value) return fallback; + const parsed = Number.parseInt(value, 10); + return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback; +} + +function trimSlashes(value: string): string { + return value.replace(/^\/+|\/+$/g, ""); +} + +function ageMs(receivedAt: unknown): number | undefined { + if (typeof receivedAt !== "string") return undefined; + const parsed = Date.parse(receivedAt); + return Number.isFinite(parsed) ? Math.max(0, Date.now() - parsed) : undefined; +} + +export function queueDeliveryMetricFromParsedMessage( + parsed: unknown, + outcome: QueueDeliveryMetric["outcome"], + collectorStatusCode: number | undefined, + durationMs: number, + messageAgeMs: number | undefined, +): QueueDeliveryMetric | null { + if (!parsed || typeof parsed !== "object") return null; + const message = parsed as { + path?: unknown; + projectId?: unknown; + body?: { storage?: unknown }; + }; + if (typeof message.path !== "string" || typeof message.projectId !== "string") return null; + const storage = message.body?.storage; + if (storage !== "inline" && storage !== "s3") return null; + return { + path: message.path, + projectId: message.projectId, + storage, + outcome, + collectorStatusCode, + durationMs, + ageMs: messageAgeMs, + }; +} diff --git a/superlog/apps/proxy/src/logger.ts b/superlog/apps/proxy/src/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..294e8a20d9026ec3329f53295b346fc312d2218b --- /dev/null +++ b/superlog/apps/proxy/src/logger.ts @@ -0,0 +1,47 @@ +import { logs, SeverityNumber } from "@opentelemetry/api-logs"; +import pino, { multistream } from "pino"; +import type { Writable } from "node:stream"; + +const SERVICE_NAME = "@superlog/proxy"; + +const PINO_LEVEL_TO_OTEL: Record = { + 10: { num: SeverityNumber.TRACE, text: "TRACE" }, + 20: { num: SeverityNumber.DEBUG, text: "DEBUG" }, + 30: { num: SeverityNumber.INFO, text: "INFO" }, + 40: { num: SeverityNumber.WARN, text: "WARN" }, + 50: { num: SeverityNumber.ERROR, text: "ERROR" }, + 60: { num: SeverityNumber.FATAL, text: "FATAL" }, +}; + +const DEFAULT_SEVERITY = { num: SeverityNumber.INFO, text: "INFO" } as const; + +const otelStream: Writable = Object.assign(Object.create(null), { + write(chunk: string): boolean { + // biome-ignore lint/suspicious/noExplicitAny: pino emits JSON whose shape mirrors AnyValueMap. + let rec: any; + try { + rec = JSON.parse(chunk); + } catch { + return true; + } + const level = typeof rec.level === "number" ? rec.level : 30; + const sev = PINO_LEVEL_TO_OTEL[level] ?? DEFAULT_SEVERITY; + const { level: _l, time, msg, pid: _p, hostname: _h, name: _n, ...attributes } = rec; + logs.getLogger(SERVICE_NAME).emit({ + timestamp: typeof time === "number" ? time : Date.now(), + severityNumber: sev.num, + severityText: sev.text, + body: typeof msg === "string" ? msg : JSON.stringify(msg ?? ""), + attributes, + }); + return true; + }, +}) as unknown as Writable; + +export const logger = pino( + { name: SERVICE_NAME }, + multistream([ + { stream: process.stdout }, + { stream: otelStream }, + ]), +); diff --git a/superlog/apps/proxy/src/operational-metrics.test.ts b/superlog/apps/proxy/src/operational-metrics.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..bcdaa9860d95e0667b9f8f8f4925523420f91541 --- /dev/null +++ b/superlog/apps/proxy/src/operational-metrics.test.ts @@ -0,0 +1,110 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { createProxyOperationalRecorder } from "./operational-metrics.js"; + +test("createProxyOperationalRecorder records ingest requests by org, project, signal, status, storage, and latency", () => { + const requests: Array<{ value: number; attrs: Record }> = []; + const durations: Array<{ value: number; attrs: Record }> = []; + const bytes: Array<{ value: number; attrs: Record }> = []; + + const recorder = createProxyOperationalRecorder({ + ingestRequests: { add: (value, attrs) => requests.push({ value, attrs: attrs ?? {} }) }, + ingestDurationMs: { record: (value, attrs) => durations.push({ value, attrs: attrs ?? {} }) }, + ingestRequestBytes: { record: (value, attrs) => bytes.push({ value, attrs: attrs ?? {} }) }, + }); + + recorder.recordIngestRequest({ + path: "/v1/traces", + projectId: "project_123", + orgId: "org_123", + orgName: "Acme", + statusCode: 200, + durationMs: 18, + requestBytes: 2048, + storage: "s3", + }); + + assert.deepEqual(requests, [ + { + value: 1, + attrs: { + "otlp.signal": "traces", + "tenant.project.id": "project_123", + "tenant.org.id": "org_123", + "tenant.org.name": "Acme", + "http.response.status_code": 200, + "http.response.status_class": "2xx", + "ingest.queue.storage": "s3", + }, + }, + ]); + assert.deepEqual(durations, [{ value: 18, attrs: requests[0]?.attrs }]); + assert.deepEqual(bytes, [{ value: 2048, attrs: requests[0]?.attrs }]); +}); + +test("createProxyOperationalRecorder records queue delivery failures with bounded cardinality attributes", () => { + const messages: Array<{ value: number; attrs: Record }> = []; + const durations: Array<{ value: number; attrs: Record }> = []; + const ages: Array<{ value: number; attrs: Record }> = []; + + const recorder = createProxyOperationalRecorder({ + queueMessages: { add: (value, attrs) => messages.push({ value, attrs: attrs ?? {} }) }, + queueDeliveryDurationMs: { record: (value, attrs) => durations.push({ value, attrs: attrs ?? {} }) }, + queueMessageAgeMs: { record: (value, attrs) => ages.push({ value, attrs: attrs ?? {} }) }, + }); + + recorder.recordQueueDelivery({ + path: "/v1/logs", + projectId: "project_123", + storage: "inline", + outcome: "collector_error", + collectorStatusCode: 503, + durationMs: 91, + ageMs: 12_000, + }); + + assert.deepEqual(messages, [ + { + value: 1, + attrs: { + "otlp.signal": "logs", + "tenant.project.id": "project_123", + "ingest.queue.storage": "inline", + "ingest.queue.outcome": "collector_error", + "collector.status_code": 503, + "collector.status_class": "5xx", + }, + }, + ]); + assert.deepEqual(durations, [{ value: 91, attrs: messages[0]?.attrs }]); + assert.deepEqual(ages, [{ value: 12_000, attrs: messages[0]?.attrs }]); +}); + +test("recordIngestRequest can emit without org enrichment", () => { + const requests: Array<{ value: number; attrs: Record }> = []; + const recorder = createProxyOperationalRecorder({ + ingestRequests: { add: (value, attrs) => requests.push({ value, attrs: attrs ?? {} }) }, + }); + + recorder.recordIngestRequest({ + path: "/v1/metrics", + projectId: "project_123", + statusCode: 500, + durationMs: 5, + requestBytes: 0, + storage: "direct", + }); + + assert.deepEqual(requests, [ + { + value: 1, + attrs: { + "otlp.signal": "metrics", + "tenant.project.id": "project_123", + "http.response.status_code": 500, + "http.response.status_class": "5xx", + "ingest.queue.storage": "direct", + }, + }, + ]); +}); diff --git a/superlog/apps/proxy/src/operational-metrics.ts b/superlog/apps/proxy/src/operational-metrics.ts new file mode 100644 index 0000000000000000000000000000000000000000..daaaf44ee2664111db7c622f157fb8a242dd1dc9 --- /dev/null +++ b/superlog/apps/proxy/src/operational-metrics.ts @@ -0,0 +1,120 @@ +import { metrics } from "@opentelemetry/api"; + +type MetricAttributes = Record; + +type CounterLike = { + add(value: number, attributes?: MetricAttributes): void; +}; + +type HistogramLike = { + record(value: number, attributes?: MetricAttributes): void; +}; + +type ProxyOperationalInstruments = { + ingestRequests?: CounterLike; + ingestDurationMs?: HistogramLike; + ingestRequestBytes?: HistogramLike; + queueMessages?: CounterLike; + queueDeliveryDurationMs?: HistogramLike; + queueMessageAgeMs?: HistogramLike; +}; + +export type IngestRequestMetricInput = { + path: string; + projectId: string; + orgId?: string | null; + orgName?: string | null; + statusCode: number; + durationMs: number; + requestBytes: number; + storage: "direct" | "inline" | "s3"; +}; + +export type QueueDeliveryMetricInput = { + path: string; + projectId: string; + storage: "inline" | "s3"; + outcome: "delivered" | "collector_error" | "invalid_message" | "delivery_error"; + collectorStatusCode?: number; + durationMs: number; + ageMs?: number; +}; + +const meter = metrics.getMeter("@superlog/proxy/operational"); + +function signalFromPath(path: string): string { + if (path === "/v1/traces") return "traces"; + if (path === "/v1/logs") return "logs"; + if (path === "/v1/metrics") return "metrics"; + return "unknown"; +} + +function statusClass(statusCode: number): string { + return `${Math.floor(statusCode / 100)}xx`; +} + +function tenantAttrs(input: { path: string; projectId: string; orgId?: string | null; orgName?: string | null }) { + const attrs: MetricAttributes = { + "otlp.signal": signalFromPath(input.path), + "tenant.project.id": input.projectId, + }; + if (input.orgId) attrs["tenant.org.id"] = input.orgId; + if (input.orgName) attrs["tenant.org.name"] = input.orgName; + return attrs; +} + +export function createProxyOperationalRecorder(instruments: ProxyOperationalInstruments) { + return { + recordIngestRequest(input: IngestRequestMetricInput): void { + const attrs: MetricAttributes = { + ...tenantAttrs(input), + "http.response.status_code": input.statusCode, + "http.response.status_class": statusClass(input.statusCode), + "ingest.queue.storage": input.storage, + }; + instruments.ingestRequests?.add(1, attrs); + instruments.ingestDurationMs?.record(input.durationMs, attrs); + instruments.ingestRequestBytes?.record(input.requestBytes, attrs); + }, + + recordQueueDelivery(input: QueueDeliveryMetricInput): void { + const attrs: MetricAttributes = { + ...tenantAttrs(input), + "ingest.queue.storage": input.storage, + "ingest.queue.outcome": input.outcome, + }; + if (input.collectorStatusCode !== undefined) { + attrs["collector.status_code"] = input.collectorStatusCode; + attrs["collector.status_class"] = statusClass(input.collectorStatusCode); + } + instruments.queueMessages?.add(1, attrs); + instruments.queueDeliveryDurationMs?.record(input.durationMs, attrs); + if (input.ageMs !== undefined) instruments.queueMessageAgeMs?.record(input.ageMs, attrs); + }, + }; +} + +export const proxyOperationalRecorder = createProxyOperationalRecorder({ + ingestRequests: meter.createCounter("superlog.proxy.ingest.requests", { + description: "Proxy OTLP ingest requests by org, project, signal, status, and storage path.", + }), + ingestDurationMs: meter.createHistogram("superlog.proxy.ingest.duration_ms", { + description: "Proxy OTLP ingest request duration in milliseconds.", + unit: "ms", + }), + ingestRequestBytes: meter.createHistogram("superlog.proxy.ingest.request_bytes", { + description: "Proxy OTLP ingest request body size in bytes.", + unit: "By", + }), + queueMessages: meter.createCounter("superlog.proxy.queue.messages", { + description: "Queued ingest payload delivery attempts by outcome.", + }), + queueDeliveryDurationMs: meter.createHistogram("superlog.proxy.queue.delivery.duration_ms", { + description: "Queued ingest payload delivery duration in milliseconds.", + unit: "ms", + }), + queueMessageAgeMs: meter.createHistogram("superlog.proxy.queue.message.age_ms", { + description: "Queued ingest payload age when delivery is attempted.", + unit: "ms", + }), +}); diff --git a/superlog/apps/proxy/src/semaphore.test.ts b/superlog/apps/proxy/src/semaphore.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..ae376e48d7a858220fe1ccb58d76709b64b1ec18 --- /dev/null +++ b/superlog/apps/proxy/src/semaphore.test.ts @@ -0,0 +1,60 @@ +import { strict as assert } from "node:assert"; +import { test } from "node:test"; +import { Semaphore } from "./semaphore.js"; + +test("acquires up to the permit count without waiting, then queues", async () => { + const sem = new Semaphore(2); + await sem.acquire(); + await sem.acquire(); + assert.equal(sem.availablePermits, 0); + + let third = "pending"; + const pending = sem.acquire().then(() => { + third = "acquired"; + }); + await Promise.resolve(); + assert.equal(third, "pending"); + assert.equal(sem.queueLength, 1); + + sem.release(); + await pending; + assert.equal(third, "acquired"); + assert.equal(sem.queueLength, 0); +}); + +test("releases hand permits to waiters in FIFO order", async () => { + const sem = new Semaphore(1); + await sem.acquire(); + + const order: number[] = []; + const a = sem.acquire().then(() => order.push(1)); + const b = sem.acquire().then(() => order.push(2)); + await Promise.resolve(); + assert.equal(sem.queueLength, 2); + + sem.release(); + await a; + sem.release(); + await b; + assert.deepEqual(order, [1, 2]); +}); + +test("releasing with no waiters restores a permit", async () => { + const sem = new Semaphore(1); + await sem.acquire(); + assert.equal(sem.availablePermits, 0); + sem.release(); + assert.equal(sem.availablePermits, 1); + // A surplus release does not exceed... it just tracks available; next acquire is immediate. + await sem.acquire(); + assert.equal(sem.availablePermits, 0); +}); + +test("a permit count of zero disables limiting (always immediate, never queues)", async () => { + const sem = new Semaphore(0); + await sem.acquire(); + await sem.acquire(); + await sem.acquire(); + assert.equal(sem.queueLength, 0); + sem.release(); // no-op, must not throw +}); diff --git a/superlog/apps/proxy/src/semaphore.ts b/superlog/apps/proxy/src/semaphore.ts new file mode 100644 index 0000000000000000000000000000000000000000..9bd3a5201ebd43a663bd21e67593ad2e35d2f525 --- /dev/null +++ b/superlog/apps/proxy/src/semaphore.ts @@ -0,0 +1,58 @@ +/** + * A counting semaphore used to bound how many ingest requests buffer/stream + * concurrently. Combined with the per-request body cap, this makes the proxy's + * memory footprint a provable constant: + * + * max_memory ≈ permits × max_bytes_held_per_request + * + * Acquisition is FIFO and `await`-based: a request that arrives when all permits + * are taken *waits* for one to free up rather than being rejected. That is the + * deliberate design choice — backpressure (the waiter holds only its socket + + * a pending promise, not a body buffer) instead of shedding valid traffic. The + * body is only read after a permit is held, so waiters cost ~nothing. + * + * A permit count of <= 0 disables the limiter (acquire resolves immediately, + * release is a no-op) — an escape hatch via INGEST_MAX_INFLIGHT_REQUESTS=0. + */ +export class Semaphore { + private readonly limited: boolean; + private available: number; + private readonly waiters: Array<() => void> = []; + + constructor(permits: number) { + this.limited = permits > 0; + this.available = this.limited ? permits : 0; + } + + acquire(): Promise { + if (!this.limited) return Promise.resolve(); + if (this.available > 0) { + this.available -= 1; + return Promise.resolve(); + } + return new Promise((resolve) => { + this.waiters.push(resolve); + }); + } + + release(): void { + if (!this.limited) return; + const next = this.waiters.shift(); + if (next) { + // Hand the permit straight to the next waiter without round-tripping + // through `available`, so a steady stream of releases keeps the queue + // draining in FIFO order. + next(); + return; + } + this.available += 1; + } + + get availablePermits(): number { + return this.available; + } + + get queueLength(): number { + return this.waiters.length; + } +} diff --git a/superlog/apps/proxy/src/tenant-metrics.ts b/superlog/apps/proxy/src/tenant-metrics.ts new file mode 100644 index 0000000000000000000000000000000000000000..5475d49a929c451de30838d4a368d3de8a8567d8 --- /dev/null +++ b/superlog/apps/proxy/src/tenant-metrics.ts @@ -0,0 +1,65 @@ +import { type Counter, metrics } from "@opentelemetry/api"; +import { db, schema } from "@superlog/db"; +import { eq } from "drizzle-orm"; + +const meter = metrics.getMeter("@superlog/proxy/tenant"); + +const tracesCounter: Counter = meter.createCounter("superlog.tenant.traces.received", { + description: "OTLP /v1/traces requests received from a tenant org (per-request, not per-span).", +}); +const logsCounter: Counter = meter.createCounter("superlog.tenant.logs.received", { + description: "OTLP /v1/logs requests received from a tenant org (per-request, not per-record).", +}); +const metricsCounter: Counter = meter.createCounter("superlog.tenant.metric_points.received", { + description: + "OTLP /v1/metrics requests received from a tenant org (per-request, not per-datapoint).", +}); + +const COUNTER_BY_PATH: Record = { + "/v1/traces": tracesCounter, + "/v1/logs": logsCounter, + "/v1/metrics": metricsCounter, +}; + +export type OrgInfo = { orgId: string; orgName: string } | null; + +const PROJECT_TTL_MS = 5 * 60 * 1000; +const projectCache = new Map(); + +const SELF_ORG_IDS = new Set( + (process.env.SUPERLOG_SELF_ORG_ID ?? "") + .split(",") + .map((s) => s.trim()) + .filter(Boolean), +); + +export async function lookupOrgForProject(projectId: string): Promise { + const cached = projectCache.get(projectId); + if (cached && cached.expiresAt > Date.now()) return cached.value; + const project = await db.query.projects.findFirst({ + where: eq(schema.projects.id, projectId), + columns: { orgId: true }, + }); + let info: OrgInfo = null; + if (project) { + const org = await db.query.orgs.findFirst({ + where: eq(schema.orgs.id, project.orgId), + columns: { id: true, name: true }, + }); + if (org) info = { orgId: org.id, orgName: org.name }; + } + projectCache.set(projectId, { value: info, expiresAt: Date.now() + PROJECT_TTL_MS }); + return info; +} + +export async function recordIngestRequest(path: string, projectId: string): Promise { + const counter = COUNTER_BY_PATH[path]; + if (!counter) return; + const info = await lookupOrgForProject(projectId); + if (!info) return; + if (SELF_ORG_IDS.has(info.orgId)) return; + counter.add(1, { + "tenant.org.id": info.orgId, + "tenant.org.name": info.orgName, + }); +} diff --git a/superlog/apps/proxy/tracing.ts b/superlog/apps/proxy/tracing.ts new file mode 100644 index 0000000000000000000000000000000000000000..02af02172f197f7f982d8acdb0aaf7759ef8d28b --- /dev/null +++ b/superlog/apps/proxy/tracing.ts @@ -0,0 +1,143 @@ +// OpenTelemetry bootstrap. Loaded via `node --import ./tracing.ts` (or tsx). +// Loads dotenv first so OTEL_* env vars set in .env / .env.superlog / .env.local +// are visible before the SDK reads process.env. Uses HTTP/protobuf exporters (no gRPC). +import { config as dotenvConfig } from "dotenv"; +const portlessPort = process.env.PORTLESS_URL ? process.env.PORT : undefined; +dotenvConfig({ path: ".env.superlog" }); +dotenvConfig(); +dotenvConfig({ path: ".env.local", override: true }); +if (process.env.SUPERLOG_ENV_FILE) { + dotenvConfig({ path: process.env.SUPERLOG_ENV_FILE, override: true }); +} +if (portlessPort) process.env.PORT = portlessPort; + +// Always stamp an `env` resource attribute so every span/log/metric we emit is +// filterable by deployment environment. SUPERLOG_ENV is the explicit knob; +// RAILWAY_ENVIRONMENT_NAME / NODE_ENV are the fallbacks; "development" is the +// last resort so we never emit telemetry without an env. +const deploymentEnv = + process.env.SUPERLOG_ENV || + process.env.RAILWAY_ENVIRONMENT_NAME || + process.env.NODE_ENV || + "development"; + +// Only ship telemetry from prod. Local dev (any non-production env) is muted +// so worktrees, branch checkouts, etc. don't pollute the prod Superlog +// project — see incident 779a80aa where local ECONNREFUSED storms were +// counted against an unrelated prod incident. Setting OTEL_SDK_DISABLED +// before any OTel import makes NodeSDK.start() a no-op; we also skip the +// manually-wired LoggerProvider below so its BatchLogRecordProcessor never +// starts. To dogfood from a local checkout, set SUPERLOG_ENV=production in +// apps/proxy/.env.local. +const telemetryEnabled = deploymentEnv === "production"; +if (!telemetryEnabled) { + process.env.OTEL_SDK_DISABLED = "true"; + console.warn( + `[otel] deployment env is "${deploymentEnv}" — telemetry disabled (set SUPERLOG_ENV=production to enable)`, + ); +} + +import { DiagConsoleLogger, DiagLogLevel, diag } from "@opentelemetry/api"; +import { logs } from "@opentelemetry/api-logs"; +import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node"; +import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http"; +import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http"; +import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http"; +import { resourceFromAttributes } from "@opentelemetry/resources"; +import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs"; +import { PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics"; +import { NodeSDK } from "@opentelemetry/sdk-node"; +import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions"; + +if (process.env.OTEL_DIAG_DEBUG === "1") { + diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO); +} + +if (telemetryEnabled) { + const serviceName = process.env.OTEL_SERVICE_NAME ?? "@superlog/proxy"; + const serviceInstanceId = + process.env.OTEL_SERVICE_INSTANCE_ID || + process.env.RAILWAY_REPLICA_ID || + process.env.RAILWAY_DEPLOYMENT_ID || + process.env.HOSTNAME; + const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT; + const rawHeaders = process.env.OTEL_EXPORTER_OTLP_HEADERS ?? ""; + + // OTel uses "k1=v1,k2=v2" in OTEL_EXPORTER_OTLP_HEADERS. Convert to a record + // so we can hand it to the exporter constructor. The SDK already does this + // for some signals, but being explicit is safer across exporter versions. + const headers: Record = {}; + for (const pair of rawHeaders.split(",")) { + const trimmed = pair.trim(); + if (!trimmed) continue; + const eq = trimmed.indexOf("="); + if (eq === -1) continue; + const key = trimmed.slice(0, eq).trim(); + const value = trimmed.slice(eq + 1).trim(); + if (key) headers[key] = value; + } + + const traceExporter = new OTLPTraceExporter({ + url: endpoint ? `${endpoint.replace(/\/$/, "")}/v1/traces` : undefined, + headers, + }); + + const metricExporter = new OTLPMetricExporter({ + url: endpoint ? `${endpoint.replace(/\/$/, "")}/v1/metrics` : undefined, + headers, + }); + + const logExporter = new OTLPLogExporter({ + url: endpoint ? `${endpoint.replace(/\/$/, "")}/v1/logs` : undefined, + headers, + }); + + const resource = resourceFromAttributes({ + [ATTR_SERVICE_NAME]: serviceName, + "deployment.environment.name": deploymentEnv, + env: deploymentEnv, + ...(serviceInstanceId ? { "service.instance.id": serviceInstanceId } : {}), + }); + + // SDK-Node owns traces + metrics. Logs we wire up manually so we can register + // a global LoggerProvider for `@opentelemetry/api-logs` consumers. + const loggerProvider = new LoggerProvider({ + resource, + processors: [new BatchLogRecordProcessor(logExporter)], + }); + logs.setGlobalLoggerProvider(loggerProvider); + + const sdk = new NodeSDK({ + resource, + traceExporter, + metricReader: new PeriodicExportingMetricReader({ + exporter: metricExporter, + exportIntervalMillis: 60_000, + }), + instrumentations: [ + getNodeAutoInstrumentations({ + // fs is extremely chatty in dev (every tsx watch reload). + "@opentelemetry/instrumentation-fs": { enabled: false }, + }), + ], + }); + + sdk.start(); + + const shutdown = async () => { + try { + await sdk.shutdown(); + await loggerProvider.shutdown(); + } catch (err) { + // Don't crash shutdown on a flush failure. + console.error("[otel] shutdown error", err); + } + }; + + process.once("SIGTERM", () => { + void shutdown().finally(() => process.exit(0)); + }); + process.once("SIGINT", () => { + void shutdown().finally(() => process.exit(0)); + }); +} diff --git a/superlog/apps/proxy/tsconfig.json b/superlog/apps/proxy/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..84e48f162cef1eee7326fb9c528d529db85006cd --- /dev/null +++ b/superlog/apps/proxy/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "types": ["node"] + }, + "include": ["src/**/*"] +} diff --git a/superlog/apps/sample/.next/app-build-manifest.json b/superlog/apps/sample/.next/app-build-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..1b3b57dc827545addaeaf92d4c61976cf23d328d --- /dev/null +++ b/superlog/apps/sample/.next/app-build-manifest.json @@ -0,0 +1,3 @@ +{ + "pages": {} +} \ No newline at end of file diff --git a/superlog/apps/sample/.next/build-manifest.json b/superlog/apps/sample/.next/build-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..b4ca5a89dec5af3832cf8c43bd4ea00abedc5b3d --- /dev/null +++ b/superlog/apps/sample/.next/build-manifest.json @@ -0,0 +1,17 @@ +{ + "polyfillFiles": [ + "static/chunks/polyfills.js" + ], + "devFiles": [], + "ampDevFiles": [], + "lowPriorityFiles": [ + "static/development/_buildManifest.js", + "static/development/_ssgManifest.js" + ], + "rootMainFiles": [], + "rootMainFilesTree": {}, + "pages": { + "/_app": [] + }, + "ampFirstPages": [] +} \ No newline at end of file diff --git a/superlog/apps/sample/.next/cache/.rscinfo b/superlog/apps/sample/.next/cache/.rscinfo new file mode 100644 index 0000000000000000000000000000000000000000..832dcb29e68b98668d2d53e0d3d28b043b4edd1c --- /dev/null +++ b/superlog/apps/sample/.next/cache/.rscinfo @@ -0,0 +1 @@ +{"encryption.key":"x4jAwh4AtUSRTc+XtxlVM06dqLCYxr1KHipeaVfDQFo=","encryption.expire_at":1782155154620} \ No newline at end of file diff --git a/superlog/apps/sample/.next/cache/next-devtools-config.json b/superlog/apps/sample/.next/cache/next-devtools-config.json new file mode 100644 index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b --- /dev/null +++ b/superlog/apps/sample/.next/cache/next-devtools-config.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/superlog/apps/sample/.next/cache/webpack/client-development/0.pack.gz b/superlog/apps/sample/.next/cache/webpack/client-development/0.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..6bd4ea36d008de52ce2be962d92215829e16e4f8 --- /dev/null +++ b/superlog/apps/sample/.next/cache/webpack/client-development/0.pack.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62237ac6225521f6e9e72a2f5b823cbba6616575010e34656c31f86acc500784 +size 44368 diff --git a/superlog/apps/sample/.next/cache/webpack/client-development/index.pack.gz b/superlog/apps/sample/.next/cache/webpack/client-development/index.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..77c78bb151eda34595997e4f9804dc73796dd621 --- /dev/null +++ b/superlog/apps/sample/.next/cache/webpack/client-development/index.pack.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ec8471eca89823be6ea37353e5833f68ae0855c2aa3c1692f203e6861150360 +size 1162 diff --git a/superlog/apps/sample/.next/cache/webpack/edge-server-development/0.pack.gz b/superlog/apps/sample/.next/cache/webpack/edge-server-development/0.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..16f1ef6052262ea9d077bf178e48f340721c49c8 --- /dev/null +++ b/superlog/apps/sample/.next/cache/webpack/edge-server-development/0.pack.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91d93cdf6a73268f4953408604c21d0df0e5b134b48f856c649c0ad67aabb563 +size 1158980 diff --git a/superlog/apps/sample/.next/cache/webpack/edge-server-development/index.pack.gz b/superlog/apps/sample/.next/cache/webpack/edge-server-development/index.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..14779d5f3b82422aaadf8146c17435fa8af4ecbe --- /dev/null +++ b/superlog/apps/sample/.next/cache/webpack/edge-server-development/index.pack.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccd7f539b89991fd23b7baef93bb6eb5a82c02ec34b7cf4756234ebc9c7e90f9 +size 22476 diff --git a/superlog/apps/sample/.next/cache/webpack/server-development/0.pack.gz b/superlog/apps/sample/.next/cache/webpack/server-development/0.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..27ba7440ebfb3a4cc21cafe6e601dd63a0381831 --- /dev/null +++ b/superlog/apps/sample/.next/cache/webpack/server-development/0.pack.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a2518ff2df1768088d2b7b2ccfaa917b9e45f8caf8d4fec3e1964b95111c3bc +size 1301670 diff --git a/superlog/apps/sample/.next/cache/webpack/server-development/index.pack.gz b/superlog/apps/sample/.next/cache/webpack/server-development/index.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..bef289f546eddffc780723787cdbc0c0f0b656be --- /dev/null +++ b/superlog/apps/sample/.next/cache/webpack/server-development/index.pack.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4da2f557fa01fd14f3a0708b01bc283d12fb49a1ef6013dce3cf159fdf6edd43 +size 35570 diff --git a/superlog/apps/sample/.next/package.json b/superlog/apps/sample/.next/package.json new file mode 100644 index 0000000000000000000000000000000000000000..7156107e3aec28c4f7cea055e4cd67b6cc1e828c --- /dev/null +++ b/superlog/apps/sample/.next/package.json @@ -0,0 +1 @@ +{"type": "commonjs"} \ No newline at end of file diff --git a/superlog/apps/sample/.next/prerender-manifest.json b/superlog/apps/sample/.next/prerender-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..5752542d12c53506402670aaca19af690a69903f --- /dev/null +++ b/superlog/apps/sample/.next/prerender-manifest.json @@ -0,0 +1,11 @@ +{ + "version": 4, + "routes": {}, + "dynamicRoutes": {}, + "notFoundRoutes": [], + "preview": { + "previewModeId": "780c4221b9734ec57dd7a4fabd544139", + "previewModeSigningKey": "da521a9e999544bbc71ce92bbaac50a8cf5714e29d3a3a3836b0bbbfa735c630", + "previewModeEncryptionKey": "c2973778f07790516def9075a3e936a1b1b139df9f357f23dacaf19af0384058" + } +} \ No newline at end of file diff --git a/superlog/apps/sample/.next/react-loadable-manifest.json b/superlog/apps/sample/.next/react-loadable-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b --- /dev/null +++ b/superlog/apps/sample/.next/react-loadable-manifest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/superlog/apps/sample/.next/routes-manifest.json b/superlog/apps/sample/.next/routes-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..82631209dbe4e64585e48b78044ec53ce2be9072 --- /dev/null +++ b/superlog/apps/sample/.next/routes-manifest.json @@ -0,0 +1 @@ +{"version":3,"caseSensitive":false,"basePath":"","rewrites":{"beforeFiles":[],"afterFiles":[],"fallback":[]},"redirects":[{"source":"/:path+/","destination":"/:path+","permanent":true,"internal":true,"regex":"^(?:\\/((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*))\\/$"}],"headers":[]} \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/app-paths-manifest.json b/superlog/apps/sample/.next/server/app-paths-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b --- /dev/null +++ b/superlog/apps/sample/.next/server/app-paths-manifest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/edge-instrumentation.js b/superlog/apps/sample/.next/server/edge-instrumentation.js new file mode 100644 index 0000000000000000000000000000000000000000..7409c32f9880e1cac4e77edbb9a5c5f70bb74029 --- /dev/null +++ b/superlog/apps/sample/.next/server/edge-instrumentation.js @@ -0,0 +1,634 @@ +// runtime can't be in strict mode because a global variable is assign and maybe created. +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["instrumentation"],{ + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js": +/*!*****************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js ***! + \*****************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_LOGGER: () => (/* binding */ NOOP_LOGGER),\n/* harmony export */ NoopLogger: () => (/* binding */ NoopLogger)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nclass NoopLogger {\n emit(_logRecord) { }\n enabled() {\n return false;\n }\n}\nconst NOOP_LOGGER = new NoopLogger();\n//# sourceMappingURL=NoopLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vTm9vcExvZ2dlci5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vTm9vcExvZ2dlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wTG9nZ2VyIHtcbiAgICBlbWl0KF9sb2dSZWNvcmQpIHsgfVxuICAgIGVuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgTk9PUF9MT0dHRVIgPSBuZXcgTm9vcExvZ2dlcigpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcExvZ2dlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js": +/*!*************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js ***! + \*************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_LOGGER_PROVIDER: () => (/* binding */ NOOP_LOGGER_PROVIDER),\n/* harmony export */ NoopLoggerProvider: () => (/* binding */ NoopLoggerProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopLogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nclass NoopLoggerProvider {\n getLogger(_name, _version, _options) {\n return new _NoopLogger__WEBPACK_IMPORTED_MODULE_0__.NoopLogger();\n }\n}\nconst NOOP_LOGGER_PROVIDER = new NoopLoggerProvider();\n//# sourceMappingURL=NoopLoggerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vTm9vcExvZ2dlclByb3ZpZGVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQzBDO0FBQ25DO0FBQ1A7QUFDQSxtQkFBbUIsbURBQVU7QUFDN0I7QUFDQTtBQUNPO0FBQ1AiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpLWxvZ3NAMC4yMTUuMC9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpLWxvZ3MvYnVpbGQvZXNtL05vb3BMb2dnZXJQcm92aWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5vb3BMb2dnZXIgfSBmcm9tICcuL05vb3BMb2dnZXInO1xuZXhwb3J0IGNsYXNzIE5vb3BMb2dnZXJQcm92aWRlciB7XG4gICAgZ2V0TG9nZ2VyKF9uYW1lLCBfdmVyc2lvbiwgX29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wTG9nZ2VyKCk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IE5PT1BfTE9HR0VSX1BST1ZJREVSID0gbmV3IE5vb3BMb2dnZXJQcm92aWRlcigpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcExvZ2dlclByb3ZpZGVyLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyLogger: () => (/* binding */ ProxyLogger)\n/* harmony export */ });\n/* harmony import */ var _NoopLogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nclass ProxyLogger {\n constructor(provider, name, version, options) {\n this._provider = provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n /**\n * Emit a log record. This method should only be used by log appenders.\n *\n * @param logRecord\n */\n emit(logRecord) {\n this._getLogger().emit(logRecord);\n }\n enabled(options) {\n return this._getLogger().enabled(options);\n }\n /**\n * Try to get a logger from the proxy logger provider.\n * If the proxy logger provider has no delegate, return a noop logger.\n */\n _getLogger() {\n if (this._delegate) {\n return this._delegate;\n }\n const logger = this._provider._getDelegateLogger(this.name, this.version, this.options);\n if (!logger) {\n return _NoopLogger__WEBPACK_IMPORTED_MODULE_0__.NOOP_LOGGER;\n }\n this._delegate = logger;\n return this._delegate;\n }\n}\n//# sourceMappingURL=ProxyLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vUHJveHlMb2dnZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUMyQztBQUNwQztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvREFBVztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpLWxvZ3NAMC4yMTUuMC9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpLWxvZ3MvYnVpbGQvZXNtL1Byb3h5TG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgTk9PUF9MT0dHRVIgfSBmcm9tICcuL05vb3BMb2dnZXInO1xuZXhwb3J0IGNsYXNzIFByb3h5TG9nZ2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlciwgbmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGEgbG9nIHJlY29yZC4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBsb2cgYXBwZW5kZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvZ1JlY29yZFxuICAgICAqL1xuICAgIGVtaXQobG9nUmVjb3JkKSB7XG4gICAgICAgIHRoaXMuX2dldExvZ2dlcigpLmVtaXQobG9nUmVjb3JkKTtcbiAgICB9XG4gICAgZW5hYmxlZChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRMb2dnZXIoKS5lbmFibGVkKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gZ2V0IGEgbG9nZ2VyIGZyb20gdGhlIHByb3h5IGxvZ2dlciBwcm92aWRlci5cbiAgICAgKiBJZiB0aGUgcHJveHkgbG9nZ2VyIHByb3ZpZGVyIGhhcyBubyBkZWxlZ2F0ZSwgcmV0dXJuIGEgbm9vcCBsb2dnZXIuXG4gICAgICovXG4gICAgX2dldExvZ2dlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG9nZ2VyID0gdGhpcy5fcHJvdmlkZXIuX2dldERlbGVnYXRlTG9nZ2VyKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAoIWxvZ2dlcikge1xuICAgICAgICAgICAgcmV0dXJuIE5PT1BfTE9HR0VSO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbG9nZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlMb2dnZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js": +/*!**************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js ***! + \**************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyLoggerProvider: () => (/* binding */ ProxyLoggerProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NoopLoggerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js\");\n/* harmony import */ var _ProxyLogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ProxyLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\nclass ProxyLoggerProvider {\n getLogger(name, version, options) {\n var _a;\n return ((_a = this._getDelegateLogger(name, version, options)) !== null && _a !== void 0 ? _a : new _ProxyLogger__WEBPACK_IMPORTED_MODULE_0__.ProxyLogger(this, name, version, options));\n }\n /**\n * Get the delegate logger provider.\n * Used by tests only.\n * @internal\n */\n _getDelegate() {\n var _a;\n return (_a = this._delegate) !== null && _a !== void 0 ? _a : _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_1__.NOOP_LOGGER_PROVIDER;\n }\n /**\n * Set the delegate logger provider\n * @internal\n */\n _setDelegate(delegate) {\n this._delegate = delegate;\n }\n /**\n * @internal\n */\n _getDelegateLogger(name, version, options) {\n var _a;\n return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getLogger(name, version, options);\n }\n}\n//# sourceMappingURL=ProxyLoggerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vUHJveHlMb2dnZXJQcm92aWRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUM0RDtBQUNoQjtBQUNyQztBQUNQO0FBQ0E7QUFDQSw0R0FBNEcscURBQVc7QUFDdkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxxRUFBb0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vUHJveHlMb2dnZXJQcm92aWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5PT1BfTE9HR0VSX1BST1ZJREVSIH0gZnJvbSAnLi9Ob29wTG9nZ2VyUHJvdmlkZXInO1xuaW1wb3J0IHsgUHJveHlMb2dnZXIgfSBmcm9tICcuL1Byb3h5TG9nZ2VyJztcbmV4cG9ydCBjbGFzcyBQcm94eUxvZ2dlclByb3ZpZGVyIHtcbiAgICBnZXRMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5fZ2V0RGVsZWdhdGVMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBQcm94eUxvZ2dlcih0aGlzLCBuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVsZWdhdGUgbG9nZ2VyIHByb3ZpZGVyLlxuICAgICAqIFVzZWQgYnkgdGVzdHMgb25seS5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZ2V0RGVsZWdhdGUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuX2RlbGVnYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBOT09QX0xPR0dFUl9QUk9WSURFUjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWxlZ2F0ZSBsb2dnZXIgcHJvdmlkZXJcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfc2V0RGVsZWdhdGUoZGVsZWdhdGUpIHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2dldERlbGVnYXRlTG9nZ2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlMb2dnZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LogsAPI: () => (/* binding */ LogsAPI)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js\");\n/* harmony import */ var _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../NoopLoggerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js\");\n/* harmony import */ var _ProxyLoggerProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ProxyLoggerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nclass LogsAPI {\n constructor() {\n this._proxyLoggerProvider = new _ProxyLoggerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyLoggerProvider();\n }\n static getInstance() {\n if (!this._instance) {\n this._instance = new LogsAPI();\n }\n return this._instance;\n }\n setGlobalLoggerProvider(provider) {\n if (_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY]) {\n return this.getLoggerProvider();\n }\n _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY] = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.makeGetter)(_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.API_BACKWARDS_COMPATIBILITY_VERSION, provider, _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_2__.NOOP_LOGGER_PROVIDER);\n this._proxyLoggerProvider._setDelegate(provider);\n return provider;\n }\n /**\n * Returns the global logger provider.\n *\n * @returns LoggerProvider\n */\n getLoggerProvider() {\n var _a, _b;\n return ((_b = (_a = _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY]) === null || _a === void 0 ? void 0 : _a.call(_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global, _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.API_BACKWARDS_COMPATIBILITY_VERSION)) !== null && _b !== void 0 ? _b : this._proxyLoggerProvider);\n }\n /**\n * Returns a logger from the global logger provider.\n *\n * @returns Logger\n */\n getLogger(name, version, options) {\n return this.getLoggerProvider().getLogger(name, version, options);\n }\n /** Remove the global logger provider */\n disable() {\n delete _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY];\n this._proxyLoggerProvider = new _ProxyLoggerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyLoggerProvider();\n }\n}\n//# sourceMappingURL=logs.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vYXBpL2xvZ3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQzBIO0FBQzdEO0FBQ0E7QUFDdEQ7QUFDUDtBQUNBLHdDQUF3QyxxRUFBbUI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMkRBQU8sQ0FBQyx1RUFBbUI7QUFDdkM7QUFDQTtBQUNBLFFBQVEsMkRBQU8sQ0FBQyx1RUFBbUIsSUFBSSxrRUFBVSxDQUFDLHVGQUFtQyxZQUFZLHFFQUFvQjtBQUNySDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwyREFBTyxDQUFDLHVFQUFtQixnREFBZ0QsMkRBQU8sRUFBRSx1RkFBbUM7QUFDbko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMkRBQU8sQ0FBQyx1RUFBbUI7QUFDMUMsd0NBQXdDLHFFQUFtQjtBQUMzRDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpLWxvZ3NAMC4yMTUuMC9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpLWxvZ3MvYnVpbGQvZXNtL2FwaS9sb2dzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQVBJX0JBQ0tXQVJEU19DT01QQVRJQklMSVRZX1ZFUlNJT04sIEdMT0JBTF9MT0dTX0FQSV9LRVksIF9nbG9iYWwsIG1ha2VHZXR0ZXIsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbmltcG9ydCB7IE5PT1BfTE9HR0VSX1BST1ZJREVSIH0gZnJvbSAnLi4vTm9vcExvZ2dlclByb3ZpZGVyJztcbmltcG9ydCB7IFByb3h5TG9nZ2VyUHJvdmlkZXIgfSBmcm9tICcuLi9Qcm94eUxvZ2dlclByb3ZpZGVyJztcbmV4cG9ydCBjbGFzcyBMb2dzQVBJIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcHJveHlMb2dnZXJQcm92aWRlciA9IG5ldyBQcm94eUxvZ2dlclByb3ZpZGVyKCk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgTG9nc0FQSSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG4gICAgc2V0R2xvYmFsTG9nZ2VyUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgaWYgKF9nbG9iYWxbR0xPQkFMX0xPR1NfQVBJX0tFWV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExvZ2dlclByb3ZpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2dsb2JhbFtHTE9CQUxfTE9HU19BUElfS0VZXSA9IG1ha2VHZXR0ZXIoQVBJX0JBQ0tXQVJEU19DT01QQVRJQklMSVRZX1ZFUlNJT04sIHByb3ZpZGVyLCBOT09QX0xPR0dFUl9QUk9WSURFUik7XG4gICAgICAgIHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIuX3NldERlbGVnYXRlKHByb3ZpZGVyKTtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgbG9nZ2VyIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgTG9nZ2VyUHJvdmlkZXJcbiAgICAgKi9cbiAgICBnZXRMb2dnZXJQcm92aWRlcigpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuICgoX2IgPSAoX2EgPSBfZ2xvYmFsW0dMT0JBTF9MT0dTX0FQSV9LRVldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChfZ2xvYmFsLCBBUElfQkFDS1dBUkRTX0NPTVBBVElCSUxJVFlfVkVSU0lPTikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbG9nZ2VyIGZyb20gdGhlIGdsb2JhbCBsb2dnZXIgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBMb2dnZXJcbiAgICAgKi9cbiAgICBnZXRMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2dnZXJQcm92aWRlcigpLmdldExvZ2dlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqIFJlbW92ZSB0aGUgZ2xvYmFsIGxvZ2dlciBwcm92aWRlciAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGRlbGV0ZSBfZ2xvYmFsW0dMT0JBTF9MT0dTX0FQSV9LRVldO1xuICAgICAgICB0aGlzLl9wcm94eUxvZ2dlclByb3ZpZGVyID0gbmV3IFByb3h5TG9nZ2VyUHJvdmlkZXIoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_LOGGER: () => (/* reexport safe */ _NoopLogger__WEBPACK_IMPORTED_MODULE_1__.NOOP_LOGGER),\n/* harmony export */ NoopLogger: () => (/* reexport safe */ _NoopLogger__WEBPACK_IMPORTED_MODULE_1__.NoopLogger),\n/* harmony export */ SeverityNumber: () => (/* reexport safe */ _types_LogRecord__WEBPACK_IMPORTED_MODULE_0__.SeverityNumber),\n/* harmony export */ logs: () => (/* binding */ logs)\n/* harmony export */ });\n/* harmony import */ var _types_LogRecord__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/LogRecord */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js\");\n/* harmony import */ var _NoopLogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NoopLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\");\n/* harmony import */ var _api_logs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api/logs */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst logs = _api_logs__WEBPACK_IMPORTED_MODULE_2__.LogsAPI.getInstance();\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ21EO0FBQ0k7QUFDbEI7QUFDOUIsYUFBYSw4Q0FBTztBQUMzQiIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgeyBTZXZlcml0eU51bWJlciB9IGZyb20gJy4vdHlwZXMvTG9nUmVjb3JkJztcbmV4cG9ydCB7IE5PT1BfTE9HR0VSLCBOb29wTG9nZ2VyIH0gZnJvbSAnLi9Ob29wTG9nZ2VyJztcbmltcG9ydCB7IExvZ3NBUEkgfSBmcm9tICcuL2FwaS9sb2dzJztcbmV4cG9ydCBjb25zdCBsb2dzID0gTG9nc0FQSS5nZXRJbnN0YW5jZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js": +/*!****************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js ***! + \****************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API_BACKWARDS_COMPATIBILITY_VERSION: () => (/* binding */ API_BACKWARDS_COMPATIBILITY_VERSION),\n/* harmony export */ GLOBAL_LOGS_API_KEY: () => (/* binding */ GLOBAL_LOGS_API_KEY),\n/* harmony export */ _global: () => (/* binding */ _global),\n/* harmony export */ makeGetter: () => (/* binding */ makeGetter)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nconst GLOBAL_LOGS_API_KEY = Symbol.for('io.opentelemetry.js.api.logs');\nconst _global = globalThis;\n/**\n * Make a function which accepts a version integer and returns the instance of an API if the version\n * is compatible, or a fallback version (usually NOOP) if it is not.\n *\n * @param requiredVersion Backwards compatibility version which is required to return the instance\n * @param instance Instance which should be returned if the required version is compatible\n * @param fallback Fallback instance, usually NOOP, which will be returned if the required version is not compatible\n */\nfunction makeGetter(requiredVersion, instance, fallback) {\n return (version) => version === requiredVersion ? instance : fallback;\n}\n/**\n * A number which should be incremented each time a backwards incompatible\n * change is made to the API. This number is used when an API package\n * attempts to access the global API to ensure it is getting a compatible\n * version. If the global API is not compatible with the API package\n * attempting to get it, a NOOP API implementation will be returned.\n */\nconst API_BACKWARDS_COMPATIBILITY_VERSION = 1;\n//# sourceMappingURL=global-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaS1sb2dzQDAuMjE1LjAvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzL2J1aWxkL2VzbS9pbnRlcm5hbC9nbG9iYWwtdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgY29uc3QgR0xPQkFMX0xPR1NfQVBJX0tFWSA9IFN5bWJvbC5mb3IoJ2lvLm9wZW50ZWxlbWV0cnkuanMuYXBpLmxvZ3MnKTtcbmV4cG9ydCBjb25zdCBfZ2xvYmFsID0gZ2xvYmFsVGhpcztcbi8qKlxuICogTWFrZSBhIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgYSB2ZXJzaW9uIGludGVnZXIgYW5kIHJldHVybnMgdGhlIGluc3RhbmNlIG9mIGFuIEFQSSBpZiB0aGUgdmVyc2lvblxuICogaXMgY29tcGF0aWJsZSwgb3IgYSBmYWxsYmFjayB2ZXJzaW9uICh1c3VhbGx5IE5PT1ApIGlmIGl0IGlzIG5vdC5cbiAqXG4gKiBAcGFyYW0gcmVxdWlyZWRWZXJzaW9uIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHZlcnNpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZSBpbnN0YW5jZVxuICogQHBhcmFtIGluc3RhbmNlIEluc3RhbmNlIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBpZiB0aGUgcmVxdWlyZWQgdmVyc2lvbiBpcyBjb21wYXRpYmxlXG4gKiBAcGFyYW0gZmFsbGJhY2sgRmFsbGJhY2sgaW5zdGFuY2UsIHVzdWFsbHkgTk9PUCwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgcmVxdWlyZWQgdmVyc2lvbiBpcyBub3QgY29tcGF0aWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUdldHRlcihyZXF1aXJlZFZlcnNpb24sIGluc3RhbmNlLCBmYWxsYmFjaykge1xuICAgIHJldHVybiAodmVyc2lvbikgPT4gdmVyc2lvbiA9PT0gcmVxdWlyZWRWZXJzaW9uID8gaW5zdGFuY2UgOiBmYWxsYmFjaztcbn1cbi8qKlxuICogQSBudW1iZXIgd2hpY2ggc2hvdWxkIGJlIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIGJhY2t3YXJkcyBpbmNvbXBhdGlibGVcbiAqIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBBUEkuIFRoaXMgbnVtYmVyIGlzIHVzZWQgd2hlbiBhbiBBUEkgcGFja2FnZVxuICogYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQVBJIHRvIGVuc3VyZSBpdCBpcyBnZXR0aW5nIGEgY29tcGF0aWJsZVxuICogdmVyc2lvbi4gSWYgdGhlIGdsb2JhbCBBUEkgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgQVBJIHBhY2thZ2VcbiAqIGF0dGVtcHRpbmcgdG8gZ2V0IGl0LCBhIE5PT1AgQVBJIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBBUElfQkFDS1dBUkRTX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js": +/*!**********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js ***! + \**********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeverityNumber: () => (/* binding */ SeverityNumber)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nvar SeverityNumber;\n(function (SeverityNumber) {\n SeverityNumber[SeverityNumber[\"UNSPECIFIED\"] = 0] = \"UNSPECIFIED\";\n SeverityNumber[SeverityNumber[\"TRACE\"] = 1] = \"TRACE\";\n SeverityNumber[SeverityNumber[\"TRACE2\"] = 2] = \"TRACE2\";\n SeverityNumber[SeverityNumber[\"TRACE3\"] = 3] = \"TRACE3\";\n SeverityNumber[SeverityNumber[\"TRACE4\"] = 4] = \"TRACE4\";\n SeverityNumber[SeverityNumber[\"DEBUG\"] = 5] = \"DEBUG\";\n SeverityNumber[SeverityNumber[\"DEBUG2\"] = 6] = \"DEBUG2\";\n SeverityNumber[SeverityNumber[\"DEBUG3\"] = 7] = \"DEBUG3\";\n SeverityNumber[SeverityNumber[\"DEBUG4\"] = 8] = \"DEBUG4\";\n SeverityNumber[SeverityNumber[\"INFO\"] = 9] = \"INFO\";\n SeverityNumber[SeverityNumber[\"INFO2\"] = 10] = \"INFO2\";\n SeverityNumber[SeverityNumber[\"INFO3\"] = 11] = \"INFO3\";\n SeverityNumber[SeverityNumber[\"INFO4\"] = 12] = \"INFO4\";\n SeverityNumber[SeverityNumber[\"WARN\"] = 13] = \"WARN\";\n SeverityNumber[SeverityNumber[\"WARN2\"] = 14] = \"WARN2\";\n SeverityNumber[SeverityNumber[\"WARN3\"] = 15] = \"WARN3\";\n SeverityNumber[SeverityNumber[\"WARN4\"] = 16] = \"WARN4\";\n SeverityNumber[SeverityNumber[\"ERROR\"] = 17] = \"ERROR\";\n SeverityNumber[SeverityNumber[\"ERROR2\"] = 18] = \"ERROR2\";\n SeverityNumber[SeverityNumber[\"ERROR3\"] = 19] = \"ERROR3\";\n SeverityNumber[SeverityNumber[\"ERROR4\"] = 20] = \"ERROR4\";\n SeverityNumber[SeverityNumber[\"FATAL\"] = 21] = \"FATAL\";\n SeverityNumber[SeverityNumber[\"FATAL2\"] = 22] = \"FATAL2\";\n SeverityNumber[SeverityNumber[\"FATAL3\"] = 23] = \"FATAL3\";\n SeverityNumber[SeverityNumber[\"FATAL4\"] = 24] = \"FATAL4\";\n})(SeverityNumber || (SeverityNumber = {}));\n//# sourceMappingURL=LogRecord.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vdHlwZXMvTG9nUmVjb3JkLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsd0NBQXdDO0FBQ3pDIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaS1sb2dzQDAuMjE1LjAvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzL2J1aWxkL2VzbS90eXBlcy9Mb2dSZWNvcmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgdmFyIFNldmVyaXR5TnVtYmVyO1xuKGZ1bmN0aW9uIChTZXZlcml0eU51bWJlcikge1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiVU5TUEVDSUZJRURcIl0gPSAwXSA9IFwiVU5TUEVDSUZJRURcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIlRSQUNFXCJdID0gMV0gPSBcIlRSQUNFXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJUUkFDRTJcIl0gPSAyXSA9IFwiVFJBQ0UyXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJUUkFDRTNcIl0gPSAzXSA9IFwiVFJBQ0UzXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJUUkFDRTRcIl0gPSA0XSA9IFwiVFJBQ0U0XCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJERUJVR1wiXSA9IDVdID0gXCJERUJVR1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiREVCVUcyXCJdID0gNl0gPSBcIkRFQlVHMlwiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiREVCVUczXCJdID0gN10gPSBcIkRFQlVHM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiREVCVUc0XCJdID0gOF0gPSBcIkRFQlVHNFwiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiSU5GT1wiXSA9IDldID0gXCJJTkZPXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJJTkZPMlwiXSA9IDEwXSA9IFwiSU5GTzJcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIklORk8zXCJdID0gMTFdID0gXCJJTkZPM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiSU5GTzRcIl0gPSAxMl0gPSBcIklORk80XCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJXQVJOXCJdID0gMTNdID0gXCJXQVJOXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJXQVJOMlwiXSA9IDE0XSA9IFwiV0FSTjJcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIldBUk4zXCJdID0gMTVdID0gXCJXQVJOM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiV0FSTjRcIl0gPSAxNl0gPSBcIldBUk40XCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJFUlJPUlwiXSA9IDE3XSA9IFwiRVJST1JcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIkVSUk9SMlwiXSA9IDE4XSA9IFwiRVJST1IyXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJFUlJPUjNcIl0gPSAxOV0gPSBcIkVSUk9SM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiRVJST1I0XCJdID0gMjBdID0gXCJFUlJPUjRcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIkZBVEFMXCJdID0gMjFdID0gXCJGQVRBTFwiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiRkFUQUwyXCJdID0gMjJdID0gXCJGQVRBTDJcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIkZBVEFMM1wiXSA9IDIzXSA9IFwiRkFUQUwzXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJGQVRBTDRcIl0gPSAyNF0gPSBcIkZBVEFMNFwiO1xufSkoU2V2ZXJpdHlOdW1iZXIgfHwgKFNldmVyaXR5TnVtYmVyID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ1JlY29yZC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextAPI: () => (/* binding */ ContextAPI)\n/* harmony export */ });\n/* harmony import */ var _context_NoopContextManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../context/NoopContextManager */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js\");\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst API_NAME = 'context';\nconst NOOP_CONTEXT_MANAGER = new _context_NoopContextManager__WEBPACK_IMPORTED_MODULE_0__.NoopContextManager();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n *\n * @since 1.0.0\n */\nclass ContextAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() { }\n /** Get the singleton instance of the Context API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n return this._instance;\n }\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n setGlobalContextManager(contextManager) {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.registerGlobal)(API_NAME, contextManager, _diag__WEBPACK_IMPORTED_MODULE_2__.DiagAPI.instance());\n }\n /**\n * Get the currently active context\n */\n active() {\n return this._getContextManager().active();\n }\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n with(context, fn, thisArg, ...args) {\n return this._getContextManager().with(context, fn, thisArg, ...args);\n }\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n bind(context, target) {\n return this._getContextManager().bind(context, target);\n }\n _getContextManager() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.getGlobal)(API_NAME) || NOOP_CONTEXT_MANAGER;\n }\n /** Disable and remove the global context manager */\n disable() {\n this._getContextManager().disable();\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_2__.DiagAPI.instance());\n }\n}\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL2NvbnRleHQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ21FO0FBQ3FCO0FBQ3ZEO0FBQ2pDO0FBQ0EsaUNBQWlDLDJFQUFrQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHNFQUFjLDJCQUEyQiwwQ0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUVBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHdFQUFnQixXQUFXLDBDQUFPO0FBQzFDO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBOb29wQ29udGV4dE1hbmFnZXIgfSBmcm9tICcuLi9jb250ZXh0L05vb3BDb250ZXh0TWFuYWdlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5pbXBvcnQgeyBEaWFnQVBJIH0gZnJvbSAnLi9kaWFnJztcbmNvbnN0IEFQSV9OQU1FID0gJ2NvbnRleHQnO1xuY29uc3QgTk9PUF9DT05URVhUX01BTkFHRVIgPSBuZXcgTm9vcENvbnRleHRNYW5hZ2VyKCk7XG4vKipcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIE9wZW5UZWxlbWV0cnkgQ29udGV4dCBBUElcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHRBUEkge1xuICAgIC8qKiBFbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHByZXZlbnRzIGVuZCB1c2VycyBmcm9tIGNvbnN0cnVjdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQVBJICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKiogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENvbnRleHQgQVBJICovXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBDb250ZXh0QVBJKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgY29udGV4dCBtYW5hZ2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGV4dCBtYW5hZ2VyIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCwgZWxzZSBmYWxzZVxuICAgICAqL1xuICAgIHNldEdsb2JhbENvbnRleHRNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiByZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgY29udGV4dE1hbmFnZXIsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb250ZXh0XG4gICAgICovXG4gICAgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udGV4dE1hbmFnZXIoKS5hY3RpdmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGggYW4gYWN0aXZlIGNvbnRleHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gYmUgYWN0aXZlIGR1cmluZyBmdW5jdGlvbiBleGVjdXRpb25cbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gZXhlY3V0ZSBpbiBhIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gdGhpc0FyZyBvcHRpb25hbCByZWNlaXZlciB0byBiZSB1c2VkIGZvciBjYWxsaW5nIGZuXG4gICAgICogQHBhcmFtIGFyZ3Mgb3B0aW9uYWwgYXJndW1lbnRzIGZvcndhcmRlZCB0byBmblxuICAgICAqL1xuICAgIHdpdGgoY29udGV4dCwgZm4sIHRoaXNBcmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRleHRNYW5hZ2VyKCkud2l0aChjb250ZXh0LCBmbiwgdGhpc0FyZywgLi4uYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJpbmQgYSBjb250ZXh0IHRvIGEgdGFyZ2V0IGZ1bmN0aW9uIG9yIGV2ZW50IGVtaXR0ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gYmluZCB0byB0aGUgZXZlbnQgZW1pdHRlciBvciBmdW5jdGlvbi4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGV4dFxuICAgICAqIEBwYXJhbSB0YXJnZXQgZnVuY3Rpb24gb3IgZXZlbnQgZW1pdHRlciB0byBiaW5kXG4gICAgICovXG4gICAgYmluZChjb250ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRleHRNYW5hZ2VyKCkuYmluZChjb250ZXh0LCB0YXJnZXQpO1xuICAgIH1cbiAgICBfZ2V0Q29udGV4dE1hbmFnZXIoKSB7XG4gICAgICAgIHJldHVybiBnZXRHbG9iYWwoQVBJX05BTUUpIHx8IE5PT1BfQ09OVEVYVF9NQU5BR0VSO1xuICAgIH1cbiAgICAvKiogRGlzYWJsZSBhbmQgcmVtb3ZlIHRoZSBnbG9iYWwgY29udGV4dCBtYW5hZ2VyICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZ2V0Q29udGV4dE1hbmFnZXIoKS5kaXNhYmxlKCk7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js": +/*!***************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js ***! + \***************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagAPI: () => (/* binding */ DiagAPI)\n/* harmony export */ });\n/* harmony import */ var _diag_ComponentLogger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../diag/ComponentLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js\");\n/* harmony import */ var _diag_internal_logLevelLogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../diag/internal/logLevelLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js\");\n/* harmony import */ var _diag_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../diag/types */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\");\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\nconst API_NAME = 'diag';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n *\n * @since 1.0.0\n */\nclass DiagAPI {\n /** Get the singleton instance of the DiagAPI API */\n static instance() {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n return this._instance;\n }\n /**\n * Private internal constructor\n * @private\n */\n constructor() {\n function _logProxy(funcName) {\n return function (...args) {\n const logger = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)('diag');\n // shortcut if logger not set\n if (!logger)\n return;\n return logger[funcName](...args);\n };\n }\n // Using self local variable for minification purposes as 'this' cannot be minified\n const self = this;\n // DiagAPI specific functions\n const setLogger = (logger, optionsOrLogLevel = { logLevel: _diag_types__WEBPACK_IMPORTED_MODULE_1__.DiagLogLevel.INFO }) => {\n var _a, _b, _c;\n if (logger === self) {\n // There isn't much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n const err = new Error('Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation');\n self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);\n return false;\n }\n if (typeof optionsOrLogLevel === 'number') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n const oldLogger = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)('diag');\n const newLogger = (0,_diag_internal_logLevelLogger__WEBPACK_IMPORTED_MODULE_2__.createLogLevelDiagLogger)((_b = optionsOrLogLevel.logLevel) !== null && _b !== void 0 ? _b : _diag_types__WEBPACK_IMPORTED_MODULE_1__.DiagLogLevel.INFO, logger);\n // There already is an logger registered. We'll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n const stack = (_c = new Error().stack) !== null && _c !== void 0 ? _c : '';\n oldLogger.warn(`Current logger will be overwritten from ${stack}`);\n newLogger.warn(`Current logger will overwrite one already registered from ${stack}`);\n }\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.registerGlobal)('diag', newLogger, self, true);\n };\n self.setLogger = setLogger;\n self.disable = () => {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.unregisterGlobal)(API_NAME, self);\n };\n self.createComponentLogger = (options) => {\n return new _diag_ComponentLogger__WEBPACK_IMPORTED_MODULE_3__.DiagComponentLogger(options);\n };\n self.verbose = _logProxy('verbose');\n self.debug = _logProxy('debug');\n self.info = _logProxy('info');\n self.warn = _logProxy('warn');\n self.error = _logProxy('error');\n }\n}\n//# sourceMappingURL=diag.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL2RpYWcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUM4RDtBQUNhO0FBQzlCO0FBQzJDO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGlFQUFTO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxVQUFVLHFEQUFZLE9BQU87QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpRUFBUztBQUN2Qyw4QkFBOEIsdUZBQXdCLG9FQUFvRSxxREFBWTtBQUN0STtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsTUFBTTtBQUNoRiw0RkFBNEYsTUFBTTtBQUNsRztBQUNBLG1CQUFtQixzRUFBYztBQUNqQztBQUNBO0FBQ0E7QUFDQSxZQUFZLHdFQUFnQjtBQUM1QjtBQUNBO0FBQ0EsdUJBQXVCLHNFQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS9kaWFnLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGlhZ0NvbXBvbmVudExvZ2dlciB9IGZyb20gJy4uL2RpYWcvQ29tcG9uZW50TG9nZ2VyJztcbmltcG9ydCB7IGNyZWF0ZUxvZ0xldmVsRGlhZ0xvZ2dlciB9IGZyb20gJy4uL2RpYWcvaW50ZXJuYWwvbG9nTGV2ZWxMb2dnZXInO1xuaW1wb3J0IHsgRGlhZ0xvZ0xldmVsIH0gZnJvbSAnLi4vZGlhZy90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5jb25zdCBBUElfTkFNRSA9ICdkaWFnJztcbi8qKlxuICogU2luZ2xldG9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgT3BlblRlbGVtZXRyeSBpbnRlcm5hbFxuICogZGlhZ25vc3RpYyBBUElcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNsYXNzIERpYWdBUEkge1xuICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRGlhZ0FQSSBBUEkgKi9cbiAgICBzdGF0aWMgaW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IERpYWdBUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaXZhdGUgaW50ZXJuYWwgY29uc3RydWN0b3JcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBmdW5jdGlvbiBfbG9nUHJveHkoZnVuY05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ2dlciA9IGdldEdsb2JhbCgnZGlhZycpO1xuICAgICAgICAgICAgICAgIC8vIHNob3J0Y3V0IGlmIGxvZ2dlciBub3Qgc2V0XG4gICAgICAgICAgICAgICAgaWYgKCFsb2dnZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyW2Z1bmNOYW1lXSguLi5hcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNpbmcgc2VsZiBsb2NhbCB2YXJpYWJsZSBmb3IgbWluaWZpY2F0aW9uIHB1cnBvc2VzIGFzICd0aGlzJyBjYW5ub3QgYmUgbWluaWZpZWRcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIERpYWdBUEkgc3BlY2lmaWMgZnVuY3Rpb25zXG4gICAgICAgIGNvbnN0IHNldExvZ2dlciA9IChsb2dnZXIsIG9wdGlvbnNPckxvZ0xldmVsID0geyBsb2dMZXZlbDogRGlhZ0xvZ0xldmVsLklORk8gfSkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICBpZiAobG9nZ2VyID09PSBzZWxmKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXNuJ3QgbXVjaCB3ZSBjYW4gZG8gaGVyZS5cbiAgICAgICAgICAgICAgICAvLyBMb2dnaW5nIHRvIHRoZSBjb25zb2xlIG1pZ2h0IGJyZWFrIHRoZSB1c2VyIGFwcGxpY2F0aW9uLlxuICAgICAgICAgICAgICAgIC8vIFRyeSB0byBsb2cgdG8gc2VsZi4gSWYgYSBsb2dnZXIgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBpdCB3aWxsIHJlY2VpdmUgdGhlIGxvZy5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgZGlhZyBhcyB0aGUgbG9nZ2VyIGZvciBpdHNlbGYuIFBsZWFzZSB1c2UgYSBEaWFnTG9nZ2VyIGltcGxlbWVudGF0aW9uIGxpa2UgQ29uc29sZURpYWdMb2dnZXIgb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgICAgICAgICBzZWxmLmVycm9yKChfYSA9IGVyci5zdGFjaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yTG9nTGV2ZWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc09yTG9nTGV2ZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBvcHRpb25zT3JMb2dMZXZlbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2xkTG9nZ2VyID0gZ2V0R2xvYmFsKCdkaWFnJyk7XG4gICAgICAgICAgICBjb25zdCBuZXdMb2dnZXIgPSBjcmVhdGVMb2dMZXZlbERpYWdMb2dnZXIoKF9iID0gb3B0aW9uc09yTG9nTGV2ZWwubG9nTGV2ZWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IERpYWdMb2dMZXZlbC5JTkZPLCBsb2dnZXIpO1xuICAgICAgICAgICAgLy8gVGhlcmUgYWxyZWFkeSBpcyBhbiBsb2dnZXIgcmVnaXN0ZXJlZC4gV2UnbGwgbGV0IGl0IGtub3cgYmVmb3JlIG92ZXJ3cml0aW5nIGl0LlxuICAgICAgICAgICAgaWYgKG9sZExvZ2dlciAmJiAhb3B0aW9uc09yTG9nTGV2ZWwuc3VwcHJlc3NPdmVycmlkZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IChfYyA9IG5ldyBFcnJvcigpLnN0YWNrKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAnPGZhaWxlZCB0byBnZW5lcmF0ZSBzdGFja3RyYWNlPic7XG4gICAgICAgICAgICAgICAgb2xkTG9nZ2VyLndhcm4oYEN1cnJlbnQgbG9nZ2VyIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZnJvbSAke3N0YWNrfWApO1xuICAgICAgICAgICAgICAgIG5ld0xvZ2dlci53YXJuKGBDdXJyZW50IGxvZ2dlciB3aWxsIG92ZXJ3cml0ZSBvbmUgYWxyZWFkeSByZWdpc3RlcmVkIGZyb20gJHtzdGFja31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWdpc3Rlckdsb2JhbCgnZGlhZycsIG5ld0xvZ2dlciwgc2VsZiwgdHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYuc2V0TG9nZ2VyID0gc2V0TG9nZ2VyO1xuICAgICAgICBzZWxmLmRpc2FibGUgPSAoKSA9PiB7XG4gICAgICAgICAgICB1bnJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCBzZWxmKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5jcmVhdGVDb21wb25lbnRMb2dnZXIgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEaWFnQ29tcG9uZW50TG9nZ2VyKG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICBzZWxmLnZlcmJvc2UgPSBfbG9nUHJveHkoJ3ZlcmJvc2UnKTtcbiAgICAgICAgc2VsZi5kZWJ1ZyA9IF9sb2dQcm94eSgnZGVidWcnKTtcbiAgICAgICAgc2VsZi5pbmZvID0gX2xvZ1Byb3h5KCdpbmZvJyk7XG4gICAgICAgIHNlbGYud2FybiA9IF9sb2dQcm94eSgnd2FybicpO1xuICAgICAgICBzZWxmLmVycm9yID0gX2xvZ1Byb3h5KCdlcnJvcicpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpYWcuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MetricsAPI: () => (/* binding */ MetricsAPI)\n/* harmony export */ });\n/* harmony import */ var _metrics_NoopMeterProvider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../metrics/NoopMeterProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js\");\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst API_NAME = 'metrics';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Metrics API\n */\nclass MetricsAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() { }\n /** Get the singleton instance of the Metrics API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new MetricsAPI();\n }\n return this._instance;\n }\n /**\n * Set the current global meter provider.\n * Returns true if the meter provider was successfully registered, else false.\n */\n setGlobalMeterProvider(provider) {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.registerGlobal)(API_NAME, provider, _diag__WEBPACK_IMPORTED_MODULE_1__.DiagAPI.instance());\n }\n /**\n * Returns the global meter provider.\n */\n getMeterProvider() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)(API_NAME) || _metrics_NoopMeterProvider__WEBPACK_IMPORTED_MODULE_2__.NOOP_METER_PROVIDER;\n }\n /**\n * Returns a meter from the global meter provider.\n */\n getMeter(name, version, options) {\n return this.getMeterProvider().getMeter(name, version, options);\n }\n /** Remove the global meter provider */\n disable() {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_1__.DiagAPI.instance());\n }\n}\n//# sourceMappingURL=metrics.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL21ldHJpY3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ21FO0FBQ3FCO0FBQ3ZEO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzRUFBYyxxQkFBcUIsMENBQU87QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUVBQVMsY0FBYywyRUFBbUI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx3RUFBZ0IsV0FBVywwQ0FBTztBQUMxQztBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS9tZXRyaWNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgTk9PUF9NRVRFUl9QUk9WSURFUiB9IGZyb20gJy4uL21ldHJpY3MvTm9vcE1ldGVyUHJvdmlkZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsLCByZWdpc3Rlckdsb2JhbCwgdW5yZWdpc3Rlckdsb2JhbCwgfSBmcm9tICcuLi9pbnRlcm5hbC9nbG9iYWwtdXRpbHMnO1xuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4vZGlhZyc7XG5jb25zdCBBUElfTkFNRSA9ICdtZXRyaWNzJztcbi8qKlxuICogU2luZ2xldG9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgT3BlblRlbGVtZXRyeSBNZXRyaWNzIEFQSVxuICovXG5leHBvcnQgY2xhc3MgTWV0cmljc0FQSSB7XG4gICAgLyoqIEVtcHR5IHByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gY29uc3RydWN0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBUEkgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgTWV0cmljcyBBUEkgKi9cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IE1ldHJpY3NBUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBnbG9iYWwgbWV0ZXIgcHJvdmlkZXIuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRlciBwcm92aWRlciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQsIGVsc2UgZmFsc2UuXG4gICAgICovXG4gICAgc2V0R2xvYmFsTWV0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIHByb3ZpZGVyLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgbWV0ZXIgcHJvdmlkZXIuXG4gICAgICovXG4gICAgZ2V0TWV0ZXJQcm92aWRlcigpIHtcbiAgICAgICAgcmV0dXJuIGdldEdsb2JhbChBUElfTkFNRSkgfHwgTk9PUF9NRVRFUl9QUk9WSURFUjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG1ldGVyIGZyb20gdGhlIGdsb2JhbCBtZXRlciBwcm92aWRlci5cbiAgICAgKi9cbiAgICBnZXRNZXRlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGVyUHJvdmlkZXIoKS5nZXRNZXRlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqIFJlbW92ZSB0aGUgZ2xvYmFsIG1ldGVyIHByb3ZpZGVyICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdW5yZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgRGlhZ0FQSS5pbnN0YW5jZSgpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXRyaWNzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PropagationAPI: () => (/* binding */ PropagationAPI)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _propagation_NoopTextMapPropagator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../propagation/NoopTextMapPropagator */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js\");\n/* harmony import */ var _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../propagation/TextMapPropagator */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js\");\n/* harmony import */ var _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../baggage/context-helpers */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js\");\n/* harmony import */ var _baggage_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../baggage/utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\n\n\nconst API_NAME = 'propagation';\nconst NOOP_TEXT_MAP_PROPAGATOR = new _propagation_NoopTextMapPropagator__WEBPACK_IMPORTED_MODULE_0__.NoopTextMapPropagator();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Propagation API\n *\n * @since 1.0.0\n */\nclass PropagationAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() {\n this.createBaggage = _baggage_utils__WEBPACK_IMPORTED_MODULE_1__.createBaggage;\n this.getBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.getBaggage;\n this.getActiveBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.getActiveBaggage;\n this.setBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.setBaggage;\n this.deleteBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.deleteBaggage;\n }\n /** Get the singleton instance of the Propagator API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new PropagationAPI();\n }\n return this._instance;\n }\n /**\n * Set the current propagator.\n *\n * @returns true if the propagator was successfully registered, else false\n */\n setGlobalPropagator(propagator) {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.registerGlobal)(API_NAME, propagator, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n }\n /**\n * Inject context into a carrier to be propagated inter-process\n *\n * @param context Context carrying tracing data to inject\n * @param carrier carrier to inject context into\n * @param setter Function used to set values on the carrier\n */\n inject(context, carrier, setter = _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_5__.defaultTextMapSetter) {\n return this._getGlobalPropagator().inject(context, carrier, setter);\n }\n /**\n * Extract context from a carrier\n *\n * @param context Context which the newly created context will inherit from\n * @param carrier Carrier to extract context from\n * @param getter Function used to extract keys from a carrier\n */\n extract(context, carrier, getter = _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_5__.defaultTextMapGetter) {\n return this._getGlobalPropagator().extract(context, carrier, getter);\n }\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n fields() {\n return this._getGlobalPropagator().fields();\n }\n /** Remove the global propagator */\n disable() {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n }\n _getGlobalPropagator() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.getGlobal)(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;\n }\n}\n//# sourceMappingURL=propagation.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL3Byb3BhZ2F0aW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUN3RjtBQUNYO0FBQ2tCO0FBQ087QUFDckQ7QUFDaEI7QUFDakM7QUFDQSxxQ0FBcUMscUZBQXFCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSw2QkFBNkIseURBQWE7QUFDMUMsMEJBQTBCLGdFQUFVO0FBQ3BDLGdDQUFnQyxzRUFBZ0I7QUFDaEQsMEJBQTBCLGdFQUFVO0FBQ3BDLDZCQUE2QixtRUFBYTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzRUFBYyx1QkFBdUIsMENBQU87QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxnRkFBb0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdGQUFvQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsd0VBQWdCLFdBQVcsMENBQU87QUFDMUM7QUFDQTtBQUNBLGVBQWUsaUVBQVM7QUFDeEI7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9hcGkvcHJvcGFnYXRpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5pbXBvcnQgeyBOb29wVGV4dE1hcFByb3BhZ2F0b3IgfSBmcm9tICcuLi9wcm9wYWdhdGlvbi9Ob29wVGV4dE1hcFByb3BhZ2F0b3InO1xuaW1wb3J0IHsgZGVmYXVsdFRleHRNYXBHZXR0ZXIsIGRlZmF1bHRUZXh0TWFwU2V0dGVyLCB9IGZyb20gJy4uL3Byb3BhZ2F0aW9uL1RleHRNYXBQcm9wYWdhdG9yJztcbmltcG9ydCB7IGdldEJhZ2dhZ2UsIGdldEFjdGl2ZUJhZ2dhZ2UsIHNldEJhZ2dhZ2UsIGRlbGV0ZUJhZ2dhZ2UsIH0gZnJvbSAnLi4vYmFnZ2FnZS9jb250ZXh0LWhlbHBlcnMnO1xuaW1wb3J0IHsgY3JlYXRlQmFnZ2FnZSB9IGZyb20gJy4uL2JhZ2dhZ2UvdXRpbHMnO1xuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4vZGlhZyc7XG5jb25zdCBBUElfTkFNRSA9ICdwcm9wYWdhdGlvbic7XG5jb25zdCBOT09QX1RFWFRfTUFQX1BST1BBR0FUT1IgPSBuZXcgTm9vcFRleHRNYXBQcm9wYWdhdG9yKCk7XG4vKipcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIE9wZW5UZWxlbWV0cnkgUHJvcGFnYXRpb24gQVBJXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9wYWdhdGlvbkFQSSB7XG4gICAgLyoqIEVtcHR5IHByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gY29uc3RydWN0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBUEkgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVCYWdnYWdlID0gY3JlYXRlQmFnZ2FnZTtcbiAgICAgICAgdGhpcy5nZXRCYWdnYWdlID0gZ2V0QmFnZ2FnZTtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVCYWdnYWdlID0gZ2V0QWN0aXZlQmFnZ2FnZTtcbiAgICAgICAgdGhpcy5zZXRCYWdnYWdlID0gc2V0QmFnZ2FnZTtcbiAgICAgICAgdGhpcy5kZWxldGVCYWdnYWdlID0gZGVsZXRlQmFnZ2FnZTtcbiAgICB9XG4gICAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBQcm9wYWdhdG9yIEFQSSAqL1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgUHJvcGFnYXRpb25BUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBwcm9wYWdhdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGFnYXRvciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQsIGVsc2UgZmFsc2VcbiAgICAgKi9cbiAgICBzZXRHbG9iYWxQcm9wYWdhdG9yKHByb3BhZ2F0b3IpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCBwcm9wYWdhdG9yLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmplY3QgY29udGV4dCBpbnRvIGEgY2FycmllciB0byBiZSBwcm9wYWdhdGVkIGludGVyLXByb2Nlc3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgY2FycnlpbmcgdHJhY2luZyBkYXRhIHRvIGluamVjdFxuICAgICAqIEBwYXJhbSBjYXJyaWVyIGNhcnJpZXIgdG8gaW5qZWN0IGNvbnRleHQgaW50b1xuICAgICAqIEBwYXJhbSBzZXR0ZXIgRnVuY3Rpb24gdXNlZCB0byBzZXQgdmFsdWVzIG9uIHRoZSBjYXJyaWVyXG4gICAgICovXG4gICAgaW5qZWN0KGNvbnRleHQsIGNhcnJpZXIsIHNldHRlciA9IGRlZmF1bHRUZXh0TWFwU2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRHbG9iYWxQcm9wYWdhdG9yKCkuaW5qZWN0KGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgY29udGV4dCBmcm9tIGEgY2FycmllclxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGljaCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0IHdpbGwgaW5oZXJpdCBmcm9tXG4gICAgICogQHBhcmFtIGNhcnJpZXIgQ2FycmllciB0byBleHRyYWN0IGNvbnRleHQgZnJvbVxuICAgICAqIEBwYXJhbSBnZXR0ZXIgRnVuY3Rpb24gdXNlZCB0byBleHRyYWN0IGtleXMgZnJvbSBhIGNhcnJpZXJcbiAgICAgKi9cbiAgICBleHRyYWN0KGNvbnRleHQsIGNhcnJpZXIsIGdldHRlciA9IGRlZmF1bHRUZXh0TWFwR2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRHbG9iYWxQcm9wYWdhdG9yKCkuZXh0cmFjdChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBmaWVsZHMgd2hpY2ggbWF5IGJlIHVzZWQgYnkgdGhlIHByb3BhZ2F0b3IuXG4gICAgICovXG4gICAgZmllbGRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0R2xvYmFsUHJvcGFnYXRvcigpLmZpZWxkcygpO1xuICAgIH1cbiAgICAvKiogUmVtb3ZlIHRoZSBnbG9iYWwgcHJvcGFnYXRvciAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfVxuICAgIF9nZXRHbG9iYWxQcm9wYWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gZ2V0R2xvYmFsKEFQSV9OQU1FKSB8fCBOT09QX1RFWFRfTUFQX1BST1BBR0FUT1I7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvcGFnYXRpb24uanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js": +/*!****************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js ***! + \****************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TraceAPI: () => (/* binding */ TraceAPI)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../trace/ProxyTracerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\");\n/* harmony import */ var _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../trace/spancontext-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\");\n/* harmony import */ var _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../trace/context-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\n\nconst API_NAME = 'trace';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n *\n * @since 1.0.0\n */\nclass TraceAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() {\n this._proxyTracerProvider = new _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyTracerProvider();\n this.wrapSpanContext = _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_1__.wrapSpanContext;\n this.isSpanContextValid = _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_1__.isSpanContextValid;\n this.deleteSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.deleteSpan;\n this.getSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getSpan;\n this.getActiveSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getActiveSpan;\n this.getSpanContext = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getSpanContext;\n this.setSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.setSpan;\n this.setSpanContext = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.setSpanContext;\n }\n /** Get the singleton instance of the Trace API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n return this._instance;\n }\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n setGlobalTracerProvider(provider) {\n const success = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.registerGlobal)(API_NAME, this._proxyTracerProvider, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n }\n /**\n * Returns the global tracer provider.\n */\n getTracerProvider() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.getGlobal)(API_NAME) || this._proxyTracerProvider;\n }\n /**\n * Returns a tracer from the global tracer provider.\n */\n getTracer(name, version) {\n return this.getTracerProvider().getTracer(name, version);\n }\n /** Remove the global tracer provider */\n disable() {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n this._proxyTracerProvider = new _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyTracerProvider();\n }\n}\n//# sourceMappingURL=trace.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL3RyYWNlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dGO0FBQ3JCO0FBQ2U7QUFDb0M7QUFDckY7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esd0NBQXdDLDJFQUFtQjtBQUMzRCwrQkFBK0IscUVBQWU7QUFDOUMsa0NBQWtDLHdFQUFrQjtBQUNwRCwwQkFBMEIsNERBQVU7QUFDcEMsdUJBQXVCLHlEQUFPO0FBQzlCLDZCQUE2QiwrREFBYTtBQUMxQyw4QkFBOEIsZ0VBQWM7QUFDNUMsdUJBQXVCLHlEQUFPO0FBQzlCLDhCQUE4QixnRUFBYztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHNFQUFjLHNDQUFzQywwQ0FBTztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlFQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsd0VBQWdCLFdBQVcsMENBQU87QUFDMUMsd0NBQXdDLDJFQUFtQjtBQUMzRDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS90cmFjZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGdldEdsb2JhbCwgcmVnaXN0ZXJHbG9iYWwsIHVucmVnaXN0ZXJHbG9iYWwsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbmltcG9ydCB7IFByb3h5VHJhY2VyUHJvdmlkZXIgfSBmcm9tICcuLi90cmFjZS9Qcm94eVRyYWNlclByb3ZpZGVyJztcbmltcG9ydCB7IGlzU3BhbkNvbnRleHRWYWxpZCwgd3JhcFNwYW5Db250ZXh0LCB9IGZyb20gJy4uL3RyYWNlL3NwYW5jb250ZXh0LXV0aWxzJztcbmltcG9ydCB7IGRlbGV0ZVNwYW4sIGdldEFjdGl2ZVNwYW4sIGdldFNwYW4sIGdldFNwYW5Db250ZXh0LCBzZXRTcGFuLCBzZXRTcGFuQ29udGV4dCwgfSBmcm9tICcuLi90cmFjZS9jb250ZXh0LXV0aWxzJztcbmltcG9ydCB7IERpYWdBUEkgfSBmcm9tICcuL2RpYWcnO1xuY29uc3QgQVBJX05BTUUgPSAndHJhY2UnO1xuLyoqXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGVudHJ5IHBvaW50IHRvIHRoZSBPcGVuVGVsZW1ldHJ5IFRyYWNpbmcgQVBJXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFjZUFQSSB7XG4gICAgLyoqIEVtcHR5IHByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gY29uc3RydWN0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBUEkgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlciA9IG5ldyBQcm94eVRyYWNlclByb3ZpZGVyKCk7XG4gICAgICAgIHRoaXMud3JhcFNwYW5Db250ZXh0ID0gd3JhcFNwYW5Db250ZXh0O1xuICAgICAgICB0aGlzLmlzU3BhbkNvbnRleHRWYWxpZCA9IGlzU3BhbkNvbnRleHRWYWxpZDtcbiAgICAgICAgdGhpcy5kZWxldGVTcGFuID0gZGVsZXRlU3BhbjtcbiAgICAgICAgdGhpcy5nZXRTcGFuID0gZ2V0U3BhbjtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVTcGFuID0gZ2V0QWN0aXZlU3BhbjtcbiAgICAgICAgdGhpcy5nZXRTcGFuQ29udGV4dCA9IGdldFNwYW5Db250ZXh0O1xuICAgICAgICB0aGlzLnNldFNwYW4gPSBzZXRTcGFuO1xuICAgICAgICB0aGlzLnNldFNwYW5Db250ZXh0ID0gc2V0U3BhbkNvbnRleHQ7XG4gICAgfVxuICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgVHJhY2UgQVBJICovXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBUcmFjZUFQSSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjdXJyZW50IGdsb2JhbCB0cmFjZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0cmFjZXIgcHJvdmlkZXIgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLCBlbHNlIGZhbHNlXG4gICAgICovXG4gICAgc2V0R2xvYmFsVHJhY2VyUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCB0aGlzLl9wcm94eVRyYWNlclByb3ZpZGVyLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlci5zZXREZWxlZ2F0ZShwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB0cmFjZXIgcHJvdmlkZXIuXG4gICAgICovXG4gICAgZ2V0VHJhY2VyUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiBnZXRHbG9iYWwoQVBJX05BTUUpIHx8IHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB0cmFjZXIgZnJvbSB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlci5cbiAgICAgKi9cbiAgICBnZXRUcmFjZXIobmFtZSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFjZXJQcm92aWRlcigpLmdldFRyYWNlcihuYW1lLCB2ZXJzaW9uKTtcbiAgICB9XG4gICAgLyoqIFJlbW92ZSB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlciAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgICAgIHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXIgPSBuZXcgUHJveHlUcmFjZXJQcm92aWRlcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNlLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deleteBaggage: () => (/* binding */ deleteBaggage),\n/* harmony export */ getActiveBaggage: () => (/* binding */ getActiveBaggage),\n/* harmony export */ getBaggage: () => (/* binding */ getBaggage),\n/* harmony export */ setBaggage: () => (/* binding */ setBaggage)\n/* harmony export */ });\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/* harmony import */ var _context_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../context/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n/**\n * Baggage key\n */\nconst BAGGAGE_KEY = (0,_context_context__WEBPACK_IMPORTED_MODULE_0__.createContextKey)('OpenTelemetry Baggage Key');\n/**\n * Retrieve the current baggage from the given context\n *\n * @param {Context} Context that manage all context values\n * @returns {Baggage} Extracted baggage from the context\n */\nfunction getBaggage(context) {\n return context.getValue(BAGGAGE_KEY) || undefined;\n}\n/**\n * Retrieve the current baggage from the active/current context\n *\n * @returns {Baggage} Extracted baggage from the context\n */\nfunction getActiveBaggage() {\n return getBaggage(_api_context__WEBPACK_IMPORTED_MODULE_1__.ContextAPI.getInstance().active());\n}\n/**\n * Store a baggage in the given context\n *\n * @param {Context} Context that manage all context values\n * @param {Baggage} baggage that will be set in the actual context\n */\nfunction setBaggage(context, baggage) {\n return context.setValue(BAGGAGE_KEY, baggage);\n}\n/**\n * Delete the baggage stored in the given context\n *\n * @param {Context} Context that manage all context values\n */\nfunction deleteBaggage(context) {\n return context.deleteValue(BAGGAGE_KEY);\n}\n//# sourceMappingURL=context-helpers.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9jb250ZXh0LWhlbHBlcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDNEM7QUFDVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0VBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDTztBQUNQLHNCQUFzQixvREFBVTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDTztBQUNQO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9jb250ZXh0LWhlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dEtleSB9IGZyb20gJy4uL2NvbnRleHQvY29udGV4dCc7XG4vKipcbiAqIEJhZ2dhZ2Uga2V5XG4gKi9cbmNvbnN0IEJBR0dBR0VfS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBCYWdnYWdlIEtleScpO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBiYWdnYWdlIGZyb20gdGhlIGdpdmVuIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0ge0NvbnRleHR9IENvbnRleHQgdGhhdCBtYW5hZ2UgYWxsIGNvbnRleHQgdmFsdWVzXG4gKiBAcmV0dXJucyB7QmFnZ2FnZX0gRXh0cmFjdGVkIGJhZ2dhZ2UgZnJvbSB0aGUgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFnZ2FnZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFsdWUoQkFHR0FHRV9LRVkpIHx8IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogUmV0cmlldmUgdGhlIGN1cnJlbnQgYmFnZ2FnZSBmcm9tIHRoZSBhY3RpdmUvY3VycmVudCBjb250ZXh0XG4gKlxuICogQHJldHVybnMge0JhZ2dhZ2V9IEV4dHJhY3RlZCBiYWdnYWdlIGZyb20gdGhlIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZUJhZ2dhZ2UoKSB7XG4gICAgcmV0dXJuIGdldEJhZ2dhZ2UoQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpLmFjdGl2ZSgpKTtcbn1cbi8qKlxuICogU3RvcmUgYSBiYWdnYWdlIGluIHRoZSBnaXZlbiBjb250ZXh0XG4gKlxuICogQHBhcmFtIHtDb250ZXh0fSBDb250ZXh0IHRoYXQgbWFuYWdlIGFsbCBjb250ZXh0IHZhbHVlc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlIHRoYXQgd2lsbCBiZSBzZXQgaW4gdGhlIGFjdHVhbCBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRCYWdnYWdlKGNvbnRleHQsIGJhZ2dhZ2UpIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShCQUdHQUdFX0tFWSwgYmFnZ2FnZSk7XG59XG4vKipcbiAqIERlbGV0ZSB0aGUgYmFnZ2FnZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0ge0NvbnRleHR9IENvbnRleHQgdGhhdCBtYW5hZ2UgYWxsIGNvbnRleHQgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVCYWdnYWdlKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5kZWxldGVWYWx1ZShCQUdHQUdFX0tFWSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LWhlbHBlcnMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js": +/*!************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js ***! + \************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaggageImpl: () => (/* binding */ BaggageImpl)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nclass BaggageImpl {\n constructor(entries) {\n this._entries = entries ? new Map(entries) : new Map();\n }\n getEntry(key) {\n const entry = this._entries.get(key);\n if (!entry) {\n return undefined;\n }\n return Object.assign({}, entry);\n }\n getAllEntries() {\n return Array.from(this._entries.entries());\n }\n setEntry(key, entry) {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.set(key, entry);\n return newBaggage;\n }\n removeEntry(key) {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.delete(key);\n return newBaggage;\n }\n removeEntries(...keys) {\n const newBaggage = new BaggageImpl(this._entries);\n for (const key of keys) {\n newBaggage._entries.delete(key);\n }\n return newBaggage;\n }\n clear() {\n return new BaggageImpl();\n }\n}\n//# sourceMappingURL=baggage-impl.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9pbnRlcm5hbC9iYWdnYWdlLWltcGwuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2JhZ2dhZ2UvaW50ZXJuYWwvYmFnZ2FnZS1pbXBsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IGNsYXNzIEJhZ2dhZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlbnRyaWVzKSB7XG4gICAgICAgIHRoaXMuX2VudHJpZXMgPSBlbnRyaWVzID8gbmV3IE1hcChlbnRyaWVzKSA6IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0RW50cnkoa2V5KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZW50cmllcy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZW50cnkpO1xuICAgIH1cbiAgICBnZXRBbGxFbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9lbnRyaWVzLmVudHJpZXMoKSk7XG4gICAgfVxuICAgIHNldEVudHJ5KGtleSwgZW50cnkpIHtcbiAgICAgICAgY29uc3QgbmV3QmFnZ2FnZSA9IG5ldyBCYWdnYWdlSW1wbCh0aGlzLl9lbnRyaWVzKTtcbiAgICAgICAgbmV3QmFnZ2FnZS5fZW50cmllcy5zZXQoa2V5LCBlbnRyeSk7XG4gICAgICAgIHJldHVybiBuZXdCYWdnYWdlO1xuICAgIH1cbiAgICByZW1vdmVFbnRyeShrZXkpIHtcbiAgICAgICAgY29uc3QgbmV3QmFnZ2FnZSA9IG5ldyBCYWdnYWdlSW1wbCh0aGlzLl9lbnRyaWVzKTtcbiAgICAgICAgbmV3QmFnZ2FnZS5fZW50cmllcy5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIG5ld0JhZ2dhZ2U7XG4gICAgfVxuICAgIHJlbW92ZUVudHJpZXMoLi4ua2V5cykge1xuICAgICAgICBjb25zdCBuZXdCYWdnYWdlID0gbmV3IEJhZ2dhZ2VJbXBsKHRoaXMuX2VudHJpZXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBuZXdCYWdnYWdlLl9lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdCYWdnYWdlO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYWdnYWdlSW1wbCgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhZ2dhZ2UtaW1wbC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ baggageEntryMetadataSymbol: () => (/* binding */ baggageEntryMetadataSymbol)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * Symbol used to make BaggageEntryMetadata an opaque type\n */\nconst baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');\n//# sourceMappingURL=symbol.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9pbnRlcm5hbC9zeW1ib2wuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9pbnRlcm5hbC9zeW1ib2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIFN5bWJvbCB1c2VkIHRvIG1ha2UgQmFnZ2FnZUVudHJ5TWV0YWRhdGEgYW4gb3BhcXVlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGJhZ2dhZ2VFbnRyeU1ldGFkYXRhU3ltYm9sID0gU3ltYm9sKCdCYWdnYWdlRW50cnlNZXRhZGF0YScpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ltYm9sLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js": +/*!********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js ***! + \********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ baggageEntryMetadataFromString: () => (/* binding */ baggageEntryMetadataFromString),\n/* harmony export */ createBaggage: () => (/* binding */ createBaggage)\n/* harmony export */ });\n/* harmony import */ var _api_diag__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api/diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/* harmony import */ var _internal_baggage_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/baggage-impl */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js\");\n/* harmony import */ var _internal_symbol__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/symbol */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst diag = _api_diag__WEBPACK_IMPORTED_MODULE_0__.DiagAPI.instance();\n/**\n * Create a new Baggage with optional entries\n *\n * @param entries An array of baggage entries the new baggage should contain\n */\nfunction createBaggage(entries = {}) {\n return new _internal_baggage_impl__WEBPACK_IMPORTED_MODULE_1__.BaggageImpl(new Map(Object.entries(entries)));\n}\n/**\n * Create a serializable BaggageEntryMetadata object from a string.\n *\n * @param str string metadata. Format is currently not defined by the spec and has no special meaning.\n *\n * @since 1.0.0\n */\nfunction baggageEntryMetadataFromString(str) {\n if (typeof str !== 'string') {\n diag.error(`Cannot create baggage metadata from unknown type: ${typeof str}`);\n str = '';\n }\n return {\n __TYPE__: _internal_symbol__WEBPACK_IMPORTED_MODULE_2__.baggageEntryMetadataSymbol,\n toString() {\n return str;\n },\n };\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3NDO0FBQ2dCO0FBQ1M7QUFDL0QsYUFBYSw4Q0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sbUNBQW1DO0FBQzFDLGVBQWUsK0RBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3RUFBd0UsV0FBVztBQUNuRjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isd0VBQTBCO0FBQzVDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9iYWdnYWdlL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4uL2FwaS9kaWFnJztcbmltcG9ydCB7IEJhZ2dhZ2VJbXBsIH0gZnJvbSAnLi9pbnRlcm5hbC9iYWdnYWdlLWltcGwnO1xuaW1wb3J0IHsgYmFnZ2FnZUVudHJ5TWV0YWRhdGFTeW1ib2wgfSBmcm9tICcuL2ludGVybmFsL3N5bWJvbCc7XG5jb25zdCBkaWFnID0gRGlhZ0FQSS5pbnN0YW5jZSgpO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgQmFnZ2FnZSB3aXRoIG9wdGlvbmFsIGVudHJpZXNcbiAqXG4gKiBAcGFyYW0gZW50cmllcyBBbiBhcnJheSBvZiBiYWdnYWdlIGVudHJpZXMgdGhlIG5ldyBiYWdnYWdlIHNob3VsZCBjb250YWluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYWdnYWdlKGVudHJpZXMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQmFnZ2FnZUltcGwobmV3IE1hcChPYmplY3QuZW50cmllcyhlbnRyaWVzKSkpO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBzZXJpYWxpemFibGUgQmFnZ2FnZUVudHJ5TWV0YWRhdGEgb2JqZWN0IGZyb20gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHN0ciBzdHJpbmcgbWV0YWRhdGEuIEZvcm1hdCBpcyBjdXJyZW50bHkgbm90IGRlZmluZWQgYnkgdGhlIHNwZWMgYW5kIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcuXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWdnYWdlRW50cnlNZXRhZGF0YUZyb21TdHJpbmcoc3RyKSB7XG4gICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpYWcuZXJyb3IoYENhbm5vdCBjcmVhdGUgYmFnZ2FnZSBtZXRhZGF0YSBmcm9tIHVua25vd24gdHlwZTogJHt0eXBlb2Ygc3RyfWApO1xuICAgICAgICBzdHIgPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgX19UWVBFX186IGJhZ2dhZ2VFbnRyeU1ldGFkYXRhU3ltYm9sLFxuICAgICAgICB0b1N0cmluZygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ context: () => (/* binding */ context)\n/* harmony export */ });\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for context API\n * @since 1.0.0\n */\nconst context = _api_context__WEBPACK_IMPORTED_MODULE_0__.ContextAPI.getInstance();\n//# sourceMappingURL=context-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vY29udGV4dC1hcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDTyxnQkFBZ0Isb0RBQVU7QUFDakMiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2NvbnRleHQtYXBpLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLy8gU3BsaXQgbW9kdWxlLWxldmVsIHZhcmlhYmxlIGRlZmluaXRpb24gaW50byBzZXBhcmF0ZSBmaWxlcyB0byBhbGxvd1xuLy8gdHJlZS1zaGFraW5nIG9uIGVhY2ggYXBpIGluc3RhbmNlLlxuaW1wb3J0IHsgQ29udGV4dEFQSSB9IGZyb20gJy4vYXBpL2NvbnRleHQnO1xuLyoqXG4gKiBFbnRyeXBvaW50IGZvciBjb250ZXh0IEFQSVxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjb25zdCBjb250ZXh0ID0gQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC1hcGkuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js": +/*!*********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js ***! + \*********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopContextManager: () => (/* binding */ NoopContextManager)\n/* harmony export */ });\n/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nclass NoopContextManager {\n active() {\n return _context__WEBPACK_IMPORTED_MODULE_0__.ROOT_CONTEXT;\n }\n with(_context, fn, thisArg, ...args) {\n return fn.call(thisArg, ...args);\n }\n bind(_context, target) {\n return target;\n }\n enable() {\n return this;\n }\n disable() {\n return this;\n }\n}\n//# sourceMappingURL=NoopContextManager.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vY29udGV4dC9Ob29wQ29udGV4dE1hbmFnZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUN5QztBQUNsQztBQUNQO0FBQ0EsZUFBZSxrREFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2NvbnRleHQvTm9vcENvbnRleHRNYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9jb250ZXh0JztcbmV4cG9ydCBjbGFzcyBOb29wQ29udGV4dE1hbmFnZXIge1xuICAgIGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIFJPT1RfQ09OVEVYVDtcbiAgICB9XG4gICAgd2l0aChfY29udGV4dCwgZm4sIHRoaXNBcmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpc0FyZywgLi4uYXJncyk7XG4gICAgfVxuICAgIGJpbmQoX2NvbnRleHQsIHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob29wQ29udGV4dE1hbmFnZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ROOT_CONTEXT: () => (/* binding */ ROOT_CONTEXT),\n/* harmony export */ createContextKey: () => (/* binding */ createContextKey)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * Get a key to uniquely identify a context value\n *\n * @since 1.0.0\n */\nfunction createContextKey(description) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\nclass BaseContext {\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n constructor(parentContext) {\n // for minification\n const self = this;\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n self.getValue = (key) => self._currentContext.get(key);\n self.setValue = (key, value) => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n self.deleteValue = (key) => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n}\n/**\n * The root context is used as the default parent context when there is no active context\n *\n * @since 1.0.0\n */\nconst ROOT_CONTEXT = new BaseContext();\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vY29udGV4dC9jb250ZXh0LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9jb250ZXh0L2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEdldCBhIGtleSB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNvbnRleHQgdmFsdWVcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRLZXkoZGVzY3JpcHRpb24pIHtcbiAgICAvLyBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBmb3IgdGhlIHNhbWUgaW5wdXQsIG11bHRpcGxlIGNhbGxzIHNob3VsZFxuICAgIC8vIHJldHVybiBkaWZmZXJlbnQga2V5cy4gRHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlIEpTIGRlcGVuZGVuY3kgbWFuYWdlbWVudFxuICAgIC8vIHN5c3RlbSwgdGhpcyBjcmVhdGVzIHByb2JsZW1zIHdoZXJlIG11bHRpcGxlIHZlcnNpb25zIG9mIHNvbWUgcGFja2FnZVxuICAgIC8vIGNvdWxkIGhvbGQgZGlmZmVyZW50IGtleXMgZm9yIHRoZSBzYW1lIHByb3BlcnR5LlxuICAgIC8vXG4gICAgLy8gVGhlcmVmb3JlLCB3ZSB1c2UgU3ltYm9sLmZvciB3aGljaCByZXR1cm5zIHRoZSBzYW1lIGtleSBmb3IgdGhlIHNhbWUgaW5wdXQuXG4gICAgcmV0dXJuIFN5bWJvbC5mb3IoZGVzY3JpcHRpb24pO1xufVxuY2xhc3MgQmFzZUNvbnRleHQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyBjb250ZXh0IHdoaWNoIGluaGVyaXRzIHZhbHVlcyBmcm9tIGFuIG9wdGlvbmFsIHBhcmVudCBjb250ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmVudENvbnRleHQgYSBjb250ZXh0IGZyb20gd2hpY2ggdG8gaW5oZXJpdCB2YWx1ZXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIC8vIGZvciBtaW5pZmljYXRpb25cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuX2N1cnJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dCA/IG5ldyBNYXAocGFyZW50Q29udGV4dCkgOiBuZXcgTWFwKCk7XG4gICAgICAgIHNlbGYuZ2V0VmFsdWUgPSAoa2V5KSA9PiBzZWxmLl9jdXJyZW50Q29udGV4dC5nZXQoa2V5KTtcbiAgICAgICAgc2VsZi5zZXRWYWx1ZSA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEJhc2VDb250ZXh0KHNlbGYuX2N1cnJlbnRDb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRDb250ZXh0LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9O1xuICAgICAgICBzZWxmLmRlbGV0ZVZhbHVlID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBCYXNlQ29udGV4dChzZWxmLl9jdXJyZW50Q29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50Q29udGV4dC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogVGhlIHJvb3QgY29udGV4dCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhcmVudCBjb250ZXh0IHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbnRleHRcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IFJPT1RfQ09OVEVYVCA9IG5ldyBCYXNlQ29udGV4dCgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js": +/*!***************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js ***! + \***************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ diag: () => (/* binding */ diag)\n/* harmony export */ });\n/* harmony import */ var _api_diag__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for Diag API.\n * Defines Diagnostic handler used for internal diagnostic logging operations.\n * The default provides a Noop DiagLogger implementation which may be changed via the\n * diag.setLogger(logger: DiagLogger) function.\n *\n * @since 1.0.0\n */\nconst diag = _api_diag__WEBPACK_IMPORTED_MODULE_0__.DiagAPI.instance();\n//# sourceMappingURL=diag-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy1hcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGFBQWEsOENBQU87QUFDM0IiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2RpYWctYXBpLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLy8gU3BsaXQgbW9kdWxlLWxldmVsIHZhcmlhYmxlIGRlZmluaXRpb24gaW50byBzZXBhcmF0ZSBmaWxlcyB0byBhbGxvd1xuLy8gdHJlZS1zaGFraW5nIG9uIGVhY2ggYXBpIGluc3RhbmNlLlxuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4vYXBpL2RpYWcnO1xuLyoqXG4gKiBFbnRyeXBvaW50IGZvciBEaWFnIEFQSS5cbiAqIERlZmluZXMgRGlhZ25vc3RpYyBoYW5kbGVyIHVzZWQgZm9yIGludGVybmFsIGRpYWdub3N0aWMgbG9nZ2luZyBvcGVyYXRpb25zLlxuICogVGhlIGRlZmF1bHQgcHJvdmlkZXMgYSBOb29wIERpYWdMb2dnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggbWF5IGJlIGNoYW5nZWQgdmlhIHRoZVxuICogZGlhZy5zZXRMb2dnZXIobG9nZ2VyOiBEaWFnTG9nZ2VyKSBmdW5jdGlvbi5cbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IGRpYWcgPSBEaWFnQVBJLmluc3RhbmNlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnLWFwaS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagComponentLogger: () => (/* binding */ DiagComponentLogger)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });\n * cLogger.debug('test');\n * // @opentelemetry/instrumentation-http test\n */\nclass DiagComponentLogger {\n constructor(props) {\n this._namespace = props.namespace || 'DiagComponentLogger';\n }\n debug(...args) {\n return logProxy('debug', this._namespace, args);\n }\n error(...args) {\n return logProxy('error', this._namespace, args);\n }\n info(...args) {\n return logProxy('info', this._namespace, args);\n }\n warn(...args) {\n return logProxy('warn', this._namespace, args);\n }\n verbose(...args) {\n return logProxy('verbose', this._namespace, args);\n }\n}\nfunction logProxy(funcName, namespace, args) {\n const logger = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)('diag');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n return logger[funcName](namespace, ...args);\n}\n//# sourceMappingURL=ComponentLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9Db21wb25lbnRMb2dnZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGtEQUFrRDtBQUNsRztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUVBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2RpYWcvQ29tcG9uZW50TG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZ2V0R2xvYmFsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbi8qKlxuICogQ29tcG9uZW50IExvZ2dlciB3aGljaCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIHBhcnQgb2YgYW55IGNvbXBvbmVudCB3aGljaFxuICogd2lsbCBhZGQgYXV0b21hdGljYWxseSBhZGRpdGlvbmFsIG5hbWVzcGFjZSBpbiBmcm9udCBvZiB0aGUgbG9nIG1lc3NhZ2UuXG4gKiBJdCB3aWxsIHRoZW4gZm9yd2FyZCBhbGwgbWVzc2FnZSB0byBnbG9iYWwgZGlhZyBsb2dnZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjTG9nZ2VyID0gZGlhZy5jcmVhdGVDb21wb25lbnRMb2dnZXIoeyBuYW1lc3BhY2U6ICdAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cCcgfSk7XG4gKiBjTG9nZ2VyLmRlYnVnKCd0ZXN0Jyk7XG4gKiAvLyBAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cCB0ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBEaWFnQ29tcG9uZW50TG9nZ2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLl9uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2UgfHwgJ0RpYWdDb21wb25lbnRMb2dnZXInO1xuICAgIH1cbiAgICBkZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBsb2dQcm94eSgnZGVidWcnLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH1cbiAgICBlcnJvciguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBsb2dQcm94eSgnZXJyb3InLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH1cbiAgICBpbmZvKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGxvZ1Byb3h5KCdpbmZvJywgdGhpcy5fbmFtZXNwYWNlLCBhcmdzKTtcbiAgICB9XG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBsb2dQcm94eSgnd2FybicsIHRoaXMuX25hbWVzcGFjZSwgYXJncyk7XG4gICAgfVxuICAgIHZlcmJvc2UoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbG9nUHJveHkoJ3ZlcmJvc2UnLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvZ1Byb3h5KGZ1bmNOYW1lLCBuYW1lc3BhY2UsIGFyZ3MpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRHbG9iYWwoJ2RpYWcnKTtcbiAgICAvLyBzaG9ydGN1dCBpZiBsb2dnZXIgbm90IHNldFxuICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlcltmdW5jTmFtZV0obmFtZXNwYWNlLCAuLi5hcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbXBvbmVudExvZ2dlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js": +/*!*************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js ***! + \*************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagConsoleLogger: () => (/* binding */ DiagConsoleLogger),\n/* harmony export */ _originalConsoleMethods: () => (/* binding */ _originalConsoleMethods)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nconst consoleMap = [\n { n: 'error', c: 'error' },\n { n: 'warn', c: 'warn' },\n { n: 'info', c: 'info' },\n { n: 'debug', c: 'debug' },\n { n: 'verbose', c: 'trace' },\n];\n// Save original console methods at module load time, before any instrumentation\n// can wrap them. This ensures DiagConsoleLogger calls the unwrapped originals.\n// Exported for testing only — not part of the public API.\nconst _originalConsoleMethods = {};\nif (typeof console !== 'undefined') {\n const keys = [\n 'error',\n 'warn',\n 'info',\n 'debug',\n 'trace',\n 'log',\n ];\n for (const key of keys) {\n // eslint-disable-next-line no-console\n if (typeof console[key] === 'function') {\n // eslint-disable-next-line no-console\n _originalConsoleMethods[key] = console[key];\n }\n }\n}\n/**\n * A simple Immutable Console based diagnostic logger which will output any messages to the Console.\n * If you want to limit the amount of logging to a specific level or lower use the\n * {@link createLogLevelDiagLogger}\n *\n * @since 1.0.0\n */\nclass DiagConsoleLogger {\n constructor() {\n function _consoleFunc(funcName) {\n return function (...args) {\n // Prefer original (pre-instrumentation) methods saved at module load time.\n let theFunc = _originalConsoleMethods[funcName];\n // Some environments only expose the console when the F12 developer console is open\n if (typeof theFunc !== 'function') {\n theFunc = _originalConsoleMethods['log'];\n }\n // Fall back in case console was not available at module load time but became available later.\n if (typeof theFunc !== 'function' && console) {\n // eslint-disable-next-line no-console\n theFunc = console[funcName];\n if (typeof theFunc !== 'function') {\n // eslint-disable-next-line no-console\n theFunc = console.log;\n }\n }\n if (typeof theFunc === 'function') {\n return theFunc.apply(console, args);\n }\n };\n }\n for (let i = 0; i < consoleMap.length; i++) {\n this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);\n }\n }\n}\n//# sourceMappingURL=consoleLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9jb25zb2xlTG9nZ2VyLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sMEJBQTBCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9jb25zb2xlTG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuY29uc3QgY29uc29sZU1hcCA9IFtcbiAgICB7IG46ICdlcnJvcicsIGM6ICdlcnJvcicgfSxcbiAgICB7IG46ICd3YXJuJywgYzogJ3dhcm4nIH0sXG4gICAgeyBuOiAnaW5mbycsIGM6ICdpbmZvJyB9LFxuICAgIHsgbjogJ2RlYnVnJywgYzogJ2RlYnVnJyB9LFxuICAgIHsgbjogJ3ZlcmJvc2UnLCBjOiAndHJhY2UnIH0sXG5dO1xuLy8gU2F2ZSBvcmlnaW5hbCBjb25zb2xlIG1ldGhvZHMgYXQgbW9kdWxlIGxvYWQgdGltZSwgYmVmb3JlIGFueSBpbnN0cnVtZW50YXRpb25cbi8vIGNhbiB3cmFwIHRoZW0uIFRoaXMgZW5zdXJlcyBEaWFnQ29uc29sZUxvZ2dlciBjYWxscyB0aGUgdW53cmFwcGVkIG9yaWdpbmFscy5cbi8vIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkg4oCUIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuZXhwb3J0IGNvbnN0IF9vcmlnaW5hbENvbnNvbGVNZXRob2RzID0ge307XG5pZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgJ3dhcm4nLFxuICAgICAgICAnaW5mbycsXG4gICAgICAgICdkZWJ1ZycsXG4gICAgICAgICd0cmFjZScsXG4gICAgICAgICdsb2cnLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGVba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIF9vcmlnaW5hbENvbnNvbGVNZXRob2RzW2tleV0gPSBjb25zb2xlW2tleV07XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgc2ltcGxlIEltbXV0YWJsZSBDb25zb2xlIGJhc2VkIGRpYWdub3N0aWMgbG9nZ2VyIHdoaWNoIHdpbGwgb3V0cHV0IGFueSBtZXNzYWdlcyB0byB0aGUgQ29uc29sZS5cbiAqIElmIHlvdSB3YW50IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgbG9nZ2luZyB0byBhIHNwZWNpZmljIGxldmVsIG9yIGxvd2VyIHVzZSB0aGVcbiAqIHtAbGluayBjcmVhdGVMb2dMZXZlbERpYWdMb2dnZXJ9XG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWFnQ29uc29sZUxvZ2dlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGZ1bmN0aW9uIF9jb25zb2xlRnVuYyhmdW5jTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJlZmVyIG9yaWdpbmFsIChwcmUtaW5zdHJ1bWVudGF0aW9uKSBtZXRob2RzIHNhdmVkIGF0IG1vZHVsZSBsb2FkIHRpbWUuXG4gICAgICAgICAgICAgICAgbGV0IHRoZUZ1bmMgPSBfb3JpZ2luYWxDb25zb2xlTWV0aG9kc1tmdW5jTmFtZV07XG4gICAgICAgICAgICAgICAgLy8gU29tZSBlbnZpcm9ubWVudHMgb25seSBleHBvc2UgdGhlIGNvbnNvbGUgd2hlbiB0aGUgRjEyIGRldmVsb3BlciBjb25zb2xlIGlzIG9wZW5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoZUZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhlRnVuYyA9IF9vcmlnaW5hbENvbnNvbGVNZXRob2RzWydsb2cnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIGluIGNhc2UgY29uc29sZSB3YXMgbm90IGF2YWlsYWJsZSBhdCBtb2R1bGUgbG9hZCB0aW1lIGJ1dCBiZWNhbWUgYXZhaWxhYmxlIGxhdGVyLlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlRnVuYyAhPT0gJ2Z1bmN0aW9uJyAmJiBjb25zb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIHRoZUZ1bmMgPSBjb25zb2xlW2Z1bmNOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGVGdW5jICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhlRnVuYyA9IGNvbnNvbGUubG9nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlRnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlRnVuYy5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uc29sZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1tjb25zb2xlTWFwW2ldLm5dID0gX2NvbnNvbGVGdW5jKGNvbnNvbGVNYXBbaV0uYyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zb2xlTG9nZ2VyLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js": +/*!***********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js ***! + \***********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createLogLevelDiagLogger: () => (/* binding */ createLogLevelDiagLogger)\n/* harmony export */ });\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nfunction createLogLevelDiagLogger(maxLevel, logger) {\n if (maxLevel < _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.NONE) {\n maxLevel = _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.NONE;\n }\n else if (maxLevel > _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.ALL) {\n maxLevel = _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.ALL;\n }\n // In case the logger is null or undefined\n logger = logger || {};\n function _filterFunc(funcName, theLevel) {\n const theFunc = logger[funcName];\n if (typeof theFunc === 'function' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () { };\n }\n return {\n error: _filterFunc('error', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.ERROR),\n warn: _filterFunc('warn', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.WARN),\n info: _filterFunc('info', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.INFO),\n debug: _filterFunc('debug', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.DEBUG),\n verbose: _filterFunc('verbose', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.VERBOSE),\n };\n}\n//# sourceMappingURL=logLevelLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9pbnRlcm5hbC9sb2dMZXZlbExvZ2dlci5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dDO0FBQ2pDO0FBQ1AsbUJBQW1CLGdEQUFZO0FBQy9CLG1CQUFtQixnREFBWTtBQUMvQjtBQUNBLHdCQUF3QixnREFBWTtBQUNwQyxtQkFBbUIsZ0RBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxnREFBWTtBQUNoRCxrQ0FBa0MsZ0RBQVk7QUFDOUMsa0NBQWtDLGdEQUFZO0FBQzlDLG9DQUFvQyxnREFBWTtBQUNoRCx3Q0FBd0MsZ0RBQVk7QUFDcEQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9kaWFnL2ludGVybmFsL2xvZ0xldmVsTG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGlhZ0xvZ0xldmVsIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ0xldmVsRGlhZ0xvZ2dlcihtYXhMZXZlbCwgbG9nZ2VyKSB7XG4gICAgaWYgKG1heExldmVsIDwgRGlhZ0xvZ0xldmVsLk5PTkUpIHtcbiAgICAgICAgbWF4TGV2ZWwgPSBEaWFnTG9nTGV2ZWwuTk9ORTtcbiAgICB9XG4gICAgZWxzZSBpZiAobWF4TGV2ZWwgPiBEaWFnTG9nTGV2ZWwuQUxMKSB7XG4gICAgICAgIG1heExldmVsID0gRGlhZ0xvZ0xldmVsLkFMTDtcbiAgICB9XG4gICAgLy8gSW4gY2FzZSB0aGUgbG9nZ2VyIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgbG9nZ2VyID0gbG9nZ2VyIHx8IHt9O1xuICAgIGZ1bmN0aW9uIF9maWx0ZXJGdW5jKGZ1bmNOYW1lLCB0aGVMZXZlbCkge1xuICAgICAgICBjb25zdCB0aGVGdW5jID0gbG9nZ2VyW2Z1bmNOYW1lXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGVGdW5jID09PSAnZnVuY3Rpb24nICYmIG1heExldmVsID49IHRoZUxldmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlRnVuYy5iaW5kKGxvZ2dlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IF9maWx0ZXJGdW5jKCdlcnJvcicsIERpYWdMb2dMZXZlbC5FUlJPUiksXG4gICAgICAgIHdhcm46IF9maWx0ZXJGdW5jKCd3YXJuJywgRGlhZ0xvZ0xldmVsLldBUk4pLFxuICAgICAgICBpbmZvOiBfZmlsdGVyRnVuYygnaW5mbycsIERpYWdMb2dMZXZlbC5JTkZPKSxcbiAgICAgICAgZGVidWc6IF9maWx0ZXJGdW5jKCdkZWJ1ZycsIERpYWdMb2dMZXZlbC5ERUJVRyksXG4gICAgICAgIHZlcmJvc2U6IF9maWx0ZXJGdW5jKCd2ZXJib3NlJywgRGlhZ0xvZ0xldmVsLlZFUkJPU0UpLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dMZXZlbExvZ2dlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js": +/*!*****************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js ***! + \*****************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagLogLevel: () => (/* binding */ DiagLogLevel)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nvar DiagLogLevel;\n(function (DiagLogLevel) {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n DiagLogLevel[DiagLogLevel[\"NONE\"] = 0] = \"NONE\";\n /** Identifies an error scenario */\n DiagLogLevel[DiagLogLevel[\"ERROR\"] = 30] = \"ERROR\";\n /** Identifies a warning scenario */\n DiagLogLevel[DiagLogLevel[\"WARN\"] = 50] = \"WARN\";\n /** General informational log message */\n DiagLogLevel[DiagLogLevel[\"INFO\"] = 60] = \"INFO\";\n /** General debug log message */\n DiagLogLevel[DiagLogLevel[\"DEBUG\"] = 70] = \"DEBUG\";\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n DiagLogLevel[DiagLogLevel[\"VERBOSE\"] = 80] = \"VERBOSE\";\n /** Used to set the logging level to include all logging */\n DiagLogLevel[DiagLogLevel[\"ALL\"] = 9999] = \"ALL\";\n})(DiagLogLevel || (DiagLogLevel = {}));\n//# sourceMappingURL=types.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy90eXBlcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG9DQUFvQztBQUNyQyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy90eXBlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogRGVmaW5lcyB0aGUgYXZhaWxhYmxlIGludGVybmFsIGxvZ2dpbmcgbGV2ZWxzIGZvciB0aGUgZGlhZ25vc3RpYyBsb2dnZXIsIHRoZSBudW1lcmljIHZhbHVlc1xuICogb2YgdGhlIGxldmVscyBhcmUgZGVmaW5lZCB0byBtYXRjaCB0aGUgb3JpZ2luYWwgdmFsdWVzIGZyb20gdGhlIGluaXRpYWwgTG9nTGV2ZWwgdG8gYXZvaWRcbiAqIGNvbXBhdGliaWxpdHkvbWlncmF0aW9uIGlzc3VlcyBmb3IgYW55IGltcGxlbWVudGF0aW9uIHRoYXQgYXNzdW1lIHRoZSBudW1lcmljIG9yZGVyaW5nLlxuICovXG5leHBvcnQgdmFyIERpYWdMb2dMZXZlbDtcbihmdW5jdGlvbiAoRGlhZ0xvZ0xldmVsKSB7XG4gICAgLyoqIERpYWdub3N0aWMgTG9nZ2luZyBsZXZlbCBzZXR0aW5nIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgKGV4Y2VwdCBhbmQgZm9yY2VkIGxvZ3MpICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIC8qKiBJZGVudGlmaWVzIGFuIGVycm9yIHNjZW5hcmlvICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIkVSUk9SXCJdID0gMzBdID0gXCJFUlJPUlwiO1xuICAgIC8qKiBJZGVudGlmaWVzIGEgd2FybmluZyBzY2VuYXJpbyAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJXQVJOXCJdID0gNTBdID0gXCJXQVJOXCI7XG4gICAgLyoqIEdlbmVyYWwgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZSAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJJTkZPXCJdID0gNjBdID0gXCJJTkZPXCI7XG4gICAgLyoqIEdlbmVyYWwgZGVidWcgbG9nIG1lc3NhZ2UgKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiREVCVUdcIl0gPSA3MF0gPSBcIkRFQlVHXCI7XG4gICAgLyoqXG4gICAgICogRGV0YWlsZWQgdHJhY2UgbGV2ZWwgbG9nZ2luZyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCwgc2hvdWxkIG9ubHkgYmUgc2V0XG4gICAgICogaW4gYSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC5cbiAgICAgKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiVkVSQk9TRVwiXSA9IDgwXSA9IFwiVkVSQk9TRVwiO1xuICAgIC8qKiBVc2VkIHRvIHNldCB0aGUgbG9nZ2luZyBsZXZlbCB0byBpbmNsdWRlIGFsbCBsb2dnaW5nICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIkFMTFwiXSA9IDk5OTldID0gXCJBTExcIjtcbn0pKERpYWdMb2dMZXZlbCB8fCAoRGlhZ0xvZ0xldmVsID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js": +/*!************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js ***! + \************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagConsoleLogger: () => (/* reexport safe */ _diag_consoleLogger__WEBPACK_IMPORTED_MODULE_2__.DiagConsoleLogger),\n/* harmony export */ DiagLogLevel: () => (/* reexport safe */ _diag_types__WEBPACK_IMPORTED_MODULE_3__.DiagLogLevel),\n/* harmony export */ INVALID_SPANID: () => (/* reexport safe */ _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__.INVALID_SPANID),\n/* harmony export */ INVALID_SPAN_CONTEXT: () => (/* reexport safe */ _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__.INVALID_SPAN_CONTEXT),\n/* harmony export */ INVALID_TRACEID: () => (/* reexport safe */ _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__.INVALID_TRACEID),\n/* harmony export */ ProxyTracer: () => (/* reexport safe */ _trace_ProxyTracer__WEBPACK_IMPORTED_MODULE_7__.ProxyTracer),\n/* harmony export */ ProxyTracerProvider: () => (/* reexport safe */ _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_8__.ProxyTracerProvider),\n/* harmony export */ ROOT_CONTEXT: () => (/* reexport safe */ _context_context__WEBPACK_IMPORTED_MODULE_1__.ROOT_CONTEXT),\n/* harmony export */ SamplingDecision: () => (/* reexport safe */ _trace_SamplingResult__WEBPACK_IMPORTED_MODULE_9__.SamplingDecision),\n/* harmony export */ SpanKind: () => (/* reexport safe */ _trace_span_kind__WEBPACK_IMPORTED_MODULE_10__.SpanKind),\n/* harmony export */ SpanStatusCode: () => (/* reexport safe */ _trace_status__WEBPACK_IMPORTED_MODULE_11__.SpanStatusCode),\n/* harmony export */ TraceFlags: () => (/* reexport safe */ _trace_trace_flags__WEBPACK_IMPORTED_MODULE_12__.TraceFlags),\n/* harmony export */ ValueType: () => (/* reexport safe */ _metrics_Metric__WEBPACK_IMPORTED_MODULE_5__.ValueType),\n/* harmony export */ baggageEntryMetadataFromString: () => (/* reexport safe */ _baggage_utils__WEBPACK_IMPORTED_MODULE_0__.baggageEntryMetadataFromString),\n/* harmony export */ context: () => (/* reexport safe */ _context_api__WEBPACK_IMPORTED_MODULE_16__.context),\n/* harmony export */ createContextKey: () => (/* reexport safe */ _context_context__WEBPACK_IMPORTED_MODULE_1__.createContextKey),\n/* harmony export */ createNoopMeter: () => (/* reexport safe */ _metrics_NoopMeter__WEBPACK_IMPORTED_MODULE_4__.createNoopMeter),\n/* harmony export */ createTraceState: () => (/* reexport safe */ _trace_internal_utils__WEBPACK_IMPORTED_MODULE_13__.createTraceState),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ defaultTextMapGetter: () => (/* reexport safe */ _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_6__.defaultTextMapGetter),\n/* harmony export */ defaultTextMapSetter: () => (/* reexport safe */ _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_6__.defaultTextMapSetter),\n/* harmony export */ diag: () => (/* reexport safe */ _diag_api__WEBPACK_IMPORTED_MODULE_17__.diag),\n/* harmony export */ isSpanContextValid: () => (/* reexport safe */ _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__.isSpanContextValid),\n/* harmony export */ isValidSpanId: () => (/* reexport safe */ _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__.isValidSpanId),\n/* harmony export */ isValidTraceId: () => (/* reexport safe */ _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__.isValidTraceId),\n/* harmony export */ metrics: () => (/* reexport safe */ _metrics_api__WEBPACK_IMPORTED_MODULE_18__.metrics),\n/* harmony export */ propagation: () => (/* reexport safe */ _propagation_api__WEBPACK_IMPORTED_MODULE_19__.propagation),\n/* harmony export */ trace: () => (/* reexport safe */ _trace_api__WEBPACK_IMPORTED_MODULE_20__.trace)\n/* harmony export */ });\n/* harmony import */ var _baggage_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baggage/utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js\");\n/* harmony import */ var _context_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/* harmony import */ var _diag_consoleLogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./diag/consoleLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js\");\n/* harmony import */ var _diag_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./diag/types */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\");\n/* harmony import */ var _metrics_NoopMeter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./metrics/NoopMeter */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js\");\n/* harmony import */ var _metrics_Metric__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./metrics/Metric */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js\");\n/* harmony import */ var _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./propagation/TextMapPropagator */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js\");\n/* harmony import */ var _trace_ProxyTracer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./trace/ProxyTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\");\n/* harmony import */ var _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./trace/ProxyTracerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\");\n/* harmony import */ var _trace_SamplingResult__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./trace/SamplingResult */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js\");\n/* harmony import */ var _trace_span_kind__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./trace/span_kind */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js\");\n/* harmony import */ var _trace_status__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./trace/status */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js\");\n/* harmony import */ var _trace_trace_flags__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./trace/trace_flags */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\");\n/* harmony import */ var _trace_internal_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./trace/internal/utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js\");\n/* harmony import */ var _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./trace/spancontext-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\");\n/* harmony import */ var _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./trace/invalid-span-constants */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\");\n/* harmony import */ var _context_api__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./context-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js\");\n/* harmony import */ var _diag_api__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./diag-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js\");\n/* harmony import */ var _metrics_api__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./metrics-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js\");\n/* harmony import */ var _propagation_api__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./propagation-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js\");\n/* harmony import */ var _trace_api__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./trace-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Context APIs\n\n// Diag APIs\n\n\n// Metrics APIs\n\n\n// Propagation APIs\n\n\n// TODO: Remove ProxyTracerProvider export in the next major version.\n\n\n\n\n\n\n\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n\n\n\n\n// Named export.\n\n// Default export.\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n context: _context_api__WEBPACK_IMPORTED_MODULE_16__.context,\n diag: _diag_api__WEBPACK_IMPORTED_MODULE_17__.diag,\n metrics: _metrics_api__WEBPACK_IMPORTED_MODULE_18__.metrics,\n propagation: _propagation_api__WEBPACK_IMPORTED_MODULE_19__.propagation,\n trace: _trace_api__WEBPACK_IMPORTED_MODULE_20__.trace,\n});\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ2lFO0FBQ2pFO0FBQ21FO0FBQ25FO0FBQ3lEO0FBQ2I7QUFDNUM7QUFDc0Q7QUFDVDtBQUM3QztBQUM4RjtBQUM1QztBQUNsRDtBQUNrRTtBQUNSO0FBQ2I7QUFDRztBQUNDO0FBQ1M7QUFDcUM7QUFDUztBQUN4RztBQUNBO0FBQ3dDO0FBQ047QUFDTTtBQUNRO0FBQ1o7QUFDcEM7QUFDc0Q7QUFDdEQ7QUFDQSxpRUFBZTtBQUNmLFdBQVc7QUFDWCxRQUFRO0FBQ1IsV0FBVztBQUNYLGVBQWU7QUFDZixTQUFTO0FBQ1QsQ0FBQyxFQUFDO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHsgYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nIH0gZnJvbSAnLi9iYWdnYWdlL3V0aWxzJztcbi8vIENvbnRleHQgQVBJc1xuZXhwb3J0IHsgY3JlYXRlQ29udGV4dEtleSwgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9jb250ZXh0L2NvbnRleHQnO1xuLy8gRGlhZyBBUElzXG5leHBvcnQgeyBEaWFnQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vZGlhZy9jb25zb2xlTG9nZ2VyJztcbmV4cG9ydCB7IERpYWdMb2dMZXZlbCB9IGZyb20gJy4vZGlhZy90eXBlcyc7XG4vLyBNZXRyaWNzIEFQSXNcbmV4cG9ydCB7IGNyZWF0ZU5vb3BNZXRlciB9IGZyb20gJy4vbWV0cmljcy9Ob29wTWV0ZXInO1xuZXhwb3J0IHsgVmFsdWVUeXBlIH0gZnJvbSAnLi9tZXRyaWNzL01ldHJpYyc7XG4vLyBQcm9wYWdhdGlvbiBBUElzXG5leHBvcnQgeyBkZWZhdWx0VGV4dE1hcEdldHRlciwgZGVmYXVsdFRleHRNYXBTZXR0ZXIsIH0gZnJvbSAnLi9wcm9wYWdhdGlvbi9UZXh0TWFwUHJvcGFnYXRvcic7XG5leHBvcnQgeyBQcm94eVRyYWNlciB9IGZyb20gJy4vdHJhY2UvUHJveHlUcmFjZXInO1xuLy8gVE9ETzogUmVtb3ZlIFByb3h5VHJhY2VyUHJvdmlkZXIgZXhwb3J0IGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG5leHBvcnQgeyBQcm94eVRyYWNlclByb3ZpZGVyIH0gZnJvbSAnLi90cmFjZS9Qcm94eVRyYWNlclByb3ZpZGVyJztcbmV4cG9ydCB7IFNhbXBsaW5nRGVjaXNpb24gfSBmcm9tICcuL3RyYWNlL1NhbXBsaW5nUmVzdWx0JztcbmV4cG9ydCB7IFNwYW5LaW5kIH0gZnJvbSAnLi90cmFjZS9zcGFuX2tpbmQnO1xuZXhwb3J0IHsgU3BhblN0YXR1c0NvZGUgfSBmcm9tICcuL3RyYWNlL3N0YXR1cyc7XG5leHBvcnQgeyBUcmFjZUZsYWdzIH0gZnJvbSAnLi90cmFjZS90cmFjZV9mbGFncyc7XG5leHBvcnQgeyBjcmVhdGVUcmFjZVN0YXRlIH0gZnJvbSAnLi90cmFjZS9pbnRlcm5hbC91dGlscyc7XG5leHBvcnQgeyBpc1NwYW5Db250ZXh0VmFsaWQsIGlzVmFsaWRUcmFjZUlkLCBpc1ZhbGlkU3BhbklkLCB9IGZyb20gJy4vdHJhY2Uvc3BhbmNvbnRleHQtdXRpbHMnO1xuZXhwb3J0IHsgSU5WQUxJRF9TUEFOSUQsIElOVkFMSURfVFJBQ0VJRCwgSU5WQUxJRF9TUEFOX0NPTlRFWFQsIH0gZnJvbSAnLi90cmFjZS9pbnZhbGlkLXNwYW4tY29uc3RhbnRzJztcbi8vIFNwbGl0IG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBkZWZpbml0aW9uIGludG8gc2VwYXJhdGUgZmlsZXMgdG8gYWxsb3dcbi8vIHRyZWUtc2hha2luZyBvbiBlYWNoIGFwaSBpbnN0YW5jZS5cbmltcG9ydCB7IGNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQtYXBpJztcbmltcG9ydCB7IGRpYWcgfSBmcm9tICcuL2RpYWctYXBpJztcbmltcG9ydCB7IG1ldHJpY3MgfSBmcm9tICcuL21ldHJpY3MtYXBpJztcbmltcG9ydCB7IHByb3BhZ2F0aW9uIH0gZnJvbSAnLi9wcm9wYWdhdGlvbi1hcGknO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tICcuL3RyYWNlLWFwaSc7XG4vLyBOYW1lZCBleHBvcnQuXG5leHBvcnQgeyBjb250ZXh0LCBkaWFnLCBtZXRyaWNzLCBwcm9wYWdhdGlvbiwgdHJhY2UgfTtcbi8vIERlZmF1bHQgZXhwb3J0LlxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGNvbnRleHQsXG4gICAgZGlhZyxcbiAgICBtZXRyaWNzLFxuICAgIHByb3BhZ2F0aW9uLFxuICAgIHRyYWNlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js": +/*!****************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js ***! + \****************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getGlobal: () => (/* binding */ getGlobal),\n/* harmony export */ registerGlobal: () => (/* binding */ registerGlobal),\n/* harmony export */ unregisterGlobal: () => (/* binding */ unregisterGlobal)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../version */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js\");\n/* harmony import */ var _semver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./semver */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\nconst major = _version__WEBPACK_IMPORTED_MODULE_0__.VERSION.split('.')[0];\nconst GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for(`opentelemetry.js.api.${major}`);\nconst _global = (typeof globalThis === 'object'\n ? globalThis\n : typeof self === 'object'\n ? self\n : typeof window === 'object'\n ? window\n : typeof __webpack_require__.g === 'object'\n ? __webpack_require__.g\n : {});\nfunction registerGlobal(type, instance, diag, allowOverride = false) {\n var _a;\n const api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {\n version: _version__WEBPACK_IMPORTED_MODULE_0__.VERSION,\n });\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(`@opentelemetry/api: Attempted duplicate registration of API: ${type}`);\n diag.error(err.stack || err.message);\n return false;\n }\n if (api.version !== _version__WEBPACK_IMPORTED_MODULE_0__.VERSION) {\n // All registered APIs must be of the same version exactly\n const err = new Error(`@opentelemetry/api: Registration of version v${api.version} for ${type} does not match previously registered API v${_version__WEBPACK_IMPORTED_MODULE_0__.VERSION}`);\n diag.error(err.stack || err.message);\n return false;\n }\n api[type] = instance;\n diag.debug(`@opentelemetry/api: Registered a global for ${type} v${_version__WEBPACK_IMPORTED_MODULE_0__.VERSION}.`);\n return true;\n}\nfunction getGlobal(type) {\n var _a, _b;\n const globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;\n if (!globalVersion || !(0,_semver__WEBPACK_IMPORTED_MODULE_1__.isCompatible)(globalVersion)) {\n return;\n }\n return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];\n}\nfunction unregisterGlobal(type, diag) {\n diag.debug(`@opentelemetry/api: Unregistering a global for ${type} v${_version__WEBPACK_IMPORTED_MODULE_0__.VERSION}.`);\n const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n if (api) {\n delete api[type];\n }\n}\n//# sourceMappingURL=global-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDcUM7QUFDRztBQUN4QyxjQUFjLDZDQUFPO0FBQ3JCLHdFQUF3RSxNQUFNO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixxQkFBTTtBQUMzQixrQkFBa0IscUJBQU07QUFDeEIsb0JBQW9CO0FBQ2I7QUFDUDtBQUNBO0FBQ0EsaUJBQWlCLDZDQUFPO0FBQ3hCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsOEZBQThGLEtBQUs7QUFDbkc7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDZDQUFPO0FBQy9CO0FBQ0EsOEVBQThFLGFBQWEsTUFBTSxNQUFNLDRDQUE0Qyw2Q0FBTyxDQUFDO0FBQzNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELE1BQU0sR0FBRyw2Q0FBTyxDQUFDO0FBQy9FO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSwyQkFBMkIscURBQVk7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGlFQUFpRSxNQUFNLEdBQUcsNkNBQU8sQ0FBQztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2ludGVybmFsL2dsb2JhbC11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uJztcbmltcG9ydCB7IGlzQ29tcGF0aWJsZSB9IGZyb20gJy4vc2VtdmVyJztcbmNvbnN0IG1ham9yID0gVkVSU0lPTi5zcGxpdCgnLicpWzBdO1xuY29uc3QgR0xPQkFMX09QRU5URUxFTUVUUllfQVBJX0tFWSA9IFN5bWJvbC5mb3IoYG9wZW50ZWxlbWV0cnkuanMuYXBpLiR7bWFqb3J9YCk7XG5jb25zdCBfZ2xvYmFsID0gKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0J1xuICAgID8gZ2xvYmFsVGhpc1xuICAgIDogdHlwZW9mIHNlbGYgPT09ICdvYmplY3QnXG4gICAgICAgID8gc2VsZlxuICAgICAgICA6IHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IHdpbmRvd1xuICAgICAgICAgICAgOiB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgID8gZ2xvYmFsXG4gICAgICAgICAgICAgICAgOiB7fSk7XG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJHbG9iYWwodHlwZSwgaW5zdGFuY2UsIGRpYWcsIGFsbG93T3ZlcnJpZGUgPSBmYWxzZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBhcGkgPSAoX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSA9IChfYSA9IF9nbG9iYWxbR0xPQkFMX09QRU5URUxFTUVUUllfQVBJX0tFWV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHtcbiAgICAgICAgdmVyc2lvbjogVkVSU0lPTixcbiAgICB9KTtcbiAgICBpZiAoIWFsbG93T3ZlcnJpZGUgJiYgYXBpW3R5cGVdKSB7XG4gICAgICAgIC8vIGFscmVhZHkgcmVnaXN0ZXJlZCBhbiBBUEkgb2YgdGhpcyB0eXBlXG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgQG9wZW50ZWxlbWV0cnkvYXBpOiBBdHRlbXB0ZWQgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbiBvZiBBUEk6ICR7dHlwZX1gKTtcbiAgICAgICAgZGlhZy5lcnJvcihlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChhcGkudmVyc2lvbiAhPT0gVkVSU0lPTikge1xuICAgICAgICAvLyBBbGwgcmVnaXN0ZXJlZCBBUElzIG11c3QgYmUgb2YgdGhlIHNhbWUgdmVyc2lvbiBleGFjdGx5XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgQG9wZW50ZWxlbWV0cnkvYXBpOiBSZWdpc3RyYXRpb24gb2YgdmVyc2lvbiB2JHthcGkudmVyc2lvbn0gZm9yICR7dHlwZX0gZG9lcyBub3QgbWF0Y2ggcHJldmlvdXNseSByZWdpc3RlcmVkIEFQSSB2JHtWRVJTSU9OfWApO1xuICAgICAgICBkaWFnLmVycm9yKGVyci5zdGFjayB8fCBlcnIubWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXBpW3R5cGVdID0gaW5zdGFuY2U7XG4gICAgZGlhZy5kZWJ1ZyhgQG9wZW50ZWxlbWV0cnkvYXBpOiBSZWdpc3RlcmVkIGEgZ2xvYmFsIGZvciAke3R5cGV9IHYke1ZFUlNJT059LmApO1xuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbCh0eXBlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCBnbG9iYWxWZXJzaW9uID0gKF9hID0gX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZlcnNpb247XG4gICAgaWYgKCFnbG9iYWxWZXJzaW9uIHx8ICFpc0NvbXBhdGlibGUoZ2xvYmFsVmVyc2lvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gKF9iID0gX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW3R5cGVdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJHbG9iYWwodHlwZSwgZGlhZykge1xuICAgIGRpYWcuZGVidWcoYEBvcGVudGVsZW1ldHJ5L2FwaTogVW5yZWdpc3RlcmluZyBhIGdsb2JhbCBmb3IgJHt0eXBlfSB2JHtWRVJTSU9OfS5gKTtcbiAgICBjb25zdCBhcGkgPSBfZ2xvYmFsW0dMT0JBTF9PUEVOVEVMRU1FVFJZX0FQSV9LRVldO1xuICAgIGlmIChhcGkpIHtcbiAgICAgICAgZGVsZXRlIGFwaVt0eXBlXTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _makeCompatibilityCheck: () => (/* binding */ _makeCompatibilityCheck),\n/* harmony export */ isCompatible: () => (/* binding */ isCompatible)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../version */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nconst re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nfunction _makeCompatibilityCheck(ownVersion) {\n const acceptedVersions = new Set([ownVersion]);\n const rejectedVersions = new Set();\n const myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return () => false;\n }\n const ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion) {\n return globalVersion === ownVersion;\n };\n }\n function _reject(v) {\n rejectedVersions.add(v);\n return false;\n }\n function _accept(v) {\n acceptedVersions.add(v);\n return true;\n }\n return function isCompatible(globalVersion) {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n const globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n const globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n if (ownVersionParsed.major === 0) {\n if (ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n }\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n };\n}\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nconst isCompatible = _makeCompatibilityCheck(_version__WEBPACK_IMPORTED_MODULE_0__.VERSION);\n//# sourceMappingURL=semver.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW50ZXJuYWwvc2VtdmVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3FDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sNkNBQTZDLDZDQUFPO0FBQzNEIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9pbnRlcm5hbC9zZW12ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5jb25zdCByZSA9IC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKC0oLispKT8kLztcbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gdG8gdGVzdCBhbiBBUEkgdmVyc2lvbiB0byBzZWUgaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm92aWRlZCBvd25WZXJzaW9uLlxuICpcbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzZW1hbnRpY3M6XG4gKiAtIEV4YWN0IG1hdGNoIGlzIGFsd2F5cyBjb21wYXRpYmxlXG4gKiAtIE1ham9yIHZlcnNpb25zIG11c3QgbWF0Y2ggZXhhY3RseVxuICogICAgLSAxLnggcGFja2FnZSBjYW5ub3QgdXNlIGdsb2JhbCAyLnggcGFja2FnZVxuICogICAgLSAyLnggcGFja2FnZSBjYW5ub3QgdXNlIGdsb2JhbCAxLnggcGFja2FnZVxuICogLSBUaGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgQVBJIG1vZHVsZSByZXF1ZXN0aW5nIGFjY2VzcyB0byB0aGUgZ2xvYmFsIEFQSSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIEFQSVxuICogICAgLSAxLjMgcGFja2FnZSBtYXkgdXNlIDEuNCBnbG9iYWwgYmVjYXVzZSB0aGUgbGF0ZXIgZ2xvYmFsIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgMS4zIGV4cGVjdHNcbiAqICAgIC0gMS40IHBhY2thZ2UgbWF5IE5PVCB1c2UgMS4zIGdsb2JhbCBiZWNhdXNlIGl0IG1heSB0cnkgdG8gY2FsbCBmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgZXhpc3Qgb24gMS4zXG4gKiAtIElmIHRoZSBtYWpvciB2ZXJzaW9uIGlzIDAsIHRoZSBtaW5vciB2ZXJzaW9uIGlzIHRyZWF0ZWQgYXMgdGhlIG1ham9yIGFuZCB0aGUgcGF0Y2ggaXMgdHJlYXRlZCBhcyB0aGUgbWlub3JcbiAqIC0gUGF0Y2ggYW5kIGJ1aWxkIHRhZyBkaWZmZXJlbmNlcyBhcmUgbm90IGNvbnNpZGVyZWQgYXQgdGhpcyB0aW1lXG4gKlxuICogQHBhcmFtIG93blZlcnNpb24gdmVyc2lvbiB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbWFrZUNvbXBhdGliaWxpdHlDaGVjayhvd25WZXJzaW9uKSB7XG4gICAgY29uc3QgYWNjZXB0ZWRWZXJzaW9ucyA9IG5ldyBTZXQoW293blZlcnNpb25dKTtcbiAgICBjb25zdCByZWplY3RlZFZlcnNpb25zID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IG15VmVyc2lvbk1hdGNoID0gb3duVmVyc2lvbi5tYXRjaChyZSk7XG4gICAgaWYgKCFteVZlcnNpb25NYXRjaCkge1xuICAgICAgICAvLyB3ZSBjYW5ub3QgZ3VhcmFudGVlIGNvbXBhdGliaWxpdHkgc28gd2UgYWx3YXlzIHJldHVybiBub29wXG4gICAgICAgIHJldHVybiAoKSA9PiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3duVmVyc2lvblBhcnNlZCA9IHtcbiAgICAgICAgbWFqb3I6ICtteVZlcnNpb25NYXRjaFsxXSxcbiAgICAgICAgbWlub3I6ICtteVZlcnNpb25NYXRjaFsyXSxcbiAgICAgICAgcGF0Y2g6ICtteVZlcnNpb25NYXRjaFszXSxcbiAgICAgICAgcHJlcmVsZWFzZTogbXlWZXJzaW9uTWF0Y2hbNF0sXG4gICAgfTtcbiAgICAvLyBpZiBvd25WZXJzaW9uIGhhcyBhIHByZXJlbGVhc2UgdGFnLCB2ZXJzaW9ucyBtdXN0IG1hdGNoIGV4YWN0bHlcbiAgICBpZiAob3duVmVyc2lvblBhcnNlZC5wcmVyZWxlYXNlICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzRXhhY3RtYXRjaChnbG9iYWxWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsVmVyc2lvbiA9PT0gb3duVmVyc2lvbjtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gX3JlamVjdCh2KSB7XG4gICAgICAgIHJlamVjdGVkVmVyc2lvbnMuYWRkKHYpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIF9hY2NlcHQodikge1xuICAgICAgICBhY2NlcHRlZFZlcnNpb25zLmFkZCh2KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiBpc0NvbXBhdGlibGUoZ2xvYmFsVmVyc2lvbikge1xuICAgICAgICBpZiAoYWNjZXB0ZWRWZXJzaW9ucy5oYXMoZ2xvYmFsVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWplY3RlZFZlcnNpb25zLmhhcyhnbG9iYWxWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsb2JhbFZlcnNpb25NYXRjaCA9IGdsb2JhbFZlcnNpb24ubWF0Y2gocmUpO1xuICAgICAgICBpZiAoIWdsb2JhbFZlcnNpb25NYXRjaCkge1xuICAgICAgICAgICAgLy8gY2Fubm90IHBhcnNlIG90aGVyIHZlcnNpb25cbiAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgY29tcGF0aWJpbGl0eSBzbyB3ZSBhbHdheXMgbm9vcFxuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2xvYmFsVmVyc2lvblBhcnNlZCA9IHtcbiAgICAgICAgICAgIG1ham9yOiArZ2xvYmFsVmVyc2lvbk1hdGNoWzFdLFxuICAgICAgICAgICAgbWlub3I6ICtnbG9iYWxWZXJzaW9uTWF0Y2hbMl0sXG4gICAgICAgICAgICBwYXRjaDogK2dsb2JhbFZlcnNpb25NYXRjaFszXSxcbiAgICAgICAgICAgIHByZXJlbGVhc2U6IGdsb2JhbFZlcnNpb25NYXRjaFs0XSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gaWYgZ2xvYmFsVmVyc2lvbiBoYXMgYSBwcmVyZWxlYXNlIHRhZywgdmVyc2lvbnMgbXVzdCBtYXRjaCBleGFjdGx5XG4gICAgICAgIGlmIChnbG9iYWxWZXJzaW9uUGFyc2VkLnByZXJlbGVhc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFqb3IgdmVyc2lvbnMgbXVzdCBtYXRjaFxuICAgICAgICBpZiAob3duVmVyc2lvblBhcnNlZC5tYWpvciAhPT0gZ2xvYmFsVmVyc2lvblBhcnNlZC5tYWpvcikge1xuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG93blZlcnNpb25QYXJzZWQubWFqb3IgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChvd25WZXJzaW9uUGFyc2VkLm1pbm9yID09PSBnbG9iYWxWZXJzaW9uUGFyc2VkLm1pbm9yICYmXG4gICAgICAgICAgICAgICAgb3duVmVyc2lvblBhcnNlZC5wYXRjaCA8PSBnbG9iYWxWZXJzaW9uUGFyc2VkLnBhdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3JlamVjdChnbG9iYWxWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3duVmVyc2lvblBhcnNlZC5taW5vciA8PSBnbG9iYWxWZXJzaW9uUGFyc2VkLm1pbm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gX2FjY2VwdChnbG9iYWxWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JlamVjdChnbG9iYWxWZXJzaW9uKTtcbiAgICB9O1xufVxuLyoqXG4gKiBUZXN0IGFuIEFQSSB2ZXJzaW9uIHRvIHNlZSBpZiBpdCBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBBUEkuXG4gKlxuICogLSBFeGFjdCBtYXRjaCBpcyBhbHdheXMgY29tcGF0aWJsZVxuICogLSBNYWpvciB2ZXJzaW9ucyBtdXN0IG1hdGNoIGV4YWN0bHlcbiAqICAgIC0gMS54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMi54IHBhY2thZ2VcbiAqICAgIC0gMi54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMS54IHBhY2thZ2VcbiAqIC0gVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIEFQSSBtb2R1bGUgcmVxdWVzdGluZyBhY2Nlc3MgdG8gdGhlIGdsb2JhbCBBUEkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhpcyBBUElcbiAqICAgIC0gMS4zIHBhY2thZ2UgbWF5IHVzZSAxLjQgZ2xvYmFsIGJlY2F1c2UgdGhlIGxhdGVyIGdsb2JhbCBjb250YWlucyBhbGwgZnVuY3Rpb25zIDEuMyBleHBlY3RzXG4gKiAgICAtIDEuNCBwYWNrYWdlIG1heSBOT1QgdXNlIDEuMyBnbG9iYWwgYmVjYXVzZSBpdCBtYXkgdHJ5IHRvIGNhbGwgZnVuY3Rpb25zIHdoaWNoIGRvbid0IGV4aXN0IG9uIDEuM1xuICogLSBJZiB0aGUgbWFqb3IgdmVyc2lvbiBpcyAwLCB0aGUgbWlub3IgdmVyc2lvbiBpcyB0cmVhdGVkIGFzIHRoZSBtYWpvciBhbmQgdGhlIHBhdGNoIGlzIHRyZWF0ZWQgYXMgdGhlIG1pbm9yXG4gKiAtIFBhdGNoIGFuZCBidWlsZCB0YWcgZGlmZmVyZW5jZXMgYXJlIG5vdCBjb25zaWRlcmVkIGF0IHRoaXMgdGltZVxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIHZlcnNpb24gb2YgdGhlIEFQSSByZXF1ZXN0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBnbG9iYWwgQVBJXG4gKi9cbmV4cG9ydCBjb25zdCBpc0NvbXBhdGlibGUgPSBfbWFrZUNvbXBhdGliaWxpdHlDaGVjayhWRVJTSU9OKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbXZlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ metrics: () => (/* binding */ metrics)\n/* harmony export */ });\n/* harmony import */ var _api_metrics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/metrics */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for metrics API\n *\n * @since 1.3.0\n */\nconst metrics = _api_metrics__WEBPACK_IMPORTED_MODULE_0__.MetricsAPI.getInstance();\n//# sourceMappingURL=metrics-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy1hcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGdCQUFnQixvREFBVTtBQUNqQyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy1hcGkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vLyBTcGxpdCBtb2R1bGUtbGV2ZWwgdmFyaWFibGUgZGVmaW5pdGlvbiBpbnRvIHNlcGFyYXRlIGZpbGVzIHRvIGFsbG93XG4vLyB0cmVlLXNoYWtpbmcgb24gZWFjaCBhcGkgaW5zdGFuY2UuXG5pbXBvcnQgeyBNZXRyaWNzQVBJIH0gZnJvbSAnLi9hcGkvbWV0cmljcyc7XG4vKipcbiAqIEVudHJ5cG9pbnQgZm9yIG1ldHJpY3MgQVBJXG4gKlxuICogQHNpbmNlIDEuMy4wXG4gKi9cbmV4cG9ydCBjb25zdCBtZXRyaWNzID0gTWV0cmljc0FQSS5nZXRJbnN0YW5jZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWV0cmljcy1hcGkuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js": +/*!*********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js ***! + \*********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ValueType: () => (/* binding */ ValueType)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * The Type of value. It describes how the data is reported.\n *\n * @since 1.3.0\n */\nvar ValueType;\n(function (ValueType) {\n ValueType[ValueType[\"INT\"] = 0] = \"INT\";\n ValueType[ValueType[\"DOUBLE\"] = 1] = \"DOUBLE\";\n})(ValueType || (ValueType = {}));\n//# sourceMappingURL=Metric.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy9NZXRyaWMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4QkFBOEI7QUFDL0IiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL21ldHJpY3MvTWV0cmljLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgVHlwZSBvZiB2YWx1ZS4gSXQgZGVzY3JpYmVzIGhvdyB0aGUgZGF0YSBpcyByZXBvcnRlZC5cbiAqXG4gKiBAc2luY2UgMS4zLjBcbiAqL1xuZXhwb3J0IHZhciBWYWx1ZVR5cGU7XG4oZnVuY3Rpb24gKFZhbHVlVHlwZSkge1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJJTlRcIl0gPSAwXSA9IFwiSU5UXCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIkRPVUJMRVwiXSA9IDFdID0gXCJET1VCTEVcIjtcbn0pKFZhbHVlVHlwZSB8fCAoVmFsdWVUeXBlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1ldHJpYy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_COUNTER_METRIC: () => (/* binding */ NOOP_COUNTER_METRIC),\n/* harmony export */ NOOP_GAUGE_METRIC: () => (/* binding */ NOOP_GAUGE_METRIC),\n/* harmony export */ NOOP_HISTOGRAM_METRIC: () => (/* binding */ NOOP_HISTOGRAM_METRIC),\n/* harmony export */ NOOP_METER: () => (/* binding */ NOOP_METER),\n/* harmony export */ NOOP_OBSERVABLE_COUNTER_METRIC: () => (/* binding */ NOOP_OBSERVABLE_COUNTER_METRIC),\n/* harmony export */ NOOP_OBSERVABLE_GAUGE_METRIC: () => (/* binding */ NOOP_OBSERVABLE_GAUGE_METRIC),\n/* harmony export */ NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC: () => (/* binding */ NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC),\n/* harmony export */ NOOP_UP_DOWN_COUNTER_METRIC: () => (/* binding */ NOOP_UP_DOWN_COUNTER_METRIC),\n/* harmony export */ NoopCounterMetric: () => (/* binding */ NoopCounterMetric),\n/* harmony export */ NoopGaugeMetric: () => (/* binding */ NoopGaugeMetric),\n/* harmony export */ NoopHistogramMetric: () => (/* binding */ NoopHistogramMetric),\n/* harmony export */ NoopMeter: () => (/* binding */ NoopMeter),\n/* harmony export */ NoopMetric: () => (/* binding */ NoopMetric),\n/* harmony export */ NoopObservableCounterMetric: () => (/* binding */ NoopObservableCounterMetric),\n/* harmony export */ NoopObservableGaugeMetric: () => (/* binding */ NoopObservableGaugeMetric),\n/* harmony export */ NoopObservableMetric: () => (/* binding */ NoopObservableMetric),\n/* harmony export */ NoopObservableUpDownCounterMetric: () => (/* binding */ NoopObservableUpDownCounterMetric),\n/* harmony export */ NoopUpDownCounterMetric: () => (/* binding */ NoopUpDownCounterMetric),\n/* harmony export */ createNoopMeter: () => (/* binding */ createNoopMeter)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * NoopMeter is a noop implementation of the {@link Meter} interface. It reuses\n * constant NoopMetrics for all of its methods.\n */\nclass NoopMeter {\n constructor() { }\n /**\n * @see {@link Meter.createGauge}\n */\n createGauge(_name, _options) {\n return NOOP_GAUGE_METRIC;\n }\n /**\n * @see {@link Meter.createHistogram}\n */\n createHistogram(_name, _options) {\n return NOOP_HISTOGRAM_METRIC;\n }\n /**\n * @see {@link Meter.createCounter}\n */\n createCounter(_name, _options) {\n return NOOP_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createUpDownCounter}\n */\n createUpDownCounter(_name, _options) {\n return NOOP_UP_DOWN_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createObservableGauge}\n */\n createObservableGauge(_name, _options) {\n return NOOP_OBSERVABLE_GAUGE_METRIC;\n }\n /**\n * @see {@link Meter.createObservableCounter}\n */\n createObservableCounter(_name, _options) {\n return NOOP_OBSERVABLE_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createObservableUpDownCounter}\n */\n createObservableUpDownCounter(_name, _options) {\n return NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.addBatchObservableCallback}\n */\n addBatchObservableCallback(_callback, _observables) { }\n /**\n * @see {@link Meter.removeBatchObservableCallback}\n */\n removeBatchObservableCallback(_callback) { }\n}\nclass NoopMetric {\n}\nclass NoopCounterMetric extends NoopMetric {\n add(_value, _attributes) { }\n}\nclass NoopUpDownCounterMetric extends NoopMetric {\n add(_value, _attributes) { }\n}\nclass NoopGaugeMetric extends NoopMetric {\n record(_value, _attributes) { }\n}\nclass NoopHistogramMetric extends NoopMetric {\n record(_value, _attributes) { }\n}\nclass NoopObservableMetric {\n addCallback(_callback) { }\n removeCallback(_callback) { }\n}\nclass NoopObservableCounterMetric extends NoopObservableMetric {\n}\nclass NoopObservableGaugeMetric extends NoopObservableMetric {\n}\nclass NoopObservableUpDownCounterMetric extends NoopObservableMetric {\n}\nconst NOOP_METER = new NoopMeter();\n// Synchronous instruments\nconst NOOP_COUNTER_METRIC = new NoopCounterMetric();\nconst NOOP_GAUGE_METRIC = new NoopGaugeMetric();\nconst NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric();\nconst NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric();\n// Asynchronous instruments\nconst NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableCounterMetric();\nconst NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableGaugeMetric();\nconst NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC = new NoopObservableUpDownCounterMetric();\n/**\n * Create a no-op Meter\n *\n * @since 1.3.0\n */\nfunction createNoopMeter() {\n return NOOP_METER;\n}\n//# sourceMappingURL=NoopMeter.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy9Ob29wTWV0ZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsYUFBYTtBQUMzRDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ087QUFDQTtBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9tZXRyaWNzL05vb3BNZXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogTm9vcE1ldGVyIGlzIGEgbm9vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1ldGVyfSBpbnRlcmZhY2UuIEl0IHJldXNlc1xuICogY29uc3RhbnQgTm9vcE1ldHJpY3MgZm9yIGFsbCBvZiBpdHMgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BNZXRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVHYXVnZX1cbiAgICAgKi9cbiAgICBjcmVhdGVHYXVnZShfbmFtZSwgX29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIE5PT1BfR0FVR0VfTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVIaXN0b2dyYW19XG4gICAgICovXG4gICAgY3JlYXRlSGlzdG9ncmFtKF9uYW1lLCBfb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gTk9PUF9ISVNUT0dSQU1fTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVDb3VudGVyfVxuICAgICAqL1xuICAgIGNyZWF0ZUNvdW50ZXIoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX0NPVU5URVJfTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVVcERvd25Db3VudGVyfVxuICAgICAqL1xuICAgIGNyZWF0ZVVwRG93bkNvdW50ZXIoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX1VQX0RPV05fQ09VTlRFUl9NRVRSSUM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUge0BsaW5rIE1ldGVyLmNyZWF0ZU9ic2VydmFibGVHYXVnZX1cbiAgICAgKi9cbiAgICBjcmVhdGVPYnNlcnZhYmxlR2F1Z2UoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX09CU0VSVkFCTEVfR0FVR0VfTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcn1cbiAgICAgKi9cbiAgICBjcmVhdGVPYnNlcnZhYmxlQ291bnRlcihfbmFtZSwgX29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIE5PT1BfT0JTRVJWQUJMRV9DT1VOVEVSX01FVFJJQztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSB7QGxpbmsgTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZVVwRG93bkNvdW50ZXJ9XG4gICAgICovXG4gICAgY3JlYXRlT2JzZXJ2YWJsZVVwRG93bkNvdW50ZXIoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX09CU0VSVkFCTEVfVVBfRE9XTl9DT1VOVEVSX01FVFJJQztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSB7QGxpbmsgTWV0ZXIuYWRkQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2t9XG4gICAgICovXG4gICAgYWRkQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2soX2NhbGxiYWNrLCBfb2JzZXJ2YWJsZXMpIHsgfVxuICAgIC8qKlxuICAgICAqIEBzZWUge0BsaW5rIE1ldGVyLnJlbW92ZUJhdGNoT2JzZXJ2YWJsZUNhbGxiYWNrfVxuICAgICAqL1xuICAgIHJlbW92ZUJhdGNoT2JzZXJ2YWJsZUNhbGxiYWNrKF9jYWxsYmFjaykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcE1ldHJpYyB7XG59XG5leHBvcnQgY2xhc3MgTm9vcENvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wTWV0cmljIHtcbiAgICBhZGQoX3ZhbHVlLCBfYXR0cmlidXRlcykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcFVwRG93bkNvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wTWV0cmljIHtcbiAgICBhZGQoX3ZhbHVlLCBfYXR0cmlidXRlcykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcEdhdWdlTWV0cmljIGV4dGVuZHMgTm9vcE1ldHJpYyB7XG4gICAgcmVjb3JkKF92YWx1ZSwgX2F0dHJpYnV0ZXMpIHsgfVxufVxuZXhwb3J0IGNsYXNzIE5vb3BIaXN0b2dyYW1NZXRyaWMgZXh0ZW5kcyBOb29wTWV0cmljIHtcbiAgICByZWNvcmQoX3ZhbHVlLCBfYXR0cmlidXRlcykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcE9ic2VydmFibGVNZXRyaWMge1xuICAgIGFkZENhbGxiYWNrKF9jYWxsYmFjaykgeyB9XG4gICAgcmVtb3ZlQ2FsbGJhY2soX2NhbGxiYWNrKSB7IH1cbn1cbmV4cG9ydCBjbGFzcyBOb29wT2JzZXJ2YWJsZUNvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wT2JzZXJ2YWJsZU1ldHJpYyB7XG59XG5leHBvcnQgY2xhc3MgTm9vcE9ic2VydmFibGVHYXVnZU1ldHJpYyBleHRlbmRzIE5vb3BPYnNlcnZhYmxlTWV0cmljIHtcbn1cbmV4cG9ydCBjbGFzcyBOb29wT2JzZXJ2YWJsZVVwRG93bkNvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wT2JzZXJ2YWJsZU1ldHJpYyB7XG59XG5leHBvcnQgY29uc3QgTk9PUF9NRVRFUiA9IG5ldyBOb29wTWV0ZXIoKTtcbi8vIFN5bmNocm9ub3VzIGluc3RydW1lbnRzXG5leHBvcnQgY29uc3QgTk9PUF9DT1VOVEVSX01FVFJJQyA9IG5ldyBOb29wQ291bnRlck1ldHJpYygpO1xuZXhwb3J0IGNvbnN0IE5PT1BfR0FVR0VfTUVUUklDID0gbmV3IE5vb3BHYXVnZU1ldHJpYygpO1xuZXhwb3J0IGNvbnN0IE5PT1BfSElTVE9HUkFNX01FVFJJQyA9IG5ldyBOb29wSGlzdG9ncmFtTWV0cmljKCk7XG5leHBvcnQgY29uc3QgTk9PUF9VUF9ET1dOX0NPVU5URVJfTUVUUklDID0gbmV3IE5vb3BVcERvd25Db3VudGVyTWV0cmljKCk7XG4vLyBBc3luY2hyb25vdXMgaW5zdHJ1bWVudHNcbmV4cG9ydCBjb25zdCBOT09QX09CU0VSVkFCTEVfQ09VTlRFUl9NRVRSSUMgPSBuZXcgTm9vcE9ic2VydmFibGVDb3VudGVyTWV0cmljKCk7XG5leHBvcnQgY29uc3QgTk9PUF9PQlNFUlZBQkxFX0dBVUdFX01FVFJJQyA9IG5ldyBOb29wT2JzZXJ2YWJsZUdhdWdlTWV0cmljKCk7XG5leHBvcnQgY29uc3QgTk9PUF9PQlNFUlZBQkxFX1VQX0RPV05fQ09VTlRFUl9NRVRSSUMgPSBuZXcgTm9vcE9ic2VydmFibGVVcERvd25Db3VudGVyTWV0cmljKCk7XG4vKipcbiAqIENyZWF0ZSBhIG5vLW9wIE1ldGVyXG4gKlxuICogQHNpbmNlIDEuMy4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb29wTWV0ZXIoKSB7XG4gICAgcmV0dXJuIE5PT1BfTUVURVI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob29wTWV0ZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js": +/*!********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js ***! + \********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_METER_PROVIDER: () => (/* binding */ NOOP_METER_PROVIDER),\n/* harmony export */ NoopMeterProvider: () => (/* binding */ NoopMeterProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopMeter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopMeter */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * An implementation of the {@link MeterProvider} which returns an impotent Meter\n * for all calls to `getMeter`\n */\nclass NoopMeterProvider {\n getMeter(_name, _version, _options) {\n return _NoopMeter__WEBPACK_IMPORTED_MODULE_0__.NOOP_METER;\n }\n}\nconst NOOP_METER_PROVIDER = new NoopMeterProvider();\n//# sourceMappingURL=NoopMeterProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy9Ob29wTWV0ZXJQcm92aWRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUN5QztBQUN6QztBQUNBLDZCQUE2QixxQkFBcUI7QUFDbEQ7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlLGtEQUFVO0FBQ3pCO0FBQ0E7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9tZXRyaWNzL05vb3BNZXRlclByb3ZpZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgTk9PUF9NRVRFUiB9IGZyb20gJy4vTm9vcE1ldGVyJztcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNZXRlclByb3ZpZGVyfSB3aGljaCByZXR1cm5zIGFuIGltcG90ZW50IE1ldGVyXG4gKiBmb3IgYWxsIGNhbGxzIHRvIGBnZXRNZXRlcmBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BNZXRlclByb3ZpZGVyIHtcbiAgICBnZXRNZXRlcihfbmFtZSwgX3ZlcnNpb24sIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX01FVEVSO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBOT09QX01FVEVSX1BST1ZJREVSID0gbmV3IE5vb3BNZXRlclByb3ZpZGVyKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob29wTWV0ZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ propagation: () => (/* binding */ propagation)\n/* harmony export */ });\n/* harmony import */ var _api_propagation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/propagation */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for propagation API\n *\n * @since 1.0.0\n */\nconst propagation = _api_propagation__WEBPACK_IMPORTED_MODULE_0__.PropagationAPI.getInstance();\n//# sourceMappingURL=propagation-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24tYXBpLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ21EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxvQkFBb0IsNERBQWM7QUFDekMiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3Byb3BhZ2F0aW9uLWFwaS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8vIFNwbGl0IG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBkZWZpbml0aW9uIGludG8gc2VwYXJhdGUgZmlsZXMgdG8gYWxsb3dcbi8vIHRyZWUtc2hha2luZyBvbiBlYWNoIGFwaSBpbnN0YW5jZS5cbmltcG9ydCB7IFByb3BhZ2F0aW9uQVBJIH0gZnJvbSAnLi9hcGkvcHJvcGFnYXRpb24nO1xuLyoqXG4gKiBFbnRyeXBvaW50IGZvciBwcm9wYWdhdGlvbiBBUElcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3BhZ2F0aW9uID0gUHJvcGFnYXRpb25BUEkuZ2V0SW5zdGFuY2UoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3BhZ2F0aW9uLWFwaS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js": +/*!****************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js ***! + \****************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopTextMapPropagator: () => (/* binding */ NoopTextMapPropagator)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * No-op implementations of {@link TextMapPropagator}.\n */\nclass NoopTextMapPropagator {\n /** Noop inject function does nothing */\n inject(_context, _carrier) { }\n /** Noop extract function does nothing and returns the input context */\n extract(context, _carrier) {\n return context;\n }\n fields() {\n return [];\n }\n}\n//# sourceMappingURL=NoopTextMapPropagator.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24vTm9vcFRleHRNYXBQcm9wYWdhdG9yLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHdCQUF3QjtBQUNyRDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24vTm9vcFRleHRNYXBQcm9wYWdhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBOby1vcCBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIFRleHRNYXBQcm9wYWdhdG9yfS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BUZXh0TWFwUHJvcGFnYXRvciB7XG4gICAgLyoqIE5vb3AgaW5qZWN0IGZ1bmN0aW9uIGRvZXMgbm90aGluZyAqL1xuICAgIGluamVjdChfY29udGV4dCwgX2NhcnJpZXIpIHsgfVxuICAgIC8qKiBOb29wIGV4dHJhY3QgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIHRoZSBpbnB1dCBjb250ZXh0ICovXG4gICAgZXh0cmFjdChjb250ZXh0LCBfY2Fycmllcikge1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgZmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcFRleHRNYXBQcm9wYWdhdG9yLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js": +/*!************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js ***! + \************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ defaultTextMapGetter: () => (/* binding */ defaultTextMapGetter),\n/* harmony export */ defaultTextMapSetter: () => (/* binding */ defaultTextMapSetter)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @since 1.0.0\n */\nconst defaultTextMapGetter = {\n get(carrier, key) {\n if (carrier == null) {\n return undefined;\n }\n return carrier[key];\n },\n keys(carrier) {\n if (carrier == null) {\n return [];\n }\n return Object.keys(carrier);\n },\n};\n/**\n * @since 1.0.0\n */\nconst defaultTextMapSetter = {\n set(carrier, key, value) {\n if (carrier == null) {\n return;\n }\n carrier[key] = value;\n },\n};\n//# sourceMappingURL=TextMapPropagator.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24vVGV4dE1hcFByb3BhZ2F0b3IuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3Byb3BhZ2F0aW9uL1RleHRNYXBQcm9wYWdhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRUZXh0TWFwR2V0dGVyID0ge1xuICAgIGdldChjYXJyaWVyLCBrZXkpIHtcbiAgICAgICAgaWYgKGNhcnJpZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FycmllcltrZXldO1xuICAgIH0sXG4gICAga2V5cyhjYXJyaWVyKSB7XG4gICAgICAgIGlmIChjYXJyaWVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY2Fycmllcik7XG4gICAgfSxcbn07XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFRleHRNYXBTZXR0ZXIgPSB7XG4gICAgc2V0KGNhcnJpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGNhcnJpZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhcnJpZXJba2V5XSA9IHZhbHVlO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGV4dE1hcFByb3BhZ2F0b3IuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js": +/*!****************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js ***! + \****************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ trace: () => (/* binding */ trace)\n/* harmony export */ });\n/* harmony import */ var _api_trace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/trace */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for trace API\n *\n * @since 1.0.0\n */\nconst trace = _api_trace__WEBPACK_IMPORTED_MODULE_0__.TraceAPI.getInstance();\n//# sourceMappingURL=trace-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UtYXBpLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3VDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxjQUFjLGdEQUFRO0FBQzdCIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS1hcGkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vLyBTcGxpdCBtb2R1bGUtbGV2ZWwgdmFyaWFibGUgZGVmaW5pdGlvbiBpbnRvIHNlcGFyYXRlIGZpbGVzIHRvIGFsbG93XG4vLyB0cmVlLXNoYWtpbmcgb24gZWFjaCBhcGkgaW5zdGFuY2UuXG5pbXBvcnQgeyBUcmFjZUFQSSB9IGZyb20gJy4vYXBpL3RyYWNlJztcbi8qKlxuICogRW50cnlwb2ludCBmb3IgdHJhY2UgQVBJXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFjZSA9IFRyYWNlQVBJLmdldEluc3RhbmNlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZS1hcGkuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js": +/*!*****************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js ***! + \*****************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NonRecordingSpan: () => (/* binding */ NonRecordingSpan)\n/* harmony export */ });\n/* harmony import */ var _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invalid-span-constants */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nclass NonRecordingSpan {\n constructor(spanContext = _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__.INVALID_SPAN_CONTEXT) {\n this._spanContext = spanContext;\n }\n // Returns a SpanContext.\n spanContext() {\n return this._spanContext;\n }\n // By default does nothing\n setAttribute(_key, _value) {\n return this;\n }\n // By default does nothing\n setAttributes(_attributes) {\n return this;\n }\n // By default does nothing\n addEvent(_name, _attributes) {\n return this;\n }\n addLink(_link) {\n return this;\n }\n addLinks(_links) {\n return this;\n }\n // By default does nothing\n setStatus(_status) {\n return this;\n }\n // By default does nothing\n updateName(_name) {\n return this;\n }\n // By default does nothing\n end(_endTime) { }\n // isRecording always returns false for NonRecordingSpan.\n isRecording() {\n return false;\n }\n // By default does nothing\n recordException(_exception, _time) { }\n}\n//# sourceMappingURL=NonRecordingSpan.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9uUmVjb3JkaW5nU3Bhbi5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ2dFO0FBQ2hFO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ087QUFDUCw4QkFBOEIseUVBQW9CO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9uUmVjb3JkaW5nU3Bhbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IElOVkFMSURfU1BBTl9DT05URVhUIH0gZnJvbSAnLi9pbnZhbGlkLXNwYW4tY29uc3RhbnRzJztcbi8qKlxuICogVGhlIE5vblJlY29yZGluZ1NwYW4gaXMgdGhlIGRlZmF1bHQge0BsaW5rIFNwYW59IHRoYXQgaXMgdXNlZCB3aGVuIG5vIFNwYW5cbiAqIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZS4gQWxsIG9wZXJhdGlvbnMgYXJlIG5vLW9wIGluY2x1ZGluZyBjb250ZXh0XG4gKiBwcm9wYWdhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vblJlY29yZGluZ1NwYW4ge1xuICAgIGNvbnN0cnVjdG9yKHNwYW5Db250ZXh0ID0gSU5WQUxJRF9TUEFOX0NPTlRFWFQpIHtcbiAgICAgICAgdGhpcy5fc3BhbkNvbnRleHQgPSBzcGFuQ29udGV4dDtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIFNwYW5Db250ZXh0LlxuICAgIHNwYW5Db250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3BhbkNvbnRleHQ7XG4gICAgfVxuICAgIC8vIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nXG4gICAgc2V0QXR0cmlidXRlKF9rZXksIF92YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBzZXRBdHRyaWJ1dGVzKF9hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIGFkZEV2ZW50KF9uYW1lLCBfYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkTGluayhfbGluaykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkTGlua3MoX2xpbmtzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIHNldFN0YXR1cyhfc3RhdHVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIHVwZGF0ZU5hbWUoX25hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nXG4gICAgZW5kKF9lbmRUaW1lKSB7IH1cbiAgICAvLyBpc1JlY29yZGluZyBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgTm9uUmVjb3JkaW5nU3Bhbi5cbiAgICBpc1JlY29yZGluZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIHJlY29yZEV4Y2VwdGlvbihfZXhjZXB0aW9uLCBfdGltZSkgeyB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25SZWNvcmRpbmdTcGFuLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js": +/*!***********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js ***! + \***********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopTracer: () => (/* binding */ NoopTracer)\n/* harmony export */ });\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/* harmony import */ var _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../trace/context-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\");\n/* harmony import */ var _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NonRecordingSpan */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\");\n/* harmony import */ var _spancontext_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./spancontext-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\nconst contextApi = _api_context__WEBPACK_IMPORTED_MODULE_0__.ContextAPI.getInstance();\n/**\n * No-op implementations of {@link Tracer}.\n */\nclass NoopTracer {\n // startSpan starts a noop span.\n startSpan(name, options, context = contextApi.active()) {\n const root = Boolean(options === null || options === void 0 ? void 0 : options.root);\n if (root) {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan();\n }\n const parentFromContext = context && (0,_trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getSpanContext)(context);\n if (isSpanContext(parentFromContext) &&\n (0,_spancontext_utils__WEBPACK_IMPORTED_MODULE_3__.isSpanContextValid)(parentFromContext)) {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan(parentFromContext);\n }\n else {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan();\n }\n }\n startActiveSpan(name, arg2, arg3, arg4) {\n let opts;\n let ctx;\n let fn;\n if (arguments.length < 2) {\n return;\n }\n else if (arguments.length === 2) {\n fn = arg2;\n }\n else if (arguments.length === 3) {\n opts = arg2;\n fn = arg3;\n }\n else {\n opts = arg2;\n ctx = arg3;\n fn = arg4;\n }\n const parentContext = ctx !== null && ctx !== void 0 ? ctx : contextApi.active();\n const span = this.startSpan(name, opts, parentContext);\n const contextWithSpanSet = (0,_trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.setSpan)(parentContext, span);\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n }\n}\nfunction isSpanContext(spanContext) {\n return (spanContext !== null &&\n typeof spanContext === 'object' &&\n 'spanId' in spanContext &&\n typeof spanContext['spanId'] === 'string' &&\n 'traceId' in spanContext &&\n typeof spanContext['traceId'] === 'string' &&\n 'traceFlags' in spanContext &&\n typeof spanContext['traceFlags'] === 'number');\n}\n//# sourceMappingURL=NoopTracer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9vcFRyYWNlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQzRDO0FBQ3FCO0FBQ1g7QUFDRztBQUN6RCxtQkFBbUIsb0RBQVU7QUFDN0I7QUFDQSw2QkFBNkIsYUFBYTtBQUMxQztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0RBQWdCO0FBQ3ZDO0FBQ0EsNkNBQTZDLG9FQUFjO0FBQzNEO0FBQ0EsWUFBWSxzRUFBa0I7QUFDOUIsdUJBQXVCLCtEQUFnQjtBQUN2QztBQUNBO0FBQ0EsdUJBQXVCLCtEQUFnQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDZEQUFPO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL05vb3BUcmFjZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgZ2V0U3BhbkNvbnRleHQsIHNldFNwYW4gfSBmcm9tICcuLi90cmFjZS9jb250ZXh0LXV0aWxzJztcbmltcG9ydCB7IE5vblJlY29yZGluZ1NwYW4gfSBmcm9tICcuL05vblJlY29yZGluZ1NwYW4nO1xuaW1wb3J0IHsgaXNTcGFuQ29udGV4dFZhbGlkIH0gZnJvbSAnLi9zcGFuY29udGV4dC11dGlscyc7XG5jb25zdCBjb250ZXh0QXBpID0gQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpO1xuLyoqXG4gKiBOby1vcCBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIFRyYWNlcn0uXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wVHJhY2VyIHtcbiAgICAvLyBzdGFydFNwYW4gc3RhcnRzIGEgbm9vcCBzcGFuLlxuICAgIHN0YXJ0U3BhbihuYW1lLCBvcHRpb25zLCBjb250ZXh0ID0gY29udGV4dEFwaS5hY3RpdmUoKSkge1xuICAgICAgICBjb25zdCByb290ID0gQm9vbGVhbihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucm9vdCk7XG4gICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vblJlY29yZGluZ1NwYW4oKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRGcm9tQ29udGV4dCA9IGNvbnRleHQgJiYgZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmIChpc1NwYW5Db250ZXh0KHBhcmVudEZyb21Db250ZXh0KSAmJlxuICAgICAgICAgICAgaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudEZyb21Db250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKHBhcmVudEZyb21Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9uUmVjb3JkaW5nU3BhbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0QWN0aXZlU3BhbihuYW1lLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICAgIGxldCBvcHRzO1xuICAgICAgICBsZXQgY3R4O1xuICAgICAgICBsZXQgZm47XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGZuID0gYXJnMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGZuID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdHMgPSBhcmcyO1xuICAgICAgICAgICAgY3R4ID0gYXJnMztcbiAgICAgICAgICAgIGZuID0gYXJnNDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gY3R4ICE9PSBudWxsICYmIGN0eCAhPT0gdm9pZCAwID8gY3R4IDogY29udGV4dEFwaS5hY3RpdmUoKTtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuc3RhcnRTcGFuKG5hbWUsIG9wdHMsIHBhcmVudENvbnRleHQpO1xuICAgICAgICBjb25zdCBjb250ZXh0V2l0aFNwYW5TZXQgPSBzZXRTcGFuKHBhcmVudENvbnRleHQsIHNwYW4pO1xuICAgICAgICByZXR1cm4gY29udGV4dEFwaS53aXRoKGNvbnRleHRXaXRoU3BhblNldCwgZm4sIHVuZGVmaW5lZCwgc3Bhbik7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTcGFuQ29udGV4dChzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiAoc3BhbkNvbnRleHQgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNwYW5Db250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAnc3BhbklkJyBpbiBzcGFuQ29udGV4dCAmJlxuICAgICAgICB0eXBlb2Ygc3BhbkNvbnRleHRbJ3NwYW5JZCddID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAndHJhY2VJZCcgaW4gc3BhbkNvbnRleHQgJiZcbiAgICAgICAgdHlwZW9mIHNwYW5Db250ZXh0Wyd0cmFjZUlkJ10gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICd0cmFjZUZsYWdzJyBpbiBzcGFuQ29udGV4dCAmJlxuICAgICAgICB0eXBlb2Ygc3BhbkNvbnRleHRbJ3RyYWNlRmxhZ3MnXSA9PT0gJ251bWJlcicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcFRyYWNlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js": +/*!*******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js ***! + \*******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopTracerProvider: () => (/* binding */ NoopTracerProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopTracer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nclass NoopTracerProvider {\n getTracer(_name, _version, _options) {\n return new _NoopTracer__WEBPACK_IMPORTED_MODULE_0__.NoopTracer();\n }\n}\n//# sourceMappingURL=NoopTracerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9vcFRyYWNlclByb3ZpZGVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDMEM7QUFDMUM7QUFDQSw2QkFBNkIsc0JBQXNCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLG1CQUFtQixtREFBVTtBQUM3QjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL05vb3BUcmFjZXJQcm92aWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5vb3BUcmFjZXIgfSBmcm9tICcuL05vb3BUcmFjZXInO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFRyYWNlclByb3ZpZGVyfSB3aGljaCByZXR1cm5zIGFuIGltcG90ZW50XG4gKiBUcmFjZXIgZm9yIGFsbCBjYWxscyB0byBgZ2V0VHJhY2VyYC5cbiAqXG4gKiBBbGwgb3BlcmF0aW9ucyBhcmUgbm8tb3AuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wVHJhY2VyUHJvdmlkZXIge1xuICAgIGdldFRyYWNlcihfbmFtZSwgX3ZlcnNpb24sIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFRyYWNlcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vb3BUcmFjZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyTracer: () => (/* binding */ ProxyTracer)\n/* harmony export */ });\n/* harmony import */ var _NoopTracer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nconst NOOP_TRACER = new _NoopTracer__WEBPACK_IMPORTED_MODULE_0__.NoopTracer();\n/**\n * Proxy tracer provided by the proxy tracer provider\n *\n * @since 1.0.0\n */\nclass ProxyTracer {\n constructor(provider, name, version, options) {\n this._provider = provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n startSpan(name, options, context) {\n return this._getTracer().startSpan(name, options, context);\n }\n startActiveSpan(_name, _options, _context, _fn) {\n const tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n }\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n _getTracer() {\n if (this._delegate) {\n return this._delegate;\n }\n const tracer = this._provider.getDelegateTracer(this.name, this.version, this.options);\n if (!tracer) {\n return NOOP_TRACER;\n }\n this._delegate = tracer;\n return this._delegate;\n }\n}\n//# sourceMappingURL=ProxyTracer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvUHJveHlUcmFjZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUMwQztBQUMxQyx3QkFBd0IsbURBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9Qcm94eVRyYWNlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5vb3BUcmFjZXIgfSBmcm9tICcuL05vb3BUcmFjZXInO1xuY29uc3QgTk9PUF9UUkFDRVIgPSBuZXcgTm9vcFRyYWNlcigpO1xuLyoqXG4gKiBQcm94eSB0cmFjZXIgcHJvdmlkZWQgYnkgdGhlIHByb3h5IHRyYWNlciBwcm92aWRlclxuICpcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY2xhc3MgUHJveHlUcmFjZXIge1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVyLCBuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3Byb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIHN0YXJ0U3BhbihuYW1lLCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRUcmFjZXIoKS5zdGFydFNwYW4obmFtZSwgb3B0aW9ucywgY29udGV4dCk7XG4gICAgfVxuICAgIHN0YXJ0QWN0aXZlU3BhbihfbmFtZSwgX29wdGlvbnMsIF9jb250ZXh0LCBfZm4pIHtcbiAgICAgICAgY29uc3QgdHJhY2VyID0gdGhpcy5fZ2V0VHJhY2VyKCk7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRyYWNlci5zdGFydEFjdGl2ZVNwYW4sIHRyYWNlciwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGdldCBhIHRyYWNlciBmcm9tIHRoZSBwcm94eSB0cmFjZXIgcHJvdmlkZXIuXG4gICAgICogSWYgdGhlIHByb3h5IHRyYWNlciBwcm92aWRlciBoYXMgbm8gZGVsZWdhdGUsIHJldHVybiBhIG5vb3AgdHJhY2VyLlxuICAgICAqL1xuICAgIF9nZXRUcmFjZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYWNlciA9IHRoaXMuX3Byb3ZpZGVyLmdldERlbGVnYXRlVHJhY2VyKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAoIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuIE5PT1BfVFJBQ0VSO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gdHJhY2VyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlUcmFjZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js": +/*!********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js ***! + \********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyTracerProvider: () => (/* binding */ ProxyTracerProvider)\n/* harmony export */ });\n/* harmony import */ var _ProxyTracer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ProxyTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\");\n/* harmony import */ var _NoopTracerProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopTracerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\nconst NOOP_TRACER_PROVIDER = new _NoopTracerProvider__WEBPACK_IMPORTED_MODULE_0__.NoopTracerProvider();\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n *\n * @deprecated This will be removed in the next major version.\n * @since 1.0.0\n */\nclass ProxyTracerProvider {\n /**\n * Get a {@link ProxyTracer}\n */\n getTracer(name, version, options) {\n var _a;\n return ((_a = this.getDelegateTracer(name, version, options)) !== null && _a !== void 0 ? _a : new _ProxyTracer__WEBPACK_IMPORTED_MODULE_1__.ProxyTracer(this, name, version, options));\n }\n getDelegate() {\n var _a;\n return (_a = this._delegate) !== null && _a !== void 0 ? _a : NOOP_TRACER_PROVIDER;\n }\n /**\n * Set the delegate tracer provider\n */\n setDelegate(delegate) {\n this._delegate = delegate;\n }\n getDelegateTracer(name, version, options) {\n var _a;\n return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getTracer(name, version, options);\n }\n}\n//# sourceMappingURL=ProxyTracerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvUHJveHlUcmFjZXJQcm92aWRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUM0QztBQUNjO0FBQzFELGlDQUFpQyxtRUFBa0I7QUFDbkQ7QUFDQSxtQ0FBbUMsa0JBQWtCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsMkdBQTJHLHFEQUFXO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL1Byb3h5VHJhY2VyUHJvdmlkZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBQcm94eVRyYWNlciB9IGZyb20gJy4vUHJveHlUcmFjZXInO1xuaW1wb3J0IHsgTm9vcFRyYWNlclByb3ZpZGVyIH0gZnJvbSAnLi9Ob29wVHJhY2VyUHJvdmlkZXInO1xuY29uc3QgTk9PUF9UUkFDRVJfUFJPVklERVIgPSBuZXcgTm9vcFRyYWNlclByb3ZpZGVyKCk7XG4vKipcbiAqIFRyYWNlciBwcm92aWRlciB3aGljaCBwcm92aWRlcyB7QGxpbmsgUHJveHlUcmFjZXJ9cy5cbiAqXG4gKiBCZWZvcmUgYSBkZWxlZ2F0ZSBpcyBzZXQsIHRyYWNlcnMgcHJvdmlkZWQgYXJlIE5vT3AuXG4gKiAgIFdoZW4gYSBkZWxlZ2F0ZSBpcyBzZXQsIHRyYWNlcyBhcmUgcHJvdmlkZWQgZnJvbSB0aGUgZGVsZWdhdGUuXG4gKiAgIFdoZW4gYSBkZWxlZ2F0ZSBpcyBzZXQgYWZ0ZXIgdHJhY2VycyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZCxcbiAqICAgYWxsIHRyYWNlcnMgYWxyZWFkeSBwcm92aWRlZCB3aWxsIHVzZSB0aGUgcHJvdmlkZWQgZGVsZWdhdGUgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY2xhc3MgUHJveHlUcmFjZXJQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogR2V0IGEge0BsaW5rIFByb3h5VHJhY2VyfVxuICAgICAqL1xuICAgIGdldFRyYWNlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLmdldERlbGVnYXRlVHJhY2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgUHJveHlUcmFjZXIodGhpcywgbmFtZSwgdmVyc2lvbiwgb3B0aW9ucykpO1xuICAgIH1cbiAgICBnZXREZWxlZ2F0ZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IE5PT1BfVFJBQ0VSX1BST1ZJREVSO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlbGVnYXRlIHRyYWNlciBwcm92aWRlclxuICAgICAqL1xuICAgIHNldERlbGVnYXRlKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIGdldERlbGVnYXRlVHJhY2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUcmFjZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlUcmFjZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SamplingDecision: () => (/* binding */ SamplingDecision)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling decision that determines how a {@link Span} will be recorded\n * and collected.\n *\n * @since 1.0.0\n */\nvar SamplingDecision;\n(function (SamplingDecision) {\n /**\n * `Span.isRecording() === false`, span will not be recorded and all events\n * and attributes will be dropped.\n */\n SamplingDecision[SamplingDecision[\"NOT_RECORD\"] = 0] = \"NOT_RECORD\";\n /**\n * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}\n * MUST NOT be set.\n */\n SamplingDecision[SamplingDecision[\"RECORD\"] = 1] = \"RECORD\";\n /**\n * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}\n * MUST be set.\n */\n SamplingDecision[SamplingDecision[\"RECORD_AND_SAMPLED\"] = 2] = \"RECORD_AND_SAMPLED\";\n})(SamplingDecision || (SamplingDecision = {}));\n//# sourceMappingURL=SamplingResult.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvU2FtcGxpbmdSZXN1bHQuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxZQUFZO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRDQUE0QztBQUM3QyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvU2FtcGxpbmdSZXN1bHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSB0aGUgb25lIGRlY2xhcmVkIGluIEBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlIGluc3RlYWQuXG4gKiBBIHNhbXBsaW5nIGRlY2lzaW9uIHRoYXQgZGV0ZXJtaW5lcyBob3cgYSB7QGxpbmsgU3Bhbn0gd2lsbCBiZSByZWNvcmRlZFxuICogYW5kIGNvbGxlY3RlZC5cbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IHZhciBTYW1wbGluZ0RlY2lzaW9uO1xuKGZ1bmN0aW9uIChTYW1wbGluZ0RlY2lzaW9uKSB7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gZmFsc2VgLCBzcGFuIHdpbGwgbm90IGJlIHJlY29yZGVkIGFuZCBhbGwgZXZlbnRzXG4gICAgICogYW5kIGF0dHJpYnV0ZXMgd2lsbCBiZSBkcm9wcGVkLlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIk5PVF9SRUNPUkRcIl0gPSAwXSA9IFwiTk9UX1JFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgLCBidXQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBOT1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRFwiXSA9IDFdID0gXCJSRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCBBTkQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEX0FORF9TQU1QTEVEXCJdID0gMl0gPSBcIlJFQ09SRF9BTkRfU0FNUExFRFwiO1xufSkoU2FtcGxpbmdEZWNpc2lvbiB8fCAoU2FtcGxpbmdEZWNpc2lvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TYW1wbGluZ1Jlc3VsdC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js": +/*!**************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js ***! + \**************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deleteSpan: () => (/* binding */ deleteSpan),\n/* harmony export */ getActiveSpan: () => (/* binding */ getActiveSpan),\n/* harmony export */ getSpan: () => (/* binding */ getSpan),\n/* harmony export */ getSpanContext: () => (/* binding */ getSpanContext),\n/* harmony export */ setSpan: () => (/* binding */ setSpan),\n/* harmony export */ setSpanContext: () => (/* binding */ setSpanContext)\n/* harmony export */ });\n/* harmony import */ var _context_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../context/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/* harmony import */ var _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./NonRecordingSpan */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\");\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n/**\n * span key\n */\nconst SPAN_KEY = (0,_context_context__WEBPACK_IMPORTED_MODULE_0__.createContextKey)('OpenTelemetry Context Key SPAN');\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nfunction getSpan(context) {\n return context.getValue(SPAN_KEY) || undefined;\n}\n/**\n * Gets the span from the current context, if one exists.\n */\nfunction getActiveSpan() {\n return getSpan(_api_context__WEBPACK_IMPORTED_MODULE_1__.ContextAPI.getInstance().active());\n}\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nfunction setSpan(context, span) {\n return context.setValue(SPAN_KEY, span);\n}\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nfunction deleteSpan(context) {\n return context.deleteValue(SPAN_KEY);\n}\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nfunction setSpanContext(context, spanContext) {\n return setSpan(context, new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_2__.NonRecordingSpan(spanContext));\n}\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nfunction getSpanContext(context) {\n var _a;\n return (_a = getSpan(context)) === null || _a === void 0 ? void 0 : _a.spanContext();\n}\n//# sourceMappingURL=context-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvY29udGV4dC11dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNzRDtBQUNBO0FBQ1Y7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtFQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxtQkFBbUIsb0RBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGdDQUFnQywrREFBZ0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvY29udGV4dC11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRLZXkgfSBmcm9tICcuLi9jb250ZXh0L2NvbnRleHQnO1xuaW1wb3J0IHsgTm9uUmVjb3JkaW5nU3BhbiB9IGZyb20gJy4vTm9uUmVjb3JkaW5nU3Bhbic7XG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuLyoqXG4gKiBzcGFuIGtleVxuICovXG5jb25zdCBTUEFOX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoJ09wZW5UZWxlbWV0cnkgQ29udGV4dCBLZXkgU1BBTicpO1xuLyoqXG4gKiBSZXR1cm4gdGhlIHNwYW4gaWYgb25lIGV4aXN0c1xuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gZ2V0IHNwYW4gZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhbihjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFsdWUoU1BBTl9LRVkpIHx8IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgc3BhbiBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGlmIG9uZSBleGlzdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVTcGFuKCkge1xuICAgIHJldHVybiBnZXRTcGFuKENvbnRleHRBUEkuZ2V0SW5zdGFuY2UoKS5hY3RpdmUoKSk7XG59XG4vKipcbiAqIFNldCB0aGUgc3BhbiBvbiBhIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIHVzZSBhcyBwYXJlbnRcbiAqIEBwYXJhbSBzcGFuIHNwYW4gdG8gc2V0IGFjdGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3Bhbihjb250ZXh0LCBzcGFuKSB7XG4gICAgcmV0dXJuIGNvbnRleHQuc2V0VmFsdWUoU1BBTl9LRVksIHNwYW4pO1xufVxuLyoqXG4gKiBSZW1vdmUgY3VycmVudCBzcGFuIHN0b3JlZCBpbiB0aGUgY29udGV4dFxuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gZGVsZXRlIHNwYW4gZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlU3Bhbihjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZGVsZXRlVmFsdWUoU1BBTl9LRVkpO1xufVxuLyoqXG4gKiBXcmFwIHNwYW4gY29udGV4dCBpbiBhIE5vb3BTcGFuIGFuZCBzZXQgYXMgc3BhbiBpbiBhIG5ld1xuICogY29udGV4dFxuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gc2V0IGFjdGl2ZSBzcGFuIG9uXG4gKiBAcGFyYW0gc3BhbkNvbnRleHQgc3BhbiBjb250ZXh0IHRvIGJlIHdyYXBwZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNwYW5Db250ZXh0KGNvbnRleHQsIHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFNwYW4oY29udGV4dCwgbmV3IE5vblJlY29yZGluZ1NwYW4oc3BhbkNvbnRleHQpKTtcbn1cbi8qKlxuICogR2V0IHRoZSBzcGFuIGNvbnRleHQgb2YgdGhlIHNwYW4gaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gZ2V0IHZhbHVlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFuQ29udGV4dChjb250ZXh0KSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBnZXRTcGFuKGNvbnRleHQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3BhbkNvbnRleHQoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js": +/*!*************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js ***! + \*************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TraceStateImpl: () => (/* binding */ TraceStateImpl)\n/* harmony export */ });\n/* harmony import */ var _tracestate_validators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tracestate-validators */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nconst MAX_TRACE_STATE_ITEMS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\nconst LIST_MEMBERS_SEPARATOR = ',';\nconst LIST_MEMBER_KEY_VALUE_SPLITTER = '=';\n/**\n * TraceState must be a class and not a simple object type because of the spec\n * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).\n *\n * Here is the list of allowed mutations:\n * - New key-value pair should be added into the beginning of the list\n * - The value of any key can be updated. Modified keys MUST be moved to the\n * beginning of the list.\n */\nclass TraceStateImpl {\n constructor(rawTraceState) {\n this._internalState = new Map();\n if (rawTraceState)\n this._parse(rawTraceState);\n }\n set(key, value) {\n // TODO: Benchmark the different approaches(map vs list) and\n // use the faster one.\n const traceState = this._clone();\n if (traceState._internalState.has(key)) {\n traceState._internalState.delete(key);\n }\n traceState._internalState.set(key, value);\n return traceState;\n }\n unset(key) {\n const traceState = this._clone();\n traceState._internalState.delete(key);\n return traceState;\n }\n get(key) {\n return this._internalState.get(key);\n }\n serialize() {\n return (Array.from(this._internalState.keys())\n // Use reduceRight() because keys are stored in reverse insertion order.\n .reduceRight((agg, key) => {\n agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + this.get(key));\n return agg;\n }, [])\n .join(LIST_MEMBERS_SEPARATOR));\n }\n _parse(rawTraceState) {\n if (rawTraceState.length > MAX_TRACE_STATE_LEN)\n return;\n this._internalState = rawTraceState\n .split(LIST_MEMBERS_SEPARATOR)\n // Use reduceRight() so new keys (.set(...)) will be placed at the beginning\n .reduceRight((agg, part) => {\n const listMember = part.trim(); // Optional Whitespace (OWS) handling\n const i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);\n if (i !== -1) {\n const key = listMember.slice(0, i);\n const value = listMember.slice(i + 1, part.length);\n if ((0,_tracestate_validators__WEBPACK_IMPORTED_MODULE_0__.validateKey)(key) && (0,_tracestate_validators__WEBPACK_IMPORTED_MODULE_0__.validateValue)(value)) {\n agg.set(key, value);\n }\n else {\n // TODO: Consider to add warning log\n }\n }\n return agg;\n }, new Map());\n // Because of the reverse() requirement, trunc must be done after map is created\n if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {\n this._internalState = new Map(Array.from(this._internalState.entries())\n .reverse() // Use reverse same as original tracestate parse chain\n .slice(0, MAX_TRACE_STATE_ITEMS));\n }\n }\n // @ts-expect-error TS6133 Accessed in tests only.\n _keys() {\n return Array.from(this._internalState.keys()).reverse();\n }\n _clone() {\n const traceState = new TraceStateImpl();\n traceState._internalState = new Map(this._internalState);\n return traceState;\n }\n}\n//# sourceMappingURL=tracestate-impl.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdHJhY2VzdGF0ZS1pbXBsLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1FQUFXLFNBQVMscUVBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9pbnRlcm5hbC90cmFjZXN0YXRlLWltcGwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyB2YWxpZGF0ZUtleSwgdmFsaWRhdGVWYWx1ZSB9IGZyb20gJy4vdHJhY2VzdGF0ZS12YWxpZGF0b3JzJztcbmNvbnN0IE1BWF9UUkFDRV9TVEFURV9JVEVNUyA9IDMyO1xuY29uc3QgTUFYX1RSQUNFX1NUQVRFX0xFTiA9IDUxMjtcbmNvbnN0IExJU1RfTUVNQkVSU19TRVBBUkFUT1IgPSAnLCc7XG5jb25zdCBMSVNUX01FTUJFUl9LRVlfVkFMVUVfU1BMSVRURVIgPSAnPSc7XG4vKipcbiAqIFRyYWNlU3RhdGUgbXVzdCBiZSBhIGNsYXNzIGFuZCBub3QgYSBzaW1wbGUgb2JqZWN0IHR5cGUgYmVjYXVzZSBvZiB0aGUgc3BlY1xuICogcmVxdWlyZW1lbnQgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0LyN0cmFjZXN0YXRlLWZpZWxkKS5cbiAqXG4gKiBIZXJlIGlzIHRoZSBsaXN0IG9mIGFsbG93ZWQgbXV0YXRpb25zOlxuICogLSBOZXcga2V5LXZhbHVlIHBhaXIgc2hvdWxkIGJlIGFkZGVkIGludG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuICogLSBUaGUgdmFsdWUgb2YgYW55IGtleSBjYW4gYmUgdXBkYXRlZC4gTW9kaWZpZWQga2V5cyBNVVNUIGJlIG1vdmVkIHRvIHRoZVxuICogYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICovXG5leHBvcnQgY2xhc3MgVHJhY2VTdGF0ZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKHJhd1RyYWNlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxTdGF0ZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKHJhd1RyYWNlU3RhdGUpXG4gICAgICAgICAgICB0aGlzLl9wYXJzZShyYXdUcmFjZVN0YXRlKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gVE9ETzogQmVuY2htYXJrIHRoZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyhtYXAgdnMgbGlzdCkgYW5kXG4gICAgICAgIC8vIHVzZSB0aGUgZmFzdGVyIG9uZS5cbiAgICAgICAgY29uc3QgdHJhY2VTdGF0ZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGlmICh0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJhY2VTdGF0ZTtcbiAgICB9XG4gICAgdW5zZXQoa2V5KSB7XG4gICAgICAgIGNvbnN0IHRyYWNlU3RhdGUgPSB0aGlzLl9jbG9uZSgpO1xuICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmRlbGV0ZShrZXkpO1xuICAgICAgICByZXR1cm4gdHJhY2VTdGF0ZTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxTdGF0ZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gKEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpXG4gICAgICAgICAgICAvLyBVc2UgcmVkdWNlUmlnaHQoKSBiZWNhdXNlIGtleXMgYXJlIHN0b3JlZCBpbiByZXZlcnNlIGluc2VydGlvbiBvcmRlci5cbiAgICAgICAgICAgIC5yZWR1Y2VSaWdodCgoYWdnLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGFnZy5wdXNoKGtleSArIExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUiArIHRoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIGFnZztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuam9pbihMSVNUX01FTUJFUlNfU0VQQVJBVE9SKSk7XG4gICAgfVxuICAgIF9wYXJzZShyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlLmxlbmd0aCA+IE1BWF9UUkFDRV9TVEFURV9MRU4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSByYXdUcmFjZVN0YXRlXG4gICAgICAgICAgICAuc3BsaXQoTElTVF9NRU1CRVJTX1NFUEFSQVRPUilcbiAgICAgICAgICAgIC8vIFVzZSByZWR1Y2VSaWdodCgpIHNvIG5ldyBrZXlzICguc2V0KC4uLikpIHdpbGwgYmUgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgICAgICAgIC5yZWR1Y2VSaWdodCgoYWdnLCBwYXJ0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0TWVtYmVyID0gcGFydC50cmltKCk7IC8vIE9wdGlvbmFsIFdoaXRlc3BhY2UgKE9XUykgaGFuZGxpbmdcbiAgICAgICAgICAgIGNvbnN0IGkgPSBsaXN0TWVtYmVyLmluZGV4T2YoTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSKTtcbiAgICAgICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGxpc3RNZW1iZXIuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsaXN0TWVtYmVyLnNsaWNlKGkgKyAxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlS2V5KGtleSkgJiYgdmFsaWRhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdnLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIHRvIGFkZCB3YXJuaW5nIGxvZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhZ2c7XG4gICAgICAgIH0sIG5ldyBNYXAoKSk7XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIHJldmVyc2UoKSByZXF1aXJlbWVudCwgdHJ1bmMgbXVzdCBiZSBkb25lIGFmdGVyIG1hcCBpcyBjcmVhdGVkXG4gICAgICAgIGlmICh0aGlzLl9pbnRlcm5hbFN0YXRlLnNpemUgPiBNQVhfVFJBQ0VfU1RBVEVfSVRFTVMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5lbnRyaWVzKCkpXG4gICAgICAgICAgICAgICAgLnJldmVyc2UoKSAvLyBVc2UgcmV2ZXJzZSBzYW1lIGFzIG9yaWdpbmFsIHRyYWNlc3RhdGUgcGFyc2UgY2hhaW5cbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgTUFYX1RSQUNFX1NUQVRFX0lURU1TKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUUzYxMzMgQWNjZXNzZWQgaW4gdGVzdHMgb25seS5cbiAgICBfa2V5cygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgX2Nsb25lKCkge1xuICAgICAgICBjb25zdCB0cmFjZVN0YXRlID0gbmV3IFRyYWNlU3RhdGVJbXBsKCk7XG4gICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKHRoaXMuX2ludGVybmFsU3RhdGUpO1xuICAgICAgICByZXR1cm4gdHJhY2VTdGF0ZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZXN0YXRlLWltcGwuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js": +/*!*******************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js ***! + \*******************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ validateKey: () => (/* binding */ validateKey),\n/* harmony export */ validateValue: () => (/* binding */ validateValue)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nconst VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';\nconst VALID_KEY = `[a-z]${VALID_KEY_CHAR_RANGE}{0,255}`;\nconst VALID_VENDOR_KEY = `[a-z0-9]${VALID_KEY_CHAR_RANGE}{0,240}@[a-z]${VALID_KEY_CHAR_RANGE}{0,13}`;\nconst VALID_KEY_REGEX = new RegExp(`^(?:${VALID_KEY}|${VALID_VENDOR_KEY})$`);\nconst VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;\nconst INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;\n/**\n * Key is opaque string up to 256 characters printable. It MUST begin with a\n * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,\n * underscores _, dashes -, asterisks *, and forward slashes /.\n * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the\n * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.\n * see https://www.w3.org/TR/trace-context/#key\n */\nfunction validateKey(key) {\n return VALID_KEY_REGEX.test(key);\n}\n/**\n * Value is opaque string up to 256 characters printable ASCII RFC0020\n * characters (i.e., the range 0x20 to 0x7E) except comma , and =.\n */\nfunction validateValue(value) {\n return (VALID_VALUE_BASE_REGEX.test(value) &&\n !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value));\n}\n//# sourceMappingURL=tracestate-validators.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdHJhY2VzdGF0ZS12YWxpZGF0b3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixzQkFBc0IsTUFBTTtBQUN0RCxvQ0FBb0Msc0JBQXNCLE1BQU0sUUFBUSxzQkFBc0IsS0FBSztBQUNuRywwQ0FBMEMsVUFBVSxHQUFHLGlCQUFpQjtBQUN4RSx1Q0FBdUMsTUFBTTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL2ludGVybmFsL3RyYWNlc3RhdGUtdmFsaWRhdG9ycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IFZBTElEX0tFWV9DSEFSX1JBTkdFID0gJ1tfMC05YS16LSovXSc7XG5jb25zdCBWQUxJRF9LRVkgPSBgW2Etel0ke1ZBTElEX0tFWV9DSEFSX1JBTkdFfXswLDI1NX1gO1xuY29uc3QgVkFMSURfVkVORE9SX0tFWSA9IGBbYS16MC05XSR7VkFMSURfS0VZX0NIQVJfUkFOR0V9ezAsMjQwfUBbYS16XSR7VkFMSURfS0VZX0NIQVJfUkFOR0V9ezAsMTN9YDtcbmNvbnN0IFZBTElEX0tFWV9SRUdFWCA9IG5ldyBSZWdFeHAoYF4oPzoke1ZBTElEX0tFWX18JHtWQUxJRF9WRU5ET1JfS0VZfSkkYCk7XG5jb25zdCBWQUxJRF9WQUxVRV9CQVNFX1JFR0VYID0gL15bIC1+XXswLDI1NX1bIS1+XSQvO1xuY29uc3QgSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWCA9IC8sfD0vO1xuLyoqXG4gKiBLZXkgaXMgb3BhcXVlIHN0cmluZyB1cCB0byAyNTYgY2hhcmFjdGVycyBwcmludGFibGUuIEl0IE1VU1QgYmVnaW4gd2l0aCBhXG4gKiBsb3dlcmNhc2UgbGV0dGVyLCBhbmQgY2FuIG9ubHkgY29udGFpbiBsb3dlcmNhc2UgbGV0dGVycyBhLXosIGRpZ2l0cyAwLTksXG4gKiB1bmRlcnNjb3JlcyBfLCBkYXNoZXMgLSwgYXN0ZXJpc2tzICosIGFuZCBmb3J3YXJkIHNsYXNoZXMgLy5cbiAqIEZvciBtdWx0aS10ZW5hbnQgdmVuZG9yIHNjZW5hcmlvcywgYW4gYXQgc2lnbiAoQCkgY2FuIGJlIHVzZWQgdG8gcHJlZml4IHRoZVxuICogdmVuZG9yIG5hbWUuIFZlbmRvcnMgU0hPVUxEIHNldCB0aGUgdGVuYW50IElEIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleS5cbiAqIHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8ja2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUtleShrZXkpIHtcbiAgICByZXR1cm4gVkFMSURfS0VZX1JFR0VYLnRlc3Qoa2V5KTtcbn1cbi8qKlxuICogVmFsdWUgaXMgb3BhcXVlIHN0cmluZyB1cCB0byAyNTYgY2hhcmFjdGVycyBwcmludGFibGUgQVNDSUkgUkZDMDAyMFxuICogY2hhcmFjdGVycyAoaS5lLiwgdGhlIHJhbmdlIDB4MjAgdG8gMHg3RSkgZXhjZXB0IGNvbW1hICwgYW5kID0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChWQUxJRF9WQUxVRV9CQVNFX1JFR0VYLnRlc3QodmFsdWUpICYmXG4gICAgICAgICFJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYLnRlc3QodmFsdWUpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNlc3RhdGUtdmFsaWRhdG9ycy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createTraceState: () => (/* binding */ createTraceState)\n/* harmony export */ });\n/* harmony import */ var _tracestate_impl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tracestate-impl */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @since 1.1.0\n */\nfunction createTraceState(rawTraceState) {\n return new _tracestate_impl__WEBPACK_IMPORTED_MODULE_0__.TraceStateImpl(rawTraceState);\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdXRpbHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDTztBQUNQLGVBQWUsNERBQWM7QUFDN0I7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBUcmFjZVN0YXRlSW1wbCB9IGZyb20gJy4vdHJhY2VzdGF0ZS1pbXBsJztcbi8qKlxuICogQHNpbmNlIDEuMS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFjZVN0YXRlKHJhd1RyYWNlU3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRyYWNlU3RhdGVJbXBsKHJhd1RyYWNlU3RhdGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js": +/*!***********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js ***! + \***********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ INVALID_SPANID: () => (/* binding */ INVALID_SPANID),\n/* harmony export */ INVALID_SPAN_CONTEXT: () => (/* binding */ INVALID_SPAN_CONTEXT),\n/* harmony export */ INVALID_TRACEID: () => (/* binding */ INVALID_TRACEID)\n/* harmony export */ });\n/* harmony import */ var _trace_flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./trace_flags */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @since 1.0.0\n */\nconst INVALID_SPANID = '0000000000000000';\n/**\n * @since 1.0.0\n */\nconst INVALID_TRACEID = '00000000000000000000000000000000';\n/**\n * @since 1.0.0\n */\nconst INVALID_SPAN_CONTEXT = {\n traceId: INVALID_TRACEID,\n spanId: INVALID_SPANID,\n traceFlags: _trace_flags__WEBPACK_IMPORTED_MODULE_0__.TraceFlags.NONE,\n};\n//# sourceMappingURL=invalid-span-constants.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW52YWxpZC1zcGFuLWNvbnN0YW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLGdCQUFnQixvREFBVTtBQUMxQjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9pbnZhbGlkLXNwYW4tY29uc3RhbnRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVHJhY2VGbGFncyB9IGZyb20gJy4vdHJhY2VfZmxhZ3MnO1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IElOVkFMSURfU1BBTklEID0gJzAwMDAwMDAwMDAwMDAwMDAnO1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IElOVkFMSURfVFJBQ0VJRCA9ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY29uc3QgSU5WQUxJRF9TUEFOX0NPTlRFWFQgPSB7XG4gICAgdHJhY2VJZDogSU5WQUxJRF9UUkFDRUlELFxuICAgIHNwYW5JZDogSU5WQUxJRF9TUEFOSUQsXG4gICAgdHJhY2VGbGFnczogVHJhY2VGbGFncy5OT05FLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludmFsaWQtc3Bhbi1jb25zdGFudHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpanKind: () => (/* binding */ SpanKind)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @since 1.0.0\n */\nvar SpanKind;\n(function (SpanKind) {\n /** Default value. Indicates that the span is used internally. */\n SpanKind[SpanKind[\"INTERNAL\"] = 0] = \"INTERNAL\";\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SpanKind[SpanKind[\"SERVER\"] = 1] = \"SERVER\";\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n SpanKind[SpanKind[\"CLIENT\"] = 2] = \"CLIENT\";\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind[\"PRODUCER\"] = 3] = \"PRODUCER\";\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind[\"CONSUMER\"] = 4] = \"CONSUMER\";\n})(SpanKind || (SpanKind = {}));\n//# sourceMappingURL=span_kind.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3Bhbl9raW5kLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRCQUE0QjtBQUM3QiIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3Bhbl9raW5kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IHZhciBTcGFuS2luZDtcbihmdW5jdGlvbiAoU3BhbktpbmQpIHtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZS4gSW5kaWNhdGVzIHRoYXQgdGhlIHNwYW4gaXMgdXNlZCBpbnRlcm5hbGx5LiAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiSU5URVJOQUxcIl0gPSAwXSA9IFwiSU5URVJOQUxcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBjb3ZlcnMgc2VydmVyLXNpZGUgaGFuZGxpbmcgb2YgYW4gUlBDIG9yIG90aGVyXG4gICAgICogcmVtb3RlIHJlcXVlc3QuXG4gICAgICovXG4gICAgU3BhbktpbmRbU3BhbktpbmRbXCJTRVJWRVJcIl0gPSAxXSA9IFwiU0VSVkVSXCI7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNwYW4gY292ZXJzIHRoZSBjbGllbnQtc2lkZSB3cmFwcGVyIGFyb3VuZCBhbiBSUEMgb3JcbiAgICAgKiBvdGhlciByZW1vdGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTcGFuS2luZFtTcGFuS2luZFtcIkNMSUVOVFwiXSA9IDJdID0gXCJDTElFTlRcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBkZXNjcmliZXMgcHJvZHVjZXIgc2VuZGluZyBhIG1lc3NhZ2UgdG8gYVxuICAgICAqIGJyb2tlci4gVW5saWtlIGNsaWVudCBhbmQgc2VydmVyLCB0aGVyZSBpcyBubyBkaXJlY3QgY3JpdGljYWwgcGF0aCBsYXRlbmN5XG4gICAgICogcmVsYXRpb25zaGlwIGJldHdlZW4gcHJvZHVjZXIgYW5kIGNvbnN1bWVyIHNwYW5zLlxuICAgICAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiUFJPRFVDRVJcIl0gPSAzXSA9IFwiUFJPRFVDRVJcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBkZXNjcmliZXMgY29uc3VtZXIgcmVjZWl2aW5nIGEgbWVzc2FnZSBmcm9tIGFcbiAgICAgKiBicm9rZXIuIFVubGlrZSBjbGllbnQgYW5kIHNlcnZlciwgdGhlcmUgaXMgbm8gZGlyZWN0IGNyaXRpY2FsIHBhdGggbGF0ZW5jeVxuICAgICAqIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHByb2R1Y2VyIGFuZCBjb25zdW1lciBzcGFucy5cbiAgICAgKi9cbiAgICBTcGFuS2luZFtTcGFuS2luZFtcIkNPTlNVTUVSXCJdID0gNF0gPSBcIkNPTlNVTUVSXCI7XG59KShTcGFuS2luZCB8fCAoU3BhbktpbmQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3Bhbl9raW5kLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isSpanContextValid: () => (/* binding */ isSpanContextValid),\n/* harmony export */ isValidSpanId: () => (/* binding */ isValidSpanId),\n/* harmony export */ isValidTraceId: () => (/* binding */ isValidTraceId),\n/* harmony export */ wrapSpanContext: () => (/* binding */ wrapSpanContext)\n/* harmony export */ });\n/* harmony import */ var _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invalid-span-constants */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\");\n/* harmony import */ var _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NonRecordingSpan */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n// Valid characters (0-9, a-f, A-F) are marked as 1.\nconst isHex = new Uint8Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,\n 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n]);\nfunction isValidHex(id, length) {\n // As of 1.9.0 the id was allowed to be a non-string value,\n // even though it was not possible in the types.\n if (typeof id !== 'string' || id.length !== length)\n return false;\n let r = 0;\n for (let i = 0; i < id.length; i += 4) {\n r +=\n (isHex[id.charCodeAt(i)] | 0) +\n (isHex[id.charCodeAt(i + 1)] | 0) +\n (isHex[id.charCodeAt(i + 2)] | 0) +\n (isHex[id.charCodeAt(i + 3)] | 0);\n }\n return r === length;\n}\n/**\n * @since 1.0.0\n */\nfunction isValidTraceId(traceId) {\n return isValidHex(traceId, 32) && traceId !== _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__.INVALID_TRACEID;\n}\n/**\n * @since 1.0.0\n */\nfunction isValidSpanId(spanId) {\n return isValidHex(spanId, 16) && spanId !== _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__.INVALID_SPANID;\n}\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n *\n * @since 1.0.0\n */\nfunction isSpanContextValid(spanContext) {\n return (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId));\n}\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nfunction wrapSpanContext(spanContext) {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan(spanContext);\n}\n//# sourceMappingURL=spancontext-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3BhbmNvbnRleHQtdXRpbHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDMkU7QUFDckI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxrREFBa0Qsb0VBQWU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGdEQUFnRCxtRUFBYztBQUM5RDtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1Qyx5QkFBeUIsbUJBQW1CO0FBQzVDO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQix3QkFBd0I7QUFDOUQ7QUFDQTtBQUNBLGlDQUFpQyxZQUFZO0FBQzdDO0FBQ087QUFDUCxlQUFlLCtEQUFnQjtBQUMvQjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9zcGFuY29udGV4dC11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IElOVkFMSURfU1BBTklELCBJTlZBTElEX1RSQUNFSUQgfSBmcm9tICcuL2ludmFsaWQtc3Bhbi1jb25zdGFudHMnO1xuaW1wb3J0IHsgTm9uUmVjb3JkaW5nU3BhbiB9IGZyb20gJy4vTm9uUmVjb3JkaW5nU3Bhbic7XG4vLyBWYWxpZCBjaGFyYWN0ZXJzICgwLTksIGEtZiwgQS1GKSBhcmUgbWFya2VkIGFzIDEuXG5jb25zdCBpc0hleCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsXG4gICAgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLFxuXSk7XG5mdW5jdGlvbiBpc1ZhbGlkSGV4KGlkLCBsZW5ndGgpIHtcbiAgICAvLyBBcyBvZiAxLjkuMCB0aGUgaWQgd2FzIGFsbG93ZWQgdG8gYmUgYSBub24tc3RyaW5nIHZhbHVlLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0IHdhcyBub3QgcG9zc2libGUgaW4gdGhlIHR5cGVzLlxuICAgIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnIHx8IGlkLmxlbmd0aCAhPT0gbGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgciArPVxuICAgICAgICAgICAgKGlzSGV4W2lkLmNoYXJDb2RlQXQoaSldIHwgMCkgK1xuICAgICAgICAgICAgICAgIChpc0hleFtpZC5jaGFyQ29kZUF0KGkgKyAxKV0gfCAwKSArXG4gICAgICAgICAgICAgICAgKGlzSGV4W2lkLmNoYXJDb2RlQXQoaSArIDIpXSB8IDApICtcbiAgICAgICAgICAgICAgICAoaXNIZXhbaWQuY2hhckNvZGVBdChpICsgMyldIHwgMCk7XG4gICAgfVxuICAgIHJldHVybiByID09PSBsZW5ndGg7XG59XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYWNlSWQodHJhY2VJZCkge1xuICAgIHJldHVybiBpc1ZhbGlkSGV4KHRyYWNlSWQsIDMyKSAmJiB0cmFjZUlkICE9PSBJTlZBTElEX1RSQUNFSUQ7XG59XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNwYW5JZChzcGFuSWQpIHtcbiAgICByZXR1cm4gaXNWYWxpZEhleChzcGFuSWQsIDE2KSAmJiBzcGFuSWQgIT09IElOVkFMSURfU1BBTklEO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB7QGxpbmsgU3BhbkNvbnRleHR9IGlzIHZhbGlkLlxuICogQHJldHVybiB0cnVlIGlmIHRoaXMge0BsaW5rIFNwYW5Db250ZXh0fSBpcyB2YWxpZC5cbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbkNvbnRleHRWYWxpZChzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiAoaXNWYWxpZFRyYWNlSWQoc3BhbkNvbnRleHQudHJhY2VJZCkgJiYgaXNWYWxpZFNwYW5JZChzcGFuQ29udGV4dC5zcGFuSWQpKTtcbn1cbi8qKlxuICogV3JhcCB0aGUgZ2l2ZW4ge0BsaW5rIFNwYW5Db250ZXh0fSBpbiBhIG5ldyBub24tcmVjb3JkaW5nIHtAbGluayBTcGFufVxuICpcbiAqIEBwYXJhbSBzcGFuQ29udGV4dCBzcGFuIGNvbnRleHQgdG8gYmUgd3JhcHBlZFxuICogQHJldHVybnMgYSBuZXcgbm9uLXJlY29yZGluZyB7QGxpbmsgU3Bhbn0gd2l0aCB0aGUgcHJvdmlkZWQgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcFNwYW5Db250ZXh0KHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKHNwYW5Db250ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYW5jb250ZXh0LXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js": +/*!*******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js ***! + \*******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpanStatusCode: () => (/* binding */ SpanStatusCode)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * An enumeration of status codes.\n *\n * @since 1.0.0\n */\nvar SpanStatusCode;\n(function (SpanStatusCode) {\n /**\n * The default status.\n */\n SpanStatusCode[SpanStatusCode[\"UNSET\"] = 0] = \"UNSET\";\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n SpanStatusCode[SpanStatusCode[\"OK\"] = 1] = \"OK\";\n /**\n * The operation contains an error.\n */\n SpanStatusCode[SpanStatusCode[\"ERROR\"] = 2] = \"ERROR\";\n})(SpanStatusCode || (SpanStatusCode = {}));\n//# sourceMappingURL=status.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3RhdHVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHdDQUF3QztBQUN6QyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3RhdHVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiBzdGF0dXMgY29kZXMuXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCB2YXIgU3BhblN0YXR1c0NvZGU7XG4oZnVuY3Rpb24gKFNwYW5TdGF0dXNDb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgc3RhdHVzLlxuICAgICAqL1xuICAgIFNwYW5TdGF0dXNDb2RlW1NwYW5TdGF0dXNDb2RlW1wiVU5TRVRcIl0gPSAwXSA9IFwiVU5TRVRcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIHZhbGlkYXRlZCBieSBhbiBBcHBsaWNhdGlvbiBkZXZlbG9wZXIgb3JcbiAgICAgKiBPcGVyYXRvciB0byBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAgICovXG4gICAgU3BhblN0YXR1c0NvZGVbU3BhblN0YXR1c0NvZGVbXCJPS1wiXSA9IDFdID0gXCJPS1wiO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcGVyYXRpb24gY29udGFpbnMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgU3BhblN0YXR1c0NvZGVbU3BhblN0YXR1c0NvZGVbXCJFUlJPUlwiXSA9IDJdID0gXCJFUlJPUlwiO1xufSkoU3BhblN0YXR1c0NvZGUgfHwgKFNwYW5TdGF0dXNDb2RlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0YXR1cy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TraceFlags: () => (/* binding */ TraceFlags)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @since 1.0.0\n */\nvar TraceFlags;\n(function (TraceFlags) {\n /** Represents no flag set. */\n TraceFlags[TraceFlags[\"NONE\"] = 0] = \"NONE\";\n /** Bit to represent whether trace is sampled in trace flags. */\n TraceFlags[TraceFlags[\"SAMPLED\"] = 1] = \"SAMPLED\";\n})(TraceFlags || (TraceFlags = {}));\n//# sourceMappingURL=trace_flags.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvdHJhY2VfZmxhZ3MuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxnQ0FBZ0M7QUFDakMiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL3RyYWNlX2ZsYWdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IHZhciBUcmFjZUZsYWdzO1xuKGZ1bmN0aW9uIChUcmFjZUZsYWdzKSB7XG4gICAgLyoqIFJlcHJlc2VudHMgbm8gZmxhZyBzZXQuICovXG4gICAgVHJhY2VGbGFnc1tUcmFjZUZsYWdzW1wiTk9ORVwiXSA9IDBdID0gXCJOT05FXCI7XG4gICAgLyoqIEJpdCB0byByZXByZXNlbnQgd2hldGhlciB0cmFjZSBpcyBzYW1wbGVkIGluIHRyYWNlIGZsYWdzLiAqL1xuICAgIFRyYWNlRmxhZ3NbVHJhY2VGbGFnc1tcIlNBTVBMRURcIl0gPSAxXSA9IFwiU0FNUExFRFwiO1xufSkoVHJhY2VGbGFncyB8fCAoVHJhY2VGbGFncyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZV9mbGFncy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js": +/*!**************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js ***! + \**************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VERSION: () => (/* binding */ VERSION)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// this is autogenerated file, see scripts/version-update.js\nconst VERSION = '1.9.1';\n//# sourceMappingURL=version.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3ZlcnNpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vLyB0aGlzIGlzIGF1dG9nZW5lcmF0ZWQgZmlsZSwgc2VlIHNjcmlwdHMvdmVyc2lvbi11cGRhdGUuanNcbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzEuOS4xJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/edge/index.js": +/*!******************************************************************************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/edge/index.js ***! + \******************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("var async_hooks__WEBPACK_IMPORTED_MODULE_1___namespace_cache;\nvar events__WEBPACK_IMPORTED_MODULE_2___namespace_cache;\n__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FetchInstrumentation: () => (/* binding */ te),\n/* harmony export */ OTLPHttpJsonTraceExporter: () => (/* binding */ Qt),\n/* harmony export */ OTLPHttpProtoTraceExporter: () => (/* binding */ Bt),\n/* harmony export */ registerOTel: () => (/* binding */ kT)\n/* harmony export */ });\n/* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @opentelemetry/api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\");\n/* harmony import */ var async_hooks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! async_hooks */ \"async_hooks\");\n/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! events */ \"events\");\n/* harmony import */ var _opentelemetry_api_logs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @opentelemetry/api-logs */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js\");\nif (globalThis.performance === undefined) {\n globalThis.performance = { timeOrigin: 0, now: () => Date.now() };\n }\nvar ku=Object.create;var xr=Object.defineProperty;var qu=Object.getOwnPropertyDescriptor;var Xu=Object.getOwnPropertyNames;var Ku=Object.getPrototypeOf,Wu=Object.prototype.hasOwnProperty;var li=(e=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(e,{get:(t,r)=>(typeof require<\"u\"?require:t)[r]}):e)(function(e){if(typeof require<\"u\")return require.apply(this,arguments);throw Error('Dynamic require of \"'+e+'\" is not supported')});var Dr=(e,t)=>()=>(e&&(t=e(e=0)),t);var _=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ge=(e,t,r,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let o of Xu(t))!Wu.call(e,o)&&o!==r&&xr(e,o,{get:()=>t[o],enumerable:!(n=qu(t,o))||n.enumerable});return e},z=(e,t,r)=>(ge(e,t,\"default\"),r&&ge(r,t,\"default\")),v=(e,t,r)=>(r=e!=null?ku(Ku(e)):{},ge(t||!e||!e.__esModule?xr(r,\"default\",{value:e,enumerable:!0}):r,e)),w=e=>ge(xr({},\"__esModule\",{value:!0}),e);var l={};var E=Dr(()=>{z(l,_opentelemetry_api__WEBPACK_IMPORTED_MODULE_0__)});var ie=_(ft=>{\"use strict\";Object.defineProperty(ft,\"__esModule\",{value:!0});ft.isTracingSuppressed=ft.unsuppressTracing=ft.suppressTracing=void 0;var Yu=(E(),w(l)),Ur=(0,Yu.createContextKey)(\"OpenTelemetry SDK Context Key SUPPRESS_TRACING\");function zu(e){return e.setValue(Ur,!0)}ft.suppressTracing=zu;function $u(e){return e.deleteValue(Ur)}ft.unsuppressTracing=$u;function Qu(e){return e.getValue(Ur)===!0}ft.isTracingSuppressed=Qu});var Br=_(B=>{\"use strict\";Object.defineProperty(B,\"__esModule\",{value:!0});B.BAGGAGE_MAX_TOTAL_LENGTH=B.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS=B.BAGGAGE_MAX_NAME_VALUE_PAIRS=B.BAGGAGE_HEADER=B.BAGGAGE_ITEMS_SEPARATOR=B.BAGGAGE_PROPERTIES_SEPARATOR=B.BAGGAGE_KEY_PAIR_SEPARATOR=void 0;B.BAGGAGE_KEY_PAIR_SEPARATOR=\"=\";B.BAGGAGE_PROPERTIES_SEPARATOR=\";\";B.BAGGAGE_ITEMS_SEPARATOR=\",\";B.BAGGAGE_HEADER=\"baggage\";B.BAGGAGE_MAX_NAME_VALUE_PAIRS=180;B.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS=4096;B.BAGGAGE_MAX_TOTAL_LENGTH=8192});var Vr=_(nt=>{\"use strict\";Object.defineProperty(nt,\"__esModule\",{value:!0});nt.parseKeyPairsIntoRecord=nt.parsePairKeyValue=nt.getKeyPairs=nt.serializeKeyPairs=void 0;var Ju=(E(),w(l)),Lt=Br();function Zu(e){return e.reduce((t,r)=>{let n=`${t}${t!==\"\"?Lt.BAGGAGE_ITEMS_SEPARATOR:\"\"}${r}`;return n.length>Lt.BAGGAGE_MAX_TOTAL_LENGTH?t:n},\"\")}nt.serializeKeyPairs=Zu;function tc(e){return e.getAllEntries().map(([t,r])=>{let n=`${encodeURIComponent(t)}=${encodeURIComponent(r.value)}`;return r.metadata!==void 0&&(n+=Lt.BAGGAGE_PROPERTIES_SEPARATOR+r.metadata.toString()),n})}nt.getKeyPairs=tc;function fi(e){let t=e.split(Lt.BAGGAGE_PROPERTIES_SEPARATOR);if(t.length<=0)return;let r=t.shift();if(!r)return;let n=r.indexOf(Lt.BAGGAGE_KEY_PAIR_SEPARATOR);if(n<=0)return;let o=decodeURIComponent(r.substring(0,n).trim()),i=decodeURIComponent(r.substring(n+1).trim()),a;return t.length>0&&(a=(0,Ju.baggageEntryMetadataFromString)(t.join(Lt.BAGGAGE_PROPERTIES_SEPARATOR))),{key:o,value:i,metadata:a}}nt.parsePairKeyValue=fi;function ec(e){return typeof e!=\"string\"||e.length===0?{}:e.split(Lt.BAGGAGE_ITEMS_SEPARATOR).map(t=>fi(t)).filter(t=>t!==void 0&&t.value.length>0).reduce((t,r)=>(t[r.key]=r.value,t),{})}nt.parseKeyPairsIntoRecord=ec});var pi=_(ye=>{\"use strict\";Object.defineProperty(ye,\"__esModule\",{value:!0});ye.W3CBaggagePropagator=void 0;var Gr=(E(),w(l)),rc=ie(),Pt=Br(),Hr=Vr(),Fr=class{inject(t,r,n){let o=Gr.propagation.getBaggage(t);if(!o||(0,rc.isTracingSuppressed)(t))return;let i=(0,Hr.getKeyPairs)(o).filter(u=>u.length<=Pt.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS).slice(0,Pt.BAGGAGE_MAX_NAME_VALUE_PAIRS),a=(0,Hr.serializeKeyPairs)(i);a.length>0&&n.set(r,Pt.BAGGAGE_HEADER,a)}extract(t,r,n){let o=n.get(r,Pt.BAGGAGE_HEADER),i=Array.isArray(o)?o.join(Pt.BAGGAGE_ITEMS_SEPARATOR):o;if(!i)return t;let a={};return i.length===0||(i.split(Pt.BAGGAGE_ITEMS_SEPARATOR).forEach(c=>{let s=(0,Hr.parsePairKeyValue)(c);if(s){let f={value:s.value};s.metadata&&(f.metadata=s.metadata),a[s.key]=f}}),Object.entries(a).length===0)?t:Gr.propagation.setBaggage(t,Gr.propagation.createBaggage(a))}fields(){return[Pt.BAGGAGE_HEADER]}};ye.W3CBaggagePropagator=Fr});var di=_(ve=>{\"use strict\";Object.defineProperty(ve,\"__esModule\",{value:!0});ve.AnchoredClock=void 0;var jr=class{constructor(t,r){this._monotonicClock=r,this._epochMillis=t.now(),this._performanceMillis=r.now()}now(){let t=this._monotonicClock.now()-this._performanceMillis;return this._epochMillis+t}};ve.AnchoredClock=jr});var Ti=_(pt=>{\"use strict\";Object.defineProperty(pt,\"__esModule\",{value:!0});pt.isAttributeValue=pt.isAttributeKey=pt.sanitizeAttributes=void 0;var _i=(E(),w(l));function nc(e){let t={};if(typeof e!=\"object\"||e==null)return t;for(let[r,n]of Object.entries(e)){if(!hi(r)){_i.diag.warn(`Invalid attribute key: ${r}`);continue}if(!Ei(n)){_i.diag.warn(`Invalid attribute value set for key: ${r}`);continue}Array.isArray(n)?t[r]=n.slice():t[r]=n}return t}pt.sanitizeAttributes=nc;function hi(e){return typeof e==\"string\"&&e.length>0}pt.isAttributeKey=hi;function Ei(e){return e==null?!0:Array.isArray(e)?ic(e):mi(e)}pt.isAttributeValue=Ei;function ic(e){let t;for(let r of e)if(r!=null){if(!t){if(mi(r)){t=typeof r;continue}return!1}if(typeof r!==t)return!1}return!0}function mi(e){switch(typeof e){case\"number\":case\"boolean\":case\"string\":return!0}return!1}});var kr=_(Ae=>{\"use strict\";Object.defineProperty(Ae,\"__esModule\",{value:!0});Ae.loggingErrorHandler=void 0;var oc=(E(),w(l));function sc(){return e=>{oc.diag.error(ac(e))}}Ae.loggingErrorHandler=sc;function ac(e){return typeof e==\"string\"?e:JSON.stringify(uc(e))}function uc(e){let t={},r=e;for(;r!==null;)Object.getOwnPropertyNames(r).forEach(n=>{if(t[n])return;let o=r[n];o&&(t[n]=String(o))}),r=Object.getPrototypeOf(r);return t}});var qr=_(Gt=>{\"use strict\";Object.defineProperty(Gt,\"__esModule\",{value:!0});Gt.globalErrorHandler=Gt.setGlobalErrorHandler=void 0;var cc=kr(),Si=(0,cc.loggingErrorHandler)();function lc(e){Si=e}Gt.setGlobalErrorHandler=lc;function fc(e){try{Si(e)}catch{}}Gt.globalErrorHandler=fc});var Xr=_(oe=>{\"use strict\";Object.defineProperty(oe,\"__esModule\",{value:!0});oe.TracesSamplerValues=void 0;var pc;(function(e){e.AlwaysOff=\"always_off\",e.AlwaysOn=\"always_on\",e.ParentBasedAlwaysOff=\"parentbased_always_off\",e.ParentBasedAlwaysOn=\"parentbased_always_on\",e.ParentBasedTraceIdRatio=\"parentbased_traceidratio\",e.TraceIdRatio=\"traceidratio\"})(pc=oe.TracesSamplerValues||(oe.TracesSamplerValues={}))});var Oe=_(Re=>{\"use strict\";Object.defineProperty(Re,\"__esModule\",{value:!0});Re._globalThis=void 0;Re._globalThis=typeof globalThis==\"object\"?globalThis:typeof self==\"object\"?self:typeof window==\"object\"?window:typeof global==\"object\"?global:{}});var be=_(L=>{\"use strict\";Object.defineProperty(L,\"__esModule\",{value:!0});L.getEnvWithoutDefaults=L.parseEnvironment=L.DEFAULT_ENVIRONMENT=L.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT=L.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT=L.DEFAULT_ATTRIBUTE_COUNT_LIMIT=L.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT=void 0;var dt=(E(),w(l)),dc=Xr(),_c=Oe(),hc=\",\",Ec=[\"OTEL_SDK_DISABLED\"];function mc(e){return Ec.indexOf(e)>-1}var Tc=[\"OTEL_BSP_EXPORT_TIMEOUT\",\"OTEL_BSP_MAX_EXPORT_BATCH_SIZE\",\"OTEL_BSP_MAX_QUEUE_SIZE\",\"OTEL_BSP_SCHEDULE_DELAY\",\"OTEL_BLRP_EXPORT_TIMEOUT\",\"OTEL_BLRP_MAX_EXPORT_BATCH_SIZE\",\"OTEL_BLRP_MAX_QUEUE_SIZE\",\"OTEL_BLRP_SCHEDULE_DELAY\",\"OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT\",\"OTEL_ATTRIBUTE_COUNT_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT\",\"OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT\",\"OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT\",\"OTEL_SPAN_EVENT_COUNT_LIMIT\",\"OTEL_SPAN_LINK_COUNT_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT\",\"OTEL_EXPORTER_OTLP_TIMEOUT\",\"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\",\"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\",\"OTEL_EXPORTER_OTLP_LOGS_TIMEOUT\",\"OTEL_EXPORTER_JAEGER_AGENT_PORT\"];function Sc(e){return Tc.indexOf(e)>-1}var gc=[\"OTEL_NO_PATCH_MODULES\",\"OTEL_PROPAGATORS\"];function yc(e){return gc.indexOf(e)>-1}L.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT=1/0;L.DEFAULT_ATTRIBUTE_COUNT_LIMIT=128;L.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT=128;L.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT=128;L.DEFAULT_ENVIRONMENT={OTEL_SDK_DISABLED:!1,CONTAINER_NAME:\"\",ECS_CONTAINER_METADATA_URI_V4:\"\",ECS_CONTAINER_METADATA_URI:\"\",HOSTNAME:\"\",KUBERNETES_SERVICE_HOST:\"\",NAMESPACE:\"\",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:\"\",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:\"\",OTEL_EXPORTER_JAEGER_PASSWORD:\"\",OTEL_EXPORTER_JAEGER_USER:\"\",OTEL_EXPORTER_OTLP_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_HEADERS:\"\",OTEL_EXPORTER_OTLP_TRACES_HEADERS:\"\",OTEL_EXPORTER_OTLP_METRICS_HEADERS:\"\",OTEL_EXPORTER_OTLP_LOGS_HEADERS:\"\",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:\"http://localhost:9411/api/v2/spans\",OTEL_LOG_LEVEL:dt.DiagLogLevel.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:[\"tracecontext\",\"baggage\"],OTEL_RESOURCE_ATTRIBUTES:\"\",OTEL_SERVICE_NAME:\"\",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:L.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,OTEL_ATTRIBUTE_COUNT_LIMIT:L.DEFAULT_ATTRIBUTE_COUNT_LIMIT,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:L.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:L.DEFAULT_ATTRIBUTE_COUNT_LIMIT,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:L.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:L.DEFAULT_ATTRIBUTE_COUNT_LIMIT,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:L.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:L.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT,OTEL_TRACES_EXPORTER:\"\",OTEL_TRACES_SAMPLER:dc.TracesSamplerValues.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:\"\",OTEL_LOGS_EXPORTER:\"\",OTEL_EXPORTER_OTLP_INSECURE:\"\",OTEL_EXPORTER_OTLP_TRACES_INSECURE:\"\",OTEL_EXPORTER_OTLP_METRICS_INSECURE:\"\",OTEL_EXPORTER_OTLP_LOGS_INSECURE:\"\",OTEL_EXPORTER_OTLP_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:\"cumulative\"};function vc(e,t,r){if(typeof r[e]>\"u\")return;let n=String(r[e]);t[e]=n.toLowerCase()===\"true\"}function Ac(e,t,r,n=-1/0,o=1/0){if(typeof r[e]<\"u\"){let i=Number(r[e]);isNaN(i)||(io?t[e]=o:t[e]=i)}}function Rc(e,t,r,n=hc){let o=r[e];typeof o==\"string\"&&(t[e]=o.split(n).map(i=>i.trim()))}var Oc={ALL:dt.DiagLogLevel.ALL,VERBOSE:dt.DiagLogLevel.VERBOSE,DEBUG:dt.DiagLogLevel.DEBUG,INFO:dt.DiagLogLevel.INFO,WARN:dt.DiagLogLevel.WARN,ERROR:dt.DiagLogLevel.ERROR,NONE:dt.DiagLogLevel.NONE};function bc(e,t,r){let n=r[e];if(typeof n==\"string\"){let o=Oc[n.toUpperCase()];o!=null&&(t[e]=o)}}function Kr(e){let t={};for(let r in L.DEFAULT_ENVIRONMENT){let n=r;switch(n){case\"OTEL_LOG_LEVEL\":bc(n,t,e);break;default:if(mc(n))vc(n,t,e);else if(Sc(n))Ac(n,t,e);else if(yc(n))Rc(n,t,e);else{let o=e[n];typeof o<\"u\"&&o!==null&&(t[n]=String(o))}}}return t}L.parseEnvironment=Kr;function Lc(){return typeof process<\"u\"&&process&&process.env?Kr(process.env):Kr(_c._globalThis)}L.getEnvWithoutDefaults=Lc});var yi=_(Le=>{\"use strict\";Object.defineProperty(Le,\"__esModule\",{value:!0});Le.getEnv=void 0;var gi=be(),Pc=Oe();function Ic(){let e=(0,gi.parseEnvironment)(Pc._globalThis);return Object.assign({},gi.DEFAULT_ENVIRONMENT,e)}Le.getEnv=Ic});var vi=_(Pe=>{\"use strict\";Object.defineProperty(Pe,\"__esModule\",{value:!0});Pe.hexToBase64=void 0;function Cc(e){let t=e.length,r=\"\";for(let n=0;n{\"use strict\";Object.defineProperty(Ce,\"__esModule\",{value:!0});Ce.RandomIdGenerator=void 0;var Nc=8,wc=16,Wr=class{constructor(){this.generateTraceId=Ai(wc),this.generateSpanId=Ai(Nc)}};Ce.RandomIdGenerator=Wr;var Ie=Array(32);function Ai(e){return function(){for(let r=0;r=58&&(Ie[r]+=39);return String.fromCharCode.apply(null,Ie.slice(0,e*2))}}});var Oi=_(Ne=>{\"use strict\";Object.defineProperty(Ne,\"__esModule\",{value:!0});Ne.otperformance=void 0;Ne.otperformance=performance});var Yr=_(we=>{\"use strict\";Object.defineProperty(we,\"__esModule\",{value:!0});we.VERSION=void 0;we.VERSION=\"1.19.0\"});var bi=_(A=>{\"use strict\";Object.defineProperty(A,\"__esModule\",{value:!0});A.MessageTypeValues=A.RpcGrpcStatusCodeValues=A.MessagingOperationValues=A.MessagingDestinationKindValues=A.HttpFlavorValues=A.NetHostConnectionSubtypeValues=A.NetHostConnectionTypeValues=A.NetTransportValues=A.FaasInvokedProviderValues=A.FaasDocumentOperationValues=A.FaasTriggerValues=A.DbCassandraConsistencyLevelValues=A.DbSystemValues=A.SemanticAttributes=void 0;A.SemanticAttributes={AWS_LAMBDA_INVOKED_ARN:\"aws.lambda.invoked_arn\",DB_SYSTEM:\"db.system\",DB_CONNECTION_STRING:\"db.connection_string\",DB_USER:\"db.user\",DB_JDBC_DRIVER_CLASSNAME:\"db.jdbc.driver_classname\",DB_NAME:\"db.name\",DB_STATEMENT:\"db.statement\",DB_OPERATION:\"db.operation\",DB_MSSQL_INSTANCE_NAME:\"db.mssql.instance_name\",DB_CASSANDRA_KEYSPACE:\"db.cassandra.keyspace\",DB_CASSANDRA_PAGE_SIZE:\"db.cassandra.page_size\",DB_CASSANDRA_CONSISTENCY_LEVEL:\"db.cassandra.consistency_level\",DB_CASSANDRA_TABLE:\"db.cassandra.table\",DB_CASSANDRA_IDEMPOTENCE:\"db.cassandra.idempotence\",DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT:\"db.cassandra.speculative_execution_count\",DB_CASSANDRA_COORDINATOR_ID:\"db.cassandra.coordinator.id\",DB_CASSANDRA_COORDINATOR_DC:\"db.cassandra.coordinator.dc\",DB_HBASE_NAMESPACE:\"db.hbase.namespace\",DB_REDIS_DATABASE_INDEX:\"db.redis.database_index\",DB_MONGODB_COLLECTION:\"db.mongodb.collection\",DB_SQL_TABLE:\"db.sql.table\",EXCEPTION_TYPE:\"exception.type\",EXCEPTION_MESSAGE:\"exception.message\",EXCEPTION_STACKTRACE:\"exception.stacktrace\",EXCEPTION_ESCAPED:\"exception.escaped\",FAAS_TRIGGER:\"faas.trigger\",FAAS_EXECUTION:\"faas.execution\",FAAS_DOCUMENT_COLLECTION:\"faas.document.collection\",FAAS_DOCUMENT_OPERATION:\"faas.document.operation\",FAAS_DOCUMENT_TIME:\"faas.document.time\",FAAS_DOCUMENT_NAME:\"faas.document.name\",FAAS_TIME:\"faas.time\",FAAS_CRON:\"faas.cron\",FAAS_COLDSTART:\"faas.coldstart\",FAAS_INVOKED_NAME:\"faas.invoked_name\",FAAS_INVOKED_PROVIDER:\"faas.invoked_provider\",FAAS_INVOKED_REGION:\"faas.invoked_region\",NET_TRANSPORT:\"net.transport\",NET_PEER_IP:\"net.peer.ip\",NET_PEER_PORT:\"net.peer.port\",NET_PEER_NAME:\"net.peer.name\",NET_HOST_IP:\"net.host.ip\",NET_HOST_PORT:\"net.host.port\",NET_HOST_NAME:\"net.host.name\",NET_HOST_CONNECTION_TYPE:\"net.host.connection.type\",NET_HOST_CONNECTION_SUBTYPE:\"net.host.connection.subtype\",NET_HOST_CARRIER_NAME:\"net.host.carrier.name\",NET_HOST_CARRIER_MCC:\"net.host.carrier.mcc\",NET_HOST_CARRIER_MNC:\"net.host.carrier.mnc\",NET_HOST_CARRIER_ICC:\"net.host.carrier.icc\",PEER_SERVICE:\"peer.service\",ENDUSER_ID:\"enduser.id\",ENDUSER_ROLE:\"enduser.role\",ENDUSER_SCOPE:\"enduser.scope\",THREAD_ID:\"thread.id\",THREAD_NAME:\"thread.name\",CODE_FUNCTION:\"code.function\",CODE_NAMESPACE:\"code.namespace\",CODE_FILEPATH:\"code.filepath\",CODE_LINENO:\"code.lineno\",HTTP_METHOD:\"http.method\",HTTP_URL:\"http.url\",HTTP_TARGET:\"http.target\",HTTP_HOST:\"http.host\",HTTP_SCHEME:\"http.scheme\",HTTP_STATUS_CODE:\"http.status_code\",HTTP_FLAVOR:\"http.flavor\",HTTP_USER_AGENT:\"http.user_agent\",HTTP_REQUEST_CONTENT_LENGTH:\"http.request_content_length\",HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED:\"http.request_content_length_uncompressed\",HTTP_RESPONSE_CONTENT_LENGTH:\"http.response_content_length\",HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED:\"http.response_content_length_uncompressed\",HTTP_SERVER_NAME:\"http.server_name\",HTTP_ROUTE:\"http.route\",HTTP_CLIENT_IP:\"http.client_ip\",AWS_DYNAMODB_TABLE_NAMES:\"aws.dynamodb.table_names\",AWS_DYNAMODB_CONSUMED_CAPACITY:\"aws.dynamodb.consumed_capacity\",AWS_DYNAMODB_ITEM_COLLECTION_METRICS:\"aws.dynamodb.item_collection_metrics\",AWS_DYNAMODB_PROVISIONED_READ_CAPACITY:\"aws.dynamodb.provisioned_read_capacity\",AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY:\"aws.dynamodb.provisioned_write_capacity\",AWS_DYNAMODB_CONSISTENT_READ:\"aws.dynamodb.consistent_read\",AWS_DYNAMODB_PROJECTION:\"aws.dynamodb.projection\",AWS_DYNAMODB_LIMIT:\"aws.dynamodb.limit\",AWS_DYNAMODB_ATTRIBUTES_TO_GET:\"aws.dynamodb.attributes_to_get\",AWS_DYNAMODB_INDEX_NAME:\"aws.dynamodb.index_name\",AWS_DYNAMODB_SELECT:\"aws.dynamodb.select\",AWS_DYNAMODB_GLOBAL_SECONDARY_INDEXES:\"aws.dynamodb.global_secondary_indexes\",AWS_DYNAMODB_LOCAL_SECONDARY_INDEXES:\"aws.dynamodb.local_secondary_indexes\",AWS_DYNAMODB_EXCLUSIVE_START_TABLE:\"aws.dynamodb.exclusive_start_table\",AWS_DYNAMODB_TABLE_COUNT:\"aws.dynamodb.table_count\",AWS_DYNAMODB_SCAN_FORWARD:\"aws.dynamodb.scan_forward\",AWS_DYNAMODB_SEGMENT:\"aws.dynamodb.segment\",AWS_DYNAMODB_TOTAL_SEGMENTS:\"aws.dynamodb.total_segments\",AWS_DYNAMODB_COUNT:\"aws.dynamodb.count\",AWS_DYNAMODB_SCANNED_COUNT:\"aws.dynamodb.scanned_count\",AWS_DYNAMODB_ATTRIBUTE_DEFINITIONS:\"aws.dynamodb.attribute_definitions\",AWS_DYNAMODB_GLOBAL_SECONDARY_INDEX_UPDATES:\"aws.dynamodb.global_secondary_index_updates\",MESSAGING_SYSTEM:\"messaging.system\",MESSAGING_DESTINATION:\"messaging.destination\",MESSAGING_DESTINATION_KIND:\"messaging.destination_kind\",MESSAGING_TEMP_DESTINATION:\"messaging.temp_destination\",MESSAGING_PROTOCOL:\"messaging.protocol\",MESSAGING_PROTOCOL_VERSION:\"messaging.protocol_version\",MESSAGING_URL:\"messaging.url\",MESSAGING_MESSAGE_ID:\"messaging.message_id\",MESSAGING_CONVERSATION_ID:\"messaging.conversation_id\",MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES:\"messaging.message_payload_size_bytes\",MESSAGING_MESSAGE_PAYLOAD_COMPRESSED_SIZE_BYTES:\"messaging.message_payload_compressed_size_bytes\",MESSAGING_OPERATION:\"messaging.operation\",MESSAGING_CONSUMER_ID:\"messaging.consumer_id\",MESSAGING_RABBITMQ_ROUTING_KEY:\"messaging.rabbitmq.routing_key\",MESSAGING_KAFKA_MESSAGE_KEY:\"messaging.kafka.message_key\",MESSAGING_KAFKA_CONSUMER_GROUP:\"messaging.kafka.consumer_group\",MESSAGING_KAFKA_CLIENT_ID:\"messaging.kafka.client_id\",MESSAGING_KAFKA_PARTITION:\"messaging.kafka.partition\",MESSAGING_KAFKA_TOMBSTONE:\"messaging.kafka.tombstone\",RPC_SYSTEM:\"rpc.system\",RPC_SERVICE:\"rpc.service\",RPC_METHOD:\"rpc.method\",RPC_GRPC_STATUS_CODE:\"rpc.grpc.status_code\",RPC_JSONRPC_VERSION:\"rpc.jsonrpc.version\",RPC_JSONRPC_REQUEST_ID:\"rpc.jsonrpc.request_id\",RPC_JSONRPC_ERROR_CODE:\"rpc.jsonrpc.error_code\",RPC_JSONRPC_ERROR_MESSAGE:\"rpc.jsonrpc.error_message\",MESSAGE_TYPE:\"message.type\",MESSAGE_ID:\"message.id\",MESSAGE_COMPRESSED_SIZE:\"message.compressed_size\",MESSAGE_UNCOMPRESSED_SIZE:\"message.uncompressed_size\"};A.DbSystemValues={OTHER_SQL:\"other_sql\",MSSQL:\"mssql\",MYSQL:\"mysql\",ORACLE:\"oracle\",DB2:\"db2\",POSTGRESQL:\"postgresql\",REDSHIFT:\"redshift\",HIVE:\"hive\",CLOUDSCAPE:\"cloudscape\",HSQLDB:\"hsqldb\",PROGRESS:\"progress\",MAXDB:\"maxdb\",HANADB:\"hanadb\",INGRES:\"ingres\",FIRSTSQL:\"firstsql\",EDB:\"edb\",CACHE:\"cache\",ADABAS:\"adabas\",FIREBIRD:\"firebird\",DERBY:\"derby\",FILEMAKER:\"filemaker\",INFORMIX:\"informix\",INSTANTDB:\"instantdb\",INTERBASE:\"interbase\",MARIADB:\"mariadb\",NETEZZA:\"netezza\",PERVASIVE:\"pervasive\",POINTBASE:\"pointbase\",SQLITE:\"sqlite\",SYBASE:\"sybase\",TERADATA:\"teradata\",VERTICA:\"vertica\",H2:\"h2\",COLDFUSION:\"coldfusion\",CASSANDRA:\"cassandra\",HBASE:\"hbase\",MONGODB:\"mongodb\",REDIS:\"redis\",COUCHBASE:\"couchbase\",COUCHDB:\"couchdb\",COSMOSDB:\"cosmosdb\",DYNAMODB:\"dynamodb\",NEO4J:\"neo4j\",GEODE:\"geode\",ELASTICSEARCH:\"elasticsearch\",MEMCACHED:\"memcached\",COCKROACHDB:\"cockroachdb\"};A.DbCassandraConsistencyLevelValues={ALL:\"all\",EACH_QUORUM:\"each_quorum\",QUORUM:\"quorum\",LOCAL_QUORUM:\"local_quorum\",ONE:\"one\",TWO:\"two\",THREE:\"three\",LOCAL_ONE:\"local_one\",ANY:\"any\",SERIAL:\"serial\",LOCAL_SERIAL:\"local_serial\"};A.FaasTriggerValues={DATASOURCE:\"datasource\",HTTP:\"http\",PUBSUB:\"pubsub\",TIMER:\"timer\",OTHER:\"other\"};A.FaasDocumentOperationValues={INSERT:\"insert\",EDIT:\"edit\",DELETE:\"delete\"};A.FaasInvokedProviderValues={ALIBABA_CLOUD:\"alibaba_cloud\",AWS:\"aws\",AZURE:\"azure\",GCP:\"gcp\"};A.NetTransportValues={IP_TCP:\"ip_tcp\",IP_UDP:\"ip_udp\",IP:\"ip\",UNIX:\"unix\",PIPE:\"pipe\",INPROC:\"inproc\",OTHER:\"other\"};A.NetHostConnectionTypeValues={WIFI:\"wifi\",WIRED:\"wired\",CELL:\"cell\",UNAVAILABLE:\"unavailable\",UNKNOWN:\"unknown\"};A.NetHostConnectionSubtypeValues={GPRS:\"gprs\",EDGE:\"edge\",UMTS:\"umts\",CDMA:\"cdma\",EVDO_0:\"evdo_0\",EVDO_A:\"evdo_a\",CDMA2000_1XRTT:\"cdma2000_1xrtt\",HSDPA:\"hsdpa\",HSUPA:\"hsupa\",HSPA:\"hspa\",IDEN:\"iden\",EVDO_B:\"evdo_b\",LTE:\"lte\",EHRPD:\"ehrpd\",HSPAP:\"hspap\",GSM:\"gsm\",TD_SCDMA:\"td_scdma\",IWLAN:\"iwlan\",NR:\"nr\",NRNSA:\"nrnsa\",LTE_CA:\"lte_ca\"};A.HttpFlavorValues={HTTP_1_0:\"1.0\",HTTP_1_1:\"1.1\",HTTP_2_0:\"2.0\",SPDY:\"SPDY\",QUIC:\"QUIC\"};A.MessagingDestinationKindValues={QUEUE:\"queue\",TOPIC:\"topic\"};A.MessagingOperationValues={RECEIVE:\"receive\",PROCESS:\"process\"};A.RpcGrpcStatusCodeValues={OK:0,CANCELLED:1,UNKNOWN:2,INVALID_ARGUMENT:3,DEADLINE_EXCEEDED:4,NOT_FOUND:5,ALREADY_EXISTS:6,PERMISSION_DENIED:7,RESOURCE_EXHAUSTED:8,FAILED_PRECONDITION:9,ABORTED:10,OUT_OF_RANGE:11,UNIMPLEMENTED:12,INTERNAL:13,UNAVAILABLE:14,DATA_LOSS:15,UNAUTHENTICATED:16};A.MessageTypeValues={SENT:\"SENT\",RECEIVED:\"RECEIVED\"}});var Li=_(It=>{\"use strict\";var Mc=It&&It.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),xc=It&&It.__exportStar||function(e,t){for(var r in e)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,r)&&Mc(t,e,r)};Object.defineProperty(It,\"__esModule\",{value:!0});xc(bi(),It)});var Pi=_(V=>{\"use strict\";Object.defineProperty(V,\"__esModule\",{value:!0});V.TelemetrySdkLanguageValues=V.OsTypeValues=V.HostArchValues=V.AwsEcsLaunchtypeValues=V.CloudPlatformValues=V.CloudProviderValues=V.SemanticResourceAttributes=void 0;V.SemanticResourceAttributes={CLOUD_PROVIDER:\"cloud.provider\",CLOUD_ACCOUNT_ID:\"cloud.account.id\",CLOUD_REGION:\"cloud.region\",CLOUD_AVAILABILITY_ZONE:\"cloud.availability_zone\",CLOUD_PLATFORM:\"cloud.platform\",AWS_ECS_CONTAINER_ARN:\"aws.ecs.container.arn\",AWS_ECS_CLUSTER_ARN:\"aws.ecs.cluster.arn\",AWS_ECS_LAUNCHTYPE:\"aws.ecs.launchtype\",AWS_ECS_TASK_ARN:\"aws.ecs.task.arn\",AWS_ECS_TASK_FAMILY:\"aws.ecs.task.family\",AWS_ECS_TASK_REVISION:\"aws.ecs.task.revision\",AWS_EKS_CLUSTER_ARN:\"aws.eks.cluster.arn\",AWS_LOG_GROUP_NAMES:\"aws.log.group.names\",AWS_LOG_GROUP_ARNS:\"aws.log.group.arns\",AWS_LOG_STREAM_NAMES:\"aws.log.stream.names\",AWS_LOG_STREAM_ARNS:\"aws.log.stream.arns\",CONTAINER_NAME:\"container.name\",CONTAINER_ID:\"container.id\",CONTAINER_RUNTIME:\"container.runtime\",CONTAINER_IMAGE_NAME:\"container.image.name\",CONTAINER_IMAGE_TAG:\"container.image.tag\",DEPLOYMENT_ENVIRONMENT:\"deployment.environment\",DEVICE_ID:\"device.id\",DEVICE_MODEL_IDENTIFIER:\"device.model.identifier\",DEVICE_MODEL_NAME:\"device.model.name\",FAAS_NAME:\"faas.name\",FAAS_ID:\"faas.id\",FAAS_VERSION:\"faas.version\",FAAS_INSTANCE:\"faas.instance\",FAAS_MAX_MEMORY:\"faas.max_memory\",HOST_ID:\"host.id\",HOST_NAME:\"host.name\",HOST_TYPE:\"host.type\",HOST_ARCH:\"host.arch\",HOST_IMAGE_NAME:\"host.image.name\",HOST_IMAGE_ID:\"host.image.id\",HOST_IMAGE_VERSION:\"host.image.version\",K8S_CLUSTER_NAME:\"k8s.cluster.name\",K8S_NODE_NAME:\"k8s.node.name\",K8S_NODE_UID:\"k8s.node.uid\",K8S_NAMESPACE_NAME:\"k8s.namespace.name\",K8S_POD_UID:\"k8s.pod.uid\",K8S_POD_NAME:\"k8s.pod.name\",K8S_CONTAINER_NAME:\"k8s.container.name\",K8S_REPLICASET_UID:\"k8s.replicaset.uid\",K8S_REPLICASET_NAME:\"k8s.replicaset.name\",K8S_DEPLOYMENT_UID:\"k8s.deployment.uid\",K8S_DEPLOYMENT_NAME:\"k8s.deployment.name\",K8S_STATEFULSET_UID:\"k8s.statefulset.uid\",K8S_STATEFULSET_NAME:\"k8s.statefulset.name\",K8S_DAEMONSET_UID:\"k8s.daemonset.uid\",K8S_DAEMONSET_NAME:\"k8s.daemonset.name\",K8S_JOB_UID:\"k8s.job.uid\",K8S_JOB_NAME:\"k8s.job.name\",K8S_CRONJOB_UID:\"k8s.cronjob.uid\",K8S_CRONJOB_NAME:\"k8s.cronjob.name\",OS_TYPE:\"os.type\",OS_DESCRIPTION:\"os.description\",OS_NAME:\"os.name\",OS_VERSION:\"os.version\",PROCESS_PID:\"process.pid\",PROCESS_EXECUTABLE_NAME:\"process.executable.name\",PROCESS_EXECUTABLE_PATH:\"process.executable.path\",PROCESS_COMMAND:\"process.command\",PROCESS_COMMAND_LINE:\"process.command_line\",PROCESS_COMMAND_ARGS:\"process.command_args\",PROCESS_OWNER:\"process.owner\",PROCESS_RUNTIME_NAME:\"process.runtime.name\",PROCESS_RUNTIME_VERSION:\"process.runtime.version\",PROCESS_RUNTIME_DESCRIPTION:\"process.runtime.description\",SERVICE_NAME:\"service.name\",SERVICE_NAMESPACE:\"service.namespace\",SERVICE_INSTANCE_ID:\"service.instance.id\",SERVICE_VERSION:\"service.version\",TELEMETRY_SDK_NAME:\"telemetry.sdk.name\",TELEMETRY_SDK_LANGUAGE:\"telemetry.sdk.language\",TELEMETRY_SDK_VERSION:\"telemetry.sdk.version\",TELEMETRY_AUTO_VERSION:\"telemetry.auto.version\",WEBENGINE_NAME:\"webengine.name\",WEBENGINE_VERSION:\"webengine.version\",WEBENGINE_DESCRIPTION:\"webengine.description\"};V.CloudProviderValues={ALIBABA_CLOUD:\"alibaba_cloud\",AWS:\"aws\",AZURE:\"azure\",GCP:\"gcp\"};V.CloudPlatformValues={ALIBABA_CLOUD_ECS:\"alibaba_cloud_ecs\",ALIBABA_CLOUD_FC:\"alibaba_cloud_fc\",AWS_EC2:\"aws_ec2\",AWS_ECS:\"aws_ecs\",AWS_EKS:\"aws_eks\",AWS_LAMBDA:\"aws_lambda\",AWS_ELASTIC_BEANSTALK:\"aws_elastic_beanstalk\",AZURE_VM:\"azure_vm\",AZURE_CONTAINER_INSTANCES:\"azure_container_instances\",AZURE_AKS:\"azure_aks\",AZURE_FUNCTIONS:\"azure_functions\",AZURE_APP_SERVICE:\"azure_app_service\",GCP_COMPUTE_ENGINE:\"gcp_compute_engine\",GCP_CLOUD_RUN:\"gcp_cloud_run\",GCP_KUBERNETES_ENGINE:\"gcp_kubernetes_engine\",GCP_CLOUD_FUNCTIONS:\"gcp_cloud_functions\",GCP_APP_ENGINE:\"gcp_app_engine\"};V.AwsEcsLaunchtypeValues={EC2:\"ec2\",FARGATE:\"fargate\"};V.HostArchValues={AMD64:\"amd64\",ARM32:\"arm32\",ARM64:\"arm64\",IA64:\"ia64\",PPC32:\"ppc32\",PPC64:\"ppc64\",X86:\"x86\"};V.OsTypeValues={WINDOWS:\"windows\",LINUX:\"linux\",DARWIN:\"darwin\",FREEBSD:\"freebsd\",NETBSD:\"netbsd\",OPENBSD:\"openbsd\",DRAGONFLYBSD:\"dragonflybsd\",HPUX:\"hpux\",AIX:\"aix\",SOLARIS:\"solaris\",Z_OS:\"z_os\"};V.TelemetrySdkLanguageValues={CPP:\"cpp\",DOTNET:\"dotnet\",ERLANG:\"erlang\",GO:\"go\",JAVA:\"java\",NODEJS:\"nodejs\",PHP:\"php\",PYTHON:\"python\",RUBY:\"ruby\",WEBJS:\"webjs\"}});var Ii=_(Ct=>{\"use strict\";var Dc=Ct&&Ct.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),Uc=Ct&&Ct.__exportStar||function(e,t){for(var r in e)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,r)&&Dc(t,e,r)};Object.defineProperty(Ct,\"__esModule\",{value:!0});Uc(Pi(),Ct)});var se=_(_t=>{\"use strict\";var Bc=_t&&_t.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),Ci=_t&&_t.__exportStar||function(e,t){for(var r in e)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,r)&&Bc(t,e,r)};Object.defineProperty(_t,\"__esModule\",{value:!0});Ci(Li(),_t);Ci(Ii(),_t)});var Ni=_(Me=>{\"use strict\";Object.defineProperty(Me,\"__esModule\",{value:!0});Me.SDK_INFO=void 0;var Vc=Yr(),ae=se();Me.SDK_INFO={[ae.SemanticResourceAttributes.TELEMETRY_SDK_NAME]:\"opentelemetry\",[ae.SemanticResourceAttributes.PROCESS_RUNTIME_NAME]:\"browser\",[ae.SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE]:ae.TelemetrySdkLanguageValues.WEBJS,[ae.SemanticResourceAttributes.TELEMETRY_SDK_VERSION]:Vc.VERSION}});var wi=_(xe=>{\"use strict\";Object.defineProperty(xe,\"__esModule\",{value:!0});xe.unrefTimer=void 0;function Gc(e){}xe.unrefTimer=Gc});var zr=_(j=>{\"use strict\";var Hc=j&&j.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),Nt=j&&j.__exportStar||function(e,t){for(var r in e)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,r)&&Hc(t,e,r)};Object.defineProperty(j,\"__esModule\",{value:!0});Nt(yi(),j);Nt(Oe(),j);Nt(vi(),j);Nt(Ri(),j);Nt(Oi(),j);Nt(Ni(),j);Nt(wi(),j)});var Ui=_(O=>{\"use strict\";Object.defineProperty(O,\"__esModule\",{value:!0});O.addHrTimes=O.isTimeInput=O.isTimeInputHrTime=O.hrTimeToMicroseconds=O.hrTimeToMilliseconds=O.hrTimeToNanoseconds=O.hrTimeToTimeStamp=O.hrTimeDuration=O.timeInputToHrTime=O.hrTime=O.getTimeOrigin=O.millisToHrTime=void 0;var $r=zr(),Mi=9,Fc=6,jc=Math.pow(10,Fc),De=Math.pow(10,Mi);function ue(e){let t=e/1e3,r=Math.trunc(t),n=Math.round(e%1e3*jc);return[r,n]}O.millisToHrTime=ue;function Qr(){let e=$r.otperformance.timeOrigin;if(typeof e!=\"number\"){let t=$r.otperformance;e=t.timing&&t.timing.fetchStart}return e}O.getTimeOrigin=Qr;function xi(e){let t=ue(Qr()),r=ue(typeof e==\"number\"?e:$r.otperformance.now());return Di(t,r)}O.hrTime=xi;function kc(e){if(Jr(e))return e;if(typeof e==\"number\")return e=De&&(r[1]-=De,r[0]+=1),r}O.addHrTimes=Di});var Vi=_(Bi=>{\"use strict\";Object.defineProperty(Bi,\"__esModule\",{value:!0})});var Gi=_(ce=>{\"use strict\";Object.defineProperty(ce,\"__esModule\",{value:!0});ce.ExportResultCode=void 0;var $c;(function(e){e[e.SUCCESS=0]=\"SUCCESS\",e[e.FAILED=1]=\"FAILED\"})($c=ce.ExportResultCode||(ce.ExportResultCode={}))});var Fi=_(Ue=>{\"use strict\";Object.defineProperty(Ue,\"__esModule\",{value:!0});Ue.CompositePropagator=void 0;var Hi=(E(),w(l)),Zr=class{constructor(t={}){var r;this._propagators=(r=t.propagators)!==null&&r!==void 0?r:[],this._fields=Array.from(new Set(this._propagators.map(n=>typeof n.fields==\"function\"?n.fields():[]).reduce((n,o)=>n.concat(o),[])))}inject(t,r,n){for(let o of this._propagators)try{o.inject(t,r,n)}catch(i){Hi.diag.warn(`Failed to inject with ${o.constructor.name}. Err: ${i.message}`)}}extract(t,r,n){return this._propagators.reduce((o,i)=>{try{return i.extract(o,r,n)}catch(a){Hi.diag.warn(`Failed to inject with ${i.constructor.name}. Err: ${a.message}`)}return o},t)}fields(){return this._fields.slice()}};Ue.CompositePropagator=Zr});var ji=_(Ht=>{\"use strict\";Object.defineProperty(Ht,\"__esModule\",{value:!0});Ht.validateValue=Ht.validateKey=void 0;var tn=\"[_0-9a-z-*/]\",Qc=`[a-z]${tn}{0,255}`,Jc=`[a-z0-9]${tn}{0,240}@[a-z]${tn}{0,13}`,Zc=new RegExp(`^(?:${Qc}|${Jc})$`),tl=/^[ -~]{0,255}[!-~]$/,el=/,|=/;function rl(e){return Zc.test(e)}Ht.validateKey=rl;function nl(e){return tl.test(e)&&!el.test(e)}Ht.validateValue=nl});var rn=_(Be=>{\"use strict\";Object.defineProperty(Be,\"__esModule\",{value:!0});Be.TraceState=void 0;var ki=ji(),qi=32,il=512,Xi=\",\",Ki=\"=\",en=class e{constructor(t){this._internalState=new Map,t&&this._parse(t)}set(t,r){let n=this._clone();return n._internalState.has(t)&&n._internalState.delete(t),n._internalState.set(t,r),n}unset(t){let r=this._clone();return r._internalState.delete(t),r}get(t){return this._internalState.get(t)}serialize(){return this._keys().reduce((t,r)=>(t.push(r+Ki+this.get(r)),t),[]).join(Xi)}_parse(t){t.length>il||(this._internalState=t.split(Xi).reverse().reduce((r,n)=>{let o=n.trim(),i=o.indexOf(Ki);if(i!==-1){let a=o.slice(0,i),u=o.slice(i+1,n.length);(0,ki.validateKey)(a)&&(0,ki.validateValue)(u)&&r.set(a,u)}return r},new Map),this._internalState.size>qi&&(this._internalState=new Map(Array.from(this._internalState.entries()).reverse().slice(0,qi))))}_keys(){return Array.from(this._internalState.keys()).reverse()}_clone(){let t=new e;return t._internalState=new Map(this._internalState),t}};Be.TraceState=en});var Yi=_(G=>{\"use strict\";Object.defineProperty(G,\"__esModule\",{value:!0});G.W3CTraceContextPropagator=G.parseTraceParent=G.TRACE_STATE_HEADER=G.TRACE_PARENT_HEADER=void 0;var Ve=(E(),w(l)),ol=ie(),sl=rn();G.TRACE_PARENT_HEADER=\"traceparent\";G.TRACE_STATE_HEADER=\"tracestate\";var al=\"00\",ul=\"(?!ff)[\\\\da-f]{2}\",cl=\"(?![0]{32})[\\\\da-f]{32}\",ll=\"(?![0]{16})[\\\\da-f]{16}\",fl=\"[\\\\da-f]{2}\",pl=new RegExp(`^\\\\s?(${ul})-(${cl})-(${ll})-(${fl})(-.*)?\\\\s?$`);function Wi(e){let t=pl.exec(e);return!t||t[1]===\"00\"&&t[5]?null:{traceId:t[2],spanId:t[3],traceFlags:parseInt(t[4],16)}}G.parseTraceParent=Wi;var nn=class{inject(t,r,n){let o=Ve.trace.getSpanContext(t);if(!o||(0,ol.isTracingSuppressed)(t)||!(0,Ve.isSpanContextValid)(o))return;let i=`${al}-${o.traceId}-${o.spanId}-0${Number(o.traceFlags||Ve.TraceFlags.NONE).toString(16)}`;n.set(r,G.TRACE_PARENT_HEADER,i),o.traceState&&n.set(r,G.TRACE_STATE_HEADER,o.traceState.serialize())}extract(t,r,n){let o=n.get(r,G.TRACE_PARENT_HEADER);if(!o)return t;let i=Array.isArray(o)?o[0]:o;if(typeof i!=\"string\")return t;let a=Wi(i);if(!a)return t;a.isRemote=!0;let u=n.get(r,G.TRACE_STATE_HEADER);if(u){let c=Array.isArray(u)?u.join(\",\"):u;a.traceState=new sl.TraceState(typeof c==\"string\"?c:void 0)}return Ve.trace.setSpanContext(t,a)}fields(){return[G.TRACE_PARENT_HEADER,G.TRACE_STATE_HEADER]}};G.W3CTraceContextPropagator=nn});var $i=_(zi=>{\"use strict\";Object.defineProperty(zi,\"__esModule\",{value:!0})});var Qi=_($=>{\"use strict\";Object.defineProperty($,\"__esModule\",{value:!0});$.getRPCMetadata=$.deleteRPCMetadata=$.setRPCMetadata=$.RPCType=void 0;var dl=(E(),w(l)),on=(0,dl.createContextKey)(\"OpenTelemetry SDK Context Key RPC_METADATA\"),_l;(function(e){e.HTTP=\"http\"})(_l=$.RPCType||($.RPCType={}));function hl(e,t){return e.setValue(on,t)}$.setRPCMetadata=hl;function El(e){return e.deleteValue(on)}$.deleteRPCMetadata=El;function ml(e){return e.getValue(on)}$.getRPCMetadata=ml});var an=_(Ge=>{\"use strict\";Object.defineProperty(Ge,\"__esModule\",{value:!0});Ge.AlwaysOffSampler=void 0;var Tl=(E(),w(l)),sn=class{shouldSample(){return{decision:Tl.SamplingDecision.NOT_RECORD}}toString(){return\"AlwaysOffSampler\"}};Ge.AlwaysOffSampler=sn});var cn=_(He=>{\"use strict\";Object.defineProperty(He,\"__esModule\",{value:!0});He.AlwaysOnSampler=void 0;var Sl=(E(),w(l)),un=class{shouldSample(){return{decision:Sl.SamplingDecision.RECORD_AND_SAMPLED}}toString(){return\"AlwaysOnSampler\"}};He.AlwaysOnSampler=un});var Zi=_(je=>{\"use strict\";Object.defineProperty(je,\"__esModule\",{value:!0});je.ParentBasedSampler=void 0;var Fe=(E(),w(l)),gl=qr(),Ji=an(),ln=cn(),fn=class{constructor(t){var r,n,o,i;this._root=t.root,this._root||((0,gl.globalErrorHandler)(new Error(\"ParentBasedSampler must have a root sampler configured\")),this._root=new ln.AlwaysOnSampler),this._remoteParentSampled=(r=t.remoteParentSampled)!==null&&r!==void 0?r:new ln.AlwaysOnSampler,this._remoteParentNotSampled=(n=t.remoteParentNotSampled)!==null&&n!==void 0?n:new Ji.AlwaysOffSampler,this._localParentSampled=(o=t.localParentSampled)!==null&&o!==void 0?o:new ln.AlwaysOnSampler,this._localParentNotSampled=(i=t.localParentNotSampled)!==null&&i!==void 0?i:new Ji.AlwaysOffSampler}shouldSample(t,r,n,o,i,a){let u=Fe.trace.getSpanContext(t);return!u||!(0,Fe.isSpanContextValid)(u)?this._root.shouldSample(t,r,n,o,i,a):u.isRemote?u.traceFlags&Fe.TraceFlags.SAMPLED?this._remoteParentSampled.shouldSample(t,r,n,o,i,a):this._remoteParentNotSampled.shouldSample(t,r,n,o,i,a):u.traceFlags&Fe.TraceFlags.SAMPLED?this._localParentSampled.shouldSample(t,r,n,o,i,a):this._localParentNotSampled.shouldSample(t,r,n,o,i,a)}toString(){return`ParentBased{root=${this._root.toString()}, remoteParentSampled=${this._remoteParentSampled.toString()}, remoteParentNotSampled=${this._remoteParentNotSampled.toString()}, localParentSampled=${this._localParentSampled.toString()}, localParentNotSampled=${this._localParentNotSampled.toString()}}`}};je.ParentBasedSampler=fn});var to=_(ke=>{\"use strict\";Object.defineProperty(ke,\"__esModule\",{value:!0});ke.TraceIdRatioBasedSampler=void 0;var pn=(E(),w(l)),dn=class{constructor(t=0){this._ratio=t,this._ratio=this._normalize(t),this._upperBound=Math.floor(this._ratio*4294967295)}shouldSample(t,r){return{decision:(0,pn.isValidTraceId)(r)&&this._accumulate(r)=1?1:t<=0?0:t}_accumulate(t){let r=0;for(let n=0;n>>0}return r}};ke.TraceIdRatioBasedSampler=dn});var oo=_(qe=>{\"use strict\";Object.defineProperty(qe,\"__esModule\",{value:!0});qe.isPlainObject=void 0;var yl=\"[object Object]\",vl=\"[object Null]\",Al=\"[object Undefined]\",Rl=Function.prototype,eo=Rl.toString,Ol=eo.call(Object),bl=Ll(Object.getPrototypeOf,Object),ro=Object.prototype,no=ro.hasOwnProperty,wt=Symbol?Symbol.toStringTag:void 0,io=ro.toString;function Ll(e,t){return function(r){return e(t(r))}}function Pl(e){if(!Il(e)||Cl(e)!==yl)return!1;let t=bl(e);if(t===null)return!0;let r=no.call(t,\"constructor\")&&t.constructor;return typeof r==\"function\"&&r instanceof r&&eo.call(r)===Ol}qe.isPlainObject=Pl;function Il(e){return e!=null&&typeof e==\"object\"}function Cl(e){return e==null?e===void 0?Al:vl:wt&&wt in Object(e)?Nl(e):wl(e)}function Nl(e){let t=no.call(e,wt),r=e[wt],n=!1;try{e[wt]=void 0,n=!0}catch{}let o=io.call(e);return n&&(t?e[wt]=r:delete e[wt]),o}function wl(e){return io.call(e)}});var lo=_(We=>{\"use strict\";Object.defineProperty(We,\"__esModule\",{value:!0});We.merge=void 0;var so=oo(),Ml=20;function xl(...e){let t=e.shift(),r=new WeakMap;for(;e.length>0;)t=uo(t,e.shift(),0,r);return t}We.merge=xl;function _n(e){return Ke(e)?e.slice():e}function uo(e,t,r=0,n){let o;if(!(r>Ml)){if(r++,Xe(e)||Xe(t)||co(t))o=_n(t);else if(Ke(e)){if(o=e.slice(),Ke(t))for(let i=0,a=t.length;i\"u\"?delete o[c]:o[c]=s;else{let f=o[c],p=s;if(ao(e,c,n)||ao(t,c,n))delete o[c];else{if(le(f)&&le(p)){let d=n.get(f)||[],m=n.get(p)||[];d.push({obj:e,key:c}),m.push({obj:t,key:c}),n.set(f,d),n.set(p,m)}o[c]=uo(o[c],s,r,n)}}}}else o=t;return o}}function ao(e,t,r){let n=r.get(e[t])||[];for(let o=0,i=n.length;o\"u\"||e instanceof Date||e instanceof RegExp||e===null}function Dl(e,t){return!(!(0,so.isPlainObject)(e)||!(0,so.isPlainObject)(t))}});var fo=_(Ft=>{\"use strict\";Object.defineProperty(Ft,\"__esModule\",{value:!0});Ft.callWithTimeout=Ft.TimeoutError=void 0;var Ye=class e extends Error{constructor(t){super(t),Object.setPrototypeOf(this,e.prototype)}};Ft.TimeoutError=Ye;function Ul(e,t){let r,n=new Promise(function(i,a){r=setTimeout(function(){a(new Ye(\"Operation timed out.\"))},t)});return Promise.race([e,n]).then(o=>(clearTimeout(r),o),o=>{throw clearTimeout(r),o})}Ft.callWithTimeout=Ul});var _o=_(jt=>{\"use strict\";Object.defineProperty(jt,\"__esModule\",{value:!0});jt.isUrlIgnored=jt.urlMatches=void 0;function po(e,t){return typeof t==\"string\"?e===t:!!e.match(t)}jt.urlMatches=po;function Bl(e,t){if(!t)return!1;for(let r of t)if(po(e,r))return!0;return!1}jt.isUrlIgnored=Bl});var ho=_(ze=>{\"use strict\";Object.defineProperty(ze,\"__esModule\",{value:!0});ze.isWrapped=void 0;function Vl(e){return typeof e==\"function\"&&typeof e.__original==\"function\"&&typeof e.__unwrap==\"function\"&&e.__wrapped===!0}ze.isWrapped=Vl});var Eo=_($e=>{\"use strict\";Object.defineProperty($e,\"__esModule\",{value:!0});$e.Deferred=void 0;var hn=class{constructor(){this._promise=new Promise((t,r)=>{this._resolve=t,this._reject=r})}get promise(){return this._promise}resolve(t){this._resolve(t)}reject(t){this._reject(t)}};$e.Deferred=hn});var mo=_(Qe=>{\"use strict\";Object.defineProperty(Qe,\"__esModule\",{value:!0});Qe.BindOnceFuture=void 0;var Gl=Eo(),En=class{constructor(t,r){this._callback=t,this._that=r,this._isCalled=!1,this._deferred=new Gl.Deferred}get isCalled(){return this._isCalled}get promise(){return this._deferred.promise}call(...t){if(!this._isCalled){this._isCalled=!0;try{Promise.resolve(this._callback.call(this._that,...t)).then(r=>this._deferred.resolve(r),r=>this._deferred.reject(r))}catch(r){this._deferred.reject(r)}}return this._deferred.promise}};Qe.BindOnceFuture=En});var So=_(Je=>{\"use strict\";Object.defineProperty(Je,\"__esModule\",{value:!0});Je._export=void 0;var To=(E(),w(l)),Hl=ie();function Fl(e,t){return new Promise(r=>{To.context.with((0,Hl.suppressTracing)(To.context.active()),()=>{e.export(t,n=>{r(n)})})})}Je._export=Fl});var P=_(S=>{\"use strict\";var jl=S&&S.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),R=S&&S.__exportStar||function(e,t){for(var r in e)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(t,r)&&jl(t,e,r)};Object.defineProperty(S,\"__esModule\",{value:!0});S.internal=S.baggageUtils=void 0;R(pi(),S);R(di(),S);R(Ti(),S);R(qr(),S);R(kr(),S);R(Ui(),S);R(Vi(),S);R(Gi(),S);S.baggageUtils=Vr();R(zr(),S);R(Fi(),S);R(Yi(),S);R($i(),S);R(Qi(),S);R(an(),S);R(cn(),S);R(Zi(),S);R(to(),S);R(ie(),S);R(rn(),S);R(be(),S);R(lo(),S);R(Xr(),S);R(fo(),S);R(_o(),S);R(ho(),S);R(mo(),S);R(Yr(),S);var kl=So();S.internal={_export:kl._export}});var Ho=_(St=>{\"use strict\";Object.defineProperty(St,\"__esModule\",{value:!0});St.disableInstrumentations=St.enableInstrumentations=St.parseInstrumentationOptions=void 0;function Go(e=[]){let t=[];for(let r=0,n=e.length;rt.disable())}St.disableInstrumentations=uf});var jo=_(ir=>{\"use strict\";Object.defineProperty(ir,\"__esModule\",{value:!0});ir.registerInstrumentations=void 0;var Fo=(E(),w(l)),Tn=Ho();function cf(e){let{instrumentations:t}=(0,Tn.parseInstrumentationOptions)(e.instrumentations),r=e.tracerProvider||Fo.trace.getTracerProvider(),n=e.meterProvider||Fo.metrics.getMeterProvider();return(0,Tn.enableInstrumentations)(t,r,n),()=>{(0,Tn.disableInstrumentations)(t)}}ir.registerInstrumentations=cf});var pe={};var Bs=Dr(()=>{z(pe,/*#__PURE__*/ (async_hooks__WEBPACK_IMPORTED_MODULE_1___namespace_cache || (async_hooks__WEBPACK_IMPORTED_MODULE_1___namespace_cache = __webpack_require__.t(async_hooks__WEBPACK_IMPORTED_MODULE_1__, 2))))});var de={};var Vs=Dr(()=>{z(de,/*#__PURE__*/ (events__WEBPACK_IMPORTED_MODULE_2___namespace_cache || (events__WEBPACK_IMPORTED_MODULE_2___namespace_cache = __webpack_require__.t(events__WEBPACK_IMPORTED_MODULE_2__, 2))))});var Gs=_(_r=>{\"use strict\";Object.defineProperty(_r,\"__esModule\",{value:!0});_r.AbstractAsyncHooksContextManager=void 0;var Vf=(Vs(),w(de)),Gf=[\"addListener\",\"on\",\"once\",\"prependListener\",\"prependOnceListener\"],Cn=class{constructor(){this._kOtListeners=Symbol(\"OtListeners\"),this._wrapped=!1}bind(t,r){return r instanceof Vf.EventEmitter?this._bindEventEmitter(t,r):typeof r==\"function\"?this._bindFunction(t,r):r}_bindFunction(t,r){let n=this,o=function(...i){return n.with(t,()=>r.apply(this,i))};return Object.defineProperty(o,\"length\",{enumerable:!1,configurable:!0,writable:!1,value:r.length}),o}_bindEventEmitter(t,r){return this._getPatchMap(r)!==void 0||(this._createPatchMap(r),Gf.forEach(o=>{r[o]!==void 0&&(r[o]=this._patchAddListener(r,r[o],t))}),typeof r.removeListener==\"function\"&&(r.removeListener=this._patchRemoveListener(r,r.removeListener)),typeof r.off==\"function\"&&(r.off=this._patchRemoveListener(r,r.off)),typeof r.removeAllListeners==\"function\"&&(r.removeAllListeners=this._patchRemoveAllListeners(r,r.removeAllListeners))),r}_patchRemoveListener(t,r){let n=this;return function(o,i){var a;let u=(a=n._getPatchMap(t))===null||a===void 0?void 0:a[o];if(u===void 0)return r.call(this,o,i);let c=u.get(i);return r.call(this,o,c||i)}}_patchRemoveAllListeners(t,r){let n=this;return function(o){let i=n._getPatchMap(t);return i!==void 0&&(arguments.length===0?n._createPatchMap(t):i[o]!==void 0&&delete i[o]),r.apply(this,arguments)}}_patchAddListener(t,r,n){let o=this;return function(i,a){if(o._wrapped)return r.call(this,i,a);let u=o._getPatchMap(t);u===void 0&&(u=o._createPatchMap(t));let c=u[i];c===void 0&&(c=new WeakMap,u[i]=c);let s=o.bind(n,a);c.set(a,s),o._wrapped=!0;try{return r.call(this,i,s)}finally{o._wrapped=!1}}}_createPatchMap(t){let r=Object.create(null);return t[this._kOtListeners]=r,r}_getPatchMap(t){return t[this._kOtListeners]}};_r.AbstractAsyncHooksContextManager=Cn});var Hs=_(hr=>{\"use strict\";Object.defineProperty(hr,\"__esModule\",{value:!0});hr.AsyncLocalStorageContextManager=void 0;var Hf=(E(),w(l)),Ff=(Bs(),w(pe)),jf=Gs(),Nn=class extends jf.AbstractAsyncHooksContextManager{constructor(){super(),this._asyncLocalStorage=new Ff.AsyncLocalStorage}active(){var t;return(t=this._asyncLocalStorage.getStore())!==null&&t!==void 0?t:Hf.ROOT_CONTEXT}with(t,r,n,...o){let i=n==null?r:r.bind(n);return this._asyncLocalStorage.run(t,i,...o)}enable(){return this}disable(){return this._asyncLocalStorage.disable(),this}};hr.AsyncLocalStorageContextManager=Nn});var Bn=_(gt=>{\"use strict\";Object.defineProperty(gt,\"__esModule\",{value:!0});gt.toAnyValue=gt.toKeyValue=gt.toAttributes=void 0;function Yf(e){return Object.keys(e).map(t=>Dn(t,e[t]))}gt.toAttributes=Yf;function Dn(e,t){return{key:e,value:Un(t)}}gt.toKeyValue=Dn;function Un(e){let t=typeof e;return t===\"string\"?{stringValue:e}:t===\"number\"?Number.isInteger(e)?{intValue:e}:{doubleValue:e}:t===\"boolean\"?{boolValue:e}:e instanceof Uint8Array?{bytesValue:e}:Array.isArray(e)?{arrayValue:{values:e.map(Un)}}:t===\"object\"&&e!=null?{kvlistValue:{values:Object.entries(e).map(([r,n])=>Dn(r,n))}}:{}}gt.toAnyValue=Un});var la=_(yt=>{\"use strict\";Object.defineProperty(yt,\"__esModule\",{value:!0});yt.toOtlpSpanEvent=yt.toOtlpLink=yt.sdkSpanToOtlpSpan=void 0;var Vn=Bn();function zf(e,t){var r;let n=e.spanContext(),o=e.status;return{traceId:t.encodeSpanContext(n.traceId),spanId:t.encodeSpanContext(n.spanId),parentSpanId:t.encodeOptionalSpanContext(e.parentSpanId),traceState:(r=n.traceState)===null||r===void 0?void 0:r.serialize(),name:e.name,kind:e.kind==null?0:e.kind+1,startTimeUnixNano:t.encodeHrTime(e.startTime),endTimeUnixNano:t.encodeHrTime(e.endTime),attributes:(0,Vn.toAttributes)(e.attributes),droppedAttributesCount:e.droppedAttributesCount,events:e.events.map(i=>ca(i,t)),droppedEventsCount:e.droppedEventsCount,status:{code:o.code,message:o.message},links:e.links.map(i=>ua(i,t)),droppedLinksCount:e.droppedLinksCount}}yt.sdkSpanToOtlpSpan=zf;function ua(e,t){var r;return{attributes:e.attributes?(0,Vn.toAttributes)(e.attributes):[],spanId:t.encodeSpanContext(e.context.spanId),traceId:t.encodeSpanContext(e.context.traceId),traceState:(r=e.context.traceState)===null||r===void 0?void 0:r.serialize(),droppedAttributesCount:e.droppedAttributesCount||0}}yt.toOtlpLink=ua;function ca(e,t){return{attributes:e.attributes?(0,Vn.toAttributes)(e.attributes):[],name:e.name,timeUnixNano:t.encodeHrTime(e.time),droppedAttributesCount:e.droppedAttributesCount||0}}yt.toOtlpSpanEvent=ca});var ha=_(W=>{\"use strict\";Object.defineProperty(W,\"__esModule\",{value:!0});W.getOtlpEncoder=W.encodeAsString=W.encodeAsLongBits=W.toLongBits=W.hrTimeToNanos=void 0;var Tr=P(),$f=BigInt(1e9);function Gn(e){return BigInt(e[0])*$f+BigInt(e[1])}W.hrTimeToNanos=Gn;function pa(e){let t=Number(BigInt.asUintN(32,e)),r=Number(BigInt.asUintN(32,e>>BigInt(32)));return{low:t,high:r}}W.toLongBits=pa;function Hn(e){let t=Gn(e);return pa(t)}W.encodeAsLongBits=Hn;function da(e){return Gn(e).toString()}W.encodeAsString=da;var Qf=typeof BigInt<\"u\"?da:Tr.hrTimeToNanoseconds;function fa(e){return e}function _a(e){if(e!==void 0)return(0,Tr.hexToBase64)(e)}var Jf={encodeHrTime:Hn,encodeSpanContext:Tr.hexToBase64,encodeOptionalSpanContext:_a};function Zf(e){var t,r;if(e===void 0)return Jf;let n=(t=e.useLongBits)!==null&&t!==void 0?t:!0,o=(r=e.useHex)!==null&&r!==void 0?r:!1;return{encodeHrTime:n?Hn:Qf,encodeSpanContext:o?fa:Tr.hexToBase64,encodeOptionalSpanContext:o?fa:_a}}W.getOtlpEncoder=Zf});var Fn=_(Sr=>{\"use strict\";Object.defineProperty(Sr,\"__esModule\",{value:!0});Sr.createExportTraceServiceRequest=void 0;var tp=Bn(),ep=la(),rp=ha();function np(e,t){let r=(0,rp.getOtlpEncoder)(t);return{resourceSpans:op(e,r)}}Sr.createExportTraceServiceRequest=np;function ip(e){let t=new Map;for(let r of e){let n=t.get(r.resource);n||(n=new Map,t.set(r.resource,n));let o=`${r.instrumentationLibrary.name}@${r.instrumentationLibrary.version||\"\"}:${r.instrumentationLibrary.schemaUrl||\"\"}`,i=n.get(o);i||(i=[],n.set(o,i)),i.push(r)}return t}function op(e,t){let r=ip(e),n=[],o=r.entries(),i=o.next();for(;!i.done;){let[a,u]=i.value,c=[],s=u.values(),f=s.next();for(;!f.done;){let d=f.value;if(d.length>0){let{name:m,version:g,schemaUrl:C}=d[0].instrumentationLibrary,M=d.map(T=>(0,ep.sdkSpanToOtlpSpan)(T,t));c.push({scope:{name:m,version:g},spans:M,schemaUrl:C})}f=s.next()}let p={resource:{attributes:(0,tp.toAttributes)(a.attributes),droppedAttributesCount:0},scopeSpans:c,schemaUrl:void 0};n.push(p),i=o.next()}return n}});var Ta=_(I=>{\"use strict\";Object.defineProperty(I,\"__esModule\",{value:!0});I.parseRetryAfterToMills=I.isExportRetryable=I.invalidTimeout=I.configureExporterTimeout=I.appendRootPathToUrlIfNeeded=I.appendResourcePathToUrl=I.parseHeaders=I.DEFAULT_EXPORT_BACKOFF_MULTIPLIER=I.DEFAULT_EXPORT_MAX_BACKOFF=I.DEFAULT_EXPORT_INITIAL_BACKOFF=I.DEFAULT_EXPORT_MAX_ATTEMPTS=void 0;var jn=(E(),w(l)),Ea=P(),ma=1e4;I.DEFAULT_EXPORT_MAX_ATTEMPTS=5;I.DEFAULT_EXPORT_INITIAL_BACKOFF=1e3;I.DEFAULT_EXPORT_MAX_BACKOFF=5e3;I.DEFAULT_EXPORT_BACKOFF_MULTIPLIER=1.5;function sp(e={}){let t={};return Object.entries(e).forEach(([r,n])=>{typeof n<\"u\"?t[r]=String(n):jn.diag.warn(`Header \"${r}\" has wrong value and will be ignored`)}),t}I.parseHeaders=sp;function ap(e,t){return e.endsWith(\"/\")||(e=e+\"/\"),e+t}I.appendResourcePathToUrl=ap;function up(e){try{let t=new URL(e);return t.pathname===\"\"&&(t.pathname=t.pathname+\"/\"),t.toString()}catch{return jn.diag.warn(`Could not parse export URL: '${e}'`),e}}I.appendRootPathToUrlIfNeeded=up;function cp(e){return typeof e==\"number\"?e<=0?kn(e,ma):e:lp()}I.configureExporterTimeout=cp;function lp(){var e;let t=Number((e=(0,Ea.getEnv)().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&e!==void 0?e:(0,Ea.getEnv)().OTEL_EXPORTER_OTLP_TIMEOUT);return t<=0?kn(t,ma):t}function kn(e,t){return jn.diag.warn(\"Timeout must be greater than 0\",e),t}I.invalidTimeout=kn;function fp(e){return[429,502,503,504].includes(e)}I.isExportRetryable=fp;function pp(e){if(e==null)return-1;let t=Number.parseInt(e,10);if(Number.isInteger(t))return t>0?t*1e3:-1;let r=new Date(e).getTime()-Date.now();return r>=0?r:0}I.parseRetryAfterToMills=pp});var ga=_(gr=>{\"use strict\";Object.defineProperty(gr,\"__esModule\",{value:!0});gr.OTLPExporterBase=void 0;var Sa=(E(),w(l)),_e=P(),dp=Ta(),qn=class{constructor(t={}){this._sendingPromises=[],this.url=this.getDefaultUrl(t),typeof t.hostname==\"string\"&&(this.hostname=t.hostname),this.shutdown=this.shutdown.bind(this),this._shutdownOnce=new _e.BindOnceFuture(this._shutdown,this),this._concurrencyLimit=typeof t.concurrencyLimit==\"number\"?t.concurrencyLimit:30,this.timeoutMillis=(0,dp.configureExporterTimeout)(t.timeoutMillis),this.onInit(t)}export(t,r){if(this._shutdownOnce.isCalled){r({code:_e.ExportResultCode.FAILED,error:new Error(\"Exporter has been shutdown\")});return}if(this._sendingPromises.length>=this._concurrencyLimit){r({code:_e.ExportResultCode.FAILED,error:new Error(\"Concurrent export limit reached\")});return}this._export(t).then(()=>{r({code:_e.ExportResultCode.SUCCESS})}).catch(n=>{r({code:_e.ExportResultCode.FAILED,error:n})})}_export(t){return new Promise((r,n)=>{try{Sa.diag.debug(\"items to be sent\",t),this.send(t,r,n)}catch(o){n(o)}})}shutdown(){return this._shutdownOnce.call()}forceFlush(){return Promise.all(this._sendingPromises).then(()=>{})}_shutdown(){return Sa.diag.debug(\"shutdown started\"),this.onShutdown(),this.forceFlush()}};gr.OTLPExporterBase=qn});var Ra=_((ym,Aa)=>{\"use strict\";Aa.exports=Ep;function Ep(e,t){for(var r=new Array(arguments.length-1),n=0,o=2,i=!0;o{\"use strict\";var vr=La;vr.length=function(t){var r=t.length;if(!r)return 0;for(var n=0;--r%4>1&&t.charAt(r)===\"=\";)++n;return Math.ceil(t.length*3)/4-n};var Jt=new Array(64),ba=new Array(123);for(Z=0;Z<64;)ba[Jt[Z]=Z<26?Z+65:Z<52?Z+71:Z<62?Z-4:Z-59|43]=Z++;var Z;vr.encode=function(t,r,n){for(var o=null,i=[],a=0,u=0,c;r>2],c=(s&3)<<4,u=1;break;case 1:i[a++]=Jt[c|s>>4],c=(s&15)<<2,u=2;break;case 2:i[a++]=Jt[c|s>>6],i[a++]=Jt[s&63],u=0;break}a>8191&&((o||(o=[])).push(String.fromCharCode.apply(String,i)),a=0)}return u&&(i[a++]=Jt[c],i[a++]=61,u===1&&(i[a++]=61)),o?(a&&o.push(String.fromCharCode.apply(String,i.slice(0,a))),o.join(\"\")):String.fromCharCode.apply(String,i.slice(0,a))};var Oa=\"invalid encoding\";vr.decode=function(t,r,n){for(var o=n,i=0,a,u=0;u1)break;if((c=ba[c])===void 0)throw Error(Oa);switch(i){case 0:a=c,i=1;break;case 1:r[n++]=a<<2|(c&48)>>4,a=c,i=2;break;case 2:r[n++]=(a&15)<<4|(c&60)>>2,a=c,i=3;break;case 3:r[n++]=(a&3)<<6|c,i=0;break}}if(i===1)throw Error(Oa);return n-o};vr.test=function(t){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(t)}});var Ca=_((Am,Ia)=>{\"use strict\";Ia.exports=Ar;function Ar(){this._listeners={}}Ar.prototype.on=function(t,r,n){return(this._listeners[t]||(this._listeners[t]=[])).push({fn:r,ctx:n||this}),this};Ar.prototype.off=function(t,r){if(t===void 0)this._listeners={};else if(r===void 0)this._listeners[t]=[];else for(var n=this._listeners[t],o=0;o{\"use strict\";Ua.exports=Na(Na);function Na(e){return typeof Float32Array<\"u\"?function(){var t=new Float32Array([-0]),r=new Uint8Array(t.buffer),n=r[3]===128;function o(c,s,f){t[0]=c,s[f]=r[0],s[f+1]=r[1],s[f+2]=r[2],s[f+3]=r[3]}function i(c,s,f){t[0]=c,s[f]=r[3],s[f+1]=r[2],s[f+2]=r[1],s[f+3]=r[0]}e.writeFloatLE=n?o:i,e.writeFloatBE=n?i:o;function a(c,s){return r[0]=c[s],r[1]=c[s+1],r[2]=c[s+2],r[3]=c[s+3],t[0]}function u(c,s){return r[3]=c[s],r[2]=c[s+1],r[1]=c[s+2],r[0]=c[s+3],t[0]}e.readFloatLE=n?a:u,e.readFloatBE=n?u:a}():function(){function t(n,o,i,a){var u=o<0?1:0;if(u&&(o=-o),o===0)n(1/o>0?0:2147483648,i,a);else if(isNaN(o))n(2143289344,i,a);else if(o>34028234663852886e22)n((u<<31|2139095040)>>>0,i,a);else if(o<11754943508222875e-54)n((u<<31|Math.round(o/1401298464324817e-60))>>>0,i,a);else{var c=Math.floor(Math.log(o)/Math.LN2),s=Math.round(o*Math.pow(2,-c)*8388608)&8388607;n((u<<31|c+127<<23|s)>>>0,i,a)}}e.writeFloatLE=t.bind(null,wa),e.writeFloatBE=t.bind(null,Ma);function r(n,o,i){var a=n(o,i),u=(a>>31)*2+1,c=a>>>23&255,s=a&8388607;return c===255?s?NaN:u*(1/0):c===0?u*1401298464324817e-60*s:u*Math.pow(2,c-150)*(s+8388608)}e.readFloatLE=r.bind(null,xa),e.readFloatBE=r.bind(null,Da)}(),typeof Float64Array<\"u\"?function(){var t=new Float64Array([-0]),r=new Uint8Array(t.buffer),n=r[7]===128;function o(c,s,f){t[0]=c,s[f]=r[0],s[f+1]=r[1],s[f+2]=r[2],s[f+3]=r[3],s[f+4]=r[4],s[f+5]=r[5],s[f+6]=r[6],s[f+7]=r[7]}function i(c,s,f){t[0]=c,s[f]=r[7],s[f+1]=r[6],s[f+2]=r[5],s[f+3]=r[4],s[f+4]=r[3],s[f+5]=r[2],s[f+6]=r[1],s[f+7]=r[0]}e.writeDoubleLE=n?o:i,e.writeDoubleBE=n?i:o;function a(c,s){return r[0]=c[s],r[1]=c[s+1],r[2]=c[s+2],r[3]=c[s+3],r[4]=c[s+4],r[5]=c[s+5],r[6]=c[s+6],r[7]=c[s+7],t[0]}function u(c,s){return r[7]=c[s],r[6]=c[s+1],r[5]=c[s+2],r[4]=c[s+3],r[3]=c[s+4],r[2]=c[s+5],r[1]=c[s+6],r[0]=c[s+7],t[0]}e.readDoubleLE=n?a:u,e.readDoubleBE=n?u:a}():function(){function t(n,o,i,a,u,c){var s=a<0?1:0;if(s&&(a=-a),a===0)n(0,u,c+o),n(1/a>0?0:2147483648,u,c+i);else if(isNaN(a))n(0,u,c+o),n(2146959360,u,c+i);else if(a>17976931348623157e292)n(0,u,c+o),n((s<<31|2146435072)>>>0,u,c+i);else{var f;if(a<22250738585072014e-324)f=a/5e-324,n(f>>>0,u,c+o),n((s<<31|f/4294967296)>>>0,u,c+i);else{var p=Math.floor(Math.log(a)/Math.LN2);p===1024&&(p=1023),f=a*Math.pow(2,-p),n(f*4503599627370496>>>0,u,c+o),n((s<<31|p+1023<<20|f*1048576&1048575)>>>0,u,c+i)}}}e.writeDoubleLE=t.bind(null,wa,0,4),e.writeDoubleBE=t.bind(null,Ma,4,0);function r(n,o,i,a,u){var c=n(a,u+o),s=n(a,u+i),f=(s>>31)*2+1,p=s>>>20&2047,d=4294967296*(s&1048575)+c;return p===2047?d?NaN:f*(1/0):p===0?f*5e-324*d:f*Math.pow(2,p-1075)*(d+4503599627370496)}e.readDoubleLE=r.bind(null,xa,0,4),e.readDoubleBE=r.bind(null,Da,4,0)}(),e}function wa(e,t,r){t[r]=e&255,t[r+1]=e>>>8&255,t[r+2]=e>>>16&255,t[r+3]=e>>>24}function Ma(e,t,r){t[r]=e>>>24,t[r+1]=e>>>16&255,t[r+2]=e>>>8&255,t[r+3]=e&255}function xa(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0}function Da(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}});var Ga=_((Om,Va)=>{\"use strict\";Va.exports=mp;function mp(e){return null}});var Fa=_(Ha=>{\"use strict\";var Kn=Ha;Kn.length=function(t){for(var r=0,n=0,o=0;o191&&c<224?a[u++]=(c&31)<<6|t[r++]&63:c>239&&c<365?(c=((c&7)<<18|(t[r++]&63)<<12|(t[r++]&63)<<6|t[r++]&63)-65536,a[u++]=55296+(c>>10),a[u++]=56320+(c&1023)):a[u++]=(c&15)<<12|(t[r++]&63)<<6|t[r++]&63,u>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,a)),u=0);return i?(u&&i.push(String.fromCharCode.apply(String,a.slice(0,u))),i.join(\"\")):String.fromCharCode.apply(String,a.slice(0,u))};Kn.write=function(t,r,n){for(var o=n,i,a,u=0;u>6|192,r[n++]=i&63|128):(i&64512)===55296&&((a=t.charCodeAt(u+1))&64512)===56320?(i=65536+((i&1023)<<10)+(a&1023),++u,r[n++]=i>>18|240,r[n++]=i>>12&63|128,r[n++]=i>>6&63|128,r[n++]=i&63|128):(r[n++]=i>>12|224,r[n++]=i>>6&63|128,r[n++]=i&63|128);return n-o}});var ka=_((Lm,ja)=>{\"use strict\";ja.exports=Tp;function Tp(e,t,r){var n=r||8192,o=n>>>1,i=null,a=n;return function(c){if(c<1||c>o)return e(c);a+c>n&&(i=e(n),a=0);var s=t.call(i,a,a+=c);return a&7&&(a=(a|7)+1),s}}});var Xa=_((Pm,qa)=>{\"use strict\";qa.exports=D;var he=At();function D(e,t){this.lo=e>>>0,this.hi=t>>>0}var Dt=D.zero=new D(0,0);Dt.toNumber=function(){return 0};Dt.zzEncode=Dt.zzDecode=function(){return this};Dt.length=function(){return 1};var Sp=D.zeroHash=\"\\0\\0\\0\\0\\0\\0\\0\\0\";D.fromNumber=function(t){if(t===0)return Dt;var r=t<0;r&&(t=-t);var n=t>>>0,o=(t-n)/4294967296>>>0;return r&&(o=~o>>>0,n=~n>>>0,++n>4294967295&&(n=0,++o>4294967295&&(o=0))),new D(n,o)};D.from=function(t){if(typeof t==\"number\")return D.fromNumber(t);if(he.isString(t))if(he.Long)t=he.Long.fromString(t);else return D.fromNumber(parseInt(t,10));return t.low||t.high?new D(t.low>>>0,t.high>>>0):Dt};D.prototype.toNumber=function(t){if(!t&&this.hi>>>31){var r=~this.lo+1>>>0,n=~this.hi>>>0;return r||(n=n+1>>>0),-(r+n*4294967296)}return this.lo+this.hi*4294967296};D.prototype.toLong=function(t){return he.Long?new he.Long(this.lo|0,this.hi|0,!!t):{low:this.lo|0,high:this.hi|0,unsigned:!!t}};var vt=String.prototype.charCodeAt;D.fromHash=function(t){return t===Sp?Dt:new D((vt.call(t,0)|vt.call(t,1)<<8|vt.call(t,2)<<16|vt.call(t,3)<<24)>>>0,(vt.call(t,4)|vt.call(t,5)<<8|vt.call(t,6)<<16|vt.call(t,7)<<24)>>>0)};D.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)};D.prototype.zzEncode=function(){var t=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^t)>>>0,this.lo=(this.lo<<1^t)>>>0,this};D.prototype.zzDecode=function(){var t=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^t)>>>0,this.hi=(this.hi>>>1^t)>>>0,this};D.prototype.length=function(){var t=this.lo,r=(this.lo>>>28|this.hi<<4)>>>0,n=this.hi>>>24;return n===0?r===0?t<16384?t<128?1:2:t<2097152?3:4:r<16384?r<128?5:6:r<2097152?7:8:n<128?9:10}});var At=_(Wn=>{\"use strict\";var h=Wn;h.asPromise=Ra();h.base64=Pa();h.EventEmitter=Ca();h.float=Ba();h.inquire=Ga();h.utf8=Fa();h.pool=ka();h.LongBits=Xa();h.isNode=!!(typeof global<\"u\"&&global&&global.process&&global.process.versions&&global.process.versions.node);h.global=h.isNode&&global||typeof window<\"u\"&&window||typeof self<\"u\"&&self||Wn;h.emptyArray=Object.freeze?Object.freeze([]):[];h.emptyObject=Object.freeze?Object.freeze({}):{};h.isInteger=Number.isInteger||function(t){return typeof t==\"number\"&&isFinite(t)&&Math.floor(t)===t};h.isString=function(t){return typeof t==\"string\"||t instanceof String};h.isObject=function(t){return t&&typeof t==\"object\"};h.isset=h.isSet=function(t,r){var n=t[r];return n!=null&&t.hasOwnProperty(r)?typeof n!=\"object\"||(Array.isArray(n)?n.length:Object.keys(n).length)>0:!1};h.Buffer=function(){try{var e=h.inquire(\"buffer\").Buffer;return e.prototype.utf8Write?e:null}catch{return null}}();h._Buffer_from=null;h._Buffer_allocUnsafe=null;h.newBuffer=function(t){return typeof t==\"number\"?h.Buffer?h._Buffer_allocUnsafe(t):new h.Array(t):h.Buffer?h._Buffer_from(t):typeof Uint8Array>\"u\"?t:new Uint8Array(t)};h.Array=typeof Uint8Array<\"u\"?Uint8Array:Array;h.Long=h.global.dcodeIO&&h.global.dcodeIO.Long||h.global.Long||h.inquire(\"long\");h.key2Re=/^true|false|0|1$/;h.key32Re=/^-?(?:0|[1-9][0-9]*)$/;h.key64Re=/^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;h.longToHash=function(t){return t?h.LongBits.from(t).toHash():h.LongBits.zeroHash};h.longFromHash=function(t,r){var n=h.LongBits.fromHash(t);return h.Long?h.Long.fromBits(n.lo,n.hi,r):n.toNumber(!!r)};function Ka(e,t,r){for(var n=Object.keys(t),o=0;o-1;--i)if(r[o[i]]===1&&this[o[i]]!==void 0&&this[o[i]]!==null)return o[i]}};h.oneOfSetter=function(t){return function(r){for(var n=0;n{\"use strict\";Qa.exports=y;var Y=At(),Yn,Rr=Y.LongBits,Ya=Y.base64,za=Y.utf8;function Ee(e,t,r){this.fn=e,this.len=t,this.next=void 0,this.val=r}function $n(){}function gp(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this.next=e.states}function y(){this.len=0,this.head=new Ee($n,0,0),this.tail=this.head,this.states=null}var $a=function(){return Y.Buffer?function(){return(y.create=function(){return new Yn})()}:function(){return new y}};y.create=$a();y.alloc=function(t){return new Y.Array(t)};Y.Array!==Array&&(y.alloc=Y.pool(y.alloc,Y.Array.prototype.subarray));y.prototype._push=function(t,r,n){return this.tail=this.tail.next=new Ee(t,r,n),this.len+=r,this};function Qn(e,t,r){t[r]=e&255}function yp(e,t,r){for(;e>127;)t[r++]=e&127|128,e>>>=7;t[r]=e}function Jn(e,t){this.len=e,this.next=void 0,this.val=t}Jn.prototype=Object.create(Ee.prototype);Jn.prototype.fn=yp;y.prototype.uint32=function(t){return this.len+=(this.tail=this.tail.next=new Jn((t=t>>>0)<128?1:t<16384?2:t<2097152?3:t<268435456?4:5,t)).len,this};y.prototype.int32=function(t){return t<0?this._push(Zn,10,Rr.fromNumber(t)):this.uint32(t)};y.prototype.sint32=function(t){return this.uint32((t<<1^t>>31)>>>0)};function Zn(e,t,r){for(;e.hi;)t[r++]=e.lo&127|128,e.lo=(e.lo>>>7|e.hi<<25)>>>0,e.hi>>>=7;for(;e.lo>127;)t[r++]=e.lo&127|128,e.lo=e.lo>>>7;t[r++]=e.lo}y.prototype.uint64=function(t){var r=Rr.from(t);return this._push(Zn,r.length(),r)};y.prototype.int64=y.prototype.uint64;y.prototype.sint64=function(t){var r=Rr.from(t).zzEncode();return this._push(Zn,r.length(),r)};y.prototype.bool=function(t){return this._push(Qn,1,t?1:0)};function zn(e,t,r){t[r]=e&255,t[r+1]=e>>>8&255,t[r+2]=e>>>16&255,t[r+3]=e>>>24}y.prototype.fixed32=function(t){return this._push(zn,4,t>>>0)};y.prototype.sfixed32=y.prototype.fixed32;y.prototype.fixed64=function(t){var r=Rr.from(t);return this._push(zn,4,r.lo)._push(zn,4,r.hi)};y.prototype.sfixed64=y.prototype.fixed64;y.prototype.float=function(t){return this._push(Y.float.writeFloatLE,4,t)};y.prototype.double=function(t){return this._push(Y.float.writeDoubleLE,8,t)};var vp=Y.Array.prototype.set?function(t,r,n){r.set(t,n)}:function(t,r,n){for(var o=0;o>>0;if(!r)return this._push(Qn,1,0);if(Y.isString(t)){var n=y.alloc(r=Ya.length(t));Ya.decode(t,n,0),t=n}return this.uint32(r)._push(vp,r,t)};y.prototype.string=function(t){var r=za.length(t);return r?this.uint32(r)._push(za.write,r,t):this._push(Qn,1,0)};y.prototype.fork=function(){return this.states=new gp(this),this.head=this.tail=new Ee($n,0,0),this.len=0,this};y.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Ee($n,0,0),this.len=0),this};y.prototype.ldelim=function(){var t=this.head,r=this.tail,n=this.len;return this.reset().uint32(n),n&&(this.tail.next=t.next,this.tail=r,this.len+=n),this};y.prototype.finish=function(){for(var t=this.head.next,r=this.constructor.alloc(this.len),n=0;t;)t.fn(t.val,r,n),n+=t.len,t=t.next;return r};y._configure=function(e){Yn=e,y.create=$a(),Yn._configure()}});var tu=_((Nm,Za)=>{\"use strict\";Za.exports=it;var Ja=ti();(it.prototype=Object.create(Ja.prototype)).constructor=it;var Rt=At();function it(){Ja.call(this)}it._configure=function(){it.alloc=Rt._Buffer_allocUnsafe,it.writeBytesBuffer=Rt.Buffer&&Rt.Buffer.prototype instanceof Uint8Array&&Rt.Buffer.prototype.set.name===\"set\"?function(t,r,n){r.set(t,n)}:function(t,r,n){if(t.copy)t.copy(r,n,0,t.length);else for(var o=0;o>>0;return this.uint32(r),r&&this._push(it.writeBytesBuffer,r,t),this};function Ap(e,t,r){e.length<40?Rt.utf8.write(e,t,r):t.utf8Write?t.utf8Write(e,r):t.write(e,r)}it.prototype.string=function(t){var r=Rt.Buffer.byteLength(t);return this.uint32(r),r&&this._push(Ap,r,t),this};it._configure()});var ni=_((wm,ou)=>{\"use strict\";ou.exports=N;var tt=At(),ri,nu=tt.LongBits,Rp=tt.utf8;function et(e,t){return RangeError(\"index out of range: \"+e.pos+\" + \"+(t||1)+\" > \"+e.len)}function N(e){this.buf=e,this.pos=0,this.len=e.length}var eu=typeof Uint8Array<\"u\"?function(t){if(t instanceof Uint8Array||Array.isArray(t))return new N(t);throw Error(\"illegal buffer\")}:function(t){if(Array.isArray(t))return new N(t);throw Error(\"illegal buffer\")},iu=function(){return tt.Buffer?function(r){return(N.create=function(o){return tt.Buffer.isBuffer(o)?new ri(o):eu(o)})(r)}:eu};N.create=iu();N.prototype._slice=tt.Array.prototype.subarray||tt.Array.prototype.slice;N.prototype.uint32=function(){var t=4294967295;return function(){if(t=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(t=(t|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(t=(t|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(t=(t|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(t=(t|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return t;if((this.pos+=5)>this.len)throw this.pos=this.len,et(this,10);return t}}();N.prototype.int32=function(){return this.uint32()|0};N.prototype.sint32=function(){var t=this.uint32();return t>>>1^-(t&1)|0};function ei(){var e=new nu(0,0),t=0;if(this.len-this.pos>4){for(;t<4;++t)if(e.lo=(e.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e;if(e.lo=(e.lo|(this.buf[this.pos]&127)<<28)>>>0,e.hi=(e.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return e;t=0}else{for(;t<3;++t){if(this.pos>=this.len)throw et(this);if(e.lo=(e.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e}return e.lo=(e.lo|(this.buf[this.pos++]&127)<>>0,e}if(this.len-this.pos>4){for(;t<5;++t)if(e.hi=(e.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e}else for(;t<5;++t){if(this.pos>=this.len)throw et(this);if(e.hi=(e.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return e}throw Error(\"invalid varint encoding\")}N.prototype.bool=function(){return this.uint32()!==0};function Or(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}N.prototype.fixed32=function(){if(this.pos+4>this.len)throw et(this,4);return Or(this.buf,this.pos+=4)};N.prototype.sfixed32=function(){if(this.pos+4>this.len)throw et(this,4);return Or(this.buf,this.pos+=4)|0};function ru(){if(this.pos+8>this.len)throw et(this,8);return new nu(Or(this.buf,this.pos+=4),Or(this.buf,this.pos+=4))}N.prototype.float=function(){if(this.pos+4>this.len)throw et(this,4);var t=tt.float.readFloatLE(this.buf,this.pos);return this.pos+=4,t};N.prototype.double=function(){if(this.pos+8>this.len)throw et(this,4);var t=tt.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,t};N.prototype.bytes=function(){var t=this.uint32(),r=this.pos,n=this.pos+t;if(n>this.len)throw et(this,t);if(this.pos+=t,Array.isArray(this.buf))return this.buf.slice(r,n);if(r===n){var o=tt.Buffer;return o?o.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,r,n)};N.prototype.string=function(){var t=this.bytes();return Rp.read(t,0,t.length)};N.prototype.skip=function(t){if(typeof t==\"number\"){if(this.pos+t>this.len)throw et(this,t);this.pos+=t}else do if(this.pos>=this.len)throw et(this);while(this.buf[this.pos++]&128);return this};N.prototype.skipType=function(e){switch(e){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(e=this.uint32()&7)!==4;)this.skipType(e);break;case 5:this.skip(4);break;default:throw Error(\"invalid wire type \"+e+\" at offset \"+this.pos)}return this};N._configure=function(e){ri=e,N.create=iu(),ri._configure();var t=tt.Long?\"toLong\":\"toNumber\";tt.merge(N.prototype,{int64:function(){return ei.call(this)[t](!1)},uint64:function(){return ei.call(this)[t](!0)},sint64:function(){return ei.call(this).zzDecode()[t](!1)},fixed64:function(){return ru.call(this)[t](!0)},sfixed64:function(){return ru.call(this)[t](!1)}})}});var cu=_((Mm,uu)=>{\"use strict\";uu.exports=Ut;var au=ni();(Ut.prototype=Object.create(au.prototype)).constructor=Ut;var su=At();function Ut(e){au.call(this,e)}Ut._configure=function(){su.Buffer&&(Ut.prototype._slice=su.Buffer.prototype.slice)};Ut.prototype.string=function(){var t=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+t,this.len)):this.buf.toString(\"utf-8\",this.pos,this.pos=Math.min(this.pos+t,this.len))};Ut._configure()});var fu=_((xm,lu)=>{\"use strict\";lu.exports=me;var ii=At();(me.prototype=Object.create(ii.EventEmitter.prototype)).constructor=me;function me(e,t,r){if(typeof e!=\"function\")throw TypeError(\"rpcImpl must be a function\");ii.EventEmitter.call(this),this.rpcImpl=e,this.requestDelimited=!!t,this.responseDelimited=!!r}me.prototype.rpcCall=function e(t,r,n,o,i){if(!o)throw TypeError(\"request must be specified\");var a=this;if(!i)return ii.asPromise(e,a,t,r,n,o);if(!a.rpcImpl){setTimeout(function(){i(Error(\"already ended\"))},0);return}try{return a.rpcImpl(t,r[a.requestDelimited?\"encodeDelimited\":\"encode\"](o).finish(),function(c,s){if(c)return a.emit(\"error\",c,t),i(c);if(s===null){a.end(!0);return}if(!(s instanceof n))try{s=n[a.responseDelimited?\"decodeDelimited\":\"decode\"](s)}catch(f){return a.emit(\"error\",f,t),i(f)}return a.emit(\"data\",s,t),i(null,s)})}catch(u){a.emit(\"error\",u,t),setTimeout(function(){i(u)},0);return}};me.prototype.end=function(t){return this.rpcImpl&&(t||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit(\"end\").off()),this}});var du=_(pu=>{\"use strict\";var Op=pu;Op.Service=fu()});var hu=_((Um,_u)=>{\"use strict\";_u.exports={}});var Tu=_(mu=>{\"use strict\";var F=mu;F.build=\"minimal\";F.Writer=ti();F.BufferWriter=tu();F.Reader=ni();F.BufferReader=cu();F.util=At();F.rpc=du();F.roots=hu();F.configure=Eu;function Eu(){F.util._configure(),F.Writer._configure(F.BufferWriter),F.Reader._configure(F.BufferReader)}Eu()});var gu=_((Vm,Su)=>{\"use strict\";Su.exports=Tu()});E();var Kt=v(P());E();var b=v(P()),ht=v(se());var go=\"exception\";var ql=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},Xl=function(e,t){var r=typeof Symbol==\"function\"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},yo=function(){function e(t,r,n,o,i,a,u,c,s,f){u===void 0&&(u=[]),this.attributes={},this.links=[],this.events=[],this._droppedAttributesCount=0,this._droppedEventsCount=0,this._droppedLinksCount=0,this.status={code:l.SpanStatusCode.UNSET},this.endTime=[0,0],this._ended=!1,this._duration=[-1,-1],this.name=n,this._spanContext=o,this.parentSpanId=a,this.kind=i,this.links=u;var p=Date.now();this._performanceStartTime=b.otperformance.now(),this._performanceOffset=p-(this._performanceStartTime+(0,b.getTimeOrigin)()),this._startTimeProvided=c!=null,this.startTime=this._getTime(c??p),this.resource=t.resource,this.instrumentationLibrary=t.instrumentationLibrary,this._spanLimits=t.getSpanLimits(),f!=null&&this.setAttributes(f),this._spanProcessor=t.getActiveSpanProcessor(),this._spanProcessor.onStart(this,r),this._attributeValueLengthLimit=this._spanLimits.attributeValueLengthLimit||0}return e.prototype.spanContext=function(){return this._spanContext},e.prototype.setAttribute=function(t,r){return r==null||this._isSpanEnded()?this:t.length===0?(l.diag.warn(\"Invalid attribute key: \"+t),this):(0,b.isAttributeValue)(r)?Object.keys(this.attributes).length>=this._spanLimits.attributeCountLimit&&!Object.prototype.hasOwnProperty.call(this.attributes,t)?(this._droppedAttributesCount++,this):(this.attributes[t]=this._truncateToSize(r),this):(l.diag.warn(\"Invalid attribute value set for key: \"+t),this)},e.prototype.setAttributes=function(t){var r,n;try{for(var o=ql(Object.entries(t)),i=o.next();!i.done;i=o.next()){var a=Xl(i.value,2),u=a[0],c=a[1];this.setAttribute(u,c)}}catch(s){r={error:s}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return this},e.prototype.addEvent=function(t,r,n){if(this._isSpanEnded())return this;if(this._spanLimits.eventCountLimit===0)return l.diag.warn(\"No events allowed.\"),this._droppedEventsCount++,this;this.events.length>=this._spanLimits.eventCountLimit&&(l.diag.warn(\"Dropping extra events.\"),this.events.shift(),this._droppedEventsCount++),(0,b.isTimeInput)(r)&&((0,b.isTimeInput)(n)||(n=r),r=void 0);var o=(0,b.sanitizeAttributes)(r);return this.events.push({name:t,attributes:o,time:this._getTime(n),droppedAttributesCount:0}),this},e.prototype.setStatus=function(t){return this._isSpanEnded()?this:(this.status=t,this)},e.prototype.updateName=function(t){return this._isSpanEnded()?this:(this.name=t,this)},e.prototype.end=function(t){if(this._isSpanEnded()){l.diag.error(this.name+\" \"+this._spanContext.traceId+\"-\"+this._spanContext.spanId+\" - You can only call end() on a span once.\");return}this._ended=!0,this.endTime=this._getTime(t),this._duration=(0,b.hrTimeDuration)(this.startTime,this.endTime),this._duration[0]<0&&(l.diag.warn(\"Inconsistent start and end time, startTime > endTime. Setting span duration to 0ms.\",this.startTime,this.endTime),this.endTime=this.startTime.slice(),this._duration=[0,0]),this._spanProcessor.onEnd(this)},e.prototype._getTime=function(t){if(typeof t==\"number\"&&t=1?1:t<=0?0:t},e.prototype._accumulate=function(t){for(var r=0,n=0;n>>0}return r},e}();var Kl=(0,x.getEnv)(),Wl=x.TracesSamplerValues.AlwaysOn,qt=1;function Ze(){return{sampler:mn(Kl),forceFlushTimeoutMillis:3e4,generalLimits:{attributeValueLengthLimit:(0,x.getEnv)().OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT,attributeCountLimit:(0,x.getEnv)().OTEL_ATTRIBUTE_COUNT_LIMIT},spanLimits:{attributeValueLengthLimit:(0,x.getEnv)().OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,attributeCountLimit:(0,x.getEnv)().OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,linkCountLimit:(0,x.getEnv)().OTEL_SPAN_LINK_COUNT_LIMIT,eventCountLimit:(0,x.getEnv)().OTEL_SPAN_EVENT_COUNT_LIMIT,attributePerEventCountLimit:(0,x.getEnv)().OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,attributePerLinkCountLimit:(0,x.getEnv)().OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT}}}function mn(e){switch(e===void 0&&(e=(0,x.getEnv)()),e.OTEL_TRACES_SAMPLER){case x.TracesSamplerValues.AlwaysOn:return new X;case x.TracesSamplerValues.AlwaysOff:return new st;case x.TracesSamplerValues.ParentBasedAlwaysOn:return new Et({root:new X});case x.TracesSamplerValues.ParentBasedAlwaysOff:return new Et({root:new st});case x.TracesSamplerValues.TraceIdRatio:return new kt(Ao(e));case x.TracesSamplerValues.ParentBasedTraceIdRatio:return new Et({root:new kt(Ao(e))});default:return l.diag.error('OTEL_TRACES_SAMPLER value \"'+e.OTEL_TRACES_SAMPLER+\" invalid, defaulting to \"+Wl+'\".'),new X}}function Ao(e){if(e.OTEL_TRACES_SAMPLER_ARG===void 0||e.OTEL_TRACES_SAMPLER_ARG===\"\")return l.diag.error(\"OTEL_TRACES_SAMPLER_ARG is blank, defaulting to \"+qt+\".\"),qt;var t=Number(e.OTEL_TRACES_SAMPLER_ARG);return isNaN(t)?(l.diag.error(\"OTEL_TRACES_SAMPLER_ARG=\"+e.OTEL_TRACES_SAMPLER_ARG+\" was given, but it is invalid, defaulting to \"+qt+\".\"),qt):t<0||t>1?(l.diag.error(\"OTEL_TRACES_SAMPLER_ARG=\"+e.OTEL_TRACES_SAMPLER_ARG+\" was given, but it is out of range ([0..1]), defaulting to \"+qt+\".\"),qt):t}var Xt=v(P());function Ro(e){var t={sampler:mn()},r=Ze(),n=Object.assign({},r,t,e);return n.generalLimits=Object.assign({},r.generalLimits,e.generalLimits||{}),n.spanLimits=Object.assign({},r.spanLimits,e.spanLimits||{}),n}function Oo(e){var t,r,n,o,i,a,u,c,s,f,p,d,m=Object.assign({},e.spanLimits),g=(0,Xt.getEnvWithoutDefaults)();return m.attributeCountLimit=(a=(i=(o=(r=(t=e.spanLimits)===null||t===void 0?void 0:t.attributeCountLimit)!==null&&r!==void 0?r:(n=e.generalLimits)===null||n===void 0?void 0:n.attributeCountLimit)!==null&&o!==void 0?o:g.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT)!==null&&i!==void 0?i:g.OTEL_ATTRIBUTE_COUNT_LIMIT)!==null&&a!==void 0?a:Xt.DEFAULT_ATTRIBUTE_COUNT_LIMIT,m.attributeValueLengthLimit=(d=(p=(f=(c=(u=e.spanLimits)===null||u===void 0?void 0:u.attributeValueLengthLimit)!==null&&c!==void 0?c:(s=e.generalLimits)===null||s===void 0?void 0:s.attributeValueLengthLimit)!==null&&f!==void 0?f:g.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT)!==null&&p!==void 0?p:g.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT)!==null&&d!==void 0?d:Xt.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,Object.assign({},e,{spanLimits:m})}E();var k=v(P()),bo=function(){function e(t,r){this._exporter=t,this._isExporting=!1,this._finishedSpans=[],this._droppedSpansCount=0;var n=(0,k.getEnv)();this._maxExportBatchSize=typeof r?.maxExportBatchSize==\"number\"?r.maxExportBatchSize:n.OTEL_BSP_MAX_EXPORT_BATCH_SIZE,this._maxQueueSize=typeof r?.maxQueueSize==\"number\"?r.maxQueueSize:n.OTEL_BSP_MAX_QUEUE_SIZE,this._scheduledDelayMillis=typeof r?.scheduledDelayMillis==\"number\"?r.scheduledDelayMillis:n.OTEL_BSP_SCHEDULE_DELAY,this._exportTimeoutMillis=typeof r?.exportTimeoutMillis==\"number\"?r.exportTimeoutMillis:n.OTEL_BSP_EXPORT_TIMEOUT,this._shutdownOnce=new k.BindOnceFuture(this._shutdown,this),this._maxExportBatchSize>this._maxQueueSize&&(l.diag.warn(\"BatchSpanProcessor: maxExportBatchSize must be smaller or equal to maxQueueSize, setting maxExportBatchSize to match maxQueueSize\"),this._maxExportBatchSize=this._maxQueueSize)}return e.prototype.forceFlush=function(){return this._shutdownOnce.isCalled?this._shutdownOnce.promise:this._flushAll()},e.prototype.onStart=function(t,r){},e.prototype.onEnd=function(t){this._shutdownOnce.isCalled||t.spanContext().traceFlags&l.TraceFlags.SAMPLED&&this._addToBuffer(t)},e.prototype.shutdown=function(){return this._shutdownOnce.call()},e.prototype._shutdown=function(){var t=this;return Promise.resolve().then(function(){return t.onShutdown()}).then(function(){return t._flushAll()}).then(function(){return t._exporter.shutdown()})},e.prototype._addToBuffer=function(t){if(this._finishedSpans.length>=this._maxQueueSize){this._droppedSpansCount===0&&l.diag.debug(\"maxQueueSize reached, dropping spans\"),this._droppedSpansCount++;return}this._droppedSpansCount>0&&(l.diag.warn(\"Dropped \"+this._droppedSpansCount+\" spans because maxQueueSize reached\"),this._droppedSpansCount=0),this._finishedSpans.push(t),this._maybeStartTimer()},e.prototype._flushAll=function(){var t=this;return new Promise(function(r,n){for(var o=[],i=Math.ceil(t._finishedSpans.length/t._maxExportBatchSize),a=0,u=i;a0&&(t._clearTimer(),t._maybeStartTimer())}).catch(function(n){t._isExporting=!1,(0,k.globalErrorHandler)(n)})};if(this._finishedSpans.length>=this._maxExportBatchSize)return r();this._timer===void 0&&(this._timer=setTimeout(function(){return r()},this._scheduledDelayMillis),(0,k.unrefTimer)(this._timer))}},e.prototype._clearTimer=function(){this._timer!==void 0&&(clearTimeout(this._timer),this._timer=void 0)},e}();var Yl=function(){var e=function(t,r){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},e(t,r)};return function(t,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");e(t,r);function n(){this.constructor=t}t.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),Mt=function(e){Yl(t,e);function t(r,n){var o=e.call(this,r,n)||this;return o.onInit(n),o}return t.prototype.onInit=function(r){var n=this;r?.disableAutoFlushOnDocumentHide!==!0&&typeof document<\"u\"&&(this._visibilityChangeListener=function(){document.visibilityState===\"hidden\"&&n.forceFlush()},this._pageHideListener=function(){n.forceFlush()},document.addEventListener(\"visibilitychange\",this._visibilityChangeListener),document.addEventListener(\"pagehide\",this._pageHideListener))},t.prototype.onShutdown=function(){typeof document<\"u\"&&(this._visibilityChangeListener&&document.removeEventListener(\"visibilitychange\",this._visibilityChangeListener),this._pageHideListener&&document.removeEventListener(\"pagehide\",this._pageHideListener))},t}(bo);var zl=8,$l=16,er=function(){function e(){this.generateTraceId=Lo($l),this.generateSpanId=Lo(zl)}return e}();var tr=Array(32);function Lo(e){return function(){for(var r=0;r=58&&(tr[r]+=39);return String.fromCharCode.apply(null,tr.slice(0,e*2))}}var Po=function(){function e(t,r,n){this._tracerProvider=n;var o=Ro(r);this._sampler=o.sampler,this._generalLimits=o.generalLimits,this._spanLimits=o.spanLimits,this._idGenerator=r.idGenerator||new er,this.resource=n.resource,this.instrumentationLibrary=t}return e.prototype.startSpan=function(t,r,n){var o,i,a;r===void 0&&(r={}),n===void 0&&(n=l.context.active()),r.root&&(n=l.trace.deleteSpan(n));var u=l.trace.getSpan(n);if((0,Kt.isTracingSuppressed)(n)){l.diag.debug(\"Instrumentation suppressed, returning Noop Span\");var c=l.trace.wrapSpanContext(l.INVALID_SPAN_CONTEXT);return c}var s=u?.spanContext(),f=this._idGenerator.generateSpanId(),p,d,m;!s||!l.trace.isSpanContextValid(s)?p=this._idGenerator.generateTraceId():(p=s.traceId,d=s.traceState,m=s.spanId);var g=(o=r.kind)!==null&&o!==void 0?o:l.SpanKind.INTERNAL,C=((i=r.links)!==null&&i!==void 0?i:[]).map(function(bt){return{context:bt.context,attributes:(0,Kt.sanitizeAttributes)(bt.attributes)}}),M=(0,Kt.sanitizeAttributes)(r.attributes),T=this._sampler.shouldSample(n,p,t,g,M,C);d=(a=T.traceState)!==null&&a!==void 0?a:d;var rt=T.decision===l.SamplingDecision.RECORD_AND_SAMPLED?l.TraceFlags.SAMPLED:l.TraceFlags.NONE,q={traceId:p,spanId:f,traceFlags:rt,traceState:d};if(T.decision===l.SamplingDecision.NOT_RECORD){l.diag.debug(\"Recording is off, propagating context in a non-recording span\");var c=l.trace.wrapSpanContext(q);return c}var U=(0,Kt.sanitizeAttributes)(Object.assign(M,T.attributes)),wr=new yo(this,n,t,q,g,m,C,r.startTime,void 0,U);return wr},e.prototype.startActiveSpan=function(t,r,n,o){var i,a,u;if(!(arguments.length<2)){arguments.length===2?u=r:arguments.length===3?(i=r,u=n):(i=r,a=n,u=o);var c=a??l.context.active(),s=this.startSpan(t,i,c),f=l.trace.setSpan(c,s);return l.context.with(f,u,void 0,s)}},e.prototype.getGeneralLimits=function(){return this._generalLimits},e.prototype.getSpanLimits=function(){return this._spanLimits},e.prototype.getActiveSpanProcessor=function(){return this._tracerProvider.getActiveSpanProcessor()},e}();E();var Q=v(P());E();var mt=v(se()),rr=v(P());function Io(){return\"unknown_service\"}var Tt=function(){return Tt=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},H=function(){function e(t,r){var n=this,o;this._attributes=t,this.asyncAttributesPending=r!=null,this._syncAttributes=(o=this._attributes)!==null&&o!==void 0?o:{},this._asyncAttributesPromise=r?.then(function(i){return n._attributes=Object.assign({},n._attributes,i),n.asyncAttributesPending=!1,i},function(i){return l.diag.debug(\"a resource's async attributes promise rejected: %s\",i),n.asyncAttributesPending=!1,{}})}return e.empty=function(){return e.EMPTY},e.default=function(){var t;return new e((t={},t[mt.SemanticResourceAttributes.SERVICE_NAME]=Io(),t[mt.SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE]=rr.SDK_INFO[mt.SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE],t[mt.SemanticResourceAttributes.TELEMETRY_SDK_NAME]=rr.SDK_INFO[mt.SemanticResourceAttributes.TELEMETRY_SDK_NAME],t[mt.SemanticResourceAttributes.TELEMETRY_SDK_VERSION]=rr.SDK_INFO[mt.SemanticResourceAttributes.TELEMETRY_SDK_VERSION],t))},Object.defineProperty(e.prototype,\"attributes\",{get:function(){var t;return this.asyncAttributesPending&&l.diag.error(\"Accessing resource attributes before async attributes settled\"),(t=this._attributes)!==null&&t!==void 0?t:{}},enumerable:!1,configurable:!0}),e.prototype.waitForAsyncAttributes=function(){return Ql(this,void 0,void 0,function(){return Jl(this,function(t){switch(t.label){case 0:return this.asyncAttributesPending?[4,this._asyncAttributesPromise]:[3,2];case 1:t.sent(),t.label=2;case 2:return[2]}})})},e.prototype.merge=function(t){var r=this,n;if(!t)return this;var o=Tt(Tt({},this._syncAttributes),(n=t._syncAttributes)!==null&&n!==void 0?n:t.attributes);if(!this._asyncAttributesPromise&&!t._asyncAttributesPromise)return new e(o);var i=Promise.all([this._asyncAttributesPromise,t._asyncAttributesPromise]).then(function(a){var u,c=Zl(a,2),s=c[0],f=c[1];return Tt(Tt(Tt(Tt({},r._syncAttributes),s),(u=t._syncAttributes)!==null&&u!==void 0?u:t.attributes),f)});return new e(o,i)},e.EMPTY=new e({}),e}();E();var Co=v(P()),No=v(se());var tf=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},ef=function(e,t){var r=typeof Symbol==\"function\"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},rf=function(){function e(){this._MAX_LENGTH=255,this._COMMA_SEPARATOR=\",\",this._LABEL_KEY_VALUE_SPLITTER=\"=\",this._ERROR_MESSAGE_INVALID_CHARS=\"should be a ASCII string with a length greater than 0 and not exceed \"+this._MAX_LENGTH+\" characters.\",this._ERROR_MESSAGE_INVALID_VALUE=\"should be a ASCII string with a length not exceed \"+this._MAX_LENGTH+\" characters.\"}return e.prototype.detect=function(t){var r={},n=(0,Co.getEnv)(),o=n.OTEL_RESOURCE_ATTRIBUTES,i=n.OTEL_SERVICE_NAME;if(o)try{var a=this._parseResourceAttributes(o);Object.assign(r,a)}catch(u){l.diag.debug(\"EnvDetector failed: \"+u.message)}return i&&(r[No.SemanticResourceAttributes.SERVICE_NAME]=i),new H(r)},e.prototype._parseResourceAttributes=function(t){var r,n;if(!t)return{};var o={},i=t.split(this._COMMA_SEPARATOR,-1);try{for(var a=tf(i),u=a.next();!u.done;u=a.next()){var c=u.value,s=c.split(this._LABEL_KEY_VALUE_SPLITTER,-1);if(s.length===2){var f=ef(s,2),p=f[0],d=f[1];if(p=p.trim(),d=d.trim().split(/^\"|\"$/).join(\"\"),!this._isValidAndNotEmpty(p))throw new Error(\"Attribute key \"+this._ERROR_MESSAGE_INVALID_CHARS);if(!this._isValid(d))throw new Error(\"Attribute value \"+this._ERROR_MESSAGE_INVALID_VALUE);o[p]=decodeURIComponent(d)}}}catch(m){r={error:m}}finally{try{u&&!u.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return o},e.prototype._isValid=function(t){return t.length<=this._MAX_LENGTH&&this._isBaggageOctetString(t)},e.prototype._isBaggageOctetString=function(t){for(var r=0;r126)return!1}return!0},e.prototype._isValidAndNotEmpty=function(t){return t.length>0&&this._isValid(t)},e}(),wo=new rf;E();var Mo=function(e){return e!==null&&typeof e==\"object\"&&typeof e.then==\"function\"};var nf=function(e,t,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function u(f){try{s(n.next(f))}catch(p){a(p)}}function c(f){try{s(n.throw(f))}catch(p){a(p)}}function s(f){f.done?i(f.value):o(f.value).then(u,c)}s((n=n.apply(e,t||[])).next())})},of=function(e,t){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:u(0),throw:u(1),return:u(2)},typeof Symbol==\"function\"&&(a[Symbol.iterator]=function(){return this}),a;function u(s){return function(f){return c([s,f])}}function c(s){if(n)throw new TypeError(\"Generator is already executing.\");for(;r;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return r.label++,{value:s[1],done:!1};case 5:r.label++,o=s[1],s=[0];continue;case 7:s=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]0){var r=JSON.stringify(t.attributes,null,4);l.diag.verbose(r)}})};var Do=v(P()),nr=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},Uo=function(){function e(t){this._spanProcessors=t}return e.prototype.forceFlush=function(){var t,r,n=[];try{for(var o=nr(this._spanProcessors),i=o.next();!i.done;i=o.next()){var a=i.value;n.push(a.forceFlush())}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return new Promise(function(u){Promise.all(n).then(function(){u()}).catch(function(c){(0,Do.globalErrorHandler)(c||new Error(\"MultiSpanProcessor: forceFlush failed\")),u()})})},e.prototype.onStart=function(t,r){var n,o;try{for(var i=nr(this._spanProcessors),a=i.next();!a.done;a=i.next()){var u=a.value;u.onStart(t,r)}}catch(c){n={error:c}}finally{try{a&&!a.done&&(o=i.return)&&o.call(i)}finally{if(n)throw n.error}}},e.prototype.onEnd=function(t){var r,n;try{for(var o=nr(this._spanProcessors),i=o.next();!i.done;i=o.next()){var a=i.value;a.onEnd(t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.shutdown=function(){var t,r,n=[];try{for(var o=nr(this._spanProcessors),i=o.next();!i.done;i=o.next()){var a=i.value;n.push(a.shutdown())}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return new Promise(function(u,c){Promise.all(n).then(function(){u()},c)})},e}();var Bo=function(){function e(){}return e.prototype.onStart=function(t,r){},e.prototype.onEnd=function(t){},e.prototype.shutdown=function(){return Promise.resolve()},e.prototype.forceFlush=function(){return Promise.resolve()},e}();var xt;(function(e){e[e.resolved=0]=\"resolved\",e[e.timeout=1]=\"timeout\",e[e.error=2]=\"error\",e[e.unresolved=3]=\"unresolved\"})(xt||(xt={}));var Vo=function(){function e(t){t===void 0&&(t={});var r;this._registeredSpanProcessors=[],this._tracers=new Map;var n=(0,Q.merge)({},Ze(),Oo(t));this.resource=(r=n.resource)!==null&&r!==void 0?r:H.empty(),this.resource=H.default().merge(this.resource),this._config=Object.assign({},n,{resource:this.resource});var o=this._buildExporterFromEnv();if(o!==void 0){var i=new Mt(o);this.activeSpanProcessor=i}else this.activeSpanProcessor=new Bo}return e.prototype.getTracer=function(t,r,n){var o=t+\"@\"+(r||\"\")+\":\"+(n?.schemaUrl||\"\");return this._tracers.has(o)||this._tracers.set(o,new Po({name:t,version:r,schemaUrl:n?.schemaUrl},this._config,this)),this._tracers.get(o)},e.prototype.addSpanProcessor=function(t){this._registeredSpanProcessors.length===0&&this.activeSpanProcessor.shutdown().catch(function(r){return l.diag.error(\"Error while trying to shutdown current span processor\",r)}),this._registeredSpanProcessors.push(t),this.activeSpanProcessor=new Uo(this._registeredSpanProcessors)},e.prototype.getActiveSpanProcessor=function(){return this.activeSpanProcessor},e.prototype.register=function(t){t===void 0&&(t={}),l.trace.setGlobalTracerProvider(this),t.propagator===void 0&&(t.propagator=this._buildPropagatorFromEnv()),t.contextManager&&l.context.setGlobalContextManager(t.contextManager),t.propagator&&l.propagation.setGlobalPropagator(t.propagator)},e.prototype.forceFlush=function(){var t=this._config.forceFlushTimeoutMillis,r=this._registeredSpanProcessors.map(function(n){return new Promise(function(o){var i,a=setTimeout(function(){o(new Error(\"Span processor did not completed within timeout period of \"+t+\" ms\")),i=xt.timeout},t);n.forceFlush().then(function(){clearTimeout(a),i!==xt.timeout&&(i=xt.resolved,o(i))}).catch(function(u){clearTimeout(a),i=xt.error,o(u)})})});return new Promise(function(n,o){Promise.all(r).then(function(i){var a=i.filter(function(u){return u!==xt.resolved});a.length>0?o(a):n()}).catch(function(i){return o([i])})})},e.prototype.shutdown=function(){return this.activeSpanProcessor.shutdown()},e.prototype._getPropagator=function(t){var r;return(r=this.constructor._registeredPropagators.get(t))===null||r===void 0?void 0:r()},e.prototype._getSpanExporter=function(t){var r;return(r=this.constructor._registeredExporters.get(t))===null||r===void 0?void 0:r()},e.prototype._buildPropagatorFromEnv=function(){var t=this,r=Array.from(new Set((0,Q.getEnv)().OTEL_PROPAGATORS)),n=r.map(function(i){var a=t._getPropagator(i);return a||l.diag.warn('Propagator \"'+i+'\" requested through environment variable is unavailable.'),a}),o=n.reduce(function(i,a){return a&&i.push(a),i},[]);if(o.length!==0)return r.length===1?o[0]:new Q.CompositePropagator({propagators:o})},e.prototype._buildExporterFromEnv=function(){var t=(0,Q.getEnv)().OTEL_TRACES_EXPORTER;if(!(t===\"none\"||t===\"\")){var r=this._getSpanExporter(t);return r||l.diag.error('Exporter \"'+t+'\" requested through environment variable is unavailable.'),r}},e._registeredPropagators=new Map([[\"tracecontext\",function(){return new Q.W3CTraceContextPropagator}],[\"baggage\",function(){return new Q.W3CBaggagePropagator}]]),e._registeredExporters=new Map,e}();E();var at={};z(at,_opentelemetry_api_logs__WEBPACK_IMPORTED_MODULE_3__);var Hu=v(jo(),1);E();var or=v(P());E();E();E();var Wt=v(P()),lf=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},ff=function(e,t){var r=typeof Symbol==\"function\"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},ko=function(){function e(t,r,n){this.attributes={},this.totalAttributesCount=0,this._isReadonly=!1;var o=n.timestamp,i=n.observedTimestamp,a=n.severityNumber,u=n.severityText,c=n.body,s=n.attributes,f=s===void 0?{}:s,p=n.context,d=Date.now();if(this.hrTime=(0,Wt.timeInputToHrTime)(o??d),this.hrTimeObserved=(0,Wt.timeInputToHrTime)(i??d),p){var m=l.trace.getSpanContext(p);m&&l.isSpanContextValid(m)&&(this.spanContext=m)}this.severityNumber=a,this.severityText=u,this.body=c,this.resource=t.resource,this.instrumentationScope=r,this._logRecordLimits=t.logRecordLimits,this.setAttributes(f)}return Object.defineProperty(e.prototype,\"severityText\",{get:function(){return this._severityText},set:function(t){this._isLogRecordReadonly()||(this._severityText=t)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"severityNumber\",{get:function(){return this._severityNumber},set:function(t){this._isLogRecordReadonly()||(this._severityNumber=t)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"body\",{get:function(){return this._body},set:function(t){this._isLogRecordReadonly()||(this._body=t)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"droppedAttributesCount\",{get:function(){return this.totalAttributesCount-Object.keys(this.attributes).length},enumerable:!1,configurable:!0}),e.prototype.setAttribute=function(t,r){return this._isLogRecordReadonly()?this:r===null?this:t.length===0?(l.diag.warn(\"Invalid attribute key: \"+t),this):!(0,Wt.isAttributeValue)(r)&&!(typeof r==\"object\"&&!Array.isArray(r)&&Object.keys(r).length>0)?(l.diag.warn(\"Invalid attribute value set for key: \"+t),this):(this.totalAttributesCount+=1,Object.keys(this.attributes).length>=this._logRecordLimits.attributeCountLimit&&!Object.prototype.hasOwnProperty.call(this.attributes,t)?this:((0,Wt.isAttributeValue)(r)?this.attributes[t]=this._truncateToSize(r):this.attributes[t]=r,this))},e.prototype.setAttributes=function(t){var r,n;try{for(var o=lf(Object.entries(t)),i=o.next();!i.done;i=o.next()){var a=ff(i.value,2),u=a[0],c=a[1];this.setAttribute(u,c)}}catch(s){r={error:s}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return this},e.prototype.setBody=function(t){return this.body=t,this},e.prototype.setSeverityNumber=function(t){return this.severityNumber=t,this},e.prototype.setSeverityText=function(t){return this.severityText=t,this},e.prototype._makeReadonly=function(){this._isReadonly=!0},e.prototype._truncateToSize=function(t){var r=this,n=this._logRecordLimits.attributeValueLengthLimit;return n<=0?(l.diag.warn(\"Attribute value limit must be positive, got \"+n),t):typeof t==\"string\"?this._truncateToLimitUtil(t,n):Array.isArray(t)?t.map(function(o){return typeof o==\"string\"?r._truncateToLimitUtil(o,n):o}):t},e.prototype._truncateToLimitUtil=function(t,r){return t.length<=r?t:t.substring(0,r)},e.prototype._isLogRecordReadonly=function(){return this._isReadonly&&l.diag.warn(\"Can not execute the operation on emitted log record\"),this._isReadonly},e}();var Sn=function(){return Sn=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")};function es(e){return e!=null}function rs(e){var t=Object.keys(e);return t.length===0?\"\":(t=t.sort(),JSON.stringify(t.map(function(r){return[r,e[r]]})))}function ns(e){var t,r;return e.name+\":\"+((t=e.version)!==null&&t!==void 0?t:\"\")+\":\"+((r=e.schemaUrl)!==null&&r!==void 0?r:\"\")}var hf=function(e){df(t,e);function t(r){var n=e.call(this,r)||this;return Object.setPrototypeOf(n,t.prototype),n}return t}(Error);function yn(e,t){var r,n=new Promise(function(i,a){r=setTimeout(function(){a(new hf(\"Operation timed out.\"))},t)});return Promise.race([e,n]).then(function(o){return clearTimeout(r),o},function(o){throw clearTimeout(r),o})}function is(e){return Zo(this,void 0,void 0,function(){var t=this;return ts(this,function(r){return[2,Promise.all(e.map(function(n){return Zo(t,void 0,void 0,function(){var o,i;return ts(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n];case 1:return o=a.sent(),[2,{status:\"fulfilled\",value:o}];case 2:return i=a.sent(),[2,{status:\"rejected\",reason:i}];case 3:return[2]}})})}))]})})}function os(e){return e.status===\"rejected\"}function ss(e,t){var r,n;if(e.size!==t.size)return!1;try{for(var o=_f(e),i=o.next();!i.done;i=o.next()){var a=i.value;if(!t.has(a))return!1}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return!0}function as(e,t){return e.toLowerCase()===t.toLowerCase()}E();var ct;(function(e){e.COUNTER=\"COUNTER\",e.HISTOGRAM=\"HISTOGRAM\",e.UP_DOWN_COUNTER=\"UP_DOWN_COUNTER\",e.OBSERVABLE_COUNTER=\"OBSERVABLE_COUNTER\",e.OBSERVABLE_GAUGE=\"OBSERVABLE_GAUGE\",e.OBSERVABLE_UP_DOWN_COUNTER=\"OBSERVABLE_UP_DOWN_COUNTER\"})(ct||(ct={}));function lt(e,t,r){var n,o,i,a;return mf(e)||l.diag.warn('Invalid metric name: \"'+e+'\". The metric name should be a ASCII string with a length no greater than 255 characters.'),{name:e,type:t,description:(n=r?.description)!==null&&n!==void 0?n:\"\",unit:(o=r?.unit)!==null&&o!==void 0?o:\"\",valueType:(i=r?.valueType)!==null&&i!==void 0?i:l.ValueType.DOUBLE,advice:(a=r?.advice)!==null&&a!==void 0?a:{}}}function us(e,t){var r,n;return{name:(r=e.name)!==null&&r!==void 0?r:t.name,description:(n=e.description)!==null&&n!==void 0?n:t.description,type:t.type,unit:t.unit,valueType:t.valueType,advice:t.advice}}function cs(e,t){return as(e.name,t.name)&&e.unit===t.unit&&e.type===t.type&&e.valueType===t.valueType}var Ef=/^[a-z][a-z0-9_.\\-/]{0,254}$/i;function mf(e){return e.match(Ef)!=null}E();var ls=function(){function e(){this._registeredViews=[]}return e.prototype.addView=function(t){this._registeredViews.push(t)},e.prototype.findViews=function(t,r){var n=this,o=this._registeredViews.filter(function(i){return n._matchInstrument(i.instrumentSelector,t)&&n._matchMeter(i.meterSelector,r)});return o},e.prototype._matchInstrument=function(t,r){return(t.getType()===void 0||r.type===t.getType())&&t.getNameFilter().match(r.name)&&t.getUnitFilter().match(r.unit)},e.prototype._matchMeter=function(t,r){return t.getNameFilter().match(r.name)&&(r.version===void 0||t.getVersionFilter().match(r.version))&&(r.schemaUrl===void 0||t.getSchemaUrlFilter().match(r.schemaUrl))},e}();E();var fs=v(P()),Yt=function(){var e=function(t,r){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},e(t,r)};return function(t,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");e(t,r);function n(){this.constructor=t}t.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),vn=function(){function e(t,r){this._writableMetricStorage=t,this._descriptor=r}return e.prototype._record=function(t,r,n){if(r===void 0&&(r={}),n===void 0&&(n=l.context.active()),typeof t!=\"number\"){l.diag.warn(\"non-number value provided to metric \"+this._descriptor.name+\": \"+t);return}this._descriptor.valueType===l.ValueType.INT&&!Number.isInteger(t)&&(l.diag.warn(\"INT value type cannot accept a floating-point value for \"+this._descriptor.name+\", ignoring the fractional digits.\"),t=Math.trunc(t),!Number.isInteger(t))||this._writableMetricStorage.record(t,r,n,(0,fs.millisToHrTime)(Date.now()))},e}();var ps=function(e){Yt(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.add=function(r,n,o){this._record(r,n,o)},t}(vn);var ds=function(e){Yt(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.add=function(r,n,o){if(r<0){l.diag.warn(\"negative value provided to counter \"+this._descriptor.name+\": \"+r);return}this._record(r,n,o)},t}(vn);var _s=function(e){Yt(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.record=function(r,n,o){if(r<0){l.diag.warn(\"negative value provided to histogram \"+this._descriptor.name+\": \"+r);return}this._record(r,n,o)},t}(vn);var ar=function(){function e(t,r,n){this._observableRegistry=n,this._descriptor=t,this._metricStorages=r}return e.prototype.addCallback=function(t){this._observableRegistry.addCallback(t,this)},e.prototype.removeCallback=function(t){this._observableRegistry.removeCallback(t,this)},e}();var hs=function(e){Yt(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(ar);var Es=function(e){Yt(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(ar);var ms=function(e){Yt(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(ar);function fe(e){return e instanceof ar}var Ts=function(){function e(t){this._meterSharedState=t}return e.prototype.createHistogram=function(t,r){var n=lt(t,ct.HISTOGRAM,r),o=this._meterSharedState.registerMetricStorage(n);return new _s(o,n)},e.prototype.createCounter=function(t,r){var n=lt(t,ct.COUNTER,r),o=this._meterSharedState.registerMetricStorage(n);return new ds(o,n)},e.prototype.createUpDownCounter=function(t,r){var n=lt(t,ct.UP_DOWN_COUNTER,r),o=this._meterSharedState.registerMetricStorage(n);return new ps(o,n)},e.prototype.createObservableGauge=function(t,r){var n=lt(t,ct.OBSERVABLE_GAUGE,r),o=this._meterSharedState.registerAsyncMetricStorage(n);return new Es(n,o,this._meterSharedState.observableRegistry)},e.prototype.createObservableCounter=function(t,r){var n=lt(t,ct.OBSERVABLE_COUNTER,r),o=this._meterSharedState.registerAsyncMetricStorage(n);return new hs(n,o,this._meterSharedState.observableRegistry)},e.prototype.createObservableUpDownCounter=function(t,r){var n=lt(t,ct.OBSERVABLE_UP_DOWN_COUNTER,r),o=this._meterSharedState.registerAsyncMetricStorage(n);return new ms(n,o,this._meterSharedState.observableRegistry)},e.prototype.addBatchObservableCallback=function(t,r){this._meterSharedState.observableRegistry.addBatchCallback(t,r)},e.prototype.removeBatchObservableCallback=function(t,r){this._meterSharedState.observableRegistry.removeBatchCallback(t,r)},e}();var ur=function(){function e(t){this._instrumentDescriptor=t}return e.prototype.getInstrumentDescriptor=function(){return this._instrumentDescriptor},e.prototype.updateDescription=function(t){this._instrumentDescriptor=lt(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:t,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})},e}();var Tf=function(){var e=function(t,r){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},e(t,r)};return function(t,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");e(t,r);function n(){this.constructor=t}t.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),Ss=function(e,t){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:u(0),throw:u(1),return:u(2)},typeof Symbol==\"function\"&&(a[Symbol.iterator]=function(){return this}),a;function u(s){return function(f){return c([s,f])}}function c(s){if(n)throw new TypeError(\"Generator is already executing.\");for(;r;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return r.label++,{value:s[1],done:!1};case 5:r.label++,o=s[1],s=[0];continue;case 7:s=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},cr=function(){function e(t){this._aggregator=t,this._activeCollectionStorage=new J,this._cumulativeMemoStorage=new J}return e.prototype.record=function(t,r,n,o){var i=this,a=this._activeCollectionStorage.getOrDefault(r,function(){return i._aggregator.createAccumulation(o)});a?.record(t)},e.prototype.batchCumulate=function(t,r){var n=this;Array.from(t.entries()).forEach(function(o){var i=gf(o,3),a=i[0],u=i[1],c=i[2],s=n._aggregator.createAccumulation(r);s?.record(u);var f=s;if(n._cumulativeMemoStorage.has(a,c)){var p=n._cumulativeMemoStorage.get(a,c);f=n._aggregator.diff(p,s)}if(n._activeCollectionStorage.has(a,c)){var d=n._activeCollectionStorage.get(a,c);f=n._aggregator.merge(d,f)}n._cumulativeMemoStorage.set(a,s,c),n._activeCollectionStorage.set(a,f,c)})},e.prototype.collect=function(){var t=this._activeCollectionStorage;return this._activeCollectionStorage=new J,t},e}();var An=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},gs=function(e,t){var r=typeof Symbol==\"function\"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},lr=function(){function e(t,r){var n=this;this._aggregator=t,this._unreportedAccumulations=new Map,this._reportHistory=new Map,r.forEach(function(o){n._unreportedAccumulations.set(o,[])})}return e.prototype.buildMetrics=function(t,r,n,o){this._stashAccumulations(n);var i=this._getMergedUnreportedAccumulations(t),a=i,u;if(this._reportHistory.has(t)){var c=this._reportHistory.get(t),s=c.collectionTime;u=c.aggregationTemporality,u===sr.CUMULATIVE?a=e.merge(c.accumulations,i,this._aggregator):a=e.calibrateStartTime(c.accumulations,i,s)}else u=t.selectAggregationTemporality(r.type);this._reportHistory.set(t,{accumulations:a,collectionTime:o,aggregationTemporality:u});var f=yf(a);if(f.length!==0)return this._aggregator.toMetricData(r,u,f,o)},e.prototype._stashAccumulations=function(t){var r,n,o=this._unreportedAccumulations.keys();try{for(var i=An(o),a=i.next();!a.done;a=i.next()){var u=a.value,c=this._unreportedAccumulations.get(u);c===void 0&&(c=[],this._unreportedAccumulations.set(u,c)),c.push(t)}}catch(s){r={error:s}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}},e.prototype._getMergedUnreportedAccumulations=function(t){var r,n,o=new J,i=this._unreportedAccumulations.get(t);if(this._unreportedAccumulations.set(t,[]),i===void 0)return o;try{for(var a=An(i),u=a.next();!u.done;u=a.next()){var c=u.value;o=e.merge(o,c,this._aggregator)}}catch(s){r={error:s}}finally{try{u&&!u.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return o},e.merge=function(t,r,n){for(var o=t,i=r.entries(),a=i.next();a.done!==!0;){var u=gs(a.value,3),c=u[0],s=u[1],f=u[2];if(t.has(c,f)){var p=t.get(c,f),d=n.merge(p,s);o.set(c,d,f)}else o.set(c,s,f);a=i.next()}return o},e.calibrateStartTime=function(t,r,n){var o,i;try{for(var a=An(t.keys()),u=a.next();!u.done;u=a.next()){var c=gs(u.value,2),s=c[0],f=c[1],p=r.get(s,f);p?.setStartTime(n)}}catch(d){o={error:d}}finally{try{u&&!u.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return r},e}();function yf(e){return Array.from(e.entries())}var vf=function(){var e=function(t,r){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},e(t,r)};return function(t,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");e(t,r);function n(){this.constructor=t}t.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),Af=function(e,t){var r=typeof Symbol==\"function\"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},ys=function(e){vf(t,e);function t(r,n,o,i){var a=e.call(this,r)||this;return a._attributesProcessor=o,a._deltaMetricStorage=new cr(n),a._temporalMetricStorage=new lr(n,i),a}return t.prototype.record=function(r,n){var o=this,i=new J;Array.from(r.entries()).forEach(function(a){var u=Af(a,2),c=u[0],s=u[1];i.set(o._attributesProcessor.process(c),s)}),this._deltaMetricStorage.batchCumulate(i,n)},t.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},t}(ur);E();function Rn(e,t){var r=\"\";return e.unit!==t.unit&&(r+=\"\t- Unit '\"+e.unit+\"' does not match '\"+t.unit+`'\n`),e.type!==t.type&&(r+=\"\t- Type '\"+e.type+\"' does not match '\"+t.type+`'\n`),e.valueType!==t.valueType&&(r+=\"\t- Value Type '\"+e.valueType+\"' does not match '\"+t.valueType+`'\n`),e.description!==t.description&&(r+=\"\t- Description '\"+e.description+\"' does not match '\"+t.description+`'\n`),r}function Rf(e,t){return\"\t- use valueType '\"+e.valueType+\"' on instrument creation or use an instrument name other than '\"+t.name+\"'\"}function Of(e,t){return\"\t- use unit '\"+e.unit+\"' on instrument creation or use an instrument name other than '\"+t.name+\"'\"}function bf(e,t){var r={name:t.name,type:t.type,unit:t.unit},n=JSON.stringify(r);return\"\t- create a new view with a name other than '\"+e.name+\"' and InstrumentSelector '\"+n+\"'\"}function Lf(e,t){var r={name:t.name,type:t.type,unit:t.unit},n=JSON.stringify(r);return\"\t- create a new view with a name other than '\"+e.name+\"' and InstrumentSelector '\"+n+`'\n \t- OR - create a new view with the name `+e.name+\" and description '\"+e.description+\"' and InstrumentSelector \"+n+`\n \t- OR - create a new view with the name `+t.name+\" and description '\"+e.description+\"' and InstrumentSelector \"+n}function On(e,t){return e.valueType!==t.valueType?Rf(e,t):e.unit!==t.unit?Of(e,t):e.type!==t.type?bf(e,t):e.description!==t.description?Lf(e,t):\"\"}var bn=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},vs=function(){function e(){this._sharedRegistry=new Map,this._perCollectorRegistry=new Map}return e.create=function(){return new e},e.prototype.getStorages=function(t){var r,n,o,i,a=[];try{for(var u=bn(this._sharedRegistry.values()),c=u.next();!c.done;c=u.next()){var s=c.value;a=a.concat(s)}}catch(m){r={error:m}}finally{try{c&&!c.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var f=this._perCollectorRegistry.get(t);if(f!=null)try{for(var p=bn(f.values()),d=p.next();!d.done;d=p.next()){var s=d.value;a=a.concat(s)}}catch(m){o={error:m}}finally{try{d&&!d.done&&(i=p.return)&&i.call(p)}finally{if(o)throw o.error}}return a},e.prototype.register=function(t){this._registerStorage(t,this._sharedRegistry)},e.prototype.registerForCollector=function(t,r){var n=this._perCollectorRegistry.get(t);n==null&&(n=new Map,this._perCollectorRegistry.set(t,n)),this._registerStorage(r,n)},e.prototype.findOrUpdateCompatibleStorage=function(t){var r=this._sharedRegistry.get(t.name);return r===void 0?null:this._findOrUpdateCompatibleStorage(t,r)},e.prototype.findOrUpdateCompatibleCollectorStorage=function(t,r){var n=this._perCollectorRegistry.get(t);if(n===void 0)return null;var o=n.get(r.name);return o===void 0?null:this._findOrUpdateCompatibleStorage(r,o)},e.prototype._registerStorage=function(t,r){var n=t.getInstrumentDescriptor(),o=r.get(n.name);if(o===void 0){r.set(n.name,[t]);return}o.push(t)},e.prototype._findOrUpdateCompatibleStorage=function(t,r){var n,o,i=null;try{for(var a=bn(r),u=a.next();!u.done;u=a.next()){var c=u.value,s=c.getInstrumentDescriptor();cs(s,t)?(s.description!==t.description&&(t.description.length>s.description.length&&c.updateDescription(t.description),l.diag.warn(\"A view or instrument with the name \",t.name,` has already been registered, but has a different description and is incompatible with another registered view.\n`,`Details:\n`,Rn(s,t),`The longer description will be used.\nTo resolve the conflict:`,On(s,t))),i=c):l.diag.warn(\"A view or instrument with the name \",t.name,` has already been registered and is incompatible with another registered view.\n`,`Details:\n`,Rn(s,t),`To resolve the conflict:\n`,On(s,t))}}catch(f){n={error:f}}finally{try{u&&!u.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return i},e}();var As=function(){function e(t){this._backingStorages=t}return e.prototype.record=function(t,r,n,o){this._backingStorages.forEach(function(i){i.record(t,r,n,o)})},e}();E();E();var Rs=function(){function e(t,r){this._instrumentName=t,this._valueType=r,this._buffer=new J}return e.prototype.observe=function(t,r){if(r===void 0&&(r={}),typeof t!=\"number\"){l.diag.warn(\"non-number value provided to metric \"+this._instrumentName+\": \"+t);return}this._valueType===l.ValueType.INT&&!Number.isInteger(t)&&(l.diag.warn(\"INT value type cannot accept a floating-point value for \"+this._instrumentName+\", ignoring the fractional digits.\"),t=Math.trunc(t),!Number.isInteger(t))||this._buffer.set(r,t)},e}();var Os=function(){function e(){this._buffer=new Map}return e.prototype.observe=function(t,r,n){if(n===void 0&&(n={}),!!fe(t)){var o=this._buffer.get(t);if(o==null&&(o=new J,this._buffer.set(t,o)),typeof r!=\"number\"){l.diag.warn(\"non-number value provided to metric \"+t._descriptor.name+\": \"+r);return}t._descriptor.valueType===l.ValueType.INT&&!Number.isInteger(r)&&(l.diag.warn(\"INT value type cannot accept a floating-point value for \"+t._descriptor.name+\", ignoring the fractional digits.\"),r=Math.trunc(r),!Number.isInteger(r))||o.set(n,r)}},e}();var Ln=function(e,t,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function u(f){try{s(n.next(f))}catch(p){a(p)}}function c(f){try{s(n.throw(f))}catch(p){a(p)}}function s(f){f.done?i(f.value):o(f.value).then(u,c)}s((n=n.apply(e,t||[])).next())})},Pn=function(e,t){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:u(0),throw:u(1),return:u(2)},typeof Symbol==\"function\"&&(a[Symbol.iterator]=function(){return this}),a;function u(s){return function(f){return c([s,f])}}function c(s){if(n)throw new TypeError(\"Generator is already executing.\");for(;r;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return r.label++,{value:s[1],done:!1};case 5:r.label++,o=s[1],s=[0];continue;case 7:s=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},Ls=function(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n=0||this._callbacks.push({callback:t,instrument:r})},e.prototype.removeCallback=function(t,r){var n=this._findCallback(t,r);n<0||this._callbacks.splice(n,1)},e.prototype.addBatchCallback=function(t,r){var n=new Set(r.filter(fe));if(n.size===0){l.diag.error(\"BatchObservableCallback is not associated with valid instruments\",r);return}var o=this._findBatchCallback(t,n);o>=0||this._batchCallbacks.push({callback:t,instruments:n})},e.prototype.removeBatchCallback=function(t,r){var n=new Set(r.filter(fe)),o=this._findBatchCallback(t,n);o<0||this._batchCallbacks.splice(o,1)},e.prototype.observe=function(t,r){return Ln(this,void 0,void 0,function(){var n,o,i,a;return Pn(this,function(u){switch(u.label){case 0:return n=this._observeCallbacks(t,r),o=this._observeBatchCallbacks(t,r),[4,is(Ls(Ls([],bs(n),!1),bs(o),!1))];case 1:return i=u.sent(),a=i.filter(os).map(function(c){return c.reason}),[2,a]}})})},e.prototype._observeCallbacks=function(t,r){var n=this;return this._callbacks.map(function(o){var i=o.callback,a=o.instrument;return Ln(n,void 0,void 0,function(){var u,c;return Pn(this,function(s){switch(s.label){case 0:return u=new Rs(a._descriptor.name,a._descriptor.valueType),c=Promise.resolve(i(u)),r!=null&&(c=yn(c,r)),[4,c];case 1:return s.sent(),a._metricStorages.forEach(function(f){f.record(u._buffer,t)}),[2]}})})})},e.prototype._observeBatchCallbacks=function(t,r){var n=this;return this._batchCallbacks.map(function(o){var i=o.callback,a=o.instruments;return Ln(n,void 0,void 0,function(){var u,c;return Pn(this,function(s){switch(s.label){case 0:return u=new Os,c=Promise.resolve(i(u)),r!=null&&(c=yn(c,r)),[4,c];case 1:return s.sent(),a.forEach(function(f){var p=u._buffer.get(f);p!=null&&f._metricStorages.forEach(function(d){d.record(p,t)})}),[2]}})})})},e.prototype._findCallback=function(t,r){return this._callbacks.findIndex(function(n){return n.callback===t&&n.instrument===r})},e.prototype._findBatchCallback=function(t,r){return this._batchCallbacks.findIndex(function(n){return n.callback===t&&ss(n.instruments,r)})},e}();var Pf=function(){var e=function(t,r){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},e(t,r)};return function(t,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");e(t,r);function n(){this.constructor=t}t.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),Is=function(e){Pf(t,e);function t(r,n,o,i){var a=e.call(this,r)||this;return a._attributesProcessor=o,a._deltaMetricStorage=new cr(n),a._temporalMetricStorage=new lr(n,i),a}return t.prototype.record=function(r,n,o,i){n=this._attributesProcessor.process(n,o),this._deltaMetricStorage.record(r,n,o,i)},t.prototype.collect=function(r,n){var o=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(r,this._instrumentDescriptor,o,n)},t}(ur);var Cs=function(){var e=function(t,r){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])},e(t,r)};return function(t,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");e(t,r);function n(){this.constructor=t}t.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}(),fr=function(){function e(){}return e.Noop=function(){return Cf},e}();var If=function(e){Cs(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.process=function(r,n){return r},t}(fr);var gE=function(e){Cs(t,e);function t(r){var n=e.call(this)||this;return n._allowedAttributeNames=r,n}return t.prototype.process=function(r,n){var o=this,i={};return Object.keys(r).filter(function(a){return o._allowedAttributeNames.includes(a)}).forEach(function(a){return i[a]=r[a]}),i},t}(fr);var Cf=new If;var Nf=function(e,t,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function u(f){try{s(n.next(f))}catch(p){a(p)}}function c(f){try{s(n.throw(f))}catch(p){a(p)}}function s(f){f.done?i(f.value):o(f.value).then(u,c)}s((n=n.apply(e,t||[])).next())})},wf=function(e,t){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:u(0),throw:u(1),return:u(2)},typeof Symbol==\"function\"&&(a[Symbol.iterator]=function(){return this}),a;function u(s){return function(f){return c([s,f])}}function c(s){if(n)throw new TypeError(\"Generator is already executing.\");for(;r;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return r.label++,{value:s[1],done:!1};case 5:r.label++,o=s[1],s=[0];continue;case 7:s=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},Ns=function(){function e(t,r){this._meterProviderSharedState=t,this._instrumentationScope=r,this.metricStorageRegistry=new vs,this.observableRegistry=new Ps,this.meter=new Ts(this)}return e.prototype.registerMetricStorage=function(t){var r=this._registerMetricStorage(t,Is);return r.length===1?r[0]:new As(r)},e.prototype.registerAsyncMetricStorage=function(t){var r=this._registerMetricStorage(t,ys);return r},e.prototype.collect=function(t,r,n){return Nf(this,void 0,void 0,function(){var o,i,a;return wf(this,function(u){switch(u.label){case 0:return[4,this.observableRegistry.observe(r,n?.timeoutMillis)];case 1:return o=u.sent(),i=this.metricStorageRegistry.getStorages(t),i.length===0?[2,null]:(a=i.map(function(c){return c.collect(t,r)}).filter(es),a.length===0?[2,{errors:o}]:[2,{scopeMetrics:{scope:this._instrumentationScope,metrics:a},errors:o}])}})})},e.prototype._registerMetricStorage=function(t,r){var n=this,o=this._meterProviderSharedState.viewRegistry.findViews(t,this._instrumentationScope),i=o.map(function(c){var s=us(c,t),f=n.metricStorageRegistry.findOrUpdateCompatibleStorage(s);if(f!=null)return f;var p=c.aggregation.createAggregator(s),d=new r(s,p,c.attributesProcessor,n._meterProviderSharedState.metricCollectors);return n.metricStorageRegistry.register(d),d});if(i.length===0){var a=this._meterProviderSharedState.selectAggregations(t.type),u=a.map(function(c){var s=Mf(c,2),f=s[0],p=s[1],d=n.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(f,t);if(d!=null)return d;var m=p.createAggregator(t),g=new r(t,m,fr.Noop(),[f]);return n.metricStorageRegistry.registerForCollector(f,g),g});i=i.concat(u)}return i},e}();var xf=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},ws=function(){function e(t){this.resource=t,this.viewRegistry=new ls,this.metricCollectors=[],this.meterSharedStates=new Map}return e.prototype.getMeterSharedState=function(t){var r=ns(t),n=this.meterSharedStates.get(r);return n==null&&(n=new Ns(this,t),this.meterSharedStates.set(r,n)),n},e.prototype.selectAggregations=function(t){var r,n,o=[];try{for(var i=xf(this.metricCollectors),a=i.next();!a.done;a=i.next()){var u=a.value;o.push([u,u.selectAggregation(t)])}}catch(c){r={error:c}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return o},e}();var Ms=v(P()),pr=function(e,t,r,n){function o(i){return i instanceof r?i:new r(function(a){a(i)})}return new(r||(r=Promise))(function(i,a){function u(f){try{s(n.next(f))}catch(p){a(p)}}function c(f){try{s(n.throw(f))}catch(p){a(p)}}function s(f){f.done?i(f.value):o(f.value).then(u,c)}s((n=n.apply(e,t||[])).next())})},dr=function(e,t){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,a;return a={next:u(0),throw:u(1),return:u(2)},typeof Symbol==\"function\"&&(a[Symbol.iterator]=function(){return this}),a;function u(s){return function(f){return c([s,f])}}function c(s){if(n)throw new TypeError(\"Generator is already executing.\");for(;r;)try{if(n=1,o&&(i=s[0]&2?o.return:s[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,s[1])).done)return i;switch(o=0,i&&(s=[s[0]&2,i.value]),s[0]){case 0:case 1:i=s;break;case 4:return r.label++,{value:s[1],done:!1};case 5:r.label++,o=s[1],s=[0];continue;case 7:s=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i},Uf=function(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n0&&i[i.length-1])&&(s[0]===6||s[0]===2)){r=0;continue}if(s[0]===3&&(!i||s[1]>i[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},In=function(){function e(t){var r,n,o;this._shutdown=!1;var i=H.default().merge((o=t?.resource)!==null&&o!==void 0?o:H.empty());if(this._sharedState=new ws(i),t?.views!=null&&t.views.length>0)try{for(var a=Bf(t.views),u=a.next();!u.done;u=a.next()){var c=u.value;this._sharedState.viewRegistry.addView(c)}}catch(s){r={error:s}}finally{try{u&&!u.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}}return e.prototype.getMeter=function(t,r,n){return r===void 0&&(r=\"\"),n===void 0&&(n={}),this._shutdown?(l.diag.warn(\"A shutdown MeterProvider cannot provide a Meter\"),(0,l.createNoopMeter)()):this._sharedState.getMeterSharedState({name:t,version:r,schemaUrl:n.schemaUrl}).meter},e.prototype.addMetricReader=function(t){var r=new xs(this._sharedState,t);t.setMetricProducer(r),this._sharedState.metricCollectors.push(r)},e.prototype.shutdown=function(t){return Ds(this,void 0,void 0,function(){return Us(this,function(r){switch(r.label){case 0:return this._shutdown?(l.diag.warn(\"shutdown may only be called once per MeterProvider\"),[2]):(this._shutdown=!0,[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.shutdown(t)}))]);case 1:return r.sent(),[2]}})})},e.prototype.forceFlush=function(t){return Ds(this,void 0,void 0,function(){return Us(this,function(r){switch(r.label){case 0:return this._shutdown?(l.diag.warn(\"invalid attempt to force flush after MeterProvider shutdown\"),[2]):[4,Promise.all(this._sharedState.metricCollectors.map(function(n){return n.forceFlush(t)}))];case 1:return r.sent(),[2]}})})},e}();var Nr=v(be(),1),Fu=v(Hs(),1),Ot=v(P(),1);E();var kf=Symbol.for(\"@vercel/request-context\");function K(){return globalThis[kf]?.get()}var Fs=\"http.method\",js=\"http.url\",Er=\"http.host\",ks=\"http.scheme\",wn=\"http.status_code\",qs=\"http.user_agent\",Mn=\"http.response_content_length_uncompressed\",Xs=\"net.peer.port\",Ks=\"net.peer.name\",Ws=\"cloud.region\";var Ys=\"deployment.environment.name\",zs=\"deployment.id\";var $s=\"process.runtime.name\",Qs=\"vcs.ref.head.name\",Js=\"vcs.ref.head.revision\",Zs=\"vcs.repository.name\",ta=\"vcs.repository.ref.revision\";var ea=\"service.name\",ra=\"service.version\";function xn(e){return Object.fromEntries(Object.entries(e).filter(([t,r])=>r!==void 0))}function ia({attributes:e,env:t=process.env,runtime:r,serviceName:n}){let o=t.VERCEL_ENV||t.NEXT_PUBLIC_VERCEL_ENV,i=t.VERCEL_DEPLOYMENT_ID,a=t.VERCEL_GIT_COMMIT_SHA||t.NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA,u=t.VERCEL_REGION,c=t.VERCEL_GIT_COMMIT_REF,s=t.VERCEL_URL||t.NEXT_PUBLIC_VERCEL_URL||void 0,f=t.VERCEL_BRANCH_URL||t.NEXT_PUBLIC_VERCEL_BRANCH_URL||void 0,p=t.VERCEL_GIT_REPO_SLUG;return xn({[ea]:n,\"node.ci\":t.CI?!0:void 0,\"node.env\":t.NODE_ENV,[Ys]:o,env:o,[Ws]:u,\"vercel.region\":u,[$s]:r,\"vercel.runtime\":r,[Qs]:c,[Js]:a,[Zs]:p,[ta]:a,\"vercel.sha\":a,\"vercel.host\":s,\"vercel.branch_host\":f,[zs]:i,\"vercel.deployment_id\":i,[ra]:i,\"vercel.project_id\":t.VERCEL_PROJECT_ID||void 0,...e})}function oa(e){return e?e.split(\"::\").at(-1):void 0}function sa(e=K(),t){if(!e)return;let r=t?Xf(t,e.headers):void 0;return xn({[Er]:e.headers.host,[qs]:e.headers[\"user-agent\"],\"http.referer\":e.headers.referer,\"vercel.request_id\":oa(e.headers[\"x-vercel-id\"]),\"vercel.matched_path\":e.headers[\"x-matched-path\"],\"vercel.edge_region\":process.env.VERCEL_REGION,...r})}var qf={keys(e){return[]},get(e,t){return e[t.toLocaleLowerCase()]}};function Xf(e,t){if(typeof e==\"function\")return e(t,qf);let r={};for(let[n,o]of Object.entries(e)){let i=t[o.toLocaleLowerCase()];i!==void 0&&(r[n]=i)}return r}E();function zt(e){return(e&l.TraceFlags.SAMPLED)!==0}var mr=class{constructor(t,r){this.processors=t;this.attributesFromHeaders=r;this.rootSpanIds=new Map;this.waitSpanEnd=new Map}forceFlush(){return Promise.all(this.processors.map(t=>t.forceFlush().catch(r=>{l.diag.error(\"@vercel/otel: forceFlush failed:\",r)}))).then(()=>{})}shutdown(){return Promise.all(this.processors.map(t=>t.shutdown().catch(()=>{}))).then(()=>{})}onStart(t,r){let{traceId:n,spanId:o,traceFlags:i}=t.spanContext(),a=!t.parentSpanId||!this.rootSpanIds.has(n);if(a?this.rootSpanIds.set(n,{rootSpanId:o,open:[]}):this.rootSpanIds.get(n)?.open.push(t),a&&zt(i)){let u=K(),c=sa(u,this.attributesFromHeaders);c&&t.setAttributes(c),u&&u.waitUntil(async()=>{if(this.rootSpanIds.has(n)){let s=new Promise(p=>{this.waitSpanEnd.set(n,p)}),f;await Promise.race([s,new Promise(p=>{f=setTimeout(()=>{this.waitSpanEnd.delete(n),p(void 0)},50)})]),f&&clearTimeout(f)}return this.forceFlush()})}for(let u of this.processors)u.onStart(t,r)}onEnd(t){let{traceId:r,spanId:n,traceFlags:o}=t.spanContext(),i=zt(o),a=this.rootSpanIds.get(r),u=a?.rootSpanId===n;if(i){let c=Wf(t);c&&Object.assign(t.attributes,c)}if(u){if(this.rootSpanIds.delete(r),a.open.length>0){for(let c of a.open)if(!c.ended&&c.spanContext().spanId!==n)try{c.end()}catch(s){l.diag.error(\"@vercel/otel: onEnd failed:\",s)}}}else if(a)for(let c=0;c{l.diag.debug(\"@vercel/otel/otlp: onSuccess\",s.status,s.statusText),r(),s.arrayBuffer().catch(()=>{})}).catch(s=>{l.diag.error(\"@vercel/otel/otlp: onError\",s),n(s)}).finally(()=>{let s=this._sendingPromises.indexOf(c);this._sendingPromises.splice(s,1)});this._sendingPromises.push(c)}getDefaultUrl(t){throw new Error(\"Method not implemented.\")}};var _p=\"v1/traces\",hp=`http://localhost:4318/${_p}`;function yr(e){return typeof e.url==\"string\"?e.url:hp}var Qt=class{constructor(t={}){this.impl=new Xn(t)}export(t,r){this.impl.export(t,r)}shutdown(){return this.impl.shutdown()}forceFlush(){return this.impl.forceFlush()}},Xn=class extends $t{convert(t){return(0,va.createExportTraceServiceRequest)(t,{useHex:!0,useLongBits:!1})}toMessage(t){return{body:JSON.stringify(t),contentType:\"application/json\"}}getDefaultUrl(t){return yr(t)}};var Ru=v(Fn(),1);var yu=v(gu(),1);function vu(e){let t=new yu.Writer;return bp(e,t),t.finish()}function bp(e,t){if(e.resourceSpans!=null&&e.resourceSpans.length)for(let r=0;r[^{}]+)\\}/g,(r,n)=>{let o=t[n];return o!==void 0?String(o):r})}var te=class{constructor(t={}){this.instrumentationName=\"@vercel/otel/fetch\";this.instrumentationVersion=\"1.0.0\";this.config=t}getConfig(){return this.config}setConfig(){}setTracerProvider(t){this.tracerProvider=t}setMeterProvider(){}shouldIgnore(t,r){let n=this.config.ignoreUrls??[];if(r?.opentelemetry?.ignore!==void 0)return r.opentelemetry.ignore;if(n.length===0)return!1;let o=t.toString();return n.some(i=>typeof i==\"string\"?i===\"*\"?!0:o.startsWith(i):i.test(o))}shouldPropagate(t,r){let n=process.env.VERCEL_URL||process.env.NEXT_PUBLIC_VERCEL_URL||null,o=process.env.VERCEL_BRANCH_URL||process.env.NEXT_PUBLIC_VERCEL_BRANCH_URL||null,i=this.config.propagateContextUrls??[],a=this.config.dontPropagateContextUrls??[];if(r?.opentelemetry?.propagateContext)return r.opentelemetry.propagateContext;let u=t.toString();return a.length>0&&a.some(c=>typeof c==\"string\"?c===\"*\"?!0:u.startsWith(c):c.test(u))?!1:n&&t.protocol===\"https:\"&&(t.host===n||t.host===o||t.host===K()?.headers.host)||!n&&t.protocol===\"http:\"&&t.hostname===\"localhost\"?!0:i.some(c=>typeof c==\"string\"?c===\"*\"?!0:u.startsWith(c):c.test(u))}startSpan({tracer:t,url:r,fetchType:n,method:o=\"GET\",name:i,attributes:a={}}){let u=this.config.resourceNameTemplate,c={[Fs]:o,[js]:r.toString(),[Er]:r.host,[ks]:r.protocol.replace(\":\",\"\"),[Ks]:r.hostname,[Xs]:r.port},s=u?Ou(u,c):Gp(r.toString()),f=i??`${n} ${o} ${r.toString()}`,p=l.context.active();return t.startSpan(f,{kind:l.SpanKind.CLIENT,attributes:{...c,\"operation.name\":`${n}.${o}`,\"http.client.name\":n,\"resource.name\":s,...a}},p)}instrumentHttp(t,r){let{tracerProvider:n}=this;if(!n)return;let o=n.getTracer(this.instrumentationName,this.instrumentationVersion),{attributesFromRequestHeaders:i,attributesFromResponseHeaders:a}=this.config,u=t.request,c=t.get,s=f=>(p,d,m)=>{let g,C={},M;if(typeof p==\"string\"||p instanceof URL?(g=new URL(p.toString()),typeof d==\"function\"?M=d:d&&typeof m==\"function\"?(C=d,M=m):d&&(C=d)):(C=p,typeof d==\"function\"&&(M=d),g=Fp(C,r)),this.shouldIgnore(g))return f.apply(this,[g,C,M]);let T=this.startSpan({tracer:o,url:g,fetchType:\"http\",method:C.method||\"GET\"});if(!T.isRecording()||!zt(T.spanContext().traceFlags))return T.end(),f.apply(this,[g,C,M]);if(this.shouldPropagate(g)){let rt=l.context.active(),q=l.trace.setSpan(rt,T);l.propagation.inject(q,C.headers||{},Vp)}i&&br(T,i,C.headers||{},Lu);try{let rt=Date.now(),q=f.apply(this,[g,C,M]);return q.prependListener(\"response\",U=>{let wr=Date.now()-rt;T.setAttribute(\"http.response_time\",wr),U.statusCode!==void 0?(T.setAttribute(wn,U.statusCode),U.statusCode>=500&&Vt(T,`Status: ${U.statusCode}`)):Vt(T,\"Response status code is undefined\"),a&&br(T,a,U.headers,Lu),q.listenerCount(\"response\")<=1&&U.resume(),U.on(\"end\",()=>{let bt,Mr=U.statusCode;U.aborted&&!U.complete?bt={code:l.SpanStatusCode.ERROR}:Mr&&Mr>=100&&Mr<500?bt={code:l.SpanStatusCode.UNSET}:bt={code:l.SpanStatusCode.ERROR},T.setStatus(bt),T.isRecording()&&(U.headers[\"content-length\"]&&T.setAttribute(Mn,U.headers[\"content-length\"]),T.end())})}),q.on(\"error\",U=>{T.isRecording()&&(Vt(T,U),T.end())}),q.on(\"close\",()=>{T.isRecording()&&T.end()}),q}catch(rt){throw Vt(T,rt),T.end(),rt}};t.request=s(u),t.get=s(c)}instrumentFetch(){let{tracerProvider:t}=this;if(!t)return;let r=t.getTracer(this.instrumentationName,this.instrumentationVersion),{attributesFromRequestHeaders:n,attributesFromResponseHeaders:o}=this.config;process.env.NEXT_OTEL_FETCH_DISABLED=\"1\";let i=globalThis.fetch;this.originalFetch=i;let a=async(u,c)=>{let s=c;if(s?.next?.internal)return i(u,s);let f=new Request(u instanceof Request?u.clone():u,s),p=new URL(f.url);if(this.shouldIgnore(p,s))return i(u,s);let d=this.startSpan({tracer:r,url:p,fetchType:\"fetch\",method:f.method,name:s?.opentelemetry?.spanName,attributes:s?.opentelemetry?.attributes});if(!d.isRecording()||!zt(d.spanContext().traceFlags))return d.end(),i(u,s);if(this.shouldPropagate(p,s)){let m=l.context.active(),g=l.trace.setSpan(m,d);l.propagation.inject(g,f.headers,Bp)}n&&br(d,n,f.headers,bu);try{let m=Date.now();s?.body&&s.body instanceof FormData&&f.headers.delete(\"content-type\");let g=await i(u,{...s,headers:f.headers}),C=Date.now()-m;return d.setAttribute(wn,g.status),d.setAttribute(\"http.response_time\",C),o&&br(d,o,g.headers,bu),g.status>=500&&Vt(d,`Status: ${g.status} (${g.statusText})`),g.body?Hp(g).then(M=>{d.isRecording()&&(d.setAttribute(Mn,M),d.end())},M=>{d.isRecording()&&(Vt(d,M),d.end())}):d.end(),g}catch(m){throw Vt(d,m),d.end(),m}};globalThis.fetch=a}enable(){this.disable(),this.instrumentFetch();try{let t=li(\"node:http\"),r=li(\"node:https\");this.instrumentHttp(t,\"http:\"),this.instrumentHttp(r,\"https:\")}catch{}}disable(){this.originalFetch&&(globalThis.fetch=this.originalFetch)}},Bp={set(e,t,r){e.set(t,r)}},bu={get(e,t){let r=e.get(t);if(r!==null)return r.includes(\",\")?r.split(\",\").map(n=>n.trimStart()):r},keys(e){let t=[];return e.forEach((r,n)=>{t.push(n)}),t}},Vp={set(e,t,r){e[t.toLowerCase()]=r}},Lu={get(e,t){return e[t.toLowerCase()]},keys(e){return Object.keys(e)}};function Gp(e){let t=e.indexOf(\"?\");return t===-1?e:e.substring(0,t)}function Hp(e){let t=0,n=e.clone().body?.getReader();if(!n)return Promise.resolve(0);let o=()=>n.read().then(({done:i,value:a})=>{if(!i)return t+=a.byteLength,o()});return o().then(()=>t)}function Vt(e,t){if(t instanceof Error)e.recordException(t),e.setStatus({code:l.SpanStatusCode.ERROR,message:t.message});else{let r=String(t);e.setStatus({code:l.SpanStatusCode.ERROR,message:r})}}function br(e,t,r,n){for(let[o,i]of Object.entries(t)){let a=n.get(r,i);a!==void 0&&e.setAttribute(o,a)}}function Fp(e,t){if(e.socketPath)throw new Error(\"Cannot construct a network URL: options.socketPath is specified, indicating a Unix domain socket.\");let r=e.protocol??t;r&&!r.endsWith(\":\")&&(r+=\":\");let n=e.hostname,o=e.port??e.defaultPort;if(!n&&e.host){let s=e.host.split(\":\");n=s[0];let f=s[1];if(s.length>1&&f&&o===void 0){let p=parseInt(f,10);isNaN(p)||(o=p)}}n||(n=\"localhost\");let i;if(o!==void 0&&o!==\"\"){let s=parseInt(String(o),10);isNaN(s)?i=r===\"https:\"?443:80:i=s}else i=r===\"https:\"?443:80;let a=e.path||\"/\",u=`${r}//${n}:${i}`,c=new URL(a,u);if(e.auth){let s=e.auth.split(\":\");c.username=decodeURIComponent(s[0]||\"\"),s.length>1&&(c.password=decodeURIComponent(s[1]||\"\"))}return c}E();var Pu=v(P(),1),jp=\"00\",si=\"traceparent\",ai=\"tracestate\",Te=class{fields(){return[si,ai]}inject(t,r,n){let o=l.trace.getSpanContext(t);if(!o||(0,Pu.isTracingSuppressed)(t)||!(0,l.isSpanContextValid)(o))return;let i=`${jp}-${o.traceId}-${o.spanId}-0${Number(o.traceFlags||0).toString(16)}`;n.set(r,si,i),o.traceState&&n.set(r,ai,o.traceState.serialize())}extract(t,r,n){let o=n.get(r,si);if(!o)return t;let i=Array.isArray(o)?o[0]:o;if(typeof i!=\"string\")return t;let a=kp(i);if(!a)return t;a.isRemote=!0;let u=n.get(r,ai);if(u){let c=Array.isArray(u)?u.join(\",\"):u;a.traceState=(0,l.createTraceState)(typeof c==\"string\"?c:void 0)}return l.trace.setSpanContext(t,a)}};function kp(e){let[t,r,n,o,i]=e.split(\"-\");return!t||!r||!n||!o||t.length!==2||r.length!==32||n.length!==16||o.length!==2||t===\"00\"&&i?null:{traceId:r,spanId:n,traceFlags:parseInt(o,16)}}E();var Lr=class{fields(){return[]}inject(){}extract(t){let r=K();if(!r?.telemetry)return l.diag.warn(\"@vercel/otel: Vercel telemetry extension not found.\"),t;let{rootSpanContext:n}=r.telemetry;return n?(l.diag.debug(\"@vercel/otel: Extracted root SpanContext from Vercel request context.\",n),l.trace.setSpanContext(t,{...n,isRemote:!0,traceFlags:n.traceFlags||l.TraceFlags.SAMPLED})):t}};E();var Pr=v(P(),1);var ee=v(P()),qp=BigInt(1e9);function Cu(e){return BigInt(e[0])*qp+BigInt(e[1])}function Xp(e){var t=Number(BigInt.asUintN(32,e)),r=Number(BigInt.asUintN(32,e>>BigInt(32)));return{low:t,high:r}}function Nu(e){var t=Cu(e);return Xp(t)}function Kp(e){var t=Cu(e);return t.toString()}var Wp=typeof BigInt<\"u\"?Kp:ee.hrTimeToNanoseconds;function Iu(e){return e}function wu(e){if(e!==void 0)return(0,ee.hexToBase64)(e)}var Yp={encodeHrTime:Nu,encodeSpanContext:ee.hexToBase64,encodeOptionalSpanContext:wu};function Mu(e){var t,r;if(e===void 0)return Yp;var n=(t=e.useLongBits)!==null&&t!==void 0?t:!0,o=(r=e.useHex)!==null&&r!==void 0?r:!1;return{encodeHrTime:n?Nu:Wp,encodeSpanContext:o?Iu:ee.hexToBase64,encodeOptionalSpanContext:o?Iu:wu}}var zp=function(e,t){var r=typeof Symbol==\"function\"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i};function re(e){return Object.keys(e).map(function(t){return xu(t,e[t])})}function xu(e,t){return{key:e,value:Du(t)}}function Du(e){var t=typeof e;return t===\"string\"?{stringValue:e}:t===\"number\"?Number.isInteger(e)?{intValue:e}:{doubleValue:e}:t===\"boolean\"?{boolValue:e}:e instanceof Uint8Array?{bytesValue:e}:Array.isArray(e)?{arrayValue:{values:e.map(Du)}}:t===\"object\"&&e!=null?{kvlistValue:{values:Object.entries(e).map(function(r){var n=zp(r,2),o=n[0],i=n[1];return xu(o,i)})}}:{}}function Uu(e,t){var r,n=e.spanContext(),o=e.status;return{traceId:t.encodeSpanContext(n.traceId),spanId:t.encodeSpanContext(n.spanId),parentSpanId:t.encodeOptionalSpanContext(e.parentSpanId),traceState:(r=n.traceState)===null||r===void 0?void 0:r.serialize(),name:e.name,kind:e.kind==null?0:e.kind+1,startTimeUnixNano:t.encodeHrTime(e.startTime),endTimeUnixNano:t.encodeHrTime(e.endTime),attributes:re(e.attributes),droppedAttributesCount:e.droppedAttributesCount,events:e.events.map(function(i){return Qp(i,t)}),droppedEventsCount:e.droppedEventsCount,status:{code:o.code,message:o.message},links:e.links.map(function(i){return $p(i,t)}),droppedLinksCount:e.droppedLinksCount}}function $p(e,t){var r;return{attributes:e.attributes?re(e.attributes):[],spanId:t.encodeSpanContext(e.context.spanId),traceId:t.encodeSpanContext(e.context.traceId),traceState:(r=e.context.traceState)===null||r===void 0?void 0:r.serialize(),droppedAttributesCount:e.droppedAttributesCount||0}}function Qp(e,t){return{attributes:e.attributes?re(e.attributes):[],name:e.name,timeUnixNano:t.encodeHrTime(e.time),droppedAttributesCount:e.droppedAttributesCount||0}}var Jp=function(e){var t=typeof Symbol==\"function\"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length==\"number\")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},Zp=function(e,t){var r=typeof Symbol==\"function\"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i};function ui(e,t){var r=Mu(t);return{resourceSpans:ed(e,r)}}function td(e){var t,r,n=new Map;try{for(var o=Jp(e),i=o.next();!i.done;i=o.next()){var a=i.value,u=n.get(a.resource);u||(u=new Map,n.set(a.resource,u));var c=a.instrumentationLibrary.name+\"@\"+(a.instrumentationLibrary.version||\"\")+\":\"+(a.instrumentationLibrary.schemaUrl||\"\"),s=u.get(c);s||(s=[],u.set(c,s)),s.push(a)}}catch(f){t={error:f}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return n}function ed(e,t){for(var r=td(e),n=[],o=r.entries(),i=o.next();!i.done;){for(var a=Zp(i.value,2),u=a[0],c=a[1],s=[],f=c.values(),p=f.next();!p.done;){var d=p.value;if(d.length>0){var m=d[0].instrumentationLibrary,g=m.name,C=m.version,M=m.schemaUrl,T=d.map(function(q){return Uu(q,t)});s.push({scope:{name:g,version:C},spans:T,schemaUrl:M})}p=f.next()}var rt={resource:{attributes:re(u.attributes),droppedAttributesCount:0},scopeSpans:s,schemaUrl:void 0};n.push(rt),i=o.next()}return n}var Ir=class{export(t,r){let n=K();if(!n?.telemetry){l.diag.warn(\"@vercel/otel: no telemetry context found\"),r({code:Pr.ExportResultCode.SUCCESS,error:void 0});return}try{let o=ui(t,{useHex:!0,useLongBits:!1});n.telemetry.reportSpans(o),r({code:Pr.ExportResultCode.SUCCESS,error:void 0})}catch(o){r({code:Pr.ExportResultCode.FAILED,error:o instanceof Error?o:new Error(String(o))})}}shutdown(){return Promise.resolve()}forceFlush(){return Promise.resolve()}};E();function ci(){return!!K()?.telemetry?.traceDrains?.length}var Bu=!1,Se=class{constructor(t){this.processor=t}forceFlush(){return this.processor.forceFlush()}shutdown(){return this.processor.shutdown()}onStart(t,r){if(ci()){Bu||(Bu=!0,l.diag.debug(\"@vercel/otel: skipping automatic exporter due to configured trace drains\"));return}this.processor.onStart(t,r)}onEnd(t){ci()||this.processor.onEnd(t)}};var rd={ALL:l.DiagLogLevel.ALL,VERBOSE:l.DiagLogLevel.VERBOSE,DEBUG:l.DiagLogLevel.DEBUG,INFO:l.DiagLogLevel.INFO,WARN:l.DiagLogLevel.WARN,ERROR:l.DiagLogLevel.ERROR,NONE:l.DiagLogLevel.NONE},Cr=class{constructor(t={}){this.configuration=t}start(){let t=nd(),r=this.configuration,n=\"edge\"||0,o=!!t.OTEL_SDK_DISABLED;if(process.env.OTEL_LOG_LEVEL&&l.diag.setLogger(new l.DiagConsoleLogger,{logLevel:rd[process.env.OTEL_LOG_LEVEL.toUpperCase()]}),o)return;let i=r.idGenerator??new er,a=r.contextManager??new Fu.AsyncLocalStorageContextManager;a.enable(),this.contextManager=a;let u=t.OTEL_SERVICE_NAME||r.serviceName||\"app\",c=new H(ia({attributes:r.attributes,runtime:n,serviceName:u})),s=r.resourceDetectors??[wo];if(r.autoDetectResources??!0){let T={detectors:s};c=c.merge(xo(T))}let p=od(r.propagators,r,t),d=sd(r.traceSampler,t),m=ad(r.spanProcessors,r,t);m.length===0&&l.diag.warn(\"@vercel/otel: No span processors configured. No spans will be exported.\");let g=r.spanLimits,C=new Vo({resource:c,idGenerator:i,sampler:d,spanLimits:g});if(C.addSpanProcessor(new mr(m,r.attributesFromHeaders)),C.register({contextManager:a,propagator:new Ot.CompositePropagator({propagators:p})}),this.tracerProvider=C,r.logRecordProcessor){let T=new gn({resource:c});this.loggerProvider=T,T.addLogRecordProcessor(r.logRecordProcessor),at.logs.setGlobalLoggerProvider(T)}if(r.metricReader||r.views){let T=new In({resource:c,views:r.views??[]});r.metricReader&&T.addMetricReader(r.metricReader),l.metrics.setGlobalMeterProvider(T),this.meterProvider=T}let M=id(r.instrumentations,r.instrumentationConfig);this.disableInstrumentations=(0,Hu.registerInstrumentations)({instrumentations:M}),l.diag.info(\"@vercel/otel: started\",u,n)}async shutdown(){let t=[];this.tracerProvider&&t.push(this.tracerProvider.shutdown()),this.loggerProvider&&t.push(this.loggerProvider.shutdown()),this.meterProvider&&t.push(this.meterProvider.shutdown()),l.diag.info(\"@vercel/otel: shutting down\",t.length,\"edge\"),await Promise.all(t),this.contextManager&&this.contextManager.disable();let{disableInstrumentations:r}=this;r&&r()}};function nd(){let e=(0,Nr.parseEnvironment)(process.env);return{...Nr.DEFAULT_ENVIRONMENT,...e}}function id(e,t){return(e??[\"auto\"]).map(r=>r===\"auto\"?(l.diag.debug(\"@vercel/otel: Configure instrumentations: fetch\",t?.fetch),[new te(t?.fetch)]):r===\"fetch\"?(l.diag.debug(\"@vercel/otel: Configure instrumentations: fetch\",t?.fetch),new te(t?.fetch)):r).flat()}function od(e,t,r){let n=process.env.OTEL_PROPAGATORS&&r.OTEL_PROPAGATORS&&r.OTEL_PROPAGATORS.length>0?r.OTEL_PROPAGATORS:void 0;return(e??n??[\"auto\"]).map(o=>{if(o===\"none\")return[];if(o===\"auto\"){let i=[];return i.push({name:\"tracecontext\",propagator:new Te}),i.push({name:\"baggage\",propagator:new Ot.W3CBaggagePropagator}),i.push({name:\"vercel-runtime\",propagator:new Lr}),l.diag.debug(`@vercel/otel: Configure propagators: ${i.map(a=>a.name).join(\", \")}`),i.map(a=>a.propagator)}if(o===\"tracecontext\")return l.diag.debug(\"@vercel/otel: Configure propagator: tracecontext\"),new Te;if(o===\"baggage\")return l.diag.debug(\"@vercel/otel: Configure propagator: baggage\"),new Ot.W3CBaggagePropagator;if(typeof o==\"string\")throw new Error(`Unknown propagator: \"${o}\"`);return o}).flat()}var Vu=\"always_on\",ne=1;function sd(e,t){if(e&&typeof e!=\"string\")return e;let r=e&&e!==\"auto\"?e:t.OTEL_TRACES_SAMPLER||Vu;switch(l.diag.debug(\"@vercel/otel: Configure sampler: \",r),r){case\"always_on\":return new X;case\"always_off\":return new st;case\"parentbased_always_on\":return new Et({root:new X});case\"parentbased_always_off\":return new Et({root:new st});case\"traceidratio\":return new kt(Gu(t));case\"parentbased_traceidratio\":return new Et({root:new kt(Gu(t))});default:return l.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER value \"${String(t.OTEL_TRACES_SAMPLER)} invalid, defaulting to ${Vu}\".`),new X}}function Gu(e){if(e.OTEL_TRACES_SAMPLER_ARG===void 0||e.OTEL_TRACES_SAMPLER_ARG===\"\")return l.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER_ARG is blank, defaulting to ${ne}.`),ne;l.diag.debug(\"@vercel/otel: Configure sampler probability: \",e.OTEL_TRACES_SAMPLER_ARG);let t=Number(e.OTEL_TRACES_SAMPLER_ARG);return isNaN(t)?(l.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER_ARG=${e.OTEL_TRACES_SAMPLER_ARG} was given, but it is invalid, defaulting to ${ne}.`),ne):t<0||t>1?(l.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER_ARG=${e.OTEL_TRACES_SAMPLER_ARG} was given, but it is out of range ([0..1]), defaulting to ${ne}.`),ne):t}function ad(e,t,r){return[...(e??[\"auto\"]).flatMap(n=>{if(n===\"auto\"){let o=[new Mt(new Ir)];if(process.env.VERCEL_OTEL_ENDPOINTS){let i=process.env.VERCEL_OTEL_ENDPOINTS_PORT||\"4318\",a=process.env.VERCEL_OTEL_ENDPOINTS_PROTOCOL||\"http/protobuf\";l.diag.debug(\"@vercel/otel: Configure vercel otel collector on port: \",i,a);let u={url:`http://localhost:${i}/v1/traces`,headers:{}},c=a===\"http/protobuf\"?new Bt(u):new Qt(u);o.push(new Se(new Mt(c)))}else(!t.traceExporter||t.traceExporter===\"auto\"||r.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT||r.OTEL_EXPORTER_OTLP_ENDPOINT)&&o.push(new Se(new Mt(ud(r))));return o}return n}).filter(fd),...t.traceExporter&&t.traceExporter!==\"auto\"?[new Mt(t.traceExporter)]:[]]}function ud(e){let t=process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL??process.env.OTEL_EXPORTER_OTLP_PROTOCOL??\"http/protobuf\",r=ld(e),n={...Ot.baggageUtils.parseKeyPairsIntoRecord(e.OTEL_EXPORTER_OTLP_HEADERS),...Ot.baggageUtils.parseKeyPairsIntoRecord(e.OTEL_EXPORTER_OTLP_TRACES_HEADERS)};switch(l.diag.debug(\"@vercel/otel: Configure trace exporter: \",t,r,`headers: ${Object.keys(n).join(\",\")||\"\"}`),t){case\"http/json\":return new Qt({url:r,headers:n});case\"http/protobuf\":return new Bt({url:r,headers:n});default:return l.diag.warn(`@vercel/otel: Unsupported OTLP traces protocol: ${t}. Using http/protobuf.`),new Bt}}var ju=\"v1/traces\",cd=`http://localhost:4318/${ju}`;function ld(e){let t=e.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(t&&typeof t==\"string\")return t;let r=e.OTEL_EXPORTER_OTLP_ENDPOINT;return r&&typeof r==\"string\"?`${r}/${ju}`:cd}function fd(e){return e!=null}function kT(e){let t;e?typeof e==\"string\"?t={serviceName:e}:t=e:t={},new Cr(t).start()}\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AdmVyY2VsK290ZWxAMS4xNC4xX0BvcGVudGVsZW1ldHJ5K2FwaS1sb2dzQDAuMjE1LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xX0BvcGVudGVsZW1ldHJ5K2lfY2c1azJueG9qcHUzMnZmM2dqZjdtZmU1emEvbm9kZV9tb2R1bGVzL0B2ZXJjZWwvb3RlbC9kaXN0L2VkZ2UvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0EscUJBQXFCLDZCQUE2Qix1Q0FBdUMsa0NBQWtDLGdFQUFnRSxvRUFBb0UsNkNBQTZDLGlCQUFpQiwyREFBMkQsMkRBQTJELEVBQUUsb0NBQW9DLDJCQUEyQixXQUFXLHdCQUF3QixtQkFBbUIsZ0dBQWdHLG1EQUFtRCxFQUFFLFNBQVMsdUZBQXVGLHlDQUF5QyxzQkFBc0IscUJBQXFCLGVBQWUsU0FBUyxLQUFLLFNBQStDLGNBQWMsSUFBSSwrQ0FBRSxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsc0VBQXNFLCtGQUErRixlQUFlLHlCQUF5QixzQkFBc0IsZUFBZSx5QkFBeUIsd0JBQXdCLGVBQWUsMkJBQTJCLDBCQUEwQixFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLDJNQUEyTSxpQ0FBaUMsaUNBQWlDLEVBQUUsOEJBQThCLDJCQUEyQixtQ0FBbUMsd0NBQXdDLGdDQUFnQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJGQUEyRiwwQkFBMEIsZUFBZSx3QkFBd0IsU0FBUyxFQUFFLEVBQUUscUNBQXFDLEVBQUUsRUFBRSxFQUFFLGdEQUFnRCxLQUFLLHdCQUF3QixlQUFlLHVDQUF1QyxTQUFTLHNCQUFzQixHQUFHLDRCQUE0QixFQUFFLHlGQUF5RixFQUFFLGtCQUFrQixlQUFlLCtDQUErQyxzQkFBc0IsZ0JBQWdCLGFBQWEsK0NBQStDLGVBQWUsa0dBQWtHLHVHQUF1RywwQkFBMEIsd0JBQXdCLGVBQWUsMENBQTBDLGdJQUFnSSxFQUFFLDhCQUE4QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLCtCQUErQixtREFBbUQsY0FBYyxtQ0FBbUMsNENBQTRDLDRKQUE0Six5Q0FBeUMsZUFBZSx5RkFBeUYsZUFBZSxTQUFTLHNFQUFzRSxrQ0FBa0MsTUFBTSxPQUFPLGVBQWUsZ0RBQWdELCtGQUErRixTQUFTLDRCQUE0QiwyQkFBMkIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx3QkFBd0IsYUFBYSxpQkFBaUIsaUZBQWlGLE1BQU0seURBQXlELDZCQUE2QixvQkFBb0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxtRUFBbUUsa0JBQWtCLGVBQWUsU0FBUyx3Q0FBd0Msa0NBQWtDLFdBQVcsdUNBQXVDLEVBQUUsR0FBRyxTQUFTLFdBQVcscURBQXFELEVBQUUsR0FBRyxTQUFTLHVDQUF1QyxTQUFTLHlCQUF5QixlQUFlLHNDQUFzQyxxQkFBcUIsZUFBZSwrQ0FBK0MsdUJBQXVCLGVBQWUsTUFBTSwyQkFBMkIsT0FBTyxVQUFVLFdBQVcsU0FBUyxTQUFTLHlCQUF5QixTQUFTLGVBQWUsaUJBQWlCLGlEQUFpRCxVQUFVLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsOEJBQThCLGtCQUFrQixjQUFjLFdBQVcsc0JBQXNCLDBCQUEwQixlQUFlLGtEQUFrRCxlQUFlLFFBQVEsS0FBSyxLQUFLLFNBQVMsMkNBQTJDLGVBQWUsV0FBVyxvQkFBb0IsNkJBQTZCLFVBQVUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxzREFBc0QsNENBQTRDLGVBQWUsS0FBSyw0QkFBNEIsZUFBZSxJQUFJLE1BQU0sUUFBUSx5QkFBeUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw4QkFBOEIsT0FBTyxhQUFhLGlPQUFpTyx1REFBdUQsR0FBRyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHNCQUFzQixrSkFBa0osRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSw0T0FBNE8sa0VBQWtFLGVBQWUsd0JBQXdCLHd3QkFBd3dCLGVBQWUsd0JBQXdCLG9EQUFvRCxlQUFlLHdCQUF3QiwyQ0FBMkMsb0NBQW9DLG1EQUFtRCxrREFBa0QsdUJBQXVCLDIvRkFBMi9GLG1CQUFtQiwwQkFBMEIsbUJBQW1CLDhCQUE4QixnQ0FBZ0Msb0JBQW9CLG1CQUFtQiwwQ0FBMEMsd0JBQXdCLFdBQVcsdURBQXVELFFBQVEsK0xBQStMLG1CQUFtQixXQUFXLHVCQUF1QiwwQkFBMEIsbUJBQW1CLGVBQWUsU0FBUyxvQ0FBb0MsUUFBUSxVQUFVLCtCQUErQixNQUFNLDJCQUEyQix3QkFBd0Isd0JBQXdCLEtBQUssV0FBVywyQ0FBMkMsU0FBUyxzQkFBc0IsY0FBYyxtRkFBbUYsMkJBQTJCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsaUJBQWlCLG9CQUFvQixjQUFjLDhDQUE4Qyx1QkFBdUIsMkJBQTJCLGFBQWEsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxzQkFBc0IsZUFBZSxvQkFBb0IsWUFBWSxJQUFJLE1BQU0sMENBQTBDLDBCQUEwQixlQUFlLGtCQUFrQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDRCQUE0Qix3QkFBd0IsY0FBYyx5REFBeUQsd0JBQXdCLGlCQUFpQixlQUFlLGtCQUFrQixZQUFZLE1BQU0saUVBQWlFLHlEQUF5RCxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHdCQUF3Qiw2QkFBNkIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxrQkFBa0Isb0JBQW9CLEVBQUUsYUFBYSxhQUFhLHNDQUFzQyxTQUFTLEVBQUUsZ1hBQWdYLHNCQUFzQiw2bExBQTZsTCxrQkFBa0IsdTFCQUF1MUIscUNBQXFDLCtMQUErTCxxQkFBcUIsaUZBQWlGLCtCQUErQiw2Q0FBNkMsNkJBQTZCLGlFQUFpRSxzQkFBc0IsK0ZBQStGLCtCQUErQixtRkFBbUYsa0NBQWtDLDZTQUE2UyxvQkFBb0Isc0VBQXNFLGtDQUFrQyw2QkFBNkIsNEJBQTRCLHFDQUFxQywyQkFBMkIsc1FBQXNRLHFCQUFxQixpQ0FBaUMsRUFBRSxjQUFjLGFBQWEsZ0VBQWdFLDZDQUE2Qyw2QkFBNkIsYUFBYSxFQUFFLG1CQUFtQiw0QkFBNEIsd0NBQXdDLHFGQUFxRix1Q0FBdUMsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSxzS0FBc0ssOEJBQThCLGk0RkFBaTRGLHVCQUF1QixpRUFBaUUsdUJBQXVCLDZpQkFBNmlCLDBCQUEwQiw2QkFBNkIsa0JBQWtCLDZGQUE2RixnQkFBZ0IscUxBQXFMLDhCQUE4QixtSUFBbUksRUFBRSxjQUFjLGFBQWEsZ0VBQWdFLDZDQUE2Qyw2QkFBNkIsYUFBYSxFQUFFLG1CQUFtQiw0QkFBNEIsd0NBQXdDLHFGQUFxRix1Q0FBdUMsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLGFBQWEsZ0VBQWdFLDZDQUE2Qyw2QkFBNkIsYUFBYSxFQUFFLG1CQUFtQiw0QkFBNEIsd0NBQXdDLHFGQUFxRix1Q0FBdUMsU0FBUyxFQUFFLFlBQVksWUFBWSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG1CQUFtQixvQkFBb0IsYUFBYSwrUkFBK1IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxxQkFBcUIsZ0JBQWdCLGlCQUFpQixFQUFFLGFBQWEsYUFBYSw4REFBOEQsNkNBQTZDLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLDRCQUE0QixzQ0FBc0MscUZBQXFGLHNDQUFzQyxTQUFTLEVBQUUsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsV0FBVyxFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLDZOQUE2Tiw0REFBNEQsZUFBZSxtREFBbUQsWUFBWSxvQkFBb0IsY0FBYyxrQ0FBa0MsdUJBQXVCLHVCQUF1QixnQ0FBZ0MsU0FBUyxtQkFBbUIsZUFBZSxpRUFBaUUsZUFBZSxZQUFZLGVBQWUsa0JBQWtCLGdEQUFnRCw0Q0FBNEMsc0NBQXNDLHVCQUF1QixpQkFBaUIsNEJBQTRCLCtCQUErQixvQkFBb0IsZUFBZSxjQUFjLGNBQWMsRUFBRSxLQUFLLDRCQUE0QiwwREFBMEQsdUJBQXVCLGVBQWUsb0JBQW9CLHlCQUF5QixlQUFlLHlCQUF5QiwwQkFBMEIsZUFBZSx5QkFBeUIsMEJBQTBCLGVBQWUsb0ZBQW9GLHVCQUF1QixlQUFlLG9EQUFvRCxpQkFBaUIsaUJBQWlCLDRCQUE0QixzQ0FBc0MsZ0JBQWdCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwyQkFBMkIsT0FBTyxhQUFhLGdEQUFnRCxpREFBaUQsR0FBRyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDhCQUE4QiwyQkFBMkIsZ0JBQWdCLEVBQUUsTUFBTSxnTUFBZ00sY0FBYyxtQ0FBbUMsZ0JBQWdCLFNBQVMsc0NBQXNDLG1CQUFtQixTQUFTLFVBQVUsSUFBSSxlQUFlLHdDQUF3QyxJQUFJLHdCQUF3QixTQUFTLHNDQUFzQyxtQkFBbUIsU0FBUyxVQUFVLEdBQUcsU0FBUyxJQUFJLFNBQVMsOEJBQThCLDBCQUEwQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHVDQUF1QyxpQ0FBaUMsSUFBSSxNQUFNLGdCQUFnQixJQUFJLE1BQU0sUUFBUSxJQUFJLEtBQUssdUJBQXVCLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixNQUFNLGlCQUFpQixlQUFlLGtCQUFrQixrQkFBa0IsZUFBZSwrQkFBK0Isb0JBQW9CLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUscUJBQXFCLGtEQUFrRCxlQUFlLDhDQUE4QyxTQUFTLG9CQUFvQix1RkFBdUYsU0FBUyxvQkFBb0Isb0NBQW9DLE9BQU8sa0NBQWtDLFlBQVksNEVBQTRFLFVBQVUsdUVBQXVFLCtCQUErQixXQUFXLDJDQUEyQywyREFBMkQsU0FBUyx1SUFBdUksUUFBUSx3REFBd0QsU0FBUyxZQUFZLHlEQUF5RCxpQkFBaUIsRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSxpR0FBaUcsa0NBQWtDLG9DQUFvQyxrQ0FBa0MsK0JBQStCLEVBQUUsYUFBYSxHQUFHLFVBQVUsR0FBRyxhQUFhLEdBQUcsVUFBVSxHQUFHLGVBQWUsRUFBRSx5QkFBeUIsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxlQUFlLGVBQWUsaUJBQWlCLGtDQUFrQyx1REFBdUQsc0JBQXNCLGFBQWEsY0FBYyxpQ0FBaUMsMkVBQTJFLFNBQVMsR0FBRyxHQUFHLFVBQVUsR0FBRyxTQUFTLElBQUksc0RBQXNELEVBQUUsc0dBQXNHLGVBQWUscUNBQXFDLGVBQWUsOEJBQThCLCtCQUErQixZQUFZLGVBQWUsY0FBYyxvQ0FBb0MsTUFBTSxxQ0FBcUMsNERBQTRELG9DQUFvQyxTQUFTLHFEQUFxRCwrQkFBK0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLHVFQUF1RSw4RkFBOEYsYUFBYSxjQUFjLDZCQUE2QixHQUFHLGlCQUFpQix3QkFBd0Isb0JBQW9CLGVBQWUseUJBQXlCLHVCQUF1QixlQUFlLHNCQUFzQixvQkFBb0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwyQkFBMkIsMkJBQTJCLGVBQWUsT0FBTyx5Q0FBeUMsV0FBVywyQkFBMkIsdUJBQXVCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMEJBQTBCLDJCQUEyQixlQUFlLE9BQU8saURBQWlELFdBQVcsMEJBQTBCLHNCQUFzQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDZCQUE2QixtREFBbUQsZUFBZSxZQUFZLDJpQkFBMmlCLDBCQUEwQixpQ0FBaUMsa1hBQWtYLFdBQVcsbUJBQW1CLE9BQU8sc0JBQXNCLHdCQUF3QixxQ0FBcUMsMkJBQTJCLHdDQUF3Qyx1QkFBdUIsb0NBQW9DLDBCQUEwQix3Q0FBd0MsSUFBSSx5QkFBeUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxtQ0FBbUMsMkJBQTJCLGlCQUFpQixpR0FBaUcsa0JBQWtCLE9BQU8sK0lBQStJLFdBQVcseUJBQXlCLEVBQUUsYUFBYSxFQUFFLGNBQWMsc0RBQXNELGVBQWUsUUFBUSxZQUFZLGFBQWEsS0FBSyx3Q0FBd0MsWUFBWSxXQUFXLCtCQUErQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHdCQUF3Qiw0UEFBNFAsaUJBQWlCLG1CQUFtQixnQkFBZ0IsZUFBZSwrQkFBK0IsWUFBWSxxQkFBcUIsOENBQThDLDZEQUE2RCxvQkFBb0IsZUFBZSxtQ0FBbUMsZUFBZSxnRUFBZ0UsZUFBZSxpQ0FBaUMsSUFBSSxrQkFBa0IsT0FBTyxpQkFBaUIscUNBQXFDLGVBQWUsbUJBQW1CLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsZ0JBQWdCLGtCQUFrQixrQkFBa0IsOEJBQThCLEtBQUssV0FBVyx1QkFBdUIsU0FBUyxZQUFZLGVBQWUseUJBQXlCLHVCQUF1QixNQUFNLFlBQVksbUNBQW1DLGVBQWUsNENBQTRDLElBQUkscUJBQXFCLGVBQWUscUJBQXFCLHVCQUF1QixJQUFJLEtBQUssV0FBVyxnQkFBZ0Isd0JBQXdCLHFCQUFxQixrQkFBa0IsSUFBSSxxQkFBcUIsdUJBQXVCLElBQUksS0FBSyxrQkFBa0IseUNBQXlDLEtBQUssZUFBZSxvQ0FBb0MsS0FBSyxpQkFBaUIsa0NBQWtDLFFBQVEsWUFBWSxVQUFVLFlBQVksd0JBQXdCLHVCQUF1QixTQUFTLFVBQVUsbUJBQW1CLHNCQUFzQix1QkFBdUIsSUFBSSxLQUFLLFdBQVcsaUNBQWlDLFNBQVMsZUFBZSx3QkFBd0IsZUFBZSw0QkFBNEIsZUFBZSxpREFBaUQsZUFBZSxtSUFBbUksaUJBQWlCLDZEQUE2RCxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDBDQUEwQyw2QkFBNkIsZUFBZSxtREFBbUQsbUJBQW1CLGlCQUFpQixrQ0FBa0Msd0JBQXdCLGtDQUFrQyxJQUFJLEVBQUUsMkRBQTJELHdCQUF3QixFQUFFLHNCQUFzQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHFDQUFxQyxpQkFBaUIsNkNBQTZDLGlCQUFpQixpQkFBaUIsZUFBZSxtQ0FBbUMsU0FBUyxtQkFBbUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxvQkFBb0IsZUFBZSw4R0FBOEcsZ0JBQWdCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsbUJBQW1CLGFBQWEsY0FBYyxrQ0FBa0MsK0JBQStCLEVBQUUsY0FBYyxxQkFBcUIsV0FBVyxpQkFBaUIsVUFBVSxrQkFBa0IsZUFBZSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHlCQUF5QixxQkFBcUIsaUJBQWlCLCtFQUErRSxlQUFlLHNCQUFzQixjQUFjLDhCQUE4QixXQUFXLG9CQUFvQixrQkFBa0IsSUFBSSxxSEFBcUgsU0FBUywwQkFBMEIsZ0NBQWdDLHFCQUFxQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGtCQUFrQiwwQkFBMEIsaUJBQWlCLHVCQUF1QixpRUFBaUUsZUFBZSxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxZQUFZLGFBQWEsOERBQThELDZDQUE2Qyw2QkFBNkIsYUFBYSxFQUFFLG1CQUFtQiw0QkFBNEIscUNBQXFDLHFGQUFxRixzQ0FBc0MsU0FBUyxFQUFFLGlDQUFpQyxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsb0JBQW9CLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsWUFBWSxZQUFZLG9CQUFvQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJGQUEyRixrQkFBa0IsU0FBUyx1QkFBdUIsSUFBSSxLQUFLLFdBQVcscUJBQXFCLFlBQVksK0JBQStCLHlFQUF5RSxPQUFPLG9CQUFvQixrQ0FBa0MsbUJBQW1CLHVCQUF1QixJQUFJLEtBQUssV0FBVyxzRkFBc0YsNkJBQTZCLGVBQWUsMEJBQTBCLDhCQUE4QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG1DQUFtQywwQkFBMEIsZUFBZSxJQUFJLG1CQUFtQiwwSkFBMEosZ0RBQWdELG1DQUFtQywrQkFBK0IsRUFBRSxVQUF5QyxlQUFlLEtBQUssMk1BQUUsRUFBRSxFQUFFLFVBQW9DLGVBQWUsS0FBSyw0TEFBRSxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMkNBQTJDLG9HQUFvRyxjQUFjLDBEQUEwRCxVQUFVLCtHQUErRyxtQkFBbUIsNEJBQTRCLHNDQUFzQyx5Q0FBeUMseURBQXlELElBQUksdUJBQXVCLDhFQUE4RSx1REFBdUQsc1NBQXNTLDBCQUEwQixXQUFXLHFCQUFxQixNQUFNLDJEQUEyRCxzQ0FBc0MsZUFBZSw0QkFBNEIsOEJBQThCLFdBQVcsbUJBQW1CLHdCQUF3QixtSEFBbUgseUJBQXlCLFdBQVcscUJBQXFCLHNDQUFzQyx3QkFBd0IscUNBQXFDLFdBQVcsbUNBQW1DLGtCQUFrQix5QkFBeUIsSUFBSSx3QkFBd0IsUUFBUSxnQkFBZ0IsbUJBQW1CLDBCQUEwQixpQ0FBaUMsZ0JBQWdCLCtCQUErQix1Q0FBdUMsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwwQ0FBMEMsK0ZBQStGLGNBQWMseURBQXlELFNBQVMsTUFBTSxrRkFBa0YsaUJBQWlCLDBCQUEwQiw2Q0FBNkMsU0FBUyxZQUFZLFVBQVUsZ0RBQWdELHNDQUFzQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG1EQUFtRCxlQUFlLHlDQUF5QyxtQkFBbUIsaUJBQWlCLE9BQU8sbUJBQW1CLGlCQUFpQixlQUFlLGVBQWUscUJBQXFCLGNBQWMsbUNBQW1DLFdBQVcsRUFBRSxjQUFjLGdCQUFnQixZQUFZLDBCQUEwQixhQUFhLG1CQUFtQixZQUFZLGtCQUFrQix3QkFBd0IsYUFBYSxnREFBZ0QsSUFBSSxpQkFBaUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw2REFBNkQsWUFBWSxpQkFBaUIsTUFBTSxpQ0FBaUMsT0FBTyx1ZkFBdWYsOEJBQThCLHNFQUFzRSx3QkFBd0IsaUJBQWlCLE1BQU0sT0FBTyx5UkFBeVIsaUJBQWlCLGlCQUFpQixPQUFPLGlLQUFpSyxzQkFBc0IsRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSx5RkFBeUYsMEJBQTBCLGVBQWUsb0NBQW9DLG1CQUFtQixlQUFlLDhFQUE4RSxPQUFPLGNBQWMsZ0JBQWdCLGVBQWUsWUFBWSxhQUFhLHNCQUFzQixlQUFlLHdCQUF3QixvQkFBb0IsbURBQW1ELGVBQWUsU0FBUyxlQUFlLDBDQUEwQyxRQUFRLCtFQUErRSxlQUFlLFFBQVEsd0JBQXdCLHVGQUF1RixPQUFPLDhGQUE4RixvQkFBb0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwwQ0FBMEMsNEJBQTRCLGlCQUFpQiwrQkFBK0IsT0FBTyx1QkFBdUIsc0NBQXNDLGVBQWUsY0FBYyxnQkFBZ0Isd0JBQXdCLG1DQUFtQyxTQUFTLDhCQUE4QixHQUFHLHFDQUFxQyxHQUFHLHVDQUF1QyxhQUFhLCtCQUErQixTQUFTLGlCQUFpQiwwQ0FBMEMsS0FBSyxRQUFRLEVBQUUsOENBQThDLEtBQUssUUFBUSxFQUFFLGNBQWMsZUFBZSxJQUFJLDZCQUE2Qix1RUFBdUUsUUFBUSxPQUFPLGlCQUFpQixxQkFBcUIsRUFBRSxXQUFXLE9BQU8sVUFBVSxzRUFBc0UsZ0NBQWdDLHFCQUFxQixVQUFVLEVBQUUsYUFBYSxhQUFhLHNDQUFzQyxTQUFTLEVBQUUsdVNBQXVTLGdDQUFnQyxnQ0FBZ0MscUNBQXFDLGlDQUFpQyx3Q0FBd0MsZ0JBQWdCLEVBQUUsU0FBUywyQ0FBMkMsb0RBQW9ELEVBQUUsd0NBQXdDLElBQUksa0JBQWtCLGlCQUFpQixzQ0FBc0MsNkJBQTZCLGVBQWUsSUFBSSxpQkFBaUIsaUVBQWlFLE1BQU0sb0RBQW9ELEVBQUUsT0FBTyxpQ0FBaUMsZUFBZSwrQ0FBK0MsOEJBQThCLGNBQWMsTUFBTSxvSUFBb0ksdUJBQXVCLGlCQUFpQiwwREFBMEQsb0JBQW9CLGVBQWUsb0NBQW9DLHVCQUF1QixlQUFlLG9CQUFvQiw0QkFBNEIsMkNBQTJDLHVDQUF1QyxnQkFBZ0IsNEJBQTRCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMkJBQTJCLDBDQUEwQyxnQkFBZ0IsRUFBRSx5WEFBeVgsWUFBWSxnQ0FBZ0MsR0FBRyw4RUFBOEUsRUFBRSxPQUFPLHlEQUF5RCxHQUFHLG1GQUFtRixFQUFFLE9BQU8sMEJBQTBCLEdBQUcsaUNBQWlDLEVBQUUsWUFBWSxHQUFHLHdDQUF3QyxFQUFFLEVBQUUsV0FBVywyQkFBMkIsSUFBSSxxREFBcUQsU0FBUyxNQUFNLEVBQUUsV0FBVyxpQ0FBaUMsYUFBYSxxREFBcUQsRUFBRSxZQUFZLCtFQUErRSx1QkFBdUIsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLGlCQUFpQixxREFBcUQsbUJBQW1CLHVCQUF1QixpQ0FBaUMsaUJBQWlCLG9CQUFvQixLQUFLLDRDQUE0QyxXQUFXLHFCQUFxQixrQkFBa0IsSUFBSSxtQkFBbUIsU0FBUyxnQkFBZ0IsR0FBRyxFQUFFLGNBQWMsYUFBYSxVQUFVLHNCQUFzQixlQUFlLGVBQWUsWUFBWSwyQkFBMkIsS0FBSyxrQ0FBa0MsdUNBQXVDLFFBQVEsS0FBSyxvREFBb0QsTUFBTSwwQkFBMEIsOEJBQThCLElBQUksRUFBRSxhQUFhLFVBQVUsc0NBQXNDLE1BQU0seUNBQXlDLE1BQU0sNkNBQTZDLE1BQU0sb0VBQW9FLCtLQUErSywwQkFBMEIsMEJBQTBCLHNCQUFzQixXQUFXLEVBQUUsd0JBQXdCLHFCQUFxQixzQ0FBc0MsVUFBVSxlQUFlLE1BQU0scUNBQXFDLE1BQU0sMENBQTBDLE1BQU0sNkJBQTZCLE9BQU8seUJBQXlCLFlBQVksb0JBQW9CLHlCQUF5QixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLGNBQWMsbUJBQW1CLGdDQUFnQywwREFBMEQsaUJBQWlCLFFBQVEsK0JBQStCLGlDQUFpQyx5Q0FBeUMsc0NBQXNDLFdBQVcsK0JBQStCLGFBQWEsOEJBQThCLHlCQUF5QixNQUFNLGlCQUFpQixtQkFBbUIsd0JBQXdCLFFBQVEsV0FBVyw2QkFBNkIsYUFBYSxFQUFFLG1CQUFtQixhQUFhLGtCQUFrQixlQUFlLDBDQUEwQyxxRUFBcUUsa0JBQWtCLHFEQUFxRCxrQkFBa0IscURBQXFELDBDQUEwQyxnQkFBZ0IsMERBQTBELGdCQUFnQiwwREFBMEQsd0NBQXdDLGNBQWMsb0JBQW9CLGNBQWMsNkNBQTZDLG1DQUFtQyw2REFBNkQsc0ZBQXNGLEtBQUssc0ZBQXNGLGdDQUFnQyw4REFBOEQsa0JBQWtCLG9EQUFvRCw0RkFBNEYsNERBQTRELHNDQUFzQyxxRUFBcUUsa0JBQWtCLHFHQUFxRyxrQkFBa0IscUdBQXFHLDRDQUE0QyxnQkFBZ0IsMEdBQTBHLGdCQUFnQiwwR0FBMEcsMENBQTBDLGNBQWMsd0JBQXdCLGNBQWMsMERBQTBELGdEQUFnRCwyRUFBMkUsS0FBSyxNQUFNLHdGQUF3RixLQUFLLHVDQUF1QywwSEFBMEgsd0VBQXdFLHNCQUFzQixpRkFBaUYseUZBQXlGLHNFQUFzRSxLQUFLLG1CQUFtQiw0REFBNEQsbUJBQW1CLDREQUE0RCxpQkFBaUIsaURBQWlELGlCQUFpQixrREFBa0QsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLGVBQWUsYUFBYSxFQUFFLGNBQWMsYUFBYSxVQUFVLHNCQUFzQixvQkFBb0IsV0FBVyxrSEFBa0gsVUFBVSx3QkFBd0IsVUFBVSxnQkFBZ0IsMEJBQTBCLElBQUksdVNBQXVTLGdJQUFnSSx5QkFBeUIsb0JBQW9CLFdBQVcsMlNBQTJTLFlBQVksRUFBRSxtQkFBbUIsYUFBYSxjQUFjLG1CQUFtQixpQ0FBaUMsbUJBQW1CLHdCQUF3QixvQkFBb0IsdUJBQXVCLDRCQUE0QixFQUFFLG1CQUFtQixhQUFhLGFBQWEsWUFBWSxnQkFBZ0IsNEJBQTRCLHlCQUF5Qix1QkFBdUIsVUFBVSxtQ0FBbUMsYUFBYSxxQkFBcUIsVUFBVSxxQ0FBcUMseUJBQXlCLG1CQUFtQixVQUFVLFVBQVUsbUNBQW1DLHNGQUFzRixtQkFBbUIsNkNBQTZDLHFEQUFxRCx5Q0FBeUMscURBQXFELGlDQUFpQyxxQkFBcUIsb0NBQW9DLHdDQUF3QyxtQ0FBbUMsK0JBQStCLHFEQUFxRCw0Q0FBNEMsbUNBQW1DLHVCQUF1QixtS0FBbUssOEJBQThCLGlKQUFpSixnQ0FBZ0Msa0JBQWtCLGtGQUFrRixnQ0FBZ0MsbUJBQW1CLG1GQUFtRiw4QkFBOEIsNkRBQTZELCtGQUErRixFQUFFLGNBQWMsYUFBYSxTQUFTLGlCQUFpQixjQUFjLG9CQUFvQixhQUFhLGVBQWUsWUFBWSxZQUFZLGdCQUFnQiw4R0FBOEcsZ0ZBQWdGLGdEQUFnRCw0Q0FBNEMsS0FBSywwQ0FBMEMsMkRBQTJELHVCQUF1QixnREFBZ0QsdUJBQXVCLDhCQUE4Qiw4QkFBOEIsV0FBVyxnSEFBZ0gsb0JBQW9CLElBQUksaUNBQWlDLG9DQUFvQyxNQUFNLGFBQWEsR0FBRyxvQkFBb0IsMkJBQTJCLHdCQUF3QixpSkFBaUosK0NBQStDLGlGQUFpRiw0QkFBNEIsa0NBQWtDLDZCQUE2QixFQUFFLHdCQUF3Qix5QkFBeUIsMERBQTBELDZCQUE2Qiw2QkFBNkIsNERBQTRELG1CQUFtQiw2QkFBNkIsV0FBVyw4Q0FBOEMsU0FBUyxXQUFXLHNCQUFzQixpREFBaUQsZUFBZSxnQkFBZ0IsMENBQTBDLHNDQUFzQyxlQUFlLFVBQVUsOEZBQThGLDRCQUE0QixnQkFBZ0Isa0RBQWtELGFBQWEsa0RBQWtELE9BQU8sZUFBZSxTQUFTLDBDQUEwQyxXQUFXLGlCQUFpQixtQ0FBbUMsNENBQTRDLElBQUksY0FBYyxvQ0FBb0MsMEJBQTBCLFlBQVksS0FBSyxXQUFXLGNBQWMsa0JBQWtCLHlDQUF5QyxLQUFLLHlFQUF5RSwwQkFBMEIsbUJBQW1CLFlBQVksV0FBVyxrQ0FBa0MsaUJBQWlCLGdEQUFnRCx3QkFBd0IsZUFBZSxPQUFPLDBDQUEwQyxPQUFPLCtEQUErRCxrQkFBa0Isa0RBQWtELGtCQUFrQixFQUFFLG1CQUFtQixhQUFhLGFBQWEsa0RBQWtELG1CQUFtQixpREFBaUQsZUFBZSxlQUFlLG9FQUFvRSxhQUFhLHlFQUF5RSxrQkFBa0IsMkJBQTJCLDJCQUEyQixjQUFjLElBQUksWUFBWSxlQUFlLGNBQWMsb0JBQW9CLHVCQUF1QixzRUFBc0Usa0NBQWtDLGdFQUFnRSxtQkFBbUIsV0FBVyxtQkFBbUIsS0FBSyxNQUFNLHlCQUF5QixPQUFPLGlCQUFpQix1Q0FBdUMseUNBQXlDLG1CQUFtQiwrQkFBK0Isc0hBQXNILDhCQUE4Qiw4REFBOEQsK0JBQStCLHNDQUFzQyxtQkFBbUIsS0FBSyxLQUFLLDREQUE0RCxLQUFLLFNBQVMsbUNBQW1DLFlBQVksK0JBQStCLGlCQUFpQixvQ0FBb0MscUNBQXFDLCtCQUErQiw0QkFBNEIsb0NBQW9DLDZCQUE2QiwrQkFBK0IsbUJBQW1CLDREQUE0RCxnQ0FBZ0MsK0JBQStCLHlDQUF5QyxnQ0FBZ0MsaUJBQWlCLCtDQUErQyx5Q0FBeUMsOEJBQThCLDZDQUE2QywrQkFBK0IsOENBQThDLDZDQUE2QyxXQUFXLGlCQUFpQixZQUFZLFdBQVcsaUJBQWlCLDhCQUE4QixtQkFBbUIsZ0NBQWdDLGtCQUFrQiw4QkFBOEIscUJBQXFCLHFDQUFxQywrQkFBK0IsbUJBQW1CLGdFQUFnRSw0QkFBNEIsb0ZBQW9GLDZCQUE2Qix1TEFBdUwsOEJBQThCLHVDQUF1Qyx1RkFBdUYsOEJBQThCLGdFQUFnRSxFQUFFLG1DQUFtQyxVQUFVLHlCQUF5QixvQ0FBb0MsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLFlBQVksMERBQTBELFlBQVksY0FBYyxjQUFjLHlCQUF5QiwrSkFBK0osV0FBVyxpQkFBaUIsaUNBQWlDLGlCQUFpQixXQUFXLGlCQUFpQiwrQkFBK0IsZ0RBQWdELG1CQUFtQixtRUFBbUUsbUJBQW1CLDJFQUEyRSxnQ0FBZ0MsOEJBQThCLGtEQUFrRCxnQkFBZ0IsRUFBRSxtQkFBbUIsYUFBYSxhQUFhLHlDQUF5QyxpQkFBaUIseUVBQXlFLGNBQWMsd0NBQXdDLHlDQUF5Qyw2REFBNkQsOEJBQThCLGFBQWEsb0NBQW9DLDhCQUE4QixlQUFlLDZCQUE2Qiw0QkFBNEIsNkNBQTZDLEtBQUssS0FBSyxjQUFjLHlFQUF5RSw4QkFBOEIsaUJBQWlCLGtCQUFrQiw4VUFBOFUsOERBQThELFVBQVUsR0FBRyw2QkFBNkIsd0JBQXdCLDhCQUE4QixvQkFBb0IsdUJBQXVCLGNBQWMsc0JBQXNCLHdCQUF3QixLQUFLLElBQUksdUZBQXVGLDhIQUE4SCxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUsscUNBQXFDLG1GQUFtRix5REFBeUQsd0JBQXdCLEtBQUssSUFBSSx5RkFBeUYsVUFBVSxJQUFJLEtBQUsscUNBQXFDLHFGQUFxRix1Q0FBdUMsNEJBQTRCLDBCQUEwQixpQkFBaUIsbURBQW1ELCtCQUErQix3Q0FBd0MsaUNBQWlDLGdDQUFnQyx3Q0FBd0MsbUNBQW1DLGNBQWMsd0NBQXdDLGlFQUFpRSw2QkFBNkIsd0NBQXdDLDhDQUE4QyxzQkFBc0IsOEJBQThCLHdDQUF3QywrQ0FBK0Msc0JBQXNCLDZCQUE2Qiw0Q0FBNEMsK0JBQStCLGtFQUFrRSxVQUFVLGdCQUFnQixnREFBZ0QsdUNBQXVDLDhCQUE4QixtQkFBbUIsOEJBQThCLDZCQUE2Qix1QkFBdUIsd0NBQXdDLFlBQVksNkNBQTZDLGdDQUFnQyxhQUFhLGlDQUFpQyxVQUFVLG1CQUFtQixNQUFNLG9CQUFvQixNQUFNLGdDQUFnQyxNQUFNLFlBQVksd0JBQXdCLGtCQUFrQixNQUFNLG9CQUFvQixNQUFNLG1FQUFtRSxhQUFhLHlCQUF5QixtQ0FBbUMsa0NBQWtDLHNCQUFzQixpQkFBaUIsNEJBQTRCLG1CQUFtQiw0QkFBNEIsbUJBQW1CLHVDQUF1QyxvQkFBb0IsNEJBQTRCLHFCQUFxQiw2QkFBNkIsR0FBRyxFQUFFLG1CQUFtQixhQUFhLGNBQWMsWUFBWSwwREFBMEQsWUFBWSxlQUFlLGdCQUFnQix5QkFBeUIsNERBQTRELCtCQUErQixvQkFBb0IsMEtBQTBLLGdCQUFnQixFQUFFLG1CQUFtQixhQUFhLGNBQWMsWUFBWSx1RUFBdUUsbUJBQW1CLHNFQUFzRSwrRkFBK0YsMkNBQTJDLG1EQUFtRCxXQUFXLHVDQUF1QyxlQUFlLHNCQUFzQiwwQkFBMEIsSUFBSSxPQUFPLElBQUksOEZBQThGLHFDQUFxQyxhQUFhLFVBQVUsT0FBTyx5QkFBeUIsdURBQXVELFNBQVMsZ0NBQWdDLG9DQUFvQyxFQUFFLFNBQVMsMENBQTBDLEtBQUssSUFBSSxTQUFTLDZCQUE2QixzR0FBc0csRUFBRSxjQUFjLGFBQWEsVUFBVSxnQkFBZ0IsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLEVBQUUsY0FBYyxhQUFhLFNBQVMsa0JBQWtCLGNBQWMsb0JBQW9CLGNBQWMsb0JBQW9CLFlBQVksV0FBVyxhQUFhLGVBQWUsY0FBYyw0RkFBNEYsS0FBSyxFQUFFLG1CQUFtQixhQUFhLGdCQUFnQixFQUFFLElBQUksY0FBYyxJQUFJLHdCQUF3QixtQkFBbUIsbUJBQW1CLCtEQUErRCxzQkFBc0IsdUNBQXVDLGdCQUFnQixtQ0FBbUMsMkJBQTJCLG1GQUFtRixrQkFBa0Isb0RBQW9ELGVBQWUseUJBQXlCLElBQUksS0FBSyx5Q0FBeUMsaUJBQWlCLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxlQUFlLGdDQUFnQyxxQ0FBcUMsK0hBQStILDRCQUE0Qix1SUFBdUksaUJBQWlCLGtmQUFrZiwwQ0FBMEMseUJBQXlCLHdDQUF3QywwWkFBMFosdUNBQXVDLFFBQVEsSUFBSSwyQ0FBMkMsUUFBUSxZQUFZLGtDQUFrQyx3QkFBd0IsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixZQUFZLHNDQUFzQyxtQ0FBbUMsaUhBQWlILDBNQUEwTSxrQ0FBa0MseUJBQXlCLG1FQUFtRSxPQUFPLG1DQUFtQyxxREFBcUQsb0NBQW9DLG1EQUFtRCw2QkFBNkIsd0JBQXdCLGdJQUFnSSxPQUFPLDZWQUE2VixrQ0FBa0MsNkZBQTZGLG9EQUFvRCw2REFBNkQsdUNBQXVDLGtFQUFrRSx1REFBdUQsK0RBQStELG9DQUFvQyx3QkFBd0IsMkNBQTJDLFNBQVMsNGRBQTRkLCtDQUErQyxlQUFlLHNCQUFzQiwrQkFBK0IsNkNBQTZDLGVBQWUsbUJBQW1CLCtCQUErQiw4REFBOEQsZUFBZSxvQ0FBb0MsK0JBQStCLDBEQUEwRCxlQUFlLGdDQUFnQywrQkFBK0IseURBQXlELGVBQWUsK0JBQStCLCtCQUErQixzQ0FBc0MsOEVBQThFLDZFQUE2RSxlQUFlLGdEQUFnRCxtQ0FBbUMseUNBQXlDLDZDQUE2QyxtS0FBbUssd0RBQXdELElBQUksR0FBRyxHQUFHLElBQUksYUFBYSxPQUFPLGFBQWEscUdBQXFHLFlBQVksR0FBRyxrQkFBa0IsY0FBYywyQ0FBMkMsT0FBTyx3QkFBd0IsaUNBQWlDLHlCQUF5QixHQUFHLEdBQUcsaUJBQWlCLGNBQWMsMkNBQTJDLE9BQU8sZ0NBQWdDLGlDQUFpQyx3QkFBd0IsR0FBRyxHQUFHLElBQUksY0FBYyxrQkFBa0IsY0FBYyxZQUFZLHNkQUFzZCxzREFBc0QsZ0NBQWdDLCtXQUErVyxpQ0FBaUMsbUJBQW1CLCtSQUErUixFQUFFLEdBQUcsR0FBRyxJQUFJLGtCQUFrQixjQUFjLG1IQUFtSCw4Q0FBOEMsT0FBTyw0R0FBNEcsaUNBQWlDLHlCQUF5QixnQkFBZ0IsRUFBRSxvQ0FBb0Msc0RBQXNELHFDQUFxQyxnQkFBZ0IsYUFBYSxLQUFLLHdDQUF3QyxZQUFZLFNBQVMsR0FBRyxHQUFHLDZEQUE2RCxjQUFjLE9BQU8sMERBQTBELHlJQUF5SSxhQUFhLGliQUFpYixlQUFlLDZEQUE2RCxpREFBaUQsbURBQW1ELDhEQUE4RCxXQUFXLEVBQUUsK0RBQStELFlBQVksRUFBRSw2REFBNkQsa0VBQWtFLG1CQUFtQixFQUFFLDJIQUEySCxlQUFlLHdKQUF3Six3Q0FBd0MsdVNBQXVTLGNBQWMsZUFBZSxPQUFPLGFBQWEsMEJBQTBCLFFBQVEsdUNBQXVDLG9DQUFvQywrQkFBK0IsOEJBQThCLElBQUksZUFBZSw4Q0FBOEMsZ0RBQWdELDR2QkFBNHZCLElBQUksYUFBYSxFQUFFLElBQUksMkJBQTJCLGdCQUFnQix1RkFBdUYscUJBQXFCLG11QkFBbXVCLHlDQUF5QywrRUFBK0Usb0NBQW9DLCtCQUErQixtR0FBbUcsaUNBQWlDLGlDQUFpQyxrQ0FBa0MsV0FBVyx5Q0FBeUMsc0JBQXNCLGtCQUFrQixxQkFBcUIsa0JBQWtCLDhCQUE4QixFQUFFLHNDQUFzQyxtREFBbUQsNEdBQTRHLE9BQU8saU1BQWlNLGtDQUFrQyxXQUFXLGlDQUFpQyxnRkFBZ0YsSUFBSSwrQkFBK0IsK0JBQStCLElBQUksV0FBVyxFQUFFLHVDQUF1QyxXQUFXLHFHQUFxRyw0QkFBNEIsd0JBQXdCLHlCQUF5QixvRUFBb0Usb0VBQW9FLHdDQUF3QyxNQUFNLGdKQUFnSixFQUFFLHFCQUFxQixrQkFBa0IscUJBQXFCLGdDQUFnQyxFQUFFLCtDQUErQyxNQUFNLHVFQUF1RSxzQkFBc0IsaUNBQWlDLEVBQUUsRUFBRSxFQUFFLHlDQUF5QyxXQUFXLHVCQUF1QixpQkFBaUIscURBQXFELG9GQUFvRixvQkFBb0IsOENBQThDLEdBQUcsbUVBQW1FLHlEQUF5RCxXQUFXLDZEQUE2RCxvQ0FBb0MscUVBQXFFLEdBQUcsR0FBRyxrQkFBa0Isb0JBQW9CLGlDQUFpQyxhQUFhLGdDQUFnQyxjQUFjLGdCQUFnQixzRUFBc0UsU0FBUyxxQkFBcUIsd0hBQXdILE9BQU8sYUFBYSxtQkFBbUIsdUVBQXVFLGtCQUFrQixRQUFRLGdCQUFnQiw2QkFBNkIscUJBQXFCLHNDQUFzQyxXQUFXLHdHQUF3RyxvREFBb0QsbUNBQW1DLGVBQWUsNElBQTRJLG1DQUFtQywrTkFBK04sR0FBRyxLQUFLLDZCQUE2QixhQUFhLHVEQUF1RCxTQUFTLEdBQUcsaUJBQWlCLGVBQWUsa0JBQWtCLFlBQVksTUFBTSxpRUFBaUUsd0RBQXdELGtCQUFrQixrQkFBa0IsdUJBQXVCLFlBQVkseUxBQXlMLDZDQUE2QyxVQUFVLGlCQUFpQix1RUFBdUUseUJBQXlCLGtDQUFrQyxnRUFBZ0Usc0RBQXNELFNBQVMsa0VBQWtFLGlIQUFpSCxtSEFBbUgsT0FBTyx3RUFBd0Usc0ZBQXNGLDBDQUEwQyxvR0FBb0csK0NBQStDLCtDQUErQyw4RUFBOEUsaUNBQWlDLFNBQVMsZ0hBQWdILFVBQVUsK0NBQStDLFVBQVUsMEJBQTBCLHNFQUFzRSwyRUFBMkUscUNBQXFDLHlDQUF5QywyQkFBMkIsc0NBQXNDLHdCQUF3QiwrQ0FBK0MscURBQXFELEdBQUcsR0FBRyxJQUFJLGFBQWEsSUFBSSx5QkFBeUIsY0FBYyx3QkFBd0Isa0JBQWtCLHFDQUFxQyxpQ0FBaUMsSUFBSSxLQUFLLGVBQWUsc0VBQXNFLFNBQVMsMEJBQTBCLHNCQUFzQixjQUFjLDBDQUEwQyxLQUFLLEVBQUUseUNBQXlDLGNBQWMsSUFBSSxhQUFhLFNBQVMsTUFBTSxjQUFjLElBQUksY0FBYyxTQUFTLE1BQU0sY0FBYyx1Q0FBdUMsK0JBQStCLEVBQUUsa0JBQWtCLE9BQU8sd0JBQXdCLHFCQUFxQixZQUFZLGdCQUFnQixTQUFTLFVBQVUsaUNBQWlDLDJEQUEyRCxZQUFZLElBQUksY0FBYyxtQkFBbUIsaUJBQWlCLGNBQWMsNERBQTRELEtBQUssRUFBRSxLQUFLLGtIQUFrSCx5Q0FBeUMsa0JBQWtCLE1BQU0seUJBQXlCLG9CQUFvQiw4QkFBOEIsU0FBUyxrQ0FBa0MsU0FBUywwRUFBMEUsSUFBSSxTQUFTLHlDQUF5QyxhQUFhLE1BQU0sMkJBQTJCLGlCQUFpQixNQUFNLG9CQUFvQiwyQkFBMkIsTUFBTSwrQkFBK0IsU0FBUyxjQUFjLFNBQVMsWUFBWSxRQUFRLE1BQU0scUJBQXFCLE9BQU8saUNBQWlDLGtCQUFrQixvREFBb0QsZUFBZSx5QkFBeUIsSUFBSSxLQUFLLHlDQUF5QyxpQkFBaUIsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixTQUFTLGNBQWMsZ0JBQWdCLGFBQWEsd0hBQXdILGtEQUFrRCxxQ0FBcUMsZ0RBQWdELGFBQWEsMkdBQTJHLEVBQUUsMEJBQTBCLGVBQWUsc0JBQXNCLE1BQU0sa0JBQWtCLDRaQUE0WixpREFBaUQsZUFBZSxNQUFNLCtKQUErSiwrQkFBK0IsZ0RBQWdELHdDQUF3QywyQkFBMkIsZ0JBQWdCLGlGQUFpRiwwQkFBMEIsa0JBQWtCLEVBQUUsRUFBRSwrQkFBK0IsYUFBYSxrQkFBa0IsY0FBYyxnRkFBZ0YsNkVBQTZFLDZGQUE2Riw4QkFBOEIscUJBQXFCLG1GQUFtRixFQUFFLGtCQUFrQixpQkFBaUIsSUFBSSxHQUFHLElBQUkseUJBQXlCLG1CQUFtQiwrREFBK0Qsc0JBQXNCLHVDQUF1QyxnQkFBZ0IsbUNBQW1DLDJCQUEyQixtRkFBbUYsa0JBQWtCLG9EQUFvRCxlQUFlLHlCQUF5QixJQUFJLEtBQUsseUNBQXlDLGlCQUFpQixTQUFTLEdBQUcsU0FBUyxRQUFRLElBQUksb0NBQW9DLFFBQVEsb0JBQW9CLFNBQVMsZUFBZSxhQUFhLG1WQUFtVixzQ0FBc0MsUUFBUSxzRUFBc0UsU0FBUyx1Q0FBdUMsbUJBQW1CLFNBQVMsK0NBQStDLHFFQUFxRSxrREFBa0QsUUFBUSxlQUFlLFFBQVEscUNBQXFDLElBQUksMkJBQTJCLFFBQVEsWUFBWSwyREFBMkQsaUJBQWlCLDRCQUE0QixrSkFBa0osMkZBQTJGLDZCQUE2QixTQUFTLEdBQUcsU0FBUyxRQUFRLElBQUksb0NBQW9DLFFBQVEsb0JBQW9CLFNBQVMsa0NBQWtDLGlFQUFpRSwrQ0FBK0MsWUFBWSxXQUFXLEtBQUssc0JBQXNCLGdEQUFnRCxTQUFTLDZDQUE2QyxvQ0FBb0MsR0FBRyxhQUFhLElBQUksbUJBQW1CLGdFQUFnRSx5QkFBeUIsY0FBYywwQ0FBMEMsS0FBSyxFQUFFLHlDQUF5QyxjQUFjLElBQUksYUFBYSxTQUFTLE1BQU0sY0FBYyxJQUFJLGNBQWMsU0FBUyxNQUFNLGNBQWMsdUNBQXVDLCtCQUErQixFQUFFLGtCQUFrQixPQUFPLHdCQUF3QixxQkFBcUIsWUFBWSxnQkFBZ0IsU0FBUyxVQUFVLGlDQUFpQywyREFBMkQsWUFBWSxJQUFJLGNBQWMsbUJBQW1CLGlCQUFpQixjQUFjLDREQUE0RCxLQUFLLEVBQUUsS0FBSyxrSEFBa0gseUNBQXlDLGtCQUFrQixNQUFNLHlCQUF5QixvQkFBb0IsOEJBQThCLFNBQVMsa0NBQWtDLFNBQVMsMEVBQTBFLElBQUksU0FBUyx5Q0FBeUMsYUFBYSxNQUFNLDJCQUEyQixpQkFBaUIsTUFBTSxvQkFBb0IsMkJBQTJCLE1BQU0sK0JBQStCLFNBQVMsY0FBYyxTQUFTLFlBQVksUUFBUSxNQUFNLHFCQUFxQixPQUFPLGtDQUFrQyxtQkFBbUIsTUFBTSxpQkFBaUIsRUFBRSxnRUFBZ0UsSUFBSSxvQkFBb0IsVUFBVSxpQkFBaUIsMENBQTBDLE1BQU0sMkJBQTJCLGdCQUFnQixtQkFBbUIsMkNBQTJDLEVBQUUsR0FBRyxVQUFVLE1BQU0sU0FBUywyRUFBMkUsNkRBQTZELDBEQUEwRCxTQUFTLHlFQUF5RSwyQkFBMkIsa0JBQWtCLFlBQVksNEVBQTRFLE1BQU0sSUFBSSxnQkFBZ0Isc0JBQXNCLHVDQUF1QywwQ0FBMEMsbUJBQW1CLEdBQUcsNkJBQTZCLCtEQUErRCxzQkFBc0IsdUNBQXVDLGdCQUFnQixtQ0FBbUMsMkJBQTJCLG1GQUFtRixlQUFlLGNBQWMsdUJBQXVCLHlDQUF5QyxhQUFhLElBQUksOENBQThDLFFBQVEsWUFBWSxjQUFjLHdCQUF3QixTQUFTLEdBQUcsU0FBUyxRQUFRLElBQUksb0NBQW9DLFFBQVEsb0JBQW9CLCtCQUErQiwrQkFBK0IsSUFBSSxvQkFBb0IscUZBQXFGLEVBQUUsRUFBRSxtQ0FBbUMsUUFBUSxJQUFJLDhDQUE4QyxRQUFRLFlBQVksY0FBYyxnQkFBZ0IsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLHFCQUFxQiwrQkFBK0IsUUFBUSxJQUFJLDhDQUE4QyxRQUFRLFlBQVksY0FBYyxZQUFZLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxxQkFBcUIsaUNBQWlDLGFBQWEsSUFBSSw4Q0FBOEMsUUFBUSxZQUFZLGNBQWMsc0JBQXNCLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsaUNBQWlDLCtCQUErQixJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsa0JBQWtCLGNBQWMsMENBQTBDLGdDQUFnQyxpQ0FBaUMseUJBQXlCLG1DQUFtQyx5QkFBeUIsR0FBRyxHQUFHLE9BQU8sYUFBYSx3R0FBd0csWUFBWSxHQUFHLGtCQUFrQixjQUFjLGlCQUFpQixFQUFFLE1BQU0sd0RBQXdELG9CQUFvQixhQUFhLHdJQUF3SSxJQUFJLHVCQUF1QixFQUFFLG1DQUFtQyxlQUFlLGdCQUFnQiwyQkFBMkIscUNBQXFDLDZDQUE2QywyQ0FBMkMseURBQXlELHdDQUF3QywwQ0FBMEMsMENBQTBDLGlHQUFpRywrRUFBK0UseUdBQXlHLCtDQUErQyxnQ0FBZ0Msa0NBQWtDLGlCQUFpQixpUEFBaVAsbUNBQW1DLDRGQUE0RiwrQkFBK0IsOEJBQThCLGdHQUFnRyxJQUFJLCtCQUErQixxREFBcUQsb0JBQW9CLGdDQUFnQyxFQUFFLEVBQUUsRUFBRSxpQ0FBaUMsZ0NBQWdDLDJCQUEyQix1QkFBdUIsRUFBRSxvQkFBb0Isb0JBQW9CLGNBQWMsRUFBRSxFQUFFLGlDQUFpQywyQ0FBMkMsd0NBQXdDLE1BQU0sdUZBQXVGLDBDQUEwQyxNQUFNLHFGQUFxRixnREFBZ0Qsc0ZBQXNGLDBCQUEwQixxR0FBcUcsMkJBQTJCLHNCQUFzQixLQUFLLG9FQUFvRSxjQUFjLEVBQUUsOENBQThDLDBDQUEwQywwQkFBMEIsK0JBQStCLHFHQUFxRyw4REFBOEQsdUNBQXVDLHdCQUF3QixrQ0FBa0MscUNBQXFDLEdBQUcsSUFBSSxVQUFVLEtBQUssb0RBQUUsRUFBNkMsaUJBQWlCLElBQUksY0FBYyxJQUFJLElBQUksSUFBSSw2QkFBNkIsK0RBQStELHNCQUFzQix1Q0FBdUMsZ0JBQWdCLG1DQUFtQywyQkFBMkIsbUZBQW1GLGtCQUFrQixvREFBb0QsZUFBZSx5QkFBeUIsSUFBSSxLQUFLLHlDQUF5QyxpQkFBaUIsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixTQUFTLGVBQWUsa0JBQWtCLGtCQUFrQixpREFBaUQsbUhBQW1ILDRCQUE0QixvR0FBb0csZ0NBQWdDLGlEQUFpRCx5S0FBeUsseURBQXlELGVBQWUsMEJBQTBCLGlCQUFpQixvREFBb0QsK0JBQStCLHNEQUFzRCxlQUFlLDRCQUE0QixpQkFBaUIsc0RBQXNELCtCQUErQiw0Q0FBNEMsZUFBZSxrQkFBa0IsaUJBQWlCLDRDQUE0QywrQkFBK0IsOERBQThELGVBQWUscUVBQXFFLCtCQUErQix5Q0FBeUMsK2hCQUEraEIsdUNBQXVDLFFBQVEsSUFBSSwyQ0FBMkMsUUFBUSxZQUFZLGtDQUFrQyx3QkFBd0IsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixZQUFZLGlDQUFpQyx3QkFBd0IsMkNBQTJDLGtDQUFrQyx5Q0FBeUMsZ0NBQWdDLHNDQUFzQyxvQkFBb0IseUNBQXlDLDZEQUE2RCxtS0FBbUssd0RBQXdELElBQUksZ0RBQWdELHNDQUFzQyw2Q0FBNkMsNkdBQTZHLEdBQUcsR0FBRyxrQkFBa0IscUNBQXFDLGlDQUFpQyxJQUFJLEtBQUssZUFBZSxzRUFBc0UsU0FBUywwQkFBMEIsZUFBZSxnQkFBZ0IsZ0RBQWdELG9DQUFvQyw2RkFBNkYsVUFBVSxLQUFLLGdFQUFnRSxHQUFHLEdBQUcsY0FBYyxjQUFjLE9BQU8sNkNBQTZDLCtKQUErSix5QkFBeUIsZUFBZSxpREFBaUQsT0FBTyxzZEFBc2QsbUNBQW1DLGNBQWMsMENBQTBDLEtBQUssRUFBRSx5Q0FBeUMsY0FBYyxJQUFJLGFBQWEsU0FBUyxNQUFNLGNBQWMsSUFBSSxjQUFjLFNBQVMsTUFBTSxjQUFjLHVDQUF1QywrQkFBK0IsRUFBRSxrQkFBa0IsT0FBTyx3QkFBd0IscUJBQXFCLFlBQVksZ0JBQWdCLFNBQVMsVUFBVSxpQ0FBaUMsMkRBQTJELFlBQVksSUFBSSxjQUFjLG1CQUFtQixpQkFBaUIsY0FBYyw0REFBNEQsS0FBSyxFQUFFLEtBQUssa0hBQWtILHlDQUF5QyxrQkFBa0IsTUFBTSx5QkFBeUIsb0JBQW9CLDhCQUE4QixTQUFTLGtDQUFrQyxTQUFTLDBFQUEwRSxJQUFJLFNBQVMseUNBQXlDLGFBQWEsTUFBTSwyQkFBMkIsaUJBQWlCLE1BQU0sb0JBQW9CLDJCQUEyQixNQUFNLCtCQUErQixTQUFTLGNBQWMsU0FBUyxZQUFZLFFBQVEsTUFBTSxxQkFBcUIsT0FBTyxpQ0FBaUMsZUFBZSxnQkFBZ0IsaURBQWlELHlDQUF5Qyx3Q0FBd0MsTUFBTSwyQkFBMkIsZ0JBQWdCLDRGQUE0RiwrQ0FBK0MsSUFBSSw0QkFBNEIsRUFBRSxFQUFFLGtDQUFrQyxvQ0FBb0MscUJBQXFCLEVBQUUsaUNBQWlDLHdDQUF3QywyQkFBMkIsZ0JBQWdCLDREQUE0RCxvQkFBb0IsSUFBSSw0QkFBNEIsRUFBRSxFQUFFLEdBQUcsR0FBRyxrQkFBa0IsY0FBYyx5Q0FBeUMseUJBQXlCLG1DQUFtQyxpQ0FBaUMseUJBQXlCLEdBQUcsR0FBRyxrQkFBa0Isa0JBQWtCLDZKQUE2SixTQUFTLEdBQUcsK0JBQStCLGNBQWMsaUJBQWlCLEVBQUUscUJBQXFCLGlHQUFpRyxrR0FBa0csNkNBQTZDLHNIQUFzSCx1RUFBdUUsbURBQW1ELGlGQUFpRix3Q0FBd0Msc0RBQXNELCtDQUErQywySEFBMkgscUZBQXFGLDhMQUE4TCxtQ0FBbUMsMkxBQTJMLGlDQUFpQyw2SkFBNkosa0NBQWtDLG9EQUFvRCxHQUFHLEdBQUcsT0FBTyxhQUFhLG9EQUFvRCxZQUFZLEdBQUcsa0JBQWtCLG9CQUFvQixpQ0FBaUMsYUFBYSxnQ0FBZ0MsY0FBYyxnQkFBZ0Isc0VBQXNFLFNBQVMscUJBQXFCLHdIQUF3SCxPQUFPLGFBQWEsbUJBQW1CLHVFQUF1RSx3QkFBd0IsY0FBYywwQ0FBMEMsS0FBSyxFQUFFLHlDQUF5QyxjQUFjLElBQUksYUFBYSxTQUFTLE1BQU0sY0FBYyxJQUFJLGNBQWMsU0FBUyxNQUFNLGNBQWMsdUNBQXVDLCtCQUErQixFQUFFLGtCQUFrQixPQUFPLHdCQUF3QixxQkFBcUIsWUFBWSxnQkFBZ0IsU0FBUyxVQUFVLGlDQUFpQywyREFBMkQsWUFBWSxJQUFJLGNBQWMsbUJBQW1CLGlCQUFpQixjQUFjLDREQUE0RCxLQUFLLEVBQUUsS0FBSyxrSEFBa0gseUNBQXlDLGtCQUFrQixNQUFNLHlCQUF5QixvQkFBb0IsOEJBQThCLFNBQVMsa0NBQWtDLFNBQVMsMEVBQTBFLElBQUksU0FBUyx5Q0FBeUMsYUFBYSxNQUFNLDJCQUEyQixpQkFBaUIsTUFBTSxvQkFBb0IsMkJBQTJCLE1BQU0sK0JBQStCLFNBQVMsY0FBYyxTQUFTLFlBQVksUUFBUSxNQUFNLHFCQUFxQixPQUFPLGtDQUFrQyxtQkFBbUIsK0RBQStELHNCQUFzQix1Q0FBdUMsZ0JBQWdCLG1DQUFtQywyQkFBMkIsb0ZBQW9GLGVBQWUsZUFBZSxlQUFlLHFCQUFxQixvRUFBb0UsZUFBZSxJQUFJLGVBQWUsUUFBUSx3R0FBd0csbUJBQW1CLFFBQVEsY0FBYywyQkFBMkIsOENBQThDLFNBQVMsUUFBUSxpQkFBaUIsa0NBQWtDLHdCQUF3QixrQ0FBa0MsSUFBSSxFQUFFLDRDQUE0Qyx5QkFBeUIsYUFBYSx3QkFBd0IsRUFBRSxlQUFlLHdDQUF3QyxXQUFXLDJCQUEyQix1Q0FBdUMscUNBQXFDLFFBQVEsMkJBQTJCLGdCQUFnQiwwQ0FBMEMsNkJBQTZCLDJCQUEyQixFQUFFLDZCQUE2QiwyQkFBMkIsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLGVBQWUsNkJBQTZCLGlCQUFpQixRQUFRLDRCQUE0QixJQUFJLDJCQUEyQixRQUFRLFlBQVksY0FBYyx1QkFBdUIsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixTQUFTLGlCQUFpQix5Q0FBeUMsSUFBSSxPQUFPLGFBQWEsME5BQTBOLFlBQVksR0FBRyxtQkFBbUIsWUFBWSxtSkFBbUosK05BQStOLGlCQUFpQixRQUFRLE9BQU8sNEtBQTRLLGlCQUFpQixzRkFBc0YsNEJBQTRCLE1BQU0sSUFBSSxlQUFlLHlCQUF5QixJQUFJLGtCQUFrQixhQUFhLHlCQUF5Qix1Q0FBdUMsOEJBQThCLHFDQUFxQyxzREFBc0Qsb0ZBQW9GLEVBQUUsU0FBUyw0Q0FBNEMscUhBQXFILHVDQUF1Qyx1S0FBdUssR0FBRyxHQUFHLElBQUksNEJBQTRCLG9CQUFvQixpQ0FBaUMsYUFBYSxnQ0FBZ0MsY0FBYyxnQkFBZ0Isc0VBQXNFLFNBQVMscUJBQXFCLHdIQUF3SCxPQUFPLGFBQWEsbUJBQW1CLHVFQUF1RSxpQkFBaUIsZ0JBQWdCLGlEQUFpRCwyQ0FBMkMsb0JBQW9CLHlEQUF5RCxpRkFBaUYsT0FBTywwVEFBMFQsR0FBRyxHQUFHLG1CQUFtQixRQUFRLGFBQWEsK0NBQStDLHVDQUF1QyxvQkFBb0IsR0FBRyxLQUFLLG1CQUFtQixRQUFRLGFBQWEsK0NBQStDLHVDQUF1QyxRQUFRLGdGQUFnRixPQUFPLG9CQUFvQixHQUFHLEtBQUssbUJBQW1CLFFBQVEsYUFBYSwrQ0FBK0MsMENBQTBDLFFBQVEsa0ZBQWtGLE9BQU8sb0JBQW9CLEdBQUcsS0FBSyxrQkFBa0Isa0JBQWtCLHFFQUFxRSwyQ0FBMkMsNkNBQTZDLHdDQUF3QyxnREFBZ0QsR0FBRyxHQUFHLG1CQUFtQixRQUFRLGFBQWEsK0NBQStDLFNBQVMsS0FBSyxtQkFBbUIsUUFBUSxhQUFhLCtDQUErQyxTQUFTLEtBQUssbUJBQW1CLFFBQVEsYUFBYSwrQ0FBK0MsU0FBUyxLQUFLLGVBQWUsdUJBQXVCLGtCQUFrQixjQUFjLHlCQUF5QixpREFBaUQsNkVBQTZFLG1CQUFtQix5Q0FBeUMsMkVBQTJFLG1CQUFtQiwrQ0FBK0MsbUZBQW1GLG1CQUFtQixpREFBaUQseUZBQXlGLDZEQUE2RCxtREFBbUQsMkZBQTJGLDZEQUE2RCx5REFBeUQsbUdBQW1HLDZEQUE2RCxzREFBc0QsZ0VBQWdFLHlEQUF5RCxtRUFBbUUsR0FBRyxHQUFHLGtCQUFrQixjQUFjLDZCQUE2QixzREFBc0Qsa0NBQWtDLDJDQUEyQywrRkFBK0YsMklBQTJJLEVBQUUsR0FBRyxHQUFHLGtCQUFrQixvQkFBb0IsaUNBQWlDLGFBQWEsZ0NBQWdDLGNBQWMsZ0JBQWdCLHNFQUFzRSxTQUFTLHFCQUFxQix3SEFBd0gsT0FBTyxhQUFhLG1CQUFtQix1RUFBdUUsb0JBQW9CLE9BQU8sd0JBQXdCLHFCQUFxQixZQUFZLGdCQUFnQixTQUFTLFVBQVUsaUNBQWlDLDJEQUEyRCxZQUFZLElBQUksY0FBYyxtQkFBbUIsaUJBQWlCLGNBQWMsNERBQTRELEtBQUssRUFBRSxLQUFLLGtIQUFrSCx5Q0FBeUMsa0JBQWtCLE1BQU0seUJBQXlCLG9CQUFvQiw4QkFBOEIsU0FBUyxrQ0FBa0MsU0FBUywwRUFBMEUsSUFBSSxTQUFTLHlDQUF5QyxhQUFhLE1BQU0sMkJBQTJCLGlCQUFpQixNQUFNLG9CQUFvQiwyQkFBMkIsTUFBTSwrQkFBK0IsU0FBUyxjQUFjLFNBQVMsWUFBWSxRQUFRLE1BQU0scUJBQXFCLE9BQU8saUNBQWlDLGVBQWUsY0FBYyx5REFBeUQscUNBQXFDLGtEQUFrRCx3Q0FBd0Msb0JBQW9CLHNEQUFzRCxVQUFVLDRFQUE0RSxpQ0FBaUMsd0ZBQXdGLCtCQUErQixrREFBa0QsNkJBQTZCLFFBQVEsMkJBQTJCLGdCQUFnQixxREFBcUQsNERBQTRELHdDQUF3QyxrQkFBa0IsRUFBRSxnQ0FBZ0MsUUFBUSwyQkFBMkIsZ0JBQWdCLHVEQUF1RCx5RkFBeUYsd0NBQXdDLGtCQUFrQixFQUFFLDJDQUEyQyxlQUFlLDJCQUEyQiwrQkFBK0IsSUFBSSxHQUFHLGtCQUFrQixRQUFRLGFBQWEsNkJBQTZCLFNBQVMsS0FBSyxxQkFBcUIsb0RBQW9ELGVBQWUseUJBQXlCLElBQUksS0FBSyx5Q0FBeUMsaUJBQWlCLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxlQUFlLGNBQWMseUZBQXlGLDRDQUE0QyxxRUFBcUUsMkNBQTJDLEVBQUUsYUFBYSx5Q0FBeUMsV0FBVyw0Q0FBNEMseUVBQXlFLGFBQWEsUUFBUSxzQ0FBc0Msd0NBQXdDLDBCQUEwQix3Q0FBd0MsMENBQTBDLDJCQUEyQiwwRUFBMEUsRUFBRSxnQ0FBZ0Msb0NBQW9DLDZDQUE2QyxHQUFHLEdBQUcsbUJBQW1CLCtEQUErRCxzQkFBc0IsdUNBQXVDLGdCQUFnQixtQ0FBbUMsMkJBQTJCLG1GQUFtRixrQkFBa0Isb0RBQW9ELGVBQWUseUJBQXlCLElBQUksS0FBSyx5Q0FBeUMsaUJBQWlCLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxlQUFlLGdCQUFnQixXQUFXLDJHQUEyRyxxQ0FBcUMsRUFBRSxrREFBa0QsNEJBQTRCLHNEQUFzRCwrQkFBK0Isb0RBQW9ELHVJQUF1SSw4Q0FBOEMsMkJBQTJCLDBEQUEwRCxFQUFFLFlBQVksOERBQThELDZDQUE2QywrQ0FBK0MsSUFBSSwyQkFBMkIsUUFBUSxZQUFZLHFEQUFxRCxxRUFBcUUsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLHFCQUFxQiwyREFBMkQsdURBQXVELCtEQUErRCxJQUFJLDJCQUEyQixRQUFRLFlBQVksY0FBYyxpQ0FBaUMsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixTQUFTLHlCQUF5QixxQ0FBcUMsWUFBWSxFQUFFLHlDQUF5QyxlQUFlLGdDQUFnQyxhQUFhLGtCQUFrQixXQUFXLFNBQVMsc0NBQXNDLFFBQVEsSUFBSSxrQ0FBa0MsUUFBUSxZQUFZLCtDQUErQyxvQkFBb0IsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixTQUFTLEdBQUcsR0FBRyxlQUFlLCtCQUErQixrQkFBa0Isb0JBQW9CLGlDQUFpQyxhQUFhLGdDQUFnQyxjQUFjLGdCQUFnQixzRUFBc0UsU0FBUyxxQkFBcUIsd0hBQXdILE9BQU8sYUFBYSxtQkFBbUIsdUVBQXVFLG9CQUFvQixvREFBb0QsZUFBZSx5QkFBeUIsSUFBSSxLQUFLLHlDQUF5QyxpQkFBaUIsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixTQUFTLGdCQUFnQixRQUFRLG9CQUFvQiwyQkFBMkIsdUdBQXVHLHdDQUF3QyxtQkFBbUIsNENBQTRDLDRCQUE0QiwyQ0FBMkMsOENBQThDLG1DQUFtQyx5Q0FBeUMsa0ZBQWtGLEdBQUcsS0FBSyxJQUFJLGlCQUFpQixTQUFTO0FBQ2htbEk7QUFDQTtBQUNBO0FBQ0EsS0FBSyxpQkFBaUIsb0hBQW9ILGlCQUFpQiwwR0FBMEcsaUJBQWlCLE9BQU8sb0NBQW9DLHFCQUFxQixnR0FBZ0csaUJBQWlCLE9BQU8sb0NBQW9DLHFCQUFxQjtBQUN2Z0I7QUFDQSxzSEFBc0gsaUJBQWlCLGtJQUFrSSxtQkFBbUIsK0RBQStELHNCQUFzQix1Q0FBdUMsZ0JBQWdCLG1DQUFtQywyQkFBMkIsbUZBQW1GLGVBQWUsYUFBYSxnRUFBZ0UsMkJBQTJCLGFBQWEscUNBQXFDLGlCQUFpQixJQUFJLHVEQUF1RCxRQUFRLFlBQVksY0FBYyxlQUFlLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0Isd0NBQXdDLGVBQWUsb0NBQW9DLFFBQVEsWUFBWSxjQUFjLGVBQWUsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixTQUFTLGtDQUFrQyw4Q0FBOEMsZ0RBQWdELHdDQUF3QyxvRkFBb0YsdURBQXVELHVDQUF1QyxnRUFBZ0Usa0VBQWtFLHdDQUF3QywwQkFBMEIsb0JBQW9CLGdFQUFnRSw0Q0FBNEMsa0RBQWtELGVBQWUsa0JBQWtCLE9BQU8sVUFBVSwwREFBMEQsZUFBZSxJQUFJLDJCQUEyQixRQUFRLFlBQVksNENBQTRDO0FBQ2htRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTLEdBQUcsU0FBUyxRQUFRLElBQUksb0NBQW9DLFFBQVEsb0JBQW9CLFNBQVMsR0FBRyxHQUFHLGtCQUFrQixjQUFjLHdCQUF3Qiw0Q0FBNEMsMENBQTBDLGtCQUFrQixFQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksa0JBQWtCLGdCQUFnQiw0REFBNEQseUNBQXlDLG9CQUFvQixzQkFBc0IsZ0ZBQWdGLE9BQU8sd1BBQXdQLEdBQUcsR0FBRyxrQkFBa0IsYUFBYSxxQkFBcUIsMkNBQTJDLG9CQUFvQixXQUFXLDBCQUEwQixnRUFBZ0UsOEVBQThFLE9BQU8sb1BBQW9QLEdBQUcsR0FBRyx5QkFBeUIsY0FBYywwQ0FBMEMsS0FBSyxFQUFFLHlDQUF5QyxjQUFjLElBQUksYUFBYSxTQUFTLE1BQU0sY0FBYyxJQUFJLGNBQWMsU0FBUyxNQUFNLGNBQWMsdUNBQXVDLCtCQUErQixFQUFFLGtCQUFrQixPQUFPLHdCQUF3QixxQkFBcUIsWUFBWSxnQkFBZ0IsU0FBUyxVQUFVLGlDQUFpQywyREFBMkQsWUFBWSxJQUFJLGNBQWMsbUJBQW1CLGlCQUFpQixjQUFjLDREQUE0RCxLQUFLLEVBQUUsS0FBSyxrSEFBa0gseUNBQXlDLGtCQUFrQixNQUFNLHlCQUF5QixvQkFBb0IsOEJBQThCLFNBQVMsa0NBQWtDLFNBQVMsMEVBQTBFLElBQUksU0FBUyx5Q0FBeUMsYUFBYSxNQUFNLDJCQUEyQixpQkFBaUIsTUFBTSxvQkFBb0IsMkJBQTJCLE1BQU0sK0JBQStCLFNBQVMsY0FBYyxTQUFTLFlBQVksUUFBUSxNQUFNLHFCQUFxQixPQUFPLGlDQUFpQyxrQkFBa0Isb0RBQW9ELGVBQWUseUJBQXlCLElBQUksS0FBSyx5Q0FBeUMsaUJBQWlCLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxvQkFBb0Isb0RBQW9ELElBQUkseUVBQXlFLGtEQUFrRCxlQUFlLGFBQWEsMkNBQTJDLDZDQUE2Qyw4QkFBOEIsNEJBQTRCLHdCQUF3QixFQUFFLDBDQUEwQyw4QkFBOEIsaUNBQWlDLDRDQUE0Qyw0QkFBNEIsZUFBZSxtRkFBbUYsT0FBTyxtQ0FBbUMsaUNBQWlDLHlCQUF5QixFQUFFLCtDQUErQywyREFBMkQsc0NBQXNDLG1DQUFtQyx3Q0FBd0MsWUFBWSwyQkFBMkIsZ0JBQWdCLG9IQUFvSCx3REFBd0QsZ0JBQWdCLFNBQVMsRUFBRSxFQUFFLDZDQUE2QyxXQUFXLHVDQUF1QyxnQ0FBZ0MscUNBQXFDLFFBQVEsMkJBQTJCLGdCQUFnQixzSEFBc0gsNkRBQTZELHNCQUFzQixPQUFPLEVBQUUsRUFBRSxFQUFFLGtEQUFrRCxXQUFXLDRDQUE0QyxpQ0FBaUMscUNBQXFDLFFBQVEsMkJBQTJCLGdCQUFnQiwwRUFBMEUsNkNBQTZDLHVCQUF1QiwrQ0FBK0MsY0FBYyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUseUNBQXlDLDZDQUE2Qyx3Q0FBd0MsRUFBRSw4Q0FBOEMsa0RBQWtELDJDQUEyQyxFQUFFLEdBQUcsR0FBRyxrQkFBa0Isb0JBQW9CLGlDQUFpQyxhQUFhLGdDQUFnQyxjQUFjLGdCQUFnQixzRUFBc0UsU0FBUyxxQkFBcUIsd0hBQXdILE9BQU8sYUFBYSxtQkFBbUIsdUVBQXVFLGtCQUFrQixRQUFRLG9CQUFvQiwyQkFBMkIsdUdBQXVHLDRDQUE0QyxrRkFBa0YsbUNBQW1DLHlDQUF5QyxrRkFBa0YsR0FBRyxLQUFLLGtCQUFrQixvQkFBb0IsaUNBQWlDLGFBQWEsZ0NBQWdDLGNBQWMsZ0JBQWdCLHNFQUFzRSxTQUFTLHFCQUFxQix3SEFBd0gsT0FBTyxhQUFhLG1CQUFtQix1RUFBdUUsaUJBQWlCLGNBQWMseUJBQXlCLFVBQVUsR0FBRyxHQUFHLG1CQUFtQixRQUFRLGFBQWEsK0NBQStDLHlDQUF5QyxTQUFTLEdBQUcsS0FBSyxtQkFBbUIsUUFBUSxjQUFjLHlCQUF5QixvQ0FBb0MseUNBQXlDLGdCQUFnQix5Q0FBeUMsNENBQTRDLHNCQUFzQixpQkFBaUIsSUFBSSxHQUFHLEtBQUssY0FBYyx5QkFBeUIsY0FBYywwQ0FBMEMsS0FBSyxFQUFFLHlDQUF5QyxjQUFjLElBQUksYUFBYSxTQUFTLE1BQU0sY0FBYyxJQUFJLGNBQWMsU0FBUyxNQUFNLGNBQWMsdUNBQXVDLCtCQUErQixFQUFFLGtCQUFrQixPQUFPLHdCQUF3QixxQkFBcUIsWUFBWSxnQkFBZ0IsU0FBUyxVQUFVLGlDQUFpQywyREFBMkQsWUFBWSxJQUFJLGNBQWMsbUJBQW1CLGlCQUFpQixjQUFjLDREQUE0RCxLQUFLLEVBQUUsS0FBSyxrSEFBa0gseUNBQXlDLGtCQUFrQixNQUFNLHlCQUF5QixvQkFBb0IsOEJBQThCLFNBQVMsa0NBQWtDLFNBQVMsMEVBQTBFLElBQUksU0FBUyx5Q0FBeUMsYUFBYSxNQUFNLDJCQUEyQixpQkFBaUIsTUFBTSxvQkFBb0IsMkJBQTJCLE1BQU0sK0JBQStCLFNBQVMsY0FBYyxTQUFTLFlBQVksUUFBUSxNQUFNLHFCQUFxQixPQUFPLGlDQUFpQyxrQkFBa0Isb0RBQW9ELGVBQWUseUJBQXlCLElBQUksS0FBSyx5Q0FBeUMsaUJBQWlCLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxlQUFlLGdCQUFnQix1SkFBdUoscURBQXFELHdDQUF3QyxtQ0FBbUMsb0RBQW9ELHdDQUF3QyxTQUFTLHFDQUFxQyx3Q0FBd0MsVUFBVSwyQkFBMkIsZ0JBQWdCLHFFQUFxRSxnSEFBZ0gsc0JBQXNCLDhCQUE4QixTQUFTLE1BQU0sY0FBYywyQ0FBMkMsVUFBVSxJQUFJLEVBQUUsRUFBRSxrREFBa0QscUhBQXFILHlFQUF5RSxvQkFBb0Isd0hBQXdILDZDQUE2QyxFQUFFLGlCQUFpQixvRkFBb0Ysa0dBQWtHLG9CQUFvQix1REFBdUQsMkRBQTJELEVBQUUsY0FBYyxTQUFTLEdBQUcsR0FBRyxtQkFBbUIsK0RBQStELHNCQUFzQix1Q0FBdUMsZ0JBQWdCLG1DQUFtQywyQkFBMkIsbUZBQW1GLGVBQWUsY0FBYyxpR0FBaUcsbURBQW1ELDRDQUE0QyxxRUFBcUUsNENBQTRDLGFBQWEsSUFBSSwrQ0FBK0MsUUFBUSxZQUFZLGNBQWMsb0NBQW9DLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxHQUFHLEdBQUcsbUNBQW1DLGNBQWMsMENBQTBDLEtBQUssRUFBRSx5Q0FBeUMsY0FBYyxJQUFJLGFBQWEsU0FBUyxNQUFNLGNBQWMsSUFBSSxjQUFjLFNBQVMsTUFBTSxjQUFjLHVDQUF1QywrQkFBK0IsRUFBRSxrQkFBa0IsT0FBTyx3QkFBd0IscUJBQXFCLFlBQVksZ0JBQWdCLFNBQVMsVUFBVSxpQ0FBaUMsMkRBQTJELFlBQVksSUFBSSxjQUFjLG1CQUFtQixpQkFBaUIsY0FBYyw0REFBNEQsS0FBSyxFQUFFLEtBQUssa0hBQWtILHlDQUF5QyxrQkFBa0IsTUFBTSx5QkFBeUIsb0JBQW9CLDhCQUE4QixTQUFTLGtDQUFrQyxTQUFTLDBFQUEwRSxJQUFJLFNBQVMseUNBQXlDLGFBQWEsTUFBTSwyQkFBMkIsaUJBQWlCLE1BQU0sb0JBQW9CLDJCQUEyQixNQUFNLCtCQUErQixTQUFTLGNBQWMsU0FBUyxZQUFZLFFBQVEsTUFBTSxxQkFBcUIsT0FBTyxpQ0FBaUMsa0JBQWtCLG9EQUFvRCxlQUFlLHlCQUF5QixJQUFJLEtBQUsseUNBQXlDLGlCQUFpQixTQUFTLEdBQUcsU0FBUyxRQUFRLElBQUksb0NBQW9DLFFBQVEsb0JBQW9CLFNBQVMsb0JBQW9CLG9EQUFvRCxJQUFJLHlFQUF5RSxrREFBa0QsZUFBZSxnQkFBZ0IseUNBQXlDLHVDQUF1Qyx3Q0FBd0MsbUJBQW1CLDJCQUEyQixnQkFBZ0IsdUlBQXVJLHFDQUFxQyxNQUFNLDJCQUEyQixnQkFBZ0IscUNBQXFDLG9JQUFvSSxFQUFFLEVBQUUscUJBQXFCLDJCQUEyQixpQkFBaUIsbURBQW1ELFVBQVUsR0FBRyxFQUFFLEVBQUUsb0NBQW9DLHdDQUF3QywyQkFBMkIsZ0JBQWdCLGtEQUFrRCw0QkFBNEIsRUFBRSxFQUFFLGtDQUFrQyx3Q0FBd0MsMkJBQTJCLGdCQUFnQixnREFBZ0QsNEJBQTRCLEVBQUUsRUFBRSxzREFBc0QsMERBQTBELDJDQUEyQywrQ0FBK0MsR0FBRyxHQUFHLHlCQUF5QixjQUFjLDBDQUEwQyxLQUFLLEVBQUUseUNBQXlDLGNBQWMsSUFBSSxhQUFhLFNBQVMsTUFBTSxjQUFjLElBQUksY0FBYyxTQUFTLE1BQU0sY0FBYyx1Q0FBdUMsK0JBQStCLEVBQUUsa0JBQWtCLE9BQU8sd0JBQXdCLHFCQUFxQixZQUFZLGdCQUFnQixTQUFTLFVBQVUsaUNBQWlDLDJEQUEyRCxZQUFZLElBQUksY0FBYyxtQkFBbUIsaUJBQWlCLGNBQWMsNERBQTRELEtBQUssRUFBRSxLQUFLLGtIQUFrSCx5Q0FBeUMsa0JBQWtCLE1BQU0seUJBQXlCLG9CQUFvQiw4QkFBOEIsU0FBUyxrQ0FBa0MsU0FBUywwRUFBMEUsSUFBSSxTQUFTLHlDQUF5QyxhQUFhLE1BQU0sMkJBQTJCLGlCQUFpQixNQUFNLG9CQUFvQiwyQkFBMkIsTUFBTSwrQkFBK0IsU0FBUyxjQUFjLFNBQVMsWUFBWSxRQUFRLE1BQU0scUJBQXFCLE9BQU8saUNBQWlDLGdCQUFnQiwrREFBK0Qsc0JBQXNCLHVDQUF1QyxnQkFBZ0IsbUNBQW1DLDJCQUEyQixtRkFBbUYsZUFBZSxjQUFjLFVBQVUsa0JBQWtCLHdFQUF3RSxvRUFBb0UsaUNBQWlDLFFBQVEsWUFBWSxjQUFjLDJDQUEyQyxTQUFTLEdBQUcsU0FBUyxRQUFRLElBQUksb0NBQW9DLFFBQVEscUJBQXFCLDRDQUE0QywyQ0FBMkMsaUpBQWlKLHVDQUF1QyxRQUFRLHlDQUF5QyxrQ0FBa0Msa0VBQWtFLGtDQUFrQyx3Q0FBd0MsMkJBQTJCLGdCQUFnQiwwTEFBMEwscUJBQXFCLEtBQUssNEJBQTRCLEVBQUUsRUFBRSxvQ0FBb0Msd0NBQXdDLDJCQUEyQixnQkFBZ0IsZ0xBQWdMLHVCQUF1QixJQUFJLDRCQUE0QixFQUFFLEVBQUUsR0FBRyxHQUFHLDBDQUEwQyxJQUFJLDZDQUE2QyxhQUFhLDZCQUE2QixxTkFBcU4sd0RBQXdELDBJQUEwSSwyQ0FBMkMsZUFBZSx5RUFBeUUsYUFBYSx1REFBdUQsRUFBRSwwVEFBMFQsV0FBVyxvU0FBb1MsRUFBRSxlQUFlLHFDQUFxQyxxQkFBcUIsYUFBYSwrQkFBK0IsV0FBVyx5T0FBeU8sRUFBRSxRQUFRLFFBQVEsU0FBUyxVQUFVLGtDQUFrQyxpQkFBaUIsdUNBQXVDLFNBQVMsa0NBQWtDLCtCQUErQixxQkFBcUIsU0FBUyxJQUFJLGVBQWUsbUNBQW1DLGFBQWEsaUJBQWlCLGtCQUFrQiw2QkFBNkIseUJBQXlCLHlCQUF5QixhQUFhLG1FQUFtRSxtREFBbUQsZUFBZSxFQUFFLFdBQVcsbUVBQW1FLGVBQWUsRUFBRSxhQUFhLElBQUksZ0NBQWdDLDZEQUE2RCw2QkFBNkIscUJBQXFCLGtEQUFrRCw2Q0FBNkMsK0NBQStDLDRCQUE0QixzQkFBc0IsMEJBQTBCLElBQUksc0NBQXNDLGtCQUFrQixxQ0FBcUMsS0FBSyx1QkFBdUIseUJBQXlCLEVBQUUsNENBQTRDLFNBQVMsSUFBSSxnQ0FBZ0MsdUVBQXVFLE1BQU0sWUFBWSxpQ0FBaUMsTUFBTSwrQ0FBK0MsZ0VBQWdFLFFBQVEsU0FBUyxnREFBZ0Qsc0JBQXNCLGdCQUFnQiw0REFBNEQsd0NBQXdDLE1BQU0sOEJBQThCLHNDQUFzQyxLQUFLLDhKQUE4SixlQUFlLElBQUksb0JBQW9CLElBQUkscUdBQXFHLEdBQUcsWUFBWSwwREFBMEQsR0FBRyxFQUFFLEVBQUUsS0FBSyxtRkFBbUYsa0RBQWtELDJDQUEyQywwQkFBMEIsY0FBYyxVQUFVLHFDQUFxQyxFQUFFLG9CQUFvQixPQUFPLHlEQUF5RCxpQkFBaUIsZUFBZSwrQkFBK0IsOENBQThDLEVBQUUsR0FBRyxFQUFFLElBQUksaUJBQWlCLGlCQUFpQixJQUFJLHlDQUF5QyxnQkFBZ0IsRUFBRSw4Q0FBOEMsYUFBYSw4Q0FBOEMsU0FBUywwQ0FBMEMsWUFBWSxnQ0FBZ0MsaUZBQWlGLE9BQU8sNEJBQTRCLElBQUksRUFBRSwrQkFBK0Isb0JBQW9CLFNBQVMsNkNBQTZDLE9BQU8sc0JBQXNCLDhCQUE4QiwyRkFBMkYsT0FBTyxhQUFhLFdBQVcsbUdBQW1HLEVBQUUsWUFBWSxrREFBa0QsZUFBZSx1Q0FBdUMsa0NBQWtDLEVBQUUsOEJBQThCLGlCQUFpQiw2Q0FBNkMsK0NBQStDLEdBQUcsRUFBRSxlQUFlLHVDQUF1QyxhQUFhLGdCQUFnQixFQUFFLG9CQUFvQixZQUFZLHNCQUFzQixXQUFXLDRCQUE0QixhQUFhLCtCQUErQixxQkFBcUIsV0FBVyxnREFBZ0QseUJBQXlCLEVBQUUsYUFBYSxPQUFPLHVEQUF1RCxpQkFBaUIsZUFBZSxpQkFBaUIsaUJBQWlCLGVBQWUsb0JBQW9CLDBCQUEwQixpQkFBaUIsNkRBQTZELHlCQUF5Qix3REFBd0QsU0FBUyxpQkFBaUIscUhBQXFILHNCQUFzQixxREFBcUQsNkRBQTZELGlCQUFpQix1REFBdUQsc0JBQXNCLHFEQUFxRCx1RkFBdUYsaUJBQWlCLHFHQUFxRyxpQkFBaUIsZ0RBQWdELDZEQUE2RCxpQkFBaUIseUdBQXlHLGlCQUFpQix1WkFBdVosaUJBQWlCLCtDQUErQyxrQkFBa0IsaURBQWlELFNBQVMsaUJBQWlCLCtDQUErQyxrQkFBa0IsaURBQWlELFNBQVMsaUJBQWlCLGlKQUFpSixzQkFBc0IscURBQXFELHVGQUF1RixpQkFBaUIsMmRBQTJkLHNCQUFzQixxREFBcUQsNkhBQTZILGtCQUFrQixpREFBaUQsbUhBQW1ILGlCQUFpQixpREFBaUQseUlBQXlJLGlCQUFpQixrR0FBa0csaUJBQWlCLDJKQUEySixzQkFBc0IscURBQXFELHVGQUF1RixpQkFBaUIseU1BQXlNLHNCQUFzQixxREFBcUQsdUZBQXVGLGFBQWEsZ0JBQWdCLEVBQUUsb0JBQW9CLFlBQVksc0JBQXNCLFdBQVcsNEJBQTRCLGFBQWEsK0JBQStCLHFCQUFxQixXQUFXLHVEQUF1RCxhQUFhLE9BQU8seURBQXlELGtDQUFrQyxpQkFBaUIsZUFBZSxJQUFJLGlCQUFpQixvQkFBb0IsYUFBYSxLQUFLLFdBQVcsV0FBVyw4QkFBOEIsRUFBRSxhQUFhLGdCQUFnQixFQUFFLDhDQUE4QyxvQ0FBb0MsY0FBYyxZQUFZLG1CQUFtQixhQUFhLHFCQUFxQixzQkFBc0Isb0JBQW9CLGtCQUFrQixpQ0FBaUMsbUVBQW1FLHlCQUF5QixtQkFBbUIsMEVBQTBFLHFCQUFxQiwwT0FBME8sOEVBQThFLG1CQUFtQixrU0FBa1MsV0FBVyxpRUFBaUUsRUFBRSwwQ0FBMEMsaUdBQWlHLHNDQUFzQyxHQUFHLEVBQUUsR0FBRyxFQUFFLGFBQWEsdUJBQXVCLHNCQUFzQixtQ0FBbUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFLCtDQUErQyxJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixNQUFNLGFBQWEseUVBQXlFLCtEQUErRCxnREFBZ0QsVUFBVSxHQUFHLG9PQUFvTyxzQkFBc0IsdURBQXVELEVBQUUsMEZBQTBGLDRCQUE0QixrREFBa0Qsb0NBQW9DLEtBQUssdUJBQXVCLEtBQUssSUFBSSwwQ0FBMEMsd0NBQXdDLHFCQUFxQixrSUFBa0ksYUFBYSxpSUFBaUksdUJBQXVCLDJCQUEyQiw0QkFBNEIseUJBQXlCLDRCQUE0QixLQUFLLDRCQUE0Qix3SEFBd0gsRUFBRSxtQkFBbUIsbUNBQW1DLG9CQUFvQix5QkFBeUIsSUFBSSxVQUFVLDRCQUE0QiwwQkFBMEIsa0JBQWtCLElBQUksaUJBQWlCLE1BQU0sYUFBYSx5RUFBeUUsK0RBQStELGFBQWEseUNBQXlDLHVCQUF1QixxQkFBcUIsbUJBQW1CLFFBQVEsbUNBQW1DLHVFQUF1RSx3Q0FBd0Msc0JBQXNCLHlIQUF5SCxFQUFFLDJFQUEyRSw4QkFBOEIsZ0RBQWdELHFDQUFxQyx3QkFBd0IsSUFBSSxpQkFBaUIsc0VBQXNFLGlCQUFpQix1QkFBdUIsaUJBQWlCLGlJQUFpSSxVQUFVLEdBQUcsYUFBYSwwQkFBMEIsZ0RBQWdELEtBQUssbUNBQW1DLFlBQVksU0FBUywwQkFBMEIsbUJBQW1CLFNBQVMsc0NBQXNDLElBQUkseUNBQXlDLCtEQUErRCxRQUFRLFVBQVUsMkRBQTJELEtBQUssV0FBVyxZQUFZLEtBQUssU0FBUyxlQUFlLHdFQUF3RSxTQUFTLFNBQVMseUJBQXlCLFVBQVUsS0FBSyxLQUFLLFdBQVcsc0JBQXNCLEtBQUssU0FBUywwQkFBMEIsU0FBUyx3QkFBd0IsZUFBZSxxQkFBcUIsaUNBQWlDLGVBQWUsc0NBQXNDLGdDQUFnQywwQkFBMEIsZUFBZSxJQUFJLGlDQUFpQyxFQUFFLHVCQUF1QixpQkFBaUIsd0RBQXdELDhDQUE4QyxFQUFFLEtBQUssZ0JBQWdCLGFBQWEsc0NBQXNDLEdBQUcscUJBQXFCLGtDQUFrQyxpQkFBaUIsaUNBQWlDLGlCQUFpQixxSUFBcUksb0JBQW9CLDhCQUE4Qix5Q0FBeUMsZUFBZSx3QkFBd0IsT0FBTyxXQUFXLDhCQUE4QixxQkFBcUIsaUJBQWlCLG1CQUFtQixNQUFNLHVCQUF1Qiw2QkFBNkIsbUNBQW1DLDJCQUEyQix1QkFBdUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixXQUFXLHdCQUF3Qiw4RkFBOEYsU0FBUyxJQUFJLGtFQUFrRSxTQUFTLGNBQWMsY0FBYyxnQ0FBZ0MsMEVBQTBFLFNBQVMsR0FBRyxHQUFHLFVBQVUsR0FBRyxTQUFTLElBQUkscUNBQXFDLEVBQUUsaUVBQWlFLGVBQWUsa0JBQWtCLGVBQWUsOEJBQThCLCtCQUErQixZQUFZLGVBQWUsY0FBYyxrQkFBa0IsTUFBTSxxQ0FBcUMsaUVBQWlFLHFDQUFxQyxlQUFlLDRCQUE0QixrR0FBa0csOENBQThDLElBQUksYUFBYSxTQUFTLFNBQVMsVUFBVSxXQUFXLFVBQVUsNkZBQTZGLElBQUksa0JBQWtCLGFBQWEsNEhBQTRILCtEQUErRCxPQUFPLElBQUksZ0JBQWdCLDZCQUE2QixlQUFlLG9DQUFvQyxlQUFlLDhFQUE4RSxPQUFPLGNBQWMsZUFBZSxZQUFZLGFBQWEsZUFBZSxZQUFZLG9CQUFvQixtREFBbUQsZUFBZSxTQUFTLGVBQWUsMENBQTBDLFFBQVEsK0VBQStFLGVBQWUsUUFBUSx3QkFBd0IsdUZBQXVGLE9BQU8sOEZBQThGLHFCQUFxQixvREFBb0QsZUFBZSx5QkFBeUIsSUFBSSxLQUFLLHlDQUF5QyxpQkFBaUIsU0FBUyxHQUFHLFNBQVMsUUFBUSxJQUFJLG9DQUFvQyxRQUFRLG9CQUFvQixVQUFVLGVBQWUsc0NBQXNDLGtCQUFrQixFQUFFLGlCQUFpQixPQUFPLG1CQUFtQixlQUFlLGVBQWUscUJBQXFCLGNBQWMsbUNBQW1DLFdBQVcsRUFBRSxjQUFjLGdCQUFnQixZQUFZLDBCQUEwQixhQUFhLG1CQUFtQixZQUFZLGtCQUFrQix3QkFBd0IsYUFBYSx5Q0FBeUMsNEJBQTRCLGVBQWUsR0FBRyxJQUFJLGlCQUFpQixtQ0FBbUMsT0FBTyxzYkFBc2IsZUFBZSxrREFBa0QsOEJBQThCLCtCQUErQixlQUFlLHlDQUF5QyxpQkFBaUIsTUFBTSxPQUFPLHdRQUF3USxpQkFBaUIsT0FBTyxnSkFBZ0osbUJBQW1CLCtEQUErRCxzQkFBc0IsdUNBQXVDLGdCQUFnQixtQ0FBbUMsMkJBQTJCLG1GQUFtRixrQkFBa0Isb0RBQW9ELGVBQWUseUJBQXlCLElBQUksS0FBSyx5Q0FBeUMsaUJBQWlCLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsVUFBVSxpQkFBaUIsWUFBWSxPQUFPLHVCQUF1QixlQUFlLGtCQUFrQixJQUFJLDJCQUEyQixRQUFRLFlBQVksa0NBQWtDLG1DQUFtQyx1SUFBdUksZ0NBQWdDLFNBQVMsR0FBRyxTQUFTLFFBQVEsSUFBSSxvQ0FBb0MsUUFBUSxvQkFBb0IsU0FBUyxpQkFBaUIsOENBQThDLFFBQVEsRUFBRSxtRUFBbUUsUUFBUSxFQUFFLGNBQWMsZUFBZSx5RkFBeUYsZUFBZSxFQUFFLFFBQVEsT0FBTyxpQkFBaUIscUJBQXFCLEVBQUUsV0FBVyxRQUFRLFVBQVUscURBQXFELGdDQUFnQyxzQkFBc0IsU0FBUyxhQUFhLFlBQVksVUFBVSxrQkFBa0IsMkRBQTJELDhDQUE4QyxFQUFFLE9BQU8sSUFBSSxZQUFZLHlCQUF5QixFQUFFLDhCQUE4Qiw4Q0FBOEMsRUFBRSxTQUFTLEdBQUcsZ0ZBQWdGLEdBQUcsV0FBVyx5QkFBeUIsYUFBYSwyQkFBMkIsSUFBSSxjQUFjLDRDQUE0QyxtQkFBbUIsZUFBZSxpQkFBaUIsYUFBYSxtQ0FBbUMsV0FBVyxpQ0FBaUMsYUFBYSxTQUFTLHFHQUFxRyxPQUFPLDRCQUE0QixTQUFTLGdDQUFnQyxRQUFRLHVMQUF1TCxVQUFVLGdCQUFnQixFQUFFLHFCQUFxQixRQUFRLGtDQUFrQyxNQUF3QixFQUFFLENBQVEseUJBQXlCLHlFQUF5RSxzREFBc0QsV0FBVyx1RkFBdUYsaUNBQWlDLDREQUE0RCxnREFBZ0QsK0JBQStCLDhCQUE4QixPQUFPLGFBQWEsaUJBQWlCLDhFQUE4RSxxR0FBcUcsNkJBQTZCLGdEQUFnRCxFQUFFLHFFQUFxRSx3REFBd0QsY0FBYyxFQUFFLDhDQUE4QyxjQUFjLFdBQVcsRUFBRSx1R0FBdUcsNEJBQTRCLGNBQWMsNkJBQTZCLEVBQUUsMkdBQTJHLHFEQUFxRCw4REFBOEQsbUJBQW1CLDJDQUEyQyxpQkFBaUIsU0FBUyxxT0FBcU8sTUFBd0IsMEVBQTBFLElBQUksMEJBQTBCLE1BQU0sU0FBUyxjQUFjLDJDQUEyQyxPQUFPLGdDQUFnQyxpQkFBaUIsc1BBQXNQLG1CQUFtQiw4R0FBOEcsK0JBQStCLHVCQUF1QixlQUFlLFNBQVMsZUFBZSxzQ0FBc0MsVUFBVSxzREFBc0QsVUFBVSx3Q0FBd0MsdURBQXVELDRCQUE0QiwwQkFBMEIscUdBQXFHLGdIQUFnSCw4REFBOEQsRUFBRSxJQUFJLFNBQVMsU0FBUyx3QkFBd0IsaUJBQWlCLGtDQUFrQyxnREFBZ0QsOERBQThELDZCQUE2QiwrQkFBK0IsMkNBQTJDLFdBQVcsRUFBRSw0Q0FBNEMsWUFBWSxFQUFFLHdDQUF3Qyw4Q0FBOEMsbUJBQW1CLEVBQUUsd0VBQXdFLCtCQUErQix5QkFBeUIsR0FBRyxZQUFZLGVBQWUsMkpBQTJKLEdBQUcsT0FBTyx3RkFBd0Ysd0NBQXdDLHVFQUF1RSwyQkFBMkIsOENBQThDLEdBQUcsd0VBQXdFLDJCQUEyQiw0REFBNEQsR0FBRyxVQUFVLG1CQUFtQixvQ0FBb0MsZUFBZSx1QkFBdUIsc0NBQXNDLG1IQUFtSCw0RUFBNEUsT0FBTyx3QkFBd0IsRUFBRSx1QkFBdUIsMkNBQTJDLDBCQUEwQixxSkFBcUosU0FBUyxTQUFTLHdGQUF3RixlQUFlLDBIQUEwSCwwSkFBMEosK0VBQStFLG1DQUFtQyxNQUFNLCtCQUErQixnQkFBZ0IsRUFBRSxtQ0FBbUMsZ0JBQWdCLEVBQUUsOEVBQThFLEVBQUUsaUNBQWlDLCtDQUErQyxHQUFHLEVBQUUsZUFBZSwyQ0FBMkMsa0NBQWtDLG9DQUFvQyxnQ0FBZ0MsRUFBRSxHQUFHLEdBQUcsS0FBSyxlQUFlLGVBQWUsZUFBZSxNQUFNLHdCQUF3QixjQUFjLFNBQVMsbUJBQTBJO0FBQy95OEMiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQHZlcmNlbCtvdGVsQDEuMTQuMV9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMV9Ab3BlbnRlbGVtZXRyeStpX2NnNWsybnhvanB1MzJ2ZjNnamY3bWZlNXphL25vZGVfbW9kdWxlcy9AdmVyY2VsL290ZWwvZGlzdC9lZGdlL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImlmIChnbG9iYWxUaGlzLnBlcmZvcm1hbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxUaGlzLnBlcmZvcm1hbmNlID0geyB0aW1lT3JpZ2luOiAwLCBub3c6ICgpID0+IERhdGUubm93KCkgfTtcbiAgfVxudmFyIGt1PU9iamVjdC5jcmVhdGU7dmFyIHhyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgcXU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgWHU9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIEt1PU9iamVjdC5nZXRQcm90b3R5cGVPZixXdT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBsaT0oZT0+dHlwZW9mIHJlcXVpcmU8XCJ1XCI/cmVxdWlyZTp0eXBlb2YgUHJveHk8XCJ1XCI/bmV3IFByb3h5KGUse2dldDoodCxyKT0+KHR5cGVvZiByZXF1aXJlPFwidVwiP3JlcXVpcmU6dClbcl19KTplKShmdW5jdGlvbihlKXtpZih0eXBlb2YgcmVxdWlyZTxcInVcIilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiBcIicrZSsnXCIgaXMgbm90IHN1cHBvcnRlZCcpfSk7dmFyIERyPShlLHQpPT4oKT0+KGUmJih0PWUoZT0wKSksdCk7dmFyIF89KGUsdCk9PigpPT4odHx8ZSgodD17ZXhwb3J0czp7fX0pLmV4cG9ydHMsdCksdC5leHBvcnRzKTt2YXIgZ2U9KGUsdCxyLG4pPT57aWYodCYmdHlwZW9mIHQ9PVwib2JqZWN0XCJ8fHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpZm9yKGxldCBvIG9mIFh1KHQpKSFXdS5jYWxsKGUsbykmJm8hPT1yJiZ4cihlLG8se2dldDooKT0+dFtvXSxlbnVtZXJhYmxlOiEobj1xdSh0LG8pKXx8bi5lbnVtZXJhYmxlfSk7cmV0dXJuIGV9LHo9KGUsdCxyKT0+KGdlKGUsdCxcImRlZmF1bHRcIiksciYmZ2Uocix0LFwiZGVmYXVsdFwiKSksdj0oZSx0LHIpPT4ocj1lIT1udWxsP2t1KEt1KGUpKTp7fSxnZSh0fHwhZXx8IWUuX19lc01vZHVsZT94cihyLFwiZGVmYXVsdFwiLHt2YWx1ZTplLGVudW1lcmFibGU6ITB9KTpyLGUpKSx3PWU9PmdlKHhyKHt9LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUpO3ZhciBsPXt9O2ltcG9ydCphcyBkZCBmcm9tXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjt2YXIgRT1EcigoKT0+e3oobCxkZCl9KTt2YXIgaWU9XyhmdD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShmdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtmdC5pc1RyYWNpbmdTdXBwcmVzc2VkPWZ0LnVuc3VwcHJlc3NUcmFjaW5nPWZ0LnN1cHByZXNzVHJhY2luZz12b2lkIDA7dmFyIFl1PShFKCksdyhsKSksVXI9KDAsWXUuY3JlYXRlQ29udGV4dEtleSkoXCJPcGVuVGVsZW1ldHJ5IFNESyBDb250ZXh0IEtleSBTVVBQUkVTU19UUkFDSU5HXCIpO2Z1bmN0aW9uIHp1KGUpe3JldHVybiBlLnNldFZhbHVlKFVyLCEwKX1mdC5zdXBwcmVzc1RyYWNpbmc9enU7ZnVuY3Rpb24gJHUoZSl7cmV0dXJuIGUuZGVsZXRlVmFsdWUoVXIpfWZ0LnVuc3VwcHJlc3NUcmFjaW5nPSR1O2Z1bmN0aW9uIFF1KGUpe3JldHVybiBlLmdldFZhbHVlKFVyKT09PSEwfWZ0LmlzVHJhY2luZ1N1cHByZXNzZWQ9UXV9KTt2YXIgQnI9XyhCPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEIsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Qi5CQUdHQUdFX01BWF9UT1RBTF9MRU5HVEg9Qi5CQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUz1CLkJBR0dBR0VfTUFYX05BTUVfVkFMVUVfUEFJUlM9Qi5CQUdHQUdFX0hFQURFUj1CLkJBR0dBR0VfSVRFTVNfU0VQQVJBVE9SPUIuQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUj1CLkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SPXZvaWQgMDtCLkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SPVwiPVwiO0IuQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUj1cIjtcIjtCLkJBR0dBR0VfSVRFTVNfU0VQQVJBVE9SPVwiLFwiO0IuQkFHR0FHRV9IRUFERVI9XCJiYWdnYWdlXCI7Qi5CQUdHQUdFX01BWF9OQU1FX1ZBTFVFX1BBSVJTPTE4MDtCLkJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTPTQwOTY7Qi5CQUdHQUdFX01BWF9UT1RBTF9MRU5HVEg9ODE5Mn0pO3ZhciBWcj1fKG50PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG50LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO250LnBhcnNlS2V5UGFpcnNJbnRvUmVjb3JkPW50LnBhcnNlUGFpcktleVZhbHVlPW50LmdldEtleVBhaXJzPW50LnNlcmlhbGl6ZUtleVBhaXJzPXZvaWQgMDt2YXIgSnU9KEUoKSx3KGwpKSxMdD1CcigpO2Z1bmN0aW9uIFp1KGUpe3JldHVybiBlLnJlZHVjZSgodCxyKT0+e2xldCBuPWAke3R9JHt0IT09XCJcIj9MdC5CQUdHQUdFX0lURU1TX1NFUEFSQVRPUjpcIlwifSR7cn1gO3JldHVybiBuLmxlbmd0aD5MdC5CQUdHQUdFX01BWF9UT1RBTF9MRU5HVEg/dDpufSxcIlwiKX1udC5zZXJpYWxpemVLZXlQYWlycz1adTtmdW5jdGlvbiB0YyhlKXtyZXR1cm4gZS5nZXRBbGxFbnRyaWVzKCkubWFwKChbdCxyXSk9PntsZXQgbj1gJHtlbmNvZGVVUklDb21wb25lbnQodCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHIudmFsdWUpfWA7cmV0dXJuIHIubWV0YWRhdGEhPT12b2lkIDAmJihuKz1MdC5CQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SK3IubWV0YWRhdGEudG9TdHJpbmcoKSksbn0pfW50LmdldEtleVBhaXJzPXRjO2Z1bmN0aW9uIGZpKGUpe2xldCB0PWUuc3BsaXQoTHQuQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUik7aWYodC5sZW5ndGg8PTApcmV0dXJuO2xldCByPXQuc2hpZnQoKTtpZighcilyZXR1cm47bGV0IG49ci5pbmRleE9mKEx0LkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SKTtpZihuPD0wKXJldHVybjtsZXQgbz1kZWNvZGVVUklDb21wb25lbnQoci5zdWJzdHJpbmcoMCxuKS50cmltKCkpLGk9ZGVjb2RlVVJJQ29tcG9uZW50KHIuc3Vic3RyaW5nKG4rMSkudHJpbSgpKSxhO3JldHVybiB0Lmxlbmd0aD4wJiYoYT0oMCxKdS5iYWdnYWdlRW50cnlNZXRhZGF0YUZyb21TdHJpbmcpKHQuam9pbihMdC5CQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SKSkpLHtrZXk6byx2YWx1ZTppLG1ldGFkYXRhOmF9fW50LnBhcnNlUGFpcktleVZhbHVlPWZpO2Z1bmN0aW9uIGVjKGUpe3JldHVybiB0eXBlb2YgZSE9XCJzdHJpbmdcInx8ZS5sZW5ndGg9PT0wP3t9OmUuc3BsaXQoTHQuQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpLm1hcCh0PT5maSh0KSkuZmlsdGVyKHQ9PnQhPT12b2lkIDAmJnQudmFsdWUubGVuZ3RoPjApLnJlZHVjZSgodCxyKT0+KHRbci5rZXldPXIudmFsdWUsdCkse30pfW50LnBhcnNlS2V5UGFpcnNJbnRvUmVjb3JkPWVjfSk7dmFyIHBpPV8oeWU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoeWUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7eWUuVzNDQmFnZ2FnZVByb3BhZ2F0b3I9dm9pZCAwO3ZhciBHcj0oRSgpLHcobCkpLHJjPWllKCksUHQ9QnIoKSxIcj1WcigpLEZyPWNsYXNze2luamVjdCh0LHIsbil7bGV0IG89R3IucHJvcGFnYXRpb24uZ2V0QmFnZ2FnZSh0KTtpZighb3x8KDAscmMuaXNUcmFjaW5nU3VwcHJlc3NlZCkodCkpcmV0dXJuO2xldCBpPSgwLEhyLmdldEtleVBhaXJzKShvKS5maWx0ZXIodT0+dS5sZW5ndGg8PVB0LkJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTKS5zbGljZSgwLFB0LkJBR0dBR0VfTUFYX05BTUVfVkFMVUVfUEFJUlMpLGE9KDAsSHIuc2VyaWFsaXplS2V5UGFpcnMpKGkpO2EubGVuZ3RoPjAmJm4uc2V0KHIsUHQuQkFHR0FHRV9IRUFERVIsYSl9ZXh0cmFjdCh0LHIsbil7bGV0IG89bi5nZXQocixQdC5CQUdHQUdFX0hFQURFUiksaT1BcnJheS5pc0FycmF5KG8pP28uam9pbihQdC5CQUdHQUdFX0lURU1TX1NFUEFSQVRPUik6bztpZighaSlyZXR1cm4gdDtsZXQgYT17fTtyZXR1cm4gaS5sZW5ndGg9PT0wfHwoaS5zcGxpdChQdC5CQUdHQUdFX0lURU1TX1NFUEFSQVRPUikuZm9yRWFjaChjPT57bGV0IHM9KDAsSHIucGFyc2VQYWlyS2V5VmFsdWUpKGMpO2lmKHMpe2xldCBmPXt2YWx1ZTpzLnZhbHVlfTtzLm1ldGFkYXRhJiYoZi5tZXRhZGF0YT1zLm1ldGFkYXRhKSxhW3Mua2V5XT1mfX0pLE9iamVjdC5lbnRyaWVzKGEpLmxlbmd0aD09PTApP3Q6R3IucHJvcGFnYXRpb24uc2V0QmFnZ2FnZSh0LEdyLnByb3BhZ2F0aW9uLmNyZWF0ZUJhZ2dhZ2UoYSkpfWZpZWxkcygpe3JldHVybltQdC5CQUdHQUdFX0hFQURFUl19fTt5ZS5XM0NCYWdnYWdlUHJvcGFnYXRvcj1Gcn0pO3ZhciBkaT1fKHZlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHZlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZlLkFuY2hvcmVkQ2xvY2s9dm9pZCAwO3ZhciBqcj1jbGFzc3tjb25zdHJ1Y3Rvcih0LHIpe3RoaXMuX21vbm90b25pY0Nsb2NrPXIsdGhpcy5fZXBvY2hNaWxsaXM9dC5ub3coKSx0aGlzLl9wZXJmb3JtYW5jZU1pbGxpcz1yLm5vdygpfW5vdygpe2xldCB0PXRoaXMuX21vbm90b25pY0Nsb2NrLm5vdygpLXRoaXMuX3BlcmZvcm1hbmNlTWlsbGlzO3JldHVybiB0aGlzLl9lcG9jaE1pbGxpcyt0fX07dmUuQW5jaG9yZWRDbG9jaz1qcn0pO3ZhciBUaT1fKHB0PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHB0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3B0LmlzQXR0cmlidXRlVmFsdWU9cHQuaXNBdHRyaWJ1dGVLZXk9cHQuc2FuaXRpemVBdHRyaWJ1dGVzPXZvaWQgMDt2YXIgX2k9KEUoKSx3KGwpKTtmdW5jdGlvbiBuYyhlKXtsZXQgdD17fTtpZih0eXBlb2YgZSE9XCJvYmplY3RcInx8ZT09bnVsbClyZXR1cm4gdDtmb3IobGV0W3Isbl1vZiBPYmplY3QuZW50cmllcyhlKSl7aWYoIWhpKHIpKXtfaS5kaWFnLndhcm4oYEludmFsaWQgYXR0cmlidXRlIGtleTogJHtyfWApO2NvbnRpbnVlfWlmKCFFaShuKSl7X2kuZGlhZy53YXJuKGBJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogJHtyfWApO2NvbnRpbnVlfUFycmF5LmlzQXJyYXkobik/dFtyXT1uLnNsaWNlKCk6dFtyXT1ufXJldHVybiB0fXB0LnNhbml0aXplQXR0cmlidXRlcz1uYztmdW5jdGlvbiBoaShlKXtyZXR1cm4gdHlwZW9mIGU9PVwic3RyaW5nXCImJmUubGVuZ3RoPjB9cHQuaXNBdHRyaWJ1dGVLZXk9aGk7ZnVuY3Rpb24gRWkoZSl7cmV0dXJuIGU9PW51bGw/ITA6QXJyYXkuaXNBcnJheShlKT9pYyhlKTptaShlKX1wdC5pc0F0dHJpYnV0ZVZhbHVlPUVpO2Z1bmN0aW9uIGljKGUpe2xldCB0O2ZvcihsZXQgciBvZiBlKWlmKHIhPW51bGwpe2lmKCF0KXtpZihtaShyKSl7dD10eXBlb2Ygcjtjb250aW51ZX1yZXR1cm4hMX1pZih0eXBlb2YgciE9PXQpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbWkoZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJib29sZWFuXCI6Y2FzZVwic3RyaW5nXCI6cmV0dXJuITB9cmV0dXJuITF9fSk7dmFyIGtyPV8oQWU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoQWUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7QWUubG9nZ2luZ0Vycm9ySGFuZGxlcj12b2lkIDA7dmFyIG9jPShFKCksdyhsKSk7ZnVuY3Rpb24gc2MoKXtyZXR1cm4gZT0+e29jLmRpYWcuZXJyb3IoYWMoZSkpfX1BZS5sb2dnaW5nRXJyb3JIYW5kbGVyPXNjO2Z1bmN0aW9uIGFjKGUpe3JldHVybiB0eXBlb2YgZT09XCJzdHJpbmdcIj9lOkpTT04uc3RyaW5naWZ5KHVjKGUpKX1mdW5jdGlvbiB1YyhlKXtsZXQgdD17fSxyPWU7Zm9yKDtyIT09bnVsbDspT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikuZm9yRWFjaChuPT57aWYodFtuXSlyZXR1cm47bGV0IG89cltuXTtvJiYodFtuXT1TdHJpbmcobykpfSkscj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIHR9fSk7dmFyIHFyPV8oR3Q9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoR3QsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7R3QuZ2xvYmFsRXJyb3JIYW5kbGVyPUd0LnNldEdsb2JhbEVycm9ySGFuZGxlcj12b2lkIDA7dmFyIGNjPWtyKCksU2k9KDAsY2MubG9nZ2luZ0Vycm9ySGFuZGxlcikoKTtmdW5jdGlvbiBsYyhlKXtTaT1lfUd0LnNldEdsb2JhbEVycm9ySGFuZGxlcj1sYztmdW5jdGlvbiBmYyhlKXt0cnl7U2koZSl9Y2F0Y2h7fX1HdC5nbG9iYWxFcnJvckhhbmRsZXI9ZmN9KTt2YXIgWHI9XyhvZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtvZS5UcmFjZXNTYW1wbGVyVmFsdWVzPXZvaWQgMDt2YXIgcGM7KGZ1bmN0aW9uKGUpe2UuQWx3YXlzT2ZmPVwiYWx3YXlzX29mZlwiLGUuQWx3YXlzT249XCJhbHdheXNfb25cIixlLlBhcmVudEJhc2VkQWx3YXlzT2ZmPVwicGFyZW50YmFzZWRfYWx3YXlzX29mZlwiLGUuUGFyZW50QmFzZWRBbHdheXNPbj1cInBhcmVudGJhc2VkX2Fsd2F5c19vblwiLGUuUGFyZW50QmFzZWRUcmFjZUlkUmF0aW89XCJwYXJlbnRiYXNlZF90cmFjZWlkcmF0aW9cIixlLlRyYWNlSWRSYXRpbz1cInRyYWNlaWRyYXRpb1wifSkocGM9b2UuVHJhY2VzU2FtcGxlclZhbHVlc3x8KG9lLlRyYWNlc1NhbXBsZXJWYWx1ZXM9e30pKX0pO3ZhciBPZT1fKFJlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1JlLl9nbG9iYWxUaGlzPXZvaWQgMDtSZS5fZ2xvYmFsVGhpcz10eXBlb2YgZ2xvYmFsVGhpcz09XCJvYmplY3RcIj9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPT1cIm9iamVjdFwiP3NlbGY6dHlwZW9mIHdpbmRvdz09XCJvYmplY3RcIj93aW5kb3c6dHlwZW9mIGdsb2JhbD09XCJvYmplY3RcIj9nbG9iYWw6e319KTt2YXIgYmU9XyhMPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7TC5nZXRFbnZXaXRob3V0RGVmYXVsdHM9TC5wYXJzZUVudmlyb25tZW50PUwuREVGQVVMVF9FTlZJUk9OTUVOVD1MLkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQ9TC5ERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVD1MLkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUPUwuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUPXZvaWQgMDt2YXIgZHQ9KEUoKSx3KGwpKSxkYz1YcigpLF9jPU9lKCksaGM9XCIsXCIsRWM9W1wiT1RFTF9TREtfRElTQUJMRURcIl07ZnVuY3Rpb24gbWMoZSl7cmV0dXJuIEVjLmluZGV4T2YoZSk+LTF9dmFyIFRjPVtcIk9URUxfQlNQX0VYUE9SVF9USU1FT1VUXCIsXCJPVEVMX0JTUF9NQVhfRVhQT1JUX0JBVENIX1NJWkVcIixcIk9URUxfQlNQX01BWF9RVUVVRV9TSVpFXCIsXCJPVEVMX0JTUF9TQ0hFRFVMRV9ERUxBWVwiLFwiT1RFTF9CTFJQX0VYUE9SVF9USU1FT1VUXCIsXCJPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFXCIsXCJPVEVMX0JMUlBfTUFYX1FVRVVFX1NJWkVcIixcIk9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWVwiLFwiT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUXCIsXCJPVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVFwiLFwiT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVRcIixcIk9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVRcIixcIk9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVRcIixcIk9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9DT1VOVF9MSU1JVFwiLFwiT1RFTF9TUEFOX0VWRU5UX0NPVU5UX0xJTUlUXCIsXCJPVEVMX1NQQU5fTElOS19DT1VOVF9MSU1JVFwiLFwiT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVRcIixcIk9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVRcIixcIk9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUXCIsXCJPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVRcIixcIk9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVRcIixcIk9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVRcIixcIk9URUxfRVhQT1JURVJfSkFFR0VSX0FHRU5UX1BPUlRcIl07ZnVuY3Rpb24gU2MoZSl7cmV0dXJuIFRjLmluZGV4T2YoZSk+LTF9dmFyIGdjPVtcIk9URUxfTk9fUEFUQ0hfTU9EVUxFU1wiLFwiT1RFTF9QUk9QQUdBVE9SU1wiXTtmdW5jdGlvbiB5YyhlKXtyZXR1cm4gZ2MuaW5kZXhPZihlKT4tMX1MLkRFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVD0xLzA7TC5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVD0xMjg7TC5ERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVD0xMjg7TC5ERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlUPTEyODtMLkRFRkFVTFRfRU5WSVJPTk1FTlQ9e09URUxfU0RLX0RJU0FCTEVEOiExLENPTlRBSU5FUl9OQU1FOlwiXCIsRUNTX0NPTlRBSU5FUl9NRVRBREFUQV9VUklfVjQ6XCJcIixFQ1NfQ09OVEFJTkVSX01FVEFEQVRBX1VSSTpcIlwiLEhPU1ROQU1FOlwiXCIsS1VCRVJORVRFU19TRVJWSUNFX0hPU1Q6XCJcIixOQU1FU1BBQ0U6XCJcIixPVEVMX0JTUF9FWFBPUlRfVElNRU9VVDozZTQsT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOjUxMixPVEVMX0JTUF9NQVhfUVVFVUVfU0laRToyMDQ4LE9URUxfQlNQX1NDSEVEVUxFX0RFTEFZOjVlMyxPVEVMX0JMUlBfRVhQT1JUX1RJTUVPVVQ6M2U0LE9URUxfQkxSUF9NQVhfRVhQT1JUX0JBVENIX1NJWkU6NTEyLE9URUxfQkxSUF9NQVhfUVVFVUVfU0laRToyMDQ4LE9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWTo1ZTMsT1RFTF9FWFBPUlRFUl9KQUVHRVJfQUdFTlRfSE9TVDpcIlwiLE9URUxfRVhQT1JURVJfSkFFR0VSX0FHRU5UX1BPUlQ6NjgzMixPVEVMX0VYUE9SVEVSX0pBRUdFUl9FTkRQT0lOVDpcIlwiLE9URUxfRVhQT1JURVJfSkFFR0VSX1BBU1NXT1JEOlwiXCIsT1RFTF9FWFBPUlRFUl9KQUVHRVJfVVNFUjpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVDpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19FTkRQT0lOVDpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0VORFBPSU5UOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlM6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0hFQURFUlM6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19IRUFERVJTOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfSEVBREVSUzpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUOjFlNCxPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVQ6MWU0LE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQ6MWU0LE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVQ6MWU0LE9URUxfRVhQT1JURVJfWklQS0lOX0VORFBPSU5UOlwiaHR0cDovL2xvY2FsaG9zdDo5NDExL2FwaS92Mi9zcGFuc1wiLE9URUxfTE9HX0xFVkVMOmR0LkRpYWdMb2dMZXZlbC5JTkZPLE9URUxfTk9fUEFUQ0hfTU9EVUxFUzpbXSxPVEVMX1BST1BBR0FUT1JTOltcInRyYWNlY29udGV4dFwiLFwiYmFnZ2FnZVwiXSxPVEVMX1JFU09VUkNFX0FUVFJJQlVURVM6XCJcIixPVEVMX1NFUlZJQ0VfTkFNRTpcIlwiLE9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDpMLkRFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxPVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVDpMLkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULE9URUxfU1BBTl9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUOkwuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULE9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6TC5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUOkwuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULE9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9DT1VOVF9MSU1JVDpMLkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULE9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVDoxMjgsT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQ6MTI4LE9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlUOkwuREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQsT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVDpMLkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQsT1RFTF9UUkFDRVNfRVhQT1JURVI6XCJcIixPVEVMX1RSQUNFU19TQU1QTEVSOmRjLlRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbixPVEVMX1RSQUNFU19TQU1QTEVSX0FSRzpcIlwiLE9URUxfTE9HU19FWFBPUlRFUjpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9JTlNFQ1VSRTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfSU5TRUNVUkU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19JTlNFQ1VSRTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0lOU0VDVVJFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0NFUlRJRklDQVRFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DRVJUSUZJQ0FURTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0NFUlRJRklDQVRFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfQ09NUFJFU1NJT046XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NPTVBSRVNTSU9OOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ09NUFJFU1NJT046XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DT01QUkVTU0lPTjpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9DTElFTlRfS0VZOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfS0VZOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ0xJRU5UX0tFWTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0NMSUVOVF9LRVk6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0NFUlRJRklDQVRFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DTElFTlRfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfUFJPVE9DT0w6XCJodHRwL3Byb3RvYnVmXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19QUk9UT0NPTDpcImh0dHAvcHJvdG9idWZcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19QUk9UT0NPTDpcImh0dHAvcHJvdG9idWZcIixPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19QUk9UT0NPTDpcImh0dHAvcHJvdG9idWZcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19URU1QT1JBTElUWV9QUkVGRVJFTkNFOlwiY3VtdWxhdGl2ZVwifTtmdW5jdGlvbiB2YyhlLHQscil7aWYodHlwZW9mIHJbZV0+XCJ1XCIpcmV0dXJuO2xldCBuPVN0cmluZyhyW2VdKTt0W2VdPW4udG9Mb3dlckNhc2UoKT09PVwidHJ1ZVwifWZ1bmN0aW9uIEFjKGUsdCxyLG49LTEvMCxvPTEvMCl7aWYodHlwZW9mIHJbZV08XCJ1XCIpe2xldCBpPU51bWJlcihyW2VdKTtpc05hTihpKXx8KGk8bj90W2VdPW46aT5vP3RbZV09bzp0W2VdPWkpfX1mdW5jdGlvbiBSYyhlLHQscixuPWhjKXtsZXQgbz1yW2VdO3R5cGVvZiBvPT1cInN0cmluZ1wiJiYodFtlXT1vLnNwbGl0KG4pLm1hcChpPT5pLnRyaW0oKSkpfXZhciBPYz17QUxMOmR0LkRpYWdMb2dMZXZlbC5BTEwsVkVSQk9TRTpkdC5EaWFnTG9nTGV2ZWwuVkVSQk9TRSxERUJVRzpkdC5EaWFnTG9nTGV2ZWwuREVCVUcsSU5GTzpkdC5EaWFnTG9nTGV2ZWwuSU5GTyxXQVJOOmR0LkRpYWdMb2dMZXZlbC5XQVJOLEVSUk9SOmR0LkRpYWdMb2dMZXZlbC5FUlJPUixOT05FOmR0LkRpYWdMb2dMZXZlbC5OT05FfTtmdW5jdGlvbiBiYyhlLHQscil7bGV0IG49cltlXTtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIil7bGV0IG89T2Nbbi50b1VwcGVyQ2FzZSgpXTtvIT1udWxsJiYodFtlXT1vKX19ZnVuY3Rpb24gS3IoZSl7bGV0IHQ9e307Zm9yKGxldCByIGluIEwuREVGQVVMVF9FTlZJUk9OTUVOVCl7bGV0IG49cjtzd2l0Y2gobil7Y2FzZVwiT1RFTF9MT0dfTEVWRUxcIjpiYyhuLHQsZSk7YnJlYWs7ZGVmYXVsdDppZihtYyhuKSl2YyhuLHQsZSk7ZWxzZSBpZihTYyhuKSlBYyhuLHQsZSk7ZWxzZSBpZih5YyhuKSlSYyhuLHQsZSk7ZWxzZXtsZXQgbz1lW25dO3R5cGVvZiBvPFwidVwiJiZvIT09bnVsbCYmKHRbbl09U3RyaW5nKG8pKX19fXJldHVybiB0fUwucGFyc2VFbnZpcm9ubWVudD1LcjtmdW5jdGlvbiBMYygpe3JldHVybiB0eXBlb2YgcHJvY2VzczxcInVcIiYmcHJvY2VzcyYmcHJvY2Vzcy5lbnY/S3IocHJvY2Vzcy5lbnYpOktyKF9jLl9nbG9iYWxUaGlzKX1MLmdldEVudldpdGhvdXREZWZhdWx0cz1MY30pO3ZhciB5aT1fKExlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KExlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0xlLmdldEVudj12b2lkIDA7dmFyIGdpPWJlKCksUGM9T2UoKTtmdW5jdGlvbiBJYygpe2xldCBlPSgwLGdpLnBhcnNlRW52aXJvbm1lbnQpKFBjLl9nbG9iYWxUaGlzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxnaS5ERUZBVUxUX0VOVklST05NRU5ULGUpfUxlLmdldEVudj1JY30pO3ZhciB2aT1fKFBlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFBlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1BlLmhleFRvQmFzZTY0PXZvaWQgMDtmdW5jdGlvbiBDYyhlKXtsZXQgdD1lLmxlbmd0aCxyPVwiXCI7Zm9yKGxldCBuPTA7bjx0O24rPTIpe2xldCBvPWUuc3Vic3RyaW5nKG4sbisyKSxpPXBhcnNlSW50KG8sMTYpO3IrPVN0cmluZy5mcm9tQ2hhckNvZGUoaSl9cmV0dXJuIGJ0b2Eocil9UGUuaGV4VG9CYXNlNjQ9Q2N9KTt2YXIgUmk9XyhDZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtDZS5SYW5kb21JZEdlbmVyYXRvcj12b2lkIDA7dmFyIE5jPTgsd2M9MTYsV3I9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmdlbmVyYXRlVHJhY2VJZD1BaSh3YyksdGhpcy5nZW5lcmF0ZVNwYW5JZD1BaShOYyl9fTtDZS5SYW5kb21JZEdlbmVyYXRvcj1Xcjt2YXIgSWU9QXJyYXkoMzIpO2Z1bmN0aW9uIEFpKGUpe3JldHVybiBmdW5jdGlvbigpe2ZvcihsZXQgcj0wO3I8ZSoyO3IrKylJZVtyXT1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTYpKzQ4LEllW3JdPj01OCYmKEllW3JdKz0zOSk7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxJZS5zbGljZSgwLGUqMikpfX19KTt2YXIgT2k9XyhOZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtOZS5vdHBlcmZvcm1hbmNlPXZvaWQgMDtOZS5vdHBlcmZvcm1hbmNlPXBlcmZvcm1hbmNlfSk7dmFyIFlyPV8od2U9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkod2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7d2UuVkVSU0lPTj12b2lkIDA7d2UuVkVSU0lPTj1cIjEuMTkuMFwifSk7dmFyIGJpPV8oQT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShBLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0EuTWVzc2FnZVR5cGVWYWx1ZXM9QS5ScGNHcnBjU3RhdHVzQ29kZVZhbHVlcz1BLk1lc3NhZ2luZ09wZXJhdGlvblZhbHVlcz1BLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uS2luZFZhbHVlcz1BLkh0dHBGbGF2b3JWYWx1ZXM9QS5OZXRIb3N0Q29ubmVjdGlvblN1YnR5cGVWYWx1ZXM9QS5OZXRIb3N0Q29ubmVjdGlvblR5cGVWYWx1ZXM9QS5OZXRUcmFuc3BvcnRWYWx1ZXM9QS5GYWFzSW52b2tlZFByb3ZpZGVyVmFsdWVzPUEuRmFhc0RvY3VtZW50T3BlcmF0aW9uVmFsdWVzPUEuRmFhc1RyaWdnZXJWYWx1ZXM9QS5EYkNhc3NhbmRyYUNvbnNpc3RlbmN5TGV2ZWxWYWx1ZXM9QS5EYlN5c3RlbVZhbHVlcz1BLlNlbWFudGljQXR0cmlidXRlcz12b2lkIDA7QS5TZW1hbnRpY0F0dHJpYnV0ZXM9e0FXU19MQU1CREFfSU5WT0tFRF9BUk46XCJhd3MubGFtYmRhLmludm9rZWRfYXJuXCIsREJfU1lTVEVNOlwiZGIuc3lzdGVtXCIsREJfQ09OTkVDVElPTl9TVFJJTkc6XCJkYi5jb25uZWN0aW9uX3N0cmluZ1wiLERCX1VTRVI6XCJkYi51c2VyXCIsREJfSkRCQ19EUklWRVJfQ0xBU1NOQU1FOlwiZGIuamRiYy5kcml2ZXJfY2xhc3NuYW1lXCIsREJfTkFNRTpcImRiLm5hbWVcIixEQl9TVEFURU1FTlQ6XCJkYi5zdGF0ZW1lbnRcIixEQl9PUEVSQVRJT046XCJkYi5vcGVyYXRpb25cIixEQl9NU1NRTF9JTlNUQU5DRV9OQU1FOlwiZGIubXNzcWwuaW5zdGFuY2VfbmFtZVwiLERCX0NBU1NBTkRSQV9LRVlTUEFDRTpcImRiLmNhc3NhbmRyYS5rZXlzcGFjZVwiLERCX0NBU1NBTkRSQV9QQUdFX1NJWkU6XCJkYi5jYXNzYW5kcmEucGFnZV9zaXplXCIsREJfQ0FTU0FORFJBX0NPTlNJU1RFTkNZX0xFVkVMOlwiZGIuY2Fzc2FuZHJhLmNvbnNpc3RlbmN5X2xldmVsXCIsREJfQ0FTU0FORFJBX1RBQkxFOlwiZGIuY2Fzc2FuZHJhLnRhYmxlXCIsREJfQ0FTU0FORFJBX0lERU1QT1RFTkNFOlwiZGIuY2Fzc2FuZHJhLmlkZW1wb3RlbmNlXCIsREJfQ0FTU0FORFJBX1NQRUNVTEFUSVZFX0VYRUNVVElPTl9DT1VOVDpcImRiLmNhc3NhbmRyYS5zcGVjdWxhdGl2ZV9leGVjdXRpb25fY291bnRcIixEQl9DQVNTQU5EUkFfQ09PUkRJTkFUT1JfSUQ6XCJkYi5jYXNzYW5kcmEuY29vcmRpbmF0b3IuaWRcIixEQl9DQVNTQU5EUkFfQ09PUkRJTkFUT1JfREM6XCJkYi5jYXNzYW5kcmEuY29vcmRpbmF0b3IuZGNcIixEQl9IQkFTRV9OQU1FU1BBQ0U6XCJkYi5oYmFzZS5uYW1lc3BhY2VcIixEQl9SRURJU19EQVRBQkFTRV9JTkRFWDpcImRiLnJlZGlzLmRhdGFiYXNlX2luZGV4XCIsREJfTU9OR09EQl9DT0xMRUNUSU9OOlwiZGIubW9uZ29kYi5jb2xsZWN0aW9uXCIsREJfU1FMX1RBQkxFOlwiZGIuc3FsLnRhYmxlXCIsRVhDRVBUSU9OX1RZUEU6XCJleGNlcHRpb24udHlwZVwiLEVYQ0VQVElPTl9NRVNTQUdFOlwiZXhjZXB0aW9uLm1lc3NhZ2VcIixFWENFUFRJT05fU1RBQ0tUUkFDRTpcImV4Y2VwdGlvbi5zdGFja3RyYWNlXCIsRVhDRVBUSU9OX0VTQ0FQRUQ6XCJleGNlcHRpb24uZXNjYXBlZFwiLEZBQVNfVFJJR0dFUjpcImZhYXMudHJpZ2dlclwiLEZBQVNfRVhFQ1VUSU9OOlwiZmFhcy5leGVjdXRpb25cIixGQUFTX0RPQ1VNRU5UX0NPTExFQ1RJT046XCJmYWFzLmRvY3VtZW50LmNvbGxlY3Rpb25cIixGQUFTX0RPQ1VNRU5UX09QRVJBVElPTjpcImZhYXMuZG9jdW1lbnQub3BlcmF0aW9uXCIsRkFBU19ET0NVTUVOVF9USU1FOlwiZmFhcy5kb2N1bWVudC50aW1lXCIsRkFBU19ET0NVTUVOVF9OQU1FOlwiZmFhcy5kb2N1bWVudC5uYW1lXCIsRkFBU19USU1FOlwiZmFhcy50aW1lXCIsRkFBU19DUk9OOlwiZmFhcy5jcm9uXCIsRkFBU19DT0xEU1RBUlQ6XCJmYWFzLmNvbGRzdGFydFwiLEZBQVNfSU5WT0tFRF9OQU1FOlwiZmFhcy5pbnZva2VkX25hbWVcIixGQUFTX0lOVk9LRURfUFJPVklERVI6XCJmYWFzLmludm9rZWRfcHJvdmlkZXJcIixGQUFTX0lOVk9LRURfUkVHSU9OOlwiZmFhcy5pbnZva2VkX3JlZ2lvblwiLE5FVF9UUkFOU1BPUlQ6XCJuZXQudHJhbnNwb3J0XCIsTkVUX1BFRVJfSVA6XCJuZXQucGVlci5pcFwiLE5FVF9QRUVSX1BPUlQ6XCJuZXQucGVlci5wb3J0XCIsTkVUX1BFRVJfTkFNRTpcIm5ldC5wZWVyLm5hbWVcIixORVRfSE9TVF9JUDpcIm5ldC5ob3N0LmlwXCIsTkVUX0hPU1RfUE9SVDpcIm5ldC5ob3N0LnBvcnRcIixORVRfSE9TVF9OQU1FOlwibmV0Lmhvc3QubmFtZVwiLE5FVF9IT1NUX0NPTk5FQ1RJT05fVFlQRTpcIm5ldC5ob3N0LmNvbm5lY3Rpb24udHlwZVwiLE5FVF9IT1NUX0NPTk5FQ1RJT05fU1VCVFlQRTpcIm5ldC5ob3N0LmNvbm5lY3Rpb24uc3VidHlwZVwiLE5FVF9IT1NUX0NBUlJJRVJfTkFNRTpcIm5ldC5ob3N0LmNhcnJpZXIubmFtZVwiLE5FVF9IT1NUX0NBUlJJRVJfTUNDOlwibmV0Lmhvc3QuY2Fycmllci5tY2NcIixORVRfSE9TVF9DQVJSSUVSX01OQzpcIm5ldC5ob3N0LmNhcnJpZXIubW5jXCIsTkVUX0hPU1RfQ0FSUklFUl9JQ0M6XCJuZXQuaG9zdC5jYXJyaWVyLmljY1wiLFBFRVJfU0VSVklDRTpcInBlZXIuc2VydmljZVwiLEVORFVTRVJfSUQ6XCJlbmR1c2VyLmlkXCIsRU5EVVNFUl9ST0xFOlwiZW5kdXNlci5yb2xlXCIsRU5EVVNFUl9TQ09QRTpcImVuZHVzZXIuc2NvcGVcIixUSFJFQURfSUQ6XCJ0aHJlYWQuaWRcIixUSFJFQURfTkFNRTpcInRocmVhZC5uYW1lXCIsQ09ERV9GVU5DVElPTjpcImNvZGUuZnVuY3Rpb25cIixDT0RFX05BTUVTUEFDRTpcImNvZGUubmFtZXNwYWNlXCIsQ09ERV9GSUxFUEFUSDpcImNvZGUuZmlsZXBhdGhcIixDT0RFX0xJTkVOTzpcImNvZGUubGluZW5vXCIsSFRUUF9NRVRIT0Q6XCJodHRwLm1ldGhvZFwiLEhUVFBfVVJMOlwiaHR0cC51cmxcIixIVFRQX1RBUkdFVDpcImh0dHAudGFyZ2V0XCIsSFRUUF9IT1NUOlwiaHR0cC5ob3N0XCIsSFRUUF9TQ0hFTUU6XCJodHRwLnNjaGVtZVwiLEhUVFBfU1RBVFVTX0NPREU6XCJodHRwLnN0YXR1c19jb2RlXCIsSFRUUF9GTEFWT1I6XCJodHRwLmZsYXZvclwiLEhUVFBfVVNFUl9BR0VOVDpcImh0dHAudXNlcl9hZ2VudFwiLEhUVFBfUkVRVUVTVF9DT05URU5UX0xFTkdUSDpcImh0dHAucmVxdWVzdF9jb250ZW50X2xlbmd0aFwiLEhUVFBfUkVRVUVTVF9DT05URU5UX0xFTkdUSF9VTkNPTVBSRVNTRUQ6XCJodHRwLnJlcXVlc3RfY29udGVudF9sZW5ndGhfdW5jb21wcmVzc2VkXCIsSFRUUF9SRVNQT05TRV9DT05URU5UX0xFTkdUSDpcImh0dHAucmVzcG9uc2VfY29udGVudF9sZW5ndGhcIixIVFRQX1JFU1BPTlNFX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRDpcImh0dHAucmVzcG9uc2VfY29udGVudF9sZW5ndGhfdW5jb21wcmVzc2VkXCIsSFRUUF9TRVJWRVJfTkFNRTpcImh0dHAuc2VydmVyX25hbWVcIixIVFRQX1JPVVRFOlwiaHR0cC5yb3V0ZVwiLEhUVFBfQ0xJRU5UX0lQOlwiaHR0cC5jbGllbnRfaXBcIixBV1NfRFlOQU1PREJfVEFCTEVfTkFNRVM6XCJhd3MuZHluYW1vZGIudGFibGVfbmFtZXNcIixBV1NfRFlOQU1PREJfQ09OU1VNRURfQ0FQQUNJVFk6XCJhd3MuZHluYW1vZGIuY29uc3VtZWRfY2FwYWNpdHlcIixBV1NfRFlOQU1PREJfSVRFTV9DT0xMRUNUSU9OX01FVFJJQ1M6XCJhd3MuZHluYW1vZGIuaXRlbV9jb2xsZWN0aW9uX21ldHJpY3NcIixBV1NfRFlOQU1PREJfUFJPVklTSU9ORURfUkVBRF9DQVBBQ0lUWTpcImF3cy5keW5hbW9kYi5wcm92aXNpb25lZF9yZWFkX2NhcGFjaXR5XCIsQVdTX0RZTkFNT0RCX1BST1ZJU0lPTkVEX1dSSVRFX0NBUEFDSVRZOlwiYXdzLmR5bmFtb2RiLnByb3Zpc2lvbmVkX3dyaXRlX2NhcGFjaXR5XCIsQVdTX0RZTkFNT0RCX0NPTlNJU1RFTlRfUkVBRDpcImF3cy5keW5hbW9kYi5jb25zaXN0ZW50X3JlYWRcIixBV1NfRFlOQU1PREJfUFJPSkVDVElPTjpcImF3cy5keW5hbW9kYi5wcm9qZWN0aW9uXCIsQVdTX0RZTkFNT0RCX0xJTUlUOlwiYXdzLmR5bmFtb2RiLmxpbWl0XCIsQVdTX0RZTkFNT0RCX0FUVFJJQlVURVNfVE9fR0VUOlwiYXdzLmR5bmFtb2RiLmF0dHJpYnV0ZXNfdG9fZ2V0XCIsQVdTX0RZTkFNT0RCX0lOREVYX05BTUU6XCJhd3MuZHluYW1vZGIuaW5kZXhfbmFtZVwiLEFXU19EWU5BTU9EQl9TRUxFQ1Q6XCJhd3MuZHluYW1vZGIuc2VsZWN0XCIsQVdTX0RZTkFNT0RCX0dMT0JBTF9TRUNPTkRBUllfSU5ERVhFUzpcImF3cy5keW5hbW9kYi5nbG9iYWxfc2Vjb25kYXJ5X2luZGV4ZXNcIixBV1NfRFlOQU1PREJfTE9DQUxfU0VDT05EQVJZX0lOREVYRVM6XCJhd3MuZHluYW1vZGIubG9jYWxfc2Vjb25kYXJ5X2luZGV4ZXNcIixBV1NfRFlOQU1PREJfRVhDTFVTSVZFX1NUQVJUX1RBQkxFOlwiYXdzLmR5bmFtb2RiLmV4Y2x1c2l2ZV9zdGFydF90YWJsZVwiLEFXU19EWU5BTU9EQl9UQUJMRV9DT1VOVDpcImF3cy5keW5hbW9kYi50YWJsZV9jb3VudFwiLEFXU19EWU5BTU9EQl9TQ0FOX0ZPUldBUkQ6XCJhd3MuZHluYW1vZGIuc2Nhbl9mb3J3YXJkXCIsQVdTX0RZTkFNT0RCX1NFR01FTlQ6XCJhd3MuZHluYW1vZGIuc2VnbWVudFwiLEFXU19EWU5BTU9EQl9UT1RBTF9TRUdNRU5UUzpcImF3cy5keW5hbW9kYi50b3RhbF9zZWdtZW50c1wiLEFXU19EWU5BTU9EQl9DT1VOVDpcImF3cy5keW5hbW9kYi5jb3VudFwiLEFXU19EWU5BTU9EQl9TQ0FOTkVEX0NPVU5UOlwiYXdzLmR5bmFtb2RiLnNjYW5uZWRfY291bnRcIixBV1NfRFlOQU1PREJfQVRUUklCVVRFX0RFRklOSVRJT05TOlwiYXdzLmR5bmFtb2RiLmF0dHJpYnV0ZV9kZWZpbml0aW9uc1wiLEFXU19EWU5BTU9EQl9HTE9CQUxfU0VDT05EQVJZX0lOREVYX1VQREFURVM6XCJhd3MuZHluYW1vZGIuZ2xvYmFsX3NlY29uZGFyeV9pbmRleF91cGRhdGVzXCIsTUVTU0FHSU5HX1NZU1RFTTpcIm1lc3NhZ2luZy5zeXN0ZW1cIixNRVNTQUdJTkdfREVTVElOQVRJT046XCJtZXNzYWdpbmcuZGVzdGluYXRpb25cIixNRVNTQUdJTkdfREVTVElOQVRJT05fS0lORDpcIm1lc3NhZ2luZy5kZXN0aW5hdGlvbl9raW5kXCIsTUVTU0FHSU5HX1RFTVBfREVTVElOQVRJT046XCJtZXNzYWdpbmcudGVtcF9kZXN0aW5hdGlvblwiLE1FU1NBR0lOR19QUk9UT0NPTDpcIm1lc3NhZ2luZy5wcm90b2NvbFwiLE1FU1NBR0lOR19QUk9UT0NPTF9WRVJTSU9OOlwibWVzc2FnaW5nLnByb3RvY29sX3ZlcnNpb25cIixNRVNTQUdJTkdfVVJMOlwibWVzc2FnaW5nLnVybFwiLE1FU1NBR0lOR19NRVNTQUdFX0lEOlwibWVzc2FnaW5nLm1lc3NhZ2VfaWRcIixNRVNTQUdJTkdfQ09OVkVSU0FUSU9OX0lEOlwibWVzc2FnaW5nLmNvbnZlcnNhdGlvbl9pZFwiLE1FU1NBR0lOR19NRVNTQUdFX1BBWUxPQURfU0laRV9CWVRFUzpcIm1lc3NhZ2luZy5tZXNzYWdlX3BheWxvYWRfc2l6ZV9ieXRlc1wiLE1FU1NBR0lOR19NRVNTQUdFX1BBWUxPQURfQ09NUFJFU1NFRF9TSVpFX0JZVEVTOlwibWVzc2FnaW5nLm1lc3NhZ2VfcGF5bG9hZF9jb21wcmVzc2VkX3NpemVfYnl0ZXNcIixNRVNTQUdJTkdfT1BFUkFUSU9OOlwibWVzc2FnaW5nLm9wZXJhdGlvblwiLE1FU1NBR0lOR19DT05TVU1FUl9JRDpcIm1lc3NhZ2luZy5jb25zdW1lcl9pZFwiLE1FU1NBR0lOR19SQUJCSVRNUV9ST1VUSU5HX0tFWTpcIm1lc3NhZ2luZy5yYWJiaXRtcS5yb3V0aW5nX2tleVwiLE1FU1NBR0lOR19LQUZLQV9NRVNTQUdFX0tFWTpcIm1lc3NhZ2luZy5rYWZrYS5tZXNzYWdlX2tleVwiLE1FU1NBR0lOR19LQUZLQV9DT05TVU1FUl9HUk9VUDpcIm1lc3NhZ2luZy5rYWZrYS5jb25zdW1lcl9ncm91cFwiLE1FU1NBR0lOR19LQUZLQV9DTElFTlRfSUQ6XCJtZXNzYWdpbmcua2Fma2EuY2xpZW50X2lkXCIsTUVTU0FHSU5HX0tBRktBX1BBUlRJVElPTjpcIm1lc3NhZ2luZy5rYWZrYS5wYXJ0aXRpb25cIixNRVNTQUdJTkdfS0FGS0FfVE9NQlNUT05FOlwibWVzc2FnaW5nLmthZmthLnRvbWJzdG9uZVwiLFJQQ19TWVNURU06XCJycGMuc3lzdGVtXCIsUlBDX1NFUlZJQ0U6XCJycGMuc2VydmljZVwiLFJQQ19NRVRIT0Q6XCJycGMubWV0aG9kXCIsUlBDX0dSUENfU1RBVFVTX0NPREU6XCJycGMuZ3JwYy5zdGF0dXNfY29kZVwiLFJQQ19KU09OUlBDX1ZFUlNJT046XCJycGMuanNvbnJwYy52ZXJzaW9uXCIsUlBDX0pTT05SUENfUkVRVUVTVF9JRDpcInJwYy5qc29ucnBjLnJlcXVlc3RfaWRcIixSUENfSlNPTlJQQ19FUlJPUl9DT0RFOlwicnBjLmpzb25ycGMuZXJyb3JfY29kZVwiLFJQQ19KU09OUlBDX0VSUk9SX01FU1NBR0U6XCJycGMuanNvbnJwYy5lcnJvcl9tZXNzYWdlXCIsTUVTU0FHRV9UWVBFOlwibWVzc2FnZS50eXBlXCIsTUVTU0FHRV9JRDpcIm1lc3NhZ2UuaWRcIixNRVNTQUdFX0NPTVBSRVNTRURfU0laRTpcIm1lc3NhZ2UuY29tcHJlc3NlZF9zaXplXCIsTUVTU0FHRV9VTkNPTVBSRVNTRURfU0laRTpcIm1lc3NhZ2UudW5jb21wcmVzc2VkX3NpemVcIn07QS5EYlN5c3RlbVZhbHVlcz17T1RIRVJfU1FMOlwib3RoZXJfc3FsXCIsTVNTUUw6XCJtc3NxbFwiLE1ZU1FMOlwibXlzcWxcIixPUkFDTEU6XCJvcmFjbGVcIixEQjI6XCJkYjJcIixQT1NUR1JFU1FMOlwicG9zdGdyZXNxbFwiLFJFRFNISUZUOlwicmVkc2hpZnRcIixISVZFOlwiaGl2ZVwiLENMT1VEU0NBUEU6XCJjbG91ZHNjYXBlXCIsSFNRTERCOlwiaHNxbGRiXCIsUFJPR1JFU1M6XCJwcm9ncmVzc1wiLE1BWERCOlwibWF4ZGJcIixIQU5BREI6XCJoYW5hZGJcIixJTkdSRVM6XCJpbmdyZXNcIixGSVJTVFNRTDpcImZpcnN0c3FsXCIsRURCOlwiZWRiXCIsQ0FDSEU6XCJjYWNoZVwiLEFEQUJBUzpcImFkYWJhc1wiLEZJUkVCSVJEOlwiZmlyZWJpcmRcIixERVJCWTpcImRlcmJ5XCIsRklMRU1BS0VSOlwiZmlsZW1ha2VyXCIsSU5GT1JNSVg6XCJpbmZvcm1peFwiLElOU1RBTlREQjpcImluc3RhbnRkYlwiLElOVEVSQkFTRTpcImludGVyYmFzZVwiLE1BUklBREI6XCJtYXJpYWRiXCIsTkVURVpaQTpcIm5ldGV6emFcIixQRVJWQVNJVkU6XCJwZXJ2YXNpdmVcIixQT0lOVEJBU0U6XCJwb2ludGJhc2VcIixTUUxJVEU6XCJzcWxpdGVcIixTWUJBU0U6XCJzeWJhc2VcIixURVJBREFUQTpcInRlcmFkYXRhXCIsVkVSVElDQTpcInZlcnRpY2FcIixIMjpcImgyXCIsQ09MREZVU0lPTjpcImNvbGRmdXNpb25cIixDQVNTQU5EUkE6XCJjYXNzYW5kcmFcIixIQkFTRTpcImhiYXNlXCIsTU9OR09EQjpcIm1vbmdvZGJcIixSRURJUzpcInJlZGlzXCIsQ09VQ0hCQVNFOlwiY291Y2hiYXNlXCIsQ09VQ0hEQjpcImNvdWNoZGJcIixDT1NNT1NEQjpcImNvc21vc2RiXCIsRFlOQU1PREI6XCJkeW5hbW9kYlwiLE5FTzRKOlwibmVvNGpcIixHRU9ERTpcImdlb2RlXCIsRUxBU1RJQ1NFQVJDSDpcImVsYXN0aWNzZWFyY2hcIixNRU1DQUNIRUQ6XCJtZW1jYWNoZWRcIixDT0NLUk9BQ0hEQjpcImNvY2tyb2FjaGRiXCJ9O0EuRGJDYXNzYW5kcmFDb25zaXN0ZW5jeUxldmVsVmFsdWVzPXtBTEw6XCJhbGxcIixFQUNIX1FVT1JVTTpcImVhY2hfcXVvcnVtXCIsUVVPUlVNOlwicXVvcnVtXCIsTE9DQUxfUVVPUlVNOlwibG9jYWxfcXVvcnVtXCIsT05FOlwib25lXCIsVFdPOlwidHdvXCIsVEhSRUU6XCJ0aHJlZVwiLExPQ0FMX09ORTpcImxvY2FsX29uZVwiLEFOWTpcImFueVwiLFNFUklBTDpcInNlcmlhbFwiLExPQ0FMX1NFUklBTDpcImxvY2FsX3NlcmlhbFwifTtBLkZhYXNUcmlnZ2VyVmFsdWVzPXtEQVRBU09VUkNFOlwiZGF0YXNvdXJjZVwiLEhUVFA6XCJodHRwXCIsUFVCU1VCOlwicHVic3ViXCIsVElNRVI6XCJ0aW1lclwiLE9USEVSOlwib3RoZXJcIn07QS5GYWFzRG9jdW1lbnRPcGVyYXRpb25WYWx1ZXM9e0lOU0VSVDpcImluc2VydFwiLEVESVQ6XCJlZGl0XCIsREVMRVRFOlwiZGVsZXRlXCJ9O0EuRmFhc0ludm9rZWRQcm92aWRlclZhbHVlcz17QUxJQkFCQV9DTE9VRDpcImFsaWJhYmFfY2xvdWRcIixBV1M6XCJhd3NcIixBWlVSRTpcImF6dXJlXCIsR0NQOlwiZ2NwXCJ9O0EuTmV0VHJhbnNwb3J0VmFsdWVzPXtJUF9UQ1A6XCJpcF90Y3BcIixJUF9VRFA6XCJpcF91ZHBcIixJUDpcImlwXCIsVU5JWDpcInVuaXhcIixQSVBFOlwicGlwZVwiLElOUFJPQzpcImlucHJvY1wiLE9USEVSOlwib3RoZXJcIn07QS5OZXRIb3N0Q29ubmVjdGlvblR5cGVWYWx1ZXM9e1dJRkk6XCJ3aWZpXCIsV0lSRUQ6XCJ3aXJlZFwiLENFTEw6XCJjZWxsXCIsVU5BVkFJTEFCTEU6XCJ1bmF2YWlsYWJsZVwiLFVOS05PV046XCJ1bmtub3duXCJ9O0EuTmV0SG9zdENvbm5lY3Rpb25TdWJ0eXBlVmFsdWVzPXtHUFJTOlwiZ3Byc1wiLEVER0U6XCJlZGdlXCIsVU1UUzpcInVtdHNcIixDRE1BOlwiY2RtYVwiLEVWRE9fMDpcImV2ZG9fMFwiLEVWRE9fQTpcImV2ZG9fYVwiLENETUEyMDAwXzFYUlRUOlwiY2RtYTIwMDBfMXhydHRcIixIU0RQQTpcImhzZHBhXCIsSFNVUEE6XCJoc3VwYVwiLEhTUEE6XCJoc3BhXCIsSURFTjpcImlkZW5cIixFVkRPX0I6XCJldmRvX2JcIixMVEU6XCJsdGVcIixFSFJQRDpcImVocnBkXCIsSFNQQVA6XCJoc3BhcFwiLEdTTTpcImdzbVwiLFREX1NDRE1BOlwidGRfc2NkbWFcIixJV0xBTjpcIml3bGFuXCIsTlI6XCJuclwiLE5STlNBOlwibnJuc2FcIixMVEVfQ0E6XCJsdGVfY2FcIn07QS5IdHRwRmxhdm9yVmFsdWVzPXtIVFRQXzFfMDpcIjEuMFwiLEhUVFBfMV8xOlwiMS4xXCIsSFRUUF8yXzA6XCIyLjBcIixTUERZOlwiU1BEWVwiLFFVSUM6XCJRVUlDXCJ9O0EuTWVzc2FnaW5nRGVzdGluYXRpb25LaW5kVmFsdWVzPXtRVUVVRTpcInF1ZXVlXCIsVE9QSUM6XCJ0b3BpY1wifTtBLk1lc3NhZ2luZ09wZXJhdGlvblZhbHVlcz17UkVDRUlWRTpcInJlY2VpdmVcIixQUk9DRVNTOlwicHJvY2Vzc1wifTtBLlJwY0dycGNTdGF0dXNDb2RlVmFsdWVzPXtPSzowLENBTkNFTExFRDoxLFVOS05PV046MixJTlZBTElEX0FSR1VNRU5UOjMsREVBRExJTkVfRVhDRUVERUQ6NCxOT1RfRk9VTkQ6NSxBTFJFQURZX0VYSVNUUzo2LFBFUk1JU1NJT05fREVOSUVEOjcsUkVTT1VSQ0VfRVhIQVVTVEVEOjgsRkFJTEVEX1BSRUNPTkRJVElPTjo5LEFCT1JURUQ6MTAsT1VUX09GX1JBTkdFOjExLFVOSU1QTEVNRU5URUQ6MTIsSU5URVJOQUw6MTMsVU5BVkFJTEFCTEU6MTQsREFUQV9MT1NTOjE1LFVOQVVUSEVOVElDQVRFRDoxNn07QS5NZXNzYWdlVHlwZVZhbHVlcz17U0VOVDpcIlNFTlRcIixSRUNFSVZFRDpcIlJFQ0VJVkVEXCJ9fSk7dmFyIExpPV8oSXQ9PntcInVzZSBzdHJpY3RcIjt2YXIgTWM9SXQmJkl0Ll9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LHIsbil7bj09PXZvaWQgMCYmKG49ciksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX19KX06ZnVuY3Rpb24oZSx0LHIsbil7bj09PXZvaWQgMCYmKG49ciksZVtuXT10W3JdfSkseGM9SXQmJkl0Ll9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIgaW4gZSlyIT09XCJkZWZhdWx0XCImJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmTWModCxlLHIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSXQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7eGMoYmkoKSxJdCl9KTt2YXIgUGk9XyhWPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFYsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Vi5UZWxlbWV0cnlTZGtMYW5ndWFnZVZhbHVlcz1WLk9zVHlwZVZhbHVlcz1WLkhvc3RBcmNoVmFsdWVzPVYuQXdzRWNzTGF1bmNodHlwZVZhbHVlcz1WLkNsb3VkUGxhdGZvcm1WYWx1ZXM9Vi5DbG91ZFByb3ZpZGVyVmFsdWVzPVYuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXM9dm9pZCAwO1YuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXM9e0NMT1VEX1BST1ZJREVSOlwiY2xvdWQucHJvdmlkZXJcIixDTE9VRF9BQ0NPVU5UX0lEOlwiY2xvdWQuYWNjb3VudC5pZFwiLENMT1VEX1JFR0lPTjpcImNsb3VkLnJlZ2lvblwiLENMT1VEX0FWQUlMQUJJTElUWV9aT05FOlwiY2xvdWQuYXZhaWxhYmlsaXR5X3pvbmVcIixDTE9VRF9QTEFURk9STTpcImNsb3VkLnBsYXRmb3JtXCIsQVdTX0VDU19DT05UQUlORVJfQVJOOlwiYXdzLmVjcy5jb250YWluZXIuYXJuXCIsQVdTX0VDU19DTFVTVEVSX0FSTjpcImF3cy5lY3MuY2x1c3Rlci5hcm5cIixBV1NfRUNTX0xBVU5DSFRZUEU6XCJhd3MuZWNzLmxhdW5jaHR5cGVcIixBV1NfRUNTX1RBU0tfQVJOOlwiYXdzLmVjcy50YXNrLmFyblwiLEFXU19FQ1NfVEFTS19GQU1JTFk6XCJhd3MuZWNzLnRhc2suZmFtaWx5XCIsQVdTX0VDU19UQVNLX1JFVklTSU9OOlwiYXdzLmVjcy50YXNrLnJldmlzaW9uXCIsQVdTX0VLU19DTFVTVEVSX0FSTjpcImF3cy5la3MuY2x1c3Rlci5hcm5cIixBV1NfTE9HX0dST1VQX05BTUVTOlwiYXdzLmxvZy5ncm91cC5uYW1lc1wiLEFXU19MT0dfR1JPVVBfQVJOUzpcImF3cy5sb2cuZ3JvdXAuYXJuc1wiLEFXU19MT0dfU1RSRUFNX05BTUVTOlwiYXdzLmxvZy5zdHJlYW0ubmFtZXNcIixBV1NfTE9HX1NUUkVBTV9BUk5TOlwiYXdzLmxvZy5zdHJlYW0uYXJuc1wiLENPTlRBSU5FUl9OQU1FOlwiY29udGFpbmVyLm5hbWVcIixDT05UQUlORVJfSUQ6XCJjb250YWluZXIuaWRcIixDT05UQUlORVJfUlVOVElNRTpcImNvbnRhaW5lci5ydW50aW1lXCIsQ09OVEFJTkVSX0lNQUdFX05BTUU6XCJjb250YWluZXIuaW1hZ2UubmFtZVwiLENPTlRBSU5FUl9JTUFHRV9UQUc6XCJjb250YWluZXIuaW1hZ2UudGFnXCIsREVQTE9ZTUVOVF9FTlZJUk9OTUVOVDpcImRlcGxveW1lbnQuZW52aXJvbm1lbnRcIixERVZJQ0VfSUQ6XCJkZXZpY2UuaWRcIixERVZJQ0VfTU9ERUxfSURFTlRJRklFUjpcImRldmljZS5tb2RlbC5pZGVudGlmaWVyXCIsREVWSUNFX01PREVMX05BTUU6XCJkZXZpY2UubW9kZWwubmFtZVwiLEZBQVNfTkFNRTpcImZhYXMubmFtZVwiLEZBQVNfSUQ6XCJmYWFzLmlkXCIsRkFBU19WRVJTSU9OOlwiZmFhcy52ZXJzaW9uXCIsRkFBU19JTlNUQU5DRTpcImZhYXMuaW5zdGFuY2VcIixGQUFTX01BWF9NRU1PUlk6XCJmYWFzLm1heF9tZW1vcnlcIixIT1NUX0lEOlwiaG9zdC5pZFwiLEhPU1RfTkFNRTpcImhvc3QubmFtZVwiLEhPU1RfVFlQRTpcImhvc3QudHlwZVwiLEhPU1RfQVJDSDpcImhvc3QuYXJjaFwiLEhPU1RfSU1BR0VfTkFNRTpcImhvc3QuaW1hZ2UubmFtZVwiLEhPU1RfSU1BR0VfSUQ6XCJob3N0LmltYWdlLmlkXCIsSE9TVF9JTUFHRV9WRVJTSU9OOlwiaG9zdC5pbWFnZS52ZXJzaW9uXCIsSzhTX0NMVVNURVJfTkFNRTpcIms4cy5jbHVzdGVyLm5hbWVcIixLOFNfTk9ERV9OQU1FOlwiazhzLm5vZGUubmFtZVwiLEs4U19OT0RFX1VJRDpcIms4cy5ub2RlLnVpZFwiLEs4U19OQU1FU1BBQ0VfTkFNRTpcIms4cy5uYW1lc3BhY2UubmFtZVwiLEs4U19QT0RfVUlEOlwiazhzLnBvZC51aWRcIixLOFNfUE9EX05BTUU6XCJrOHMucG9kLm5hbWVcIixLOFNfQ09OVEFJTkVSX05BTUU6XCJrOHMuY29udGFpbmVyLm5hbWVcIixLOFNfUkVQTElDQVNFVF9VSUQ6XCJrOHMucmVwbGljYXNldC51aWRcIixLOFNfUkVQTElDQVNFVF9OQU1FOlwiazhzLnJlcGxpY2FzZXQubmFtZVwiLEs4U19ERVBMT1lNRU5UX1VJRDpcIms4cy5kZXBsb3ltZW50LnVpZFwiLEs4U19ERVBMT1lNRU5UX05BTUU6XCJrOHMuZGVwbG95bWVudC5uYW1lXCIsSzhTX1NUQVRFRlVMU0VUX1VJRDpcIms4cy5zdGF0ZWZ1bHNldC51aWRcIixLOFNfU1RBVEVGVUxTRVRfTkFNRTpcIms4cy5zdGF0ZWZ1bHNldC5uYW1lXCIsSzhTX0RBRU1PTlNFVF9VSUQ6XCJrOHMuZGFlbW9uc2V0LnVpZFwiLEs4U19EQUVNT05TRVRfTkFNRTpcIms4cy5kYWVtb25zZXQubmFtZVwiLEs4U19KT0JfVUlEOlwiazhzLmpvYi51aWRcIixLOFNfSk9CX05BTUU6XCJrOHMuam9iLm5hbWVcIixLOFNfQ1JPTkpPQl9VSUQ6XCJrOHMuY3JvbmpvYi51aWRcIixLOFNfQ1JPTkpPQl9OQU1FOlwiazhzLmNyb25qb2IubmFtZVwiLE9TX1RZUEU6XCJvcy50eXBlXCIsT1NfREVTQ1JJUFRJT046XCJvcy5kZXNjcmlwdGlvblwiLE9TX05BTUU6XCJvcy5uYW1lXCIsT1NfVkVSU0lPTjpcIm9zLnZlcnNpb25cIixQUk9DRVNTX1BJRDpcInByb2Nlc3MucGlkXCIsUFJPQ0VTU19FWEVDVVRBQkxFX05BTUU6XCJwcm9jZXNzLmV4ZWN1dGFibGUubmFtZVwiLFBST0NFU1NfRVhFQ1VUQUJMRV9QQVRIOlwicHJvY2Vzcy5leGVjdXRhYmxlLnBhdGhcIixQUk9DRVNTX0NPTU1BTkQ6XCJwcm9jZXNzLmNvbW1hbmRcIixQUk9DRVNTX0NPTU1BTkRfTElORTpcInByb2Nlc3MuY29tbWFuZF9saW5lXCIsUFJPQ0VTU19DT01NQU5EX0FSR1M6XCJwcm9jZXNzLmNvbW1hbmRfYXJnc1wiLFBST0NFU1NfT1dORVI6XCJwcm9jZXNzLm93bmVyXCIsUFJPQ0VTU19SVU5USU1FX05BTUU6XCJwcm9jZXNzLnJ1bnRpbWUubmFtZVwiLFBST0NFU1NfUlVOVElNRV9WRVJTSU9OOlwicHJvY2Vzcy5ydW50aW1lLnZlcnNpb25cIixQUk9DRVNTX1JVTlRJTUVfREVTQ1JJUFRJT046XCJwcm9jZXNzLnJ1bnRpbWUuZGVzY3JpcHRpb25cIixTRVJWSUNFX05BTUU6XCJzZXJ2aWNlLm5hbWVcIixTRVJWSUNFX05BTUVTUEFDRTpcInNlcnZpY2UubmFtZXNwYWNlXCIsU0VSVklDRV9JTlNUQU5DRV9JRDpcInNlcnZpY2UuaW5zdGFuY2UuaWRcIixTRVJWSUNFX1ZFUlNJT046XCJzZXJ2aWNlLnZlcnNpb25cIixURUxFTUVUUllfU0RLX05BTUU6XCJ0ZWxlbWV0cnkuc2RrLm5hbWVcIixURUxFTUVUUllfU0RLX0xBTkdVQUdFOlwidGVsZW1ldHJ5LnNkay5sYW5ndWFnZVwiLFRFTEVNRVRSWV9TREtfVkVSU0lPTjpcInRlbGVtZXRyeS5zZGsudmVyc2lvblwiLFRFTEVNRVRSWV9BVVRPX1ZFUlNJT046XCJ0ZWxlbWV0cnkuYXV0by52ZXJzaW9uXCIsV0VCRU5HSU5FX05BTUU6XCJ3ZWJlbmdpbmUubmFtZVwiLFdFQkVOR0lORV9WRVJTSU9OOlwid2ViZW5naW5lLnZlcnNpb25cIixXRUJFTkdJTkVfREVTQ1JJUFRJT046XCJ3ZWJlbmdpbmUuZGVzY3JpcHRpb25cIn07Vi5DbG91ZFByb3ZpZGVyVmFsdWVzPXtBTElCQUJBX0NMT1VEOlwiYWxpYmFiYV9jbG91ZFwiLEFXUzpcImF3c1wiLEFaVVJFOlwiYXp1cmVcIixHQ1A6XCJnY3BcIn07Vi5DbG91ZFBsYXRmb3JtVmFsdWVzPXtBTElCQUJBX0NMT1VEX0VDUzpcImFsaWJhYmFfY2xvdWRfZWNzXCIsQUxJQkFCQV9DTE9VRF9GQzpcImFsaWJhYmFfY2xvdWRfZmNcIixBV1NfRUMyOlwiYXdzX2VjMlwiLEFXU19FQ1M6XCJhd3NfZWNzXCIsQVdTX0VLUzpcImF3c19la3NcIixBV1NfTEFNQkRBOlwiYXdzX2xhbWJkYVwiLEFXU19FTEFTVElDX0JFQU5TVEFMSzpcImF3c19lbGFzdGljX2JlYW5zdGFsa1wiLEFaVVJFX1ZNOlwiYXp1cmVfdm1cIixBWlVSRV9DT05UQUlORVJfSU5TVEFOQ0VTOlwiYXp1cmVfY29udGFpbmVyX2luc3RhbmNlc1wiLEFaVVJFX0FLUzpcImF6dXJlX2Frc1wiLEFaVVJFX0ZVTkNUSU9OUzpcImF6dXJlX2Z1bmN0aW9uc1wiLEFaVVJFX0FQUF9TRVJWSUNFOlwiYXp1cmVfYXBwX3NlcnZpY2VcIixHQ1BfQ09NUFVURV9FTkdJTkU6XCJnY3BfY29tcHV0ZV9lbmdpbmVcIixHQ1BfQ0xPVURfUlVOOlwiZ2NwX2Nsb3VkX3J1blwiLEdDUF9LVUJFUk5FVEVTX0VOR0lORTpcImdjcF9rdWJlcm5ldGVzX2VuZ2luZVwiLEdDUF9DTE9VRF9GVU5DVElPTlM6XCJnY3BfY2xvdWRfZnVuY3Rpb25zXCIsR0NQX0FQUF9FTkdJTkU6XCJnY3BfYXBwX2VuZ2luZVwifTtWLkF3c0Vjc0xhdW5jaHR5cGVWYWx1ZXM9e0VDMjpcImVjMlwiLEZBUkdBVEU6XCJmYXJnYXRlXCJ9O1YuSG9zdEFyY2hWYWx1ZXM9e0FNRDY0OlwiYW1kNjRcIixBUk0zMjpcImFybTMyXCIsQVJNNjQ6XCJhcm02NFwiLElBNjQ6XCJpYTY0XCIsUFBDMzI6XCJwcGMzMlwiLFBQQzY0OlwicHBjNjRcIixYODY6XCJ4ODZcIn07Vi5Pc1R5cGVWYWx1ZXM9e1dJTkRPV1M6XCJ3aW5kb3dzXCIsTElOVVg6XCJsaW51eFwiLERBUldJTjpcImRhcndpblwiLEZSRUVCU0Q6XCJmcmVlYnNkXCIsTkVUQlNEOlwibmV0YnNkXCIsT1BFTkJTRDpcIm9wZW5ic2RcIixEUkFHT05GTFlCU0Q6XCJkcmFnb25mbHlic2RcIixIUFVYOlwiaHB1eFwiLEFJWDpcImFpeFwiLFNPTEFSSVM6XCJzb2xhcmlzXCIsWl9PUzpcInpfb3NcIn07Vi5UZWxlbWV0cnlTZGtMYW5ndWFnZVZhbHVlcz17Q1BQOlwiY3BwXCIsRE9UTkVUOlwiZG90bmV0XCIsRVJMQU5HOlwiZXJsYW5nXCIsR086XCJnb1wiLEpBVkE6XCJqYXZhXCIsTk9ERUpTOlwibm9kZWpzXCIsUEhQOlwicGhwXCIsUFlUSE9OOlwicHl0aG9uXCIsUlVCWTpcInJ1YnlcIixXRUJKUzpcIndlYmpzXCJ9fSk7dmFyIElpPV8oQ3Q9PntcInVzZSBzdHJpY3RcIjt2YXIgRGM9Q3QmJkN0Ll9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LHIsbil7bj09PXZvaWQgMCYmKG49ciksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX19KX06ZnVuY3Rpb24oZSx0LHIsbil7bj09PXZvaWQgMCYmKG49ciksZVtuXT10W3JdfSksVWM9Q3QmJkN0Ll9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIgaW4gZSlyIT09XCJkZWZhdWx0XCImJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmRGModCxlLHIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQ3QsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VWMoUGkoKSxDdCl9KTt2YXIgc2U9XyhfdD0+e1widXNlIHN0cmljdFwiO3ZhciBCYz1fdCYmX3QuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihlLHQscixuKXtuPT09dm9pZCAwJiYobj1yKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W3JdfX0pfTpmdW5jdGlvbihlLHQscixuKXtuPT09dm9pZCAwJiYobj1yKSxlW25dPXRbcl19KSxDaT1fdCYmX3QuX19leHBvcnRTdGFyfHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgciBpbiBlKXIhPT1cImRlZmF1bHRcIiYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiZCYyh0LGUscil9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShfdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtDaShMaSgpLF90KTtDaShJaSgpLF90KX0pO3ZhciBOaT1fKE1lPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KE1lLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO01lLlNES19JTkZPPXZvaWQgMDt2YXIgVmM9WXIoKSxhZT1zZSgpO01lLlNES19JTkZPPXtbYWUuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19OQU1FXTpcIm9wZW50ZWxlbWV0cnlcIixbYWUuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuUFJPQ0VTU19SVU5USU1FX05BTUVdOlwiYnJvd3NlclwiLFthZS5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5URUxFTUVUUllfU0RLX0xBTkdVQUdFXTphZS5UZWxlbWV0cnlTZGtMYW5ndWFnZVZhbHVlcy5XRUJKUyxbYWUuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19WRVJTSU9OXTpWYy5WRVJTSU9OfX0pO3ZhciB3aT1fKHhlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHhlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3hlLnVucmVmVGltZXI9dm9pZCAwO2Z1bmN0aW9uIEdjKGUpe314ZS51bnJlZlRpbWVyPUdjfSk7dmFyIHpyPV8oaj0+e1widXNlIHN0cmljdFwiO3ZhciBIYz1qJiZqLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oZSx0LHIsbil7bj09PXZvaWQgMCYmKG49ciksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdFtyXX19KX06ZnVuY3Rpb24oZSx0LHIsbil7bj09PXZvaWQgMCYmKG49ciksZVtuXT10W3JdfSksTnQ9aiYmai5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByIGluIGUpciE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJkhjKHQsZSxyKX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGosXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7TnQoeWkoKSxqKTtOdChPZSgpLGopO050KHZpKCksaik7TnQoUmkoKSxqKTtOdChPaSgpLGopO050KE5pKCksaik7TnQod2koKSxqKX0pO3ZhciBVaT1fKE89PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoTyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtPLmFkZEhyVGltZXM9Ty5pc1RpbWVJbnB1dD1PLmlzVGltZUlucHV0SHJUaW1lPU8uaHJUaW1lVG9NaWNyb3NlY29uZHM9Ty5oclRpbWVUb01pbGxpc2Vjb25kcz1PLmhyVGltZVRvTmFub3NlY29uZHM9Ty5oclRpbWVUb1RpbWVTdGFtcD1PLmhyVGltZUR1cmF0aW9uPU8udGltZUlucHV0VG9IclRpbWU9Ty5oclRpbWU9Ty5nZXRUaW1lT3JpZ2luPU8ubWlsbGlzVG9IclRpbWU9dm9pZCAwO3ZhciAkcj16cigpLE1pPTksRmM9NixqYz1NYXRoLnBvdygxMCxGYyksRGU9TWF0aC5wb3coMTAsTWkpO2Z1bmN0aW9uIHVlKGUpe2xldCB0PWUvMWUzLHI9TWF0aC50cnVuYyh0KSxuPU1hdGgucm91bmQoZSUxZTMqamMpO3JldHVybltyLG5dfU8ubWlsbGlzVG9IclRpbWU9dWU7ZnVuY3Rpb24gUXIoKXtsZXQgZT0kci5vdHBlcmZvcm1hbmNlLnRpbWVPcmlnaW47aWYodHlwZW9mIGUhPVwibnVtYmVyXCIpe2xldCB0PSRyLm90cGVyZm9ybWFuY2U7ZT10LnRpbWluZyYmdC50aW1pbmcuZmV0Y2hTdGFydH1yZXR1cm4gZX1PLmdldFRpbWVPcmlnaW49UXI7ZnVuY3Rpb24geGkoZSl7bGV0IHQ9dWUoUXIoKSkscj11ZSh0eXBlb2YgZT09XCJudW1iZXJcIj9lOiRyLm90cGVyZm9ybWFuY2Uubm93KCkpO3JldHVybiBEaSh0LHIpfU8uaHJUaW1lPXhpO2Z1bmN0aW9uIGtjKGUpe2lmKEpyKGUpKXJldHVybiBlO2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKXJldHVybiBlPFFyKCk/eGkoZSk6dWUoZSk7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHVlKGUuZ2V0VGltZSgpKTt0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIGlucHV0IHR5cGVcIil9Ty50aW1lSW5wdXRUb0hyVGltZT1rYztmdW5jdGlvbiBxYyhlLHQpe2xldCByPXRbMF0tZVswXSxuPXRbMV0tZVsxXTtyZXR1cm4gbjwwJiYoci09MSxuKz1EZSksW3Isbl19Ty5oclRpbWVEdXJhdGlvbj1xYztmdW5jdGlvbiBYYyhlKXtsZXQgdD1NaSxyPWAke1wiMFwiLnJlcGVhdCh0KX0ke2VbMV19WmAsbj1yLnN1YnN0cihyLmxlbmd0aC10LTEpO3JldHVybiBuZXcgRGF0ZShlWzBdKjFlMykudG9JU09TdHJpbmcoKS5yZXBsYWNlKFwiMDAwWlwiLG4pfU8uaHJUaW1lVG9UaW1lU3RhbXA9WGM7ZnVuY3Rpb24gS2MoZSl7cmV0dXJuIGVbMF0qRGUrZVsxXX1PLmhyVGltZVRvTmFub3NlY29uZHM9S2M7ZnVuY3Rpb24gV2MoZSl7cmV0dXJuIGVbMF0qMWUzK2VbMV0vMWU2fU8uaHJUaW1lVG9NaWxsaXNlY29uZHM9V2M7ZnVuY3Rpb24gWWMoZSl7cmV0dXJuIGVbMF0qMWU2K2VbMV0vMWUzfU8uaHJUaW1lVG9NaWNyb3NlY29uZHM9WWM7ZnVuY3Rpb24gSnIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MiYmdHlwZW9mIGVbMF09PVwibnVtYmVyXCImJnR5cGVvZiBlWzFdPT1cIm51bWJlclwifU8uaXNUaW1lSW5wdXRIclRpbWU9SnI7ZnVuY3Rpb24gemMoZSl7cmV0dXJuIEpyKGUpfHx0eXBlb2YgZT09XCJudW1iZXJcInx8ZSBpbnN0YW5jZW9mIERhdGV9Ty5pc1RpbWVJbnB1dD16YztmdW5jdGlvbiBEaShlLHQpe2xldCByPVtlWzBdK3RbMF0sZVsxXSt0WzFdXTtyZXR1cm4gclsxXT49RGUmJihyWzFdLT1EZSxyWzBdKz0xKSxyfU8uYWRkSHJUaW1lcz1EaX0pO3ZhciBWaT1fKEJpPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEJpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSk7dmFyIEdpPV8oY2U9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoY2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Y2UuRXhwb3J0UmVzdWx0Q29kZT12b2lkIDA7dmFyICRjOyhmdW5jdGlvbihlKXtlW2UuU1VDQ0VTUz0wXT1cIlNVQ0NFU1NcIixlW2UuRkFJTEVEPTFdPVwiRkFJTEVEXCJ9KSgkYz1jZS5FeHBvcnRSZXN1bHRDb2RlfHwoY2UuRXhwb3J0UmVzdWx0Q29kZT17fSkpfSk7dmFyIEZpPV8oVWU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VWUuQ29tcG9zaXRlUHJvcGFnYXRvcj12b2lkIDA7dmFyIEhpPShFKCksdyhsKSksWnI9Y2xhc3N7Y29uc3RydWN0b3IodD17fSl7dmFyIHI7dGhpcy5fcHJvcGFnYXRvcnM9KHI9dC5wcm9wYWdhdG9ycykhPT1udWxsJiZyIT09dm9pZCAwP3I6W10sdGhpcy5fZmllbGRzPUFycmF5LmZyb20obmV3IFNldCh0aGlzLl9wcm9wYWdhdG9ycy5tYXAobj0+dHlwZW9mIG4uZmllbGRzPT1cImZ1bmN0aW9uXCI/bi5maWVsZHMoKTpbXSkucmVkdWNlKChuLG8pPT5uLmNvbmNhdChvKSxbXSkpKX1pbmplY3QodCxyLG4pe2ZvcihsZXQgbyBvZiB0aGlzLl9wcm9wYWdhdG9ycyl0cnl7by5pbmplY3QodCxyLG4pfWNhdGNoKGkpe0hpLmRpYWcud2FybihgRmFpbGVkIHRvIGluamVjdCB3aXRoICR7by5jb25zdHJ1Y3Rvci5uYW1lfS4gRXJyOiAke2kubWVzc2FnZX1gKX19ZXh0cmFjdCh0LHIsbil7cmV0dXJuIHRoaXMuX3Byb3BhZ2F0b3JzLnJlZHVjZSgobyxpKT0+e3RyeXtyZXR1cm4gaS5leHRyYWN0KG8scixuKX1jYXRjaChhKXtIaS5kaWFnLndhcm4oYEZhaWxlZCB0byBpbmplY3Qgd2l0aCAke2kuY29uc3RydWN0b3IubmFtZX0uIEVycjogJHthLm1lc3NhZ2V9YCl9cmV0dXJuIG99LHQpfWZpZWxkcygpe3JldHVybiB0aGlzLl9maWVsZHMuc2xpY2UoKX19O1VlLkNvbXBvc2l0ZVByb3BhZ2F0b3I9WnJ9KTt2YXIgamk9XyhIdD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtIdC52YWxpZGF0ZVZhbHVlPUh0LnZhbGlkYXRlS2V5PXZvaWQgMDt2YXIgdG49XCJbXzAtOWEtei0qL11cIixRYz1gW2Etel0ke3RufXswLDI1NX1gLEpjPWBbYS16MC05XSR7dG59ezAsMjQwfUBbYS16XSR7dG59ezAsMTN9YCxaYz1uZXcgUmVnRXhwKGBeKD86JHtRY318JHtKY30pJGApLHRsPS9eWyAtfl17MCwyNTV9WyEtfl0kLyxlbD0vLHw9LztmdW5jdGlvbiBybChlKXtyZXR1cm4gWmMudGVzdChlKX1IdC52YWxpZGF0ZUtleT1ybDtmdW5jdGlvbiBubChlKXtyZXR1cm4gdGwudGVzdChlKSYmIWVsLnRlc3QoZSl9SHQudmFsaWRhdGVWYWx1ZT1ubH0pO3ZhciBybj1fKEJlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEJlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0JlLlRyYWNlU3RhdGU9dm9pZCAwO3ZhciBraT1qaSgpLHFpPTMyLGlsPTUxMixYaT1cIixcIixLaT1cIj1cIixlbj1jbGFzcyBle2NvbnN0cnVjdG9yKHQpe3RoaXMuX2ludGVybmFsU3RhdGU9bmV3IE1hcCx0JiZ0aGlzLl9wYXJzZSh0KX1zZXQodCxyKXtsZXQgbj10aGlzLl9jbG9uZSgpO3JldHVybiBuLl9pbnRlcm5hbFN0YXRlLmhhcyh0KSYmbi5faW50ZXJuYWxTdGF0ZS5kZWxldGUodCksbi5faW50ZXJuYWxTdGF0ZS5zZXQodCxyKSxufXVuc2V0KHQpe2xldCByPXRoaXMuX2Nsb25lKCk7cmV0dXJuIHIuX2ludGVybmFsU3RhdGUuZGVsZXRlKHQpLHJ9Z2V0KHQpe3JldHVybiB0aGlzLl9pbnRlcm5hbFN0YXRlLmdldCh0KX1zZXJpYWxpemUoKXtyZXR1cm4gdGhpcy5fa2V5cygpLnJlZHVjZSgodCxyKT0+KHQucHVzaChyK0tpK3RoaXMuZ2V0KHIpKSx0KSxbXSkuam9pbihYaSl9X3BhcnNlKHQpe3QubGVuZ3RoPmlsfHwodGhpcy5faW50ZXJuYWxTdGF0ZT10LnNwbGl0KFhpKS5yZXZlcnNlKCkucmVkdWNlKChyLG4pPT57bGV0IG89bi50cmltKCksaT1vLmluZGV4T2YoS2kpO2lmKGkhPT0tMSl7bGV0IGE9by5zbGljZSgwLGkpLHU9by5zbGljZShpKzEsbi5sZW5ndGgpOygwLGtpLnZhbGlkYXRlS2V5KShhKSYmKDAsa2kudmFsaWRhdGVWYWx1ZSkodSkmJnIuc2V0KGEsdSl9cmV0dXJuIHJ9LG5ldyBNYXApLHRoaXMuX2ludGVybmFsU3RhdGUuc2l6ZT5xaSYmKHRoaXMuX2ludGVybmFsU3RhdGU9bmV3IE1hcChBcnJheS5mcm9tKHRoaXMuX2ludGVybmFsU3RhdGUuZW50cmllcygpKS5yZXZlcnNlKCkuc2xpY2UoMCxxaSkpKSl9X2tleXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9pbnRlcm5hbFN0YXRlLmtleXMoKSkucmV2ZXJzZSgpfV9jbG9uZSgpe2xldCB0PW5ldyBlO3JldHVybiB0Ll9pbnRlcm5hbFN0YXRlPW5ldyBNYXAodGhpcy5faW50ZXJuYWxTdGF0ZSksdH19O0JlLlRyYWNlU3RhdGU9ZW59KTt2YXIgWWk9XyhHPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEcsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Ry5XM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yPUcucGFyc2VUcmFjZVBhcmVudD1HLlRSQUNFX1NUQVRFX0hFQURFUj1HLlRSQUNFX1BBUkVOVF9IRUFERVI9dm9pZCAwO3ZhciBWZT0oRSgpLHcobCkpLG9sPWllKCksc2w9cm4oKTtHLlRSQUNFX1BBUkVOVF9IRUFERVI9XCJ0cmFjZXBhcmVudFwiO0cuVFJBQ0VfU1RBVEVfSEVBREVSPVwidHJhY2VzdGF0ZVwiO3ZhciBhbD1cIjAwXCIsdWw9XCIoPyFmZilbXFxcXGRhLWZdezJ9XCIsY2w9XCIoPyFbMF17MzJ9KVtcXFxcZGEtZl17MzJ9XCIsbGw9XCIoPyFbMF17MTZ9KVtcXFxcZGEtZl17MTZ9XCIsZmw9XCJbXFxcXGRhLWZdezJ9XCIscGw9bmV3IFJlZ0V4cChgXlxcXFxzPygke3VsfSktKCR7Y2x9KS0oJHtsbH0pLSgke2ZsfSkoLS4qKT9cXFxccz8kYCk7ZnVuY3Rpb24gV2koZSl7bGV0IHQ9cGwuZXhlYyhlKTtyZXR1cm4hdHx8dFsxXT09PVwiMDBcIiYmdFs1XT9udWxsOnt0cmFjZUlkOnRbMl0sc3BhbklkOnRbM10sdHJhY2VGbGFnczpwYXJzZUludCh0WzRdLDE2KX19Ry5wYXJzZVRyYWNlUGFyZW50PVdpO3ZhciBubj1jbGFzc3tpbmplY3QodCxyLG4pe2xldCBvPVZlLnRyYWNlLmdldFNwYW5Db250ZXh0KHQpO2lmKCFvfHwoMCxvbC5pc1RyYWNpbmdTdXBwcmVzc2VkKSh0KXx8ISgwLFZlLmlzU3BhbkNvbnRleHRWYWxpZCkobykpcmV0dXJuO2xldCBpPWAke2FsfS0ke28udHJhY2VJZH0tJHtvLnNwYW5JZH0tMCR7TnVtYmVyKG8udHJhY2VGbGFnc3x8VmUuVHJhY2VGbGFncy5OT05FKS50b1N0cmluZygxNil9YDtuLnNldChyLEcuVFJBQ0VfUEFSRU5UX0hFQURFUixpKSxvLnRyYWNlU3RhdGUmJm4uc2V0KHIsRy5UUkFDRV9TVEFURV9IRUFERVIsby50cmFjZVN0YXRlLnNlcmlhbGl6ZSgpKX1leHRyYWN0KHQscixuKXtsZXQgbz1uLmdldChyLEcuVFJBQ0VfUEFSRU5UX0hFQURFUik7aWYoIW8pcmV0dXJuIHQ7bGV0IGk9QXJyYXkuaXNBcnJheShvKT9vWzBdOm87aWYodHlwZW9mIGkhPVwic3RyaW5nXCIpcmV0dXJuIHQ7bGV0IGE9V2koaSk7aWYoIWEpcmV0dXJuIHQ7YS5pc1JlbW90ZT0hMDtsZXQgdT1uLmdldChyLEcuVFJBQ0VfU1RBVEVfSEVBREVSKTtpZih1KXtsZXQgYz1BcnJheS5pc0FycmF5KHUpP3Uuam9pbihcIixcIik6dTthLnRyYWNlU3RhdGU9bmV3IHNsLlRyYWNlU3RhdGUodHlwZW9mIGM9PVwic3RyaW5nXCI/Yzp2b2lkIDApfXJldHVybiBWZS50cmFjZS5zZXRTcGFuQ29udGV4dCh0LGEpfWZpZWxkcygpe3JldHVybltHLlRSQUNFX1BBUkVOVF9IRUFERVIsRy5UUkFDRV9TVEFURV9IRUFERVJdfX07Ry5XM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yPW5ufSk7dmFyICRpPV8oemk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoemksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9KTt2YXIgUWk9XygkPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KCQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7JC5nZXRSUENNZXRhZGF0YT0kLmRlbGV0ZVJQQ01ldGFkYXRhPSQuc2V0UlBDTWV0YWRhdGE9JC5SUENUeXBlPXZvaWQgMDt2YXIgZGw9KEUoKSx3KGwpKSxvbj0oMCxkbC5jcmVhdGVDb250ZXh0S2V5KShcIk9wZW5UZWxlbWV0cnkgU0RLIENvbnRleHQgS2V5IFJQQ19NRVRBREFUQVwiKSxfbDsoZnVuY3Rpb24oZSl7ZS5IVFRQPVwiaHR0cFwifSkoX2w9JC5SUENUeXBlfHwoJC5SUENUeXBlPXt9KSk7ZnVuY3Rpb24gaGwoZSx0KXtyZXR1cm4gZS5zZXRWYWx1ZShvbix0KX0kLnNldFJQQ01ldGFkYXRhPWhsO2Z1bmN0aW9uIEVsKGUpe3JldHVybiBlLmRlbGV0ZVZhbHVlKG9uKX0kLmRlbGV0ZVJQQ01ldGFkYXRhPUVsO2Z1bmN0aW9uIG1sKGUpe3JldHVybiBlLmdldFZhbHVlKG9uKX0kLmdldFJQQ01ldGFkYXRhPW1sfSk7dmFyIGFuPV8oR2U9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoR2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7R2UuQWx3YXlzT2ZmU2FtcGxlcj12b2lkIDA7dmFyIFRsPShFKCksdyhsKSksc249Y2xhc3N7c2hvdWxkU2FtcGxlKCl7cmV0dXJue2RlY2lzaW9uOlRsLlNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRH19dG9TdHJpbmcoKXtyZXR1cm5cIkFsd2F5c09mZlNhbXBsZXJcIn19O0dlLkFsd2F5c09mZlNhbXBsZXI9c259KTt2YXIgY249XyhIZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtIZS5BbHdheXNPblNhbXBsZXI9dm9pZCAwO3ZhciBTbD0oRSgpLHcobCkpLHVuPWNsYXNze3Nob3VsZFNhbXBsZSgpe3JldHVybntkZWNpc2lvbjpTbC5TYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRH19dG9TdHJpbmcoKXtyZXR1cm5cIkFsd2F5c09uU2FtcGxlclwifX07SGUuQWx3YXlzT25TYW1wbGVyPXVufSk7dmFyIFppPV8oamU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoamUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7amUuUGFyZW50QmFzZWRTYW1wbGVyPXZvaWQgMDt2YXIgRmU9KEUoKSx3KGwpKSxnbD1xcigpLEppPWFuKCksbG49Y24oKSxmbj1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt2YXIgcixuLG8saTt0aGlzLl9yb290PXQucm9vdCx0aGlzLl9yb290fHwoKDAsZ2wuZ2xvYmFsRXJyb3JIYW5kbGVyKShuZXcgRXJyb3IoXCJQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWRcIikpLHRoaXMuX3Jvb3Q9bmV3IGxuLkFsd2F5c09uU2FtcGxlciksdGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZD0ocj10LnJlbW90ZVBhcmVudFNhbXBsZWQpIT09bnVsbCYmciE9PXZvaWQgMD9yOm5ldyBsbi5BbHdheXNPblNhbXBsZXIsdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZD0obj10LnJlbW90ZVBhcmVudE5vdFNhbXBsZWQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOm5ldyBKaS5BbHdheXNPZmZTYW1wbGVyLHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZD0obz10LmxvY2FsUGFyZW50U2FtcGxlZCkhPT1udWxsJiZvIT09dm9pZCAwP286bmV3IGxuLkFsd2F5c09uU2FtcGxlcix0aGlzLl9sb2NhbFBhcmVudE5vdFNhbXBsZWQ9KGk9dC5sb2NhbFBhcmVudE5vdFNhbXBsZWQpIT09bnVsbCYmaSE9PXZvaWQgMD9pOm5ldyBKaS5BbHdheXNPZmZTYW1wbGVyfXNob3VsZFNhbXBsZSh0LHIsbixvLGksYSl7bGV0IHU9RmUudHJhY2UuZ2V0U3BhbkNvbnRleHQodCk7cmV0dXJuIXV8fCEoMCxGZS5pc1NwYW5Db250ZXh0VmFsaWQpKHUpP3RoaXMuX3Jvb3Quc2hvdWxkU2FtcGxlKHQscixuLG8saSxhKTp1LmlzUmVtb3RlP3UudHJhY2VGbGFncyZGZS5UcmFjZUZsYWdzLlNBTVBMRUQ/dGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUodCxyLG4sbyxpLGEpOnRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQuc2hvdWxkU2FtcGxlKHQscixuLG8saSxhKTp1LnRyYWNlRmxhZ3MmRmUuVHJhY2VGbGFncy5TQU1QTEVEP3RoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUodCxyLG4sbyxpLGEpOnRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUodCxyLG4sbyxpLGEpfXRvU3RyaW5nKCl7cmV0dXJuYFBhcmVudEJhc2Vke3Jvb3Q9JHt0aGlzLl9yb290LnRvU3RyaW5nKCl9LCByZW1vdGVQYXJlbnRTYW1wbGVkPSR7dGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC50b1N0cmluZygpfSwgcmVtb3RlUGFyZW50Tm90U2FtcGxlZD0ke3RoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKX0sIGxvY2FsUGFyZW50U2FtcGxlZD0ke3RoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpfSwgbG9jYWxQYXJlbnROb3RTYW1wbGVkPSR7dGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnRvU3RyaW5nKCl9fWB9fTtqZS5QYXJlbnRCYXNlZFNhbXBsZXI9Zm59KTt2YXIgdG89XyhrZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShrZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtrZS5UcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXI9dm9pZCAwO3ZhciBwbj0oRSgpLHcobCkpLGRuPWNsYXNze2NvbnN0cnVjdG9yKHQ9MCl7dGhpcy5fcmF0aW89dCx0aGlzLl9yYXRpbz10aGlzLl9ub3JtYWxpemUodCksdGhpcy5fdXBwZXJCb3VuZD1NYXRoLmZsb29yKHRoaXMuX3JhdGlvKjQyOTQ5NjcyOTUpfXNob3VsZFNhbXBsZSh0LHIpe3JldHVybntkZWNpc2lvbjooMCxwbi5pc1ZhbGlkVHJhY2VJZCkocikmJnRoaXMuX2FjY3VtdWxhdGUocik8dGhpcy5fdXBwZXJCb3VuZD9wbi5TYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRDpwbi5TYW1wbGluZ0RlY2lzaW9uLk5PVF9SRUNPUkR9fXRvU3RyaW5nKCl7cmV0dXJuYFRyYWNlSWRSYXRpb0Jhc2VkeyR7dGhpcy5fcmF0aW99fWB9X25vcm1hbGl6ZSh0KXtyZXR1cm4gdHlwZW9mIHQhPVwibnVtYmVyXCJ8fGlzTmFOKHQpPzA6dD49MT8xOnQ8PTA/MDp0fV9hY2N1bXVsYXRlKHQpe2xldCByPTA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aC84O24rKyl7bGV0IG89bio4LGk9cGFyc2VJbnQodC5zbGljZShvLG8rOCksMTYpO3I9KHJeaSk+Pj4wfXJldHVybiByfX07a2UuVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyPWRufSk7dmFyIG9vPV8ocWU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkocWUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7cWUuaXNQbGFpbk9iamVjdD12b2lkIDA7dmFyIHlsPVwiW29iamVjdCBPYmplY3RdXCIsdmw9XCJbb2JqZWN0IE51bGxdXCIsQWw9XCJbb2JqZWN0IFVuZGVmaW5lZF1cIixSbD1GdW5jdGlvbi5wcm90b3R5cGUsZW89UmwudG9TdHJpbmcsT2w9ZW8uY2FsbChPYmplY3QpLGJsPUxsKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpLHJvPU9iamVjdC5wcm90b3R5cGUsbm89cm8uaGFzT3duUHJvcGVydHksd3Q9U3ltYm9sP1N5bWJvbC50b1N0cmluZ1RhZzp2b2lkIDAsaW89cm8udG9TdHJpbmc7ZnVuY3Rpb24gTGwoZSx0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIGUodChyKSl9fWZ1bmN0aW9uIFBsKGUpe2lmKCFJbChlKXx8Q2woZSkhPT15bClyZXR1cm4hMTtsZXQgdD1ibChlKTtpZih0PT09bnVsbClyZXR1cm4hMDtsZXQgcj1uby5jYWxsKHQsXCJjb25zdHJ1Y3RvclwiKSYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIHI9PVwiZnVuY3Rpb25cIiYmciBpbnN0YW5jZW9mIHImJmVvLmNhbGwocik9PT1PbH1xZS5pc1BsYWluT2JqZWN0PVBsO2Z1bmN0aW9uIElsKGUpe3JldHVybiBlIT1udWxsJiZ0eXBlb2YgZT09XCJvYmplY3RcIn1mdW5jdGlvbiBDbChlKXtyZXR1cm4gZT09bnVsbD9lPT09dm9pZCAwP0FsOnZsOnd0JiZ3dCBpbiBPYmplY3QoZSk/TmwoZSk6d2woZSl9ZnVuY3Rpb24gTmwoZSl7bGV0IHQ9bm8uY2FsbChlLHd0KSxyPWVbd3RdLG49ITE7dHJ5e2Vbd3RdPXZvaWQgMCxuPSEwfWNhdGNoe31sZXQgbz1pby5jYWxsKGUpO3JldHVybiBuJiYodD9lW3d0XT1yOmRlbGV0ZSBlW3d0XSksb31mdW5jdGlvbiB3bChlKXtyZXR1cm4gaW8uY2FsbChlKX19KTt2YXIgbG89XyhXZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtXZS5tZXJnZT12b2lkIDA7dmFyIHNvPW9vKCksTWw9MjA7ZnVuY3Rpb24geGwoLi4uZSl7bGV0IHQ9ZS5zaGlmdCgpLHI9bmV3IFdlYWtNYXA7Zm9yKDtlLmxlbmd0aD4wOyl0PXVvKHQsZS5zaGlmdCgpLDAscik7cmV0dXJuIHR9V2UubWVyZ2U9eGw7ZnVuY3Rpb24gX24oZSl7cmV0dXJuIEtlKGUpP2Uuc2xpY2UoKTplfWZ1bmN0aW9uIHVvKGUsdCxyPTAsbil7bGV0IG87aWYoIShyPk1sKSl7aWYocisrLFhlKGUpfHxYZSh0KXx8Y28odCkpbz1fbih0KTtlbHNlIGlmKEtlKGUpKXtpZihvPWUuc2xpY2UoKSxLZSh0KSlmb3IobGV0IGk9MCxhPXQubGVuZ3RoO2k8YTtpKyspby5wdXNoKF9uKHRbaV0pKTtlbHNlIGlmKGxlKHQpKXtsZXQgaT1PYmplY3Qua2V5cyh0KTtmb3IobGV0IGE9MCx1PWkubGVuZ3RoO2E8dTthKyspe2xldCBjPWlbYV07b1tjXT1fbih0W2NdKX19fWVsc2UgaWYobGUoZSkpaWYobGUodCkpe2lmKCFEbChlLHQpKXJldHVybiB0O289T2JqZWN0LmFzc2lnbih7fSxlKTtsZXQgaT1PYmplY3Qua2V5cyh0KTtmb3IobGV0IGE9MCx1PWkubGVuZ3RoO2E8dTthKyspe2xldCBjPWlbYV0scz10W2NdO2lmKFhlKHMpKXR5cGVvZiBzPlwidVwiP2RlbGV0ZSBvW2NdOm9bY109cztlbHNle2xldCBmPW9bY10scD1zO2lmKGFvKGUsYyxuKXx8YW8odCxjLG4pKWRlbGV0ZSBvW2NdO2Vsc2V7aWYobGUoZikmJmxlKHApKXtsZXQgZD1uLmdldChmKXx8W10sbT1uLmdldChwKXx8W107ZC5wdXNoKHtvYmo6ZSxrZXk6Y30pLG0ucHVzaCh7b2JqOnQsa2V5OmN9KSxuLnNldChmLGQpLG4uc2V0KHAsbSl9b1tjXT11byhvW2NdLHMscixuKX19fX1lbHNlIG89dDtyZXR1cm4gb319ZnVuY3Rpb24gYW8oZSx0LHIpe2xldCBuPXIuZ2V0KGVbdF0pfHxbXTtmb3IobGV0IG89MCxpPW4ubGVuZ3RoO288aTtvKyspe2xldCBhPW5bb107aWYoYS5rZXk9PT10JiZhLm9iaj09PWUpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gS2UoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gY28oZSl7cmV0dXJuIHR5cGVvZiBlPT1cImZ1bmN0aW9uXCJ9ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIVhlKGUpJiYhS2UoZSkmJiFjbyhlKSYmdHlwZW9mIGU9PVwib2JqZWN0XCJ9ZnVuY3Rpb24gWGUoZSl7cmV0dXJuIHR5cGVvZiBlPT1cInN0cmluZ1wifHx0eXBlb2YgZT09XCJudW1iZXJcInx8dHlwZW9mIGU9PVwiYm9vbGVhblwifHx0eXBlb2YgZT5cInVcInx8ZSBpbnN0YW5jZW9mIERhdGV8fGUgaW5zdGFuY2VvZiBSZWdFeHB8fGU9PT1udWxsfWZ1bmN0aW9uIERsKGUsdCl7cmV0dXJuISghKDAsc28uaXNQbGFpbk9iamVjdCkoZSl8fCEoMCxzby5pc1BsYWluT2JqZWN0KSh0KSl9fSk7dmFyIGZvPV8oRnQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoRnQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7RnQuY2FsbFdpdGhUaW1lb3V0PUZ0LlRpbWVvdXRFcnJvcj12b2lkIDA7dmFyIFllPWNsYXNzIGUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxlLnByb3RvdHlwZSl9fTtGdC5UaW1lb3V0RXJyb3I9WWU7ZnVuY3Rpb24gVWwoZSx0KXtsZXQgcixuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGksYSl7cj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YShuZXcgWWUoXCJPcGVyYXRpb24gdGltZWQgb3V0LlwiKSl9LHQpfSk7cmV0dXJuIFByb21pc2UucmFjZShbZSxuXSkudGhlbihvPT4oY2xlYXJUaW1lb3V0KHIpLG8pLG89Pnt0aHJvdyBjbGVhclRpbWVvdXQociksb30pfUZ0LmNhbGxXaXRoVGltZW91dD1VbH0pO3ZhciBfbz1fKGp0PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGp0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2p0LmlzVXJsSWdub3JlZD1qdC51cmxNYXRjaGVzPXZvaWQgMDtmdW5jdGlvbiBwbyhlLHQpe3JldHVybiB0eXBlb2YgdD09XCJzdHJpbmdcIj9lPT09dDohIWUubWF0Y2godCl9anQudXJsTWF0Y2hlcz1wbztmdW5jdGlvbiBCbChlLHQpe2lmKCF0KXJldHVybiExO2ZvcihsZXQgciBvZiB0KWlmKHBvKGUscikpcmV0dXJuITA7cmV0dXJuITF9anQuaXNVcmxJZ25vcmVkPUJsfSk7dmFyIGhvPV8oemU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoemUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7emUuaXNXcmFwcGVkPXZvaWQgMDtmdW5jdGlvbiBWbChlKXtyZXR1cm4gdHlwZW9mIGU9PVwiZnVuY3Rpb25cIiYmdHlwZW9mIGUuX19vcmlnaW5hbD09XCJmdW5jdGlvblwiJiZ0eXBlb2YgZS5fX3Vud3JhcD09XCJmdW5jdGlvblwiJiZlLl9fd3JhcHBlZD09PSEwfXplLmlzV3JhcHBlZD1WbH0pO3ZhciBFbz1fKCRlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pOyRlLkRlZmVycmVkPXZvaWQgMDt2YXIgaG49Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9wcm9taXNlPW5ldyBQcm9taXNlKCh0LHIpPT57dGhpcy5fcmVzb2x2ZT10LHRoaXMuX3JlamVjdD1yfSl9Z2V0IHByb21pc2UoKXtyZXR1cm4gdGhpcy5fcHJvbWlzZX1yZXNvbHZlKHQpe3RoaXMuX3Jlc29sdmUodCl9cmVqZWN0KHQpe3RoaXMuX3JlamVjdCh0KX19OyRlLkRlZmVycmVkPWhufSk7dmFyIG1vPV8oUWU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoUWUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7UWUuQmluZE9uY2VGdXR1cmU9dm9pZCAwO3ZhciBHbD1FbygpLEVuPWNsYXNze2NvbnN0cnVjdG9yKHQscil7dGhpcy5fY2FsbGJhY2s9dCx0aGlzLl90aGF0PXIsdGhpcy5faXNDYWxsZWQ9ITEsdGhpcy5fZGVmZXJyZWQ9bmV3IEdsLkRlZmVycmVkfWdldCBpc0NhbGxlZCgpe3JldHVybiB0aGlzLl9pc0NhbGxlZH1nZXQgcHJvbWlzZSgpe3JldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlfWNhbGwoLi4udCl7aWYoIXRoaXMuX2lzQ2FsbGVkKXt0aGlzLl9pc0NhbGxlZD0hMDt0cnl7UHJvbWlzZS5yZXNvbHZlKHRoaXMuX2NhbGxiYWNrLmNhbGwodGhpcy5fdGhhdCwuLi50KSkudGhlbihyPT50aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHIpLHI9PnRoaXMuX2RlZmVycmVkLnJlamVjdChyKSl9Y2F0Y2gocil7dGhpcy5fZGVmZXJyZWQucmVqZWN0KHIpfX1yZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZX19O1FlLkJpbmRPbmNlRnV0dXJlPUVufSk7dmFyIFNvPV8oSmU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoSmUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7SmUuX2V4cG9ydD12b2lkIDA7dmFyIFRvPShFKCksdyhsKSksSGw9aWUoKTtmdW5jdGlvbiBGbChlLHQpe3JldHVybiBuZXcgUHJvbWlzZShyPT57VG8uY29udGV4dC53aXRoKCgwLEhsLnN1cHByZXNzVHJhY2luZykoVG8uY29udGV4dC5hY3RpdmUoKSksKCk9PntlLmV4cG9ydCh0LG49PntyKG4pfSl9KX0pfUplLl9leHBvcnQ9Rmx9KTt2YXIgUD1fKFM9PntcInVzZSBzdHJpY3RcIjt2YXIgamw9UyYmUy5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKGUsdCxyLG4pe249PT12b2lkIDAmJihuPXIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbcl19fSl9OmZ1bmN0aW9uKGUsdCxyLG4pe249PT12b2lkIDAmJihuPXIpLGVbbl09dFtyXX0pLFI9UyYmUy5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByIGluIGUpciE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJmpsKHQsZSxyKX07T2JqZWN0LmRlZmluZVByb3BlcnR5KFMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Uy5pbnRlcm5hbD1TLmJhZ2dhZ2VVdGlscz12b2lkIDA7UihwaSgpLFMpO1IoZGkoKSxTKTtSKFRpKCksUyk7UihxcigpLFMpO1Ioa3IoKSxTKTtSKFVpKCksUyk7UihWaSgpLFMpO1IoR2koKSxTKTtTLmJhZ2dhZ2VVdGlscz1WcigpO1IoenIoKSxTKTtSKEZpKCksUyk7UihZaSgpLFMpO1IoJGkoKSxTKTtSKFFpKCksUyk7UihhbigpLFMpO1IoY24oKSxTKTtSKFppKCksUyk7Uih0bygpLFMpO1IoaWUoKSxTKTtSKHJuKCksUyk7UihiZSgpLFMpO1IobG8oKSxTKTtSKFhyKCksUyk7UihmbygpLFMpO1IoX28oKSxTKTtSKGhvKCksUyk7UihtbygpLFMpO1IoWXIoKSxTKTt2YXIga2w9U28oKTtTLmludGVybmFsPXtfZXhwb3J0OmtsLl9leHBvcnR9fSk7dmFyIEhvPV8oU3Q9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoU3QsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7U3QuZGlzYWJsZUluc3RydW1lbnRhdGlvbnM9U3QuZW5hYmxlSW5zdHJ1bWVudGF0aW9ucz1TdC5wYXJzZUluc3RydW1lbnRhdGlvbk9wdGlvbnM9dm9pZCAwO2Z1bmN0aW9uIEdvKGU9W10pe2xldCB0PVtdO2ZvcihsZXQgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl7bGV0IG89ZVtyXTtpZihBcnJheS5pc0FycmF5KG8pKXtsZXQgaT1HbyhvKTt0PXQuY29uY2F0KGkuaW5zdHJ1bWVudGF0aW9ucyl9ZWxzZSB0eXBlb2Ygbz09XCJmdW5jdGlvblwiP3QucHVzaChuZXcgbyk6by5pbnN0cnVtZW50YXRpb25OYW1lJiZ0LnB1c2gobyl9cmV0dXJue2luc3RydW1lbnRhdGlvbnM6dH19U3QucGFyc2VJbnN0cnVtZW50YXRpb25PcHRpb25zPUdvO2Z1bmN0aW9uIGFmKGUsdCxyKXtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspe2xldCBpPWVbbl07dCYmaS5zZXRUcmFjZXJQcm92aWRlcih0KSxyJiZpLnNldE1ldGVyUHJvdmlkZXIociksaS5nZXRDb25maWcoKS5lbmFibGVkfHxpLmVuYWJsZSgpfX1TdC5lbmFibGVJbnN0cnVtZW50YXRpb25zPWFmO2Z1bmN0aW9uIHVmKGUpe2UuZm9yRWFjaCh0PT50LmRpc2FibGUoKSl9U3QuZGlzYWJsZUluc3RydW1lbnRhdGlvbnM9dWZ9KTt2YXIgam89Xyhpcj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpcixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtpci5yZWdpc3Rlckluc3RydW1lbnRhdGlvbnM9dm9pZCAwO3ZhciBGbz0oRSgpLHcobCkpLFRuPUhvKCk7ZnVuY3Rpb24gY2YoZSl7bGV0e2luc3RydW1lbnRhdGlvbnM6dH09KDAsVG4ucGFyc2VJbnN0cnVtZW50YXRpb25PcHRpb25zKShlLmluc3RydW1lbnRhdGlvbnMpLHI9ZS50cmFjZXJQcm92aWRlcnx8Rm8udHJhY2UuZ2V0VHJhY2VyUHJvdmlkZXIoKSxuPWUubWV0ZXJQcm92aWRlcnx8Rm8ubWV0cmljcy5nZXRNZXRlclByb3ZpZGVyKCk7cmV0dXJuKDAsVG4uZW5hYmxlSW5zdHJ1bWVudGF0aW9ucykodCxyLG4pLCgpPT57KDAsVG4uZGlzYWJsZUluc3RydW1lbnRhdGlvbnMpKHQpfX1pci5yZWdpc3Rlckluc3RydW1lbnRhdGlvbnM9Y2Z9KTt2YXIgcGU9e307aW1wb3J0KmFzIHFFIGZyb21cImFzeW5jX2hvb2tzXCI7dmFyIEJzPURyKCgpPT57eihwZSxxRSl9KTt2YXIgZGU9e307aW1wb3J0KmFzIFhFIGZyb21cImV2ZW50c1wiO3ZhciBWcz1EcigoKT0+e3ooZGUsWEUpfSk7dmFyIEdzPV8oX3I9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoX3IsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7X3IuQWJzdHJhY3RBc3luY0hvb2tzQ29udGV4dE1hbmFnZXI9dm9pZCAwO3ZhciBWZj0oVnMoKSx3KGRlKSksR2Y9W1wiYWRkTGlzdGVuZXJcIixcIm9uXCIsXCJvbmNlXCIsXCJwcmVwZW5kTGlzdGVuZXJcIixcInByZXBlbmRPbmNlTGlzdGVuZXJcIl0sQ249Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9rT3RMaXN0ZW5lcnM9U3ltYm9sKFwiT3RMaXN0ZW5lcnNcIiksdGhpcy5fd3JhcHBlZD0hMX1iaW5kKHQscil7cmV0dXJuIHIgaW5zdGFuY2VvZiBWZi5FdmVudEVtaXR0ZXI/dGhpcy5fYmluZEV2ZW50RW1pdHRlcih0LHIpOnR5cGVvZiByPT1cImZ1bmN0aW9uXCI/dGhpcy5fYmluZEZ1bmN0aW9uKHQscik6cn1fYmluZEZ1bmN0aW9uKHQscil7bGV0IG49dGhpcyxvPWZ1bmN0aW9uKC4uLmkpe3JldHVybiBuLndpdGgodCwoKT0+ci5hcHBseSh0aGlzLGkpKX07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFwibGVuZ3RoXCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiExLHZhbHVlOnIubGVuZ3RofSksb31fYmluZEV2ZW50RW1pdHRlcih0LHIpe3JldHVybiB0aGlzLl9nZXRQYXRjaE1hcChyKSE9PXZvaWQgMHx8KHRoaXMuX2NyZWF0ZVBhdGNoTWFwKHIpLEdmLmZvckVhY2gobz0+e3Jbb10hPT12b2lkIDAmJihyW29dPXRoaXMuX3BhdGNoQWRkTGlzdGVuZXIocixyW29dLHQpKX0pLHR5cGVvZiByLnJlbW92ZUxpc3RlbmVyPT1cImZ1bmN0aW9uXCImJihyLnJlbW92ZUxpc3RlbmVyPXRoaXMuX3BhdGNoUmVtb3ZlTGlzdGVuZXIocixyLnJlbW92ZUxpc3RlbmVyKSksdHlwZW9mIHIub2ZmPT1cImZ1bmN0aW9uXCImJihyLm9mZj10aGlzLl9wYXRjaFJlbW92ZUxpc3RlbmVyKHIsci5vZmYpKSx0eXBlb2Ygci5yZW1vdmVBbGxMaXN0ZW5lcnM9PVwiZnVuY3Rpb25cIiYmKHIucmVtb3ZlQWxsTGlzdGVuZXJzPXRoaXMuX3BhdGNoUmVtb3ZlQWxsTGlzdGVuZXJzKHIsci5yZW1vdmVBbGxMaXN0ZW5lcnMpKSkscn1fcGF0Y2hSZW1vdmVMaXN0ZW5lcih0LHIpe2xldCBuPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKG8saSl7dmFyIGE7bGV0IHU9KGE9bi5fZ2V0UGF0Y2hNYXAodCkpPT09bnVsbHx8YT09PXZvaWQgMD92b2lkIDA6YVtvXTtpZih1PT09dm9pZCAwKXJldHVybiByLmNhbGwodGhpcyxvLGkpO2xldCBjPXUuZ2V0KGkpO3JldHVybiByLmNhbGwodGhpcyxvLGN8fGkpfX1fcGF0Y2hSZW1vdmVBbGxMaXN0ZW5lcnModCxyKXtsZXQgbj10aGlzO3JldHVybiBmdW5jdGlvbihvKXtsZXQgaT1uLl9nZXRQYXRjaE1hcCh0KTtyZXR1cm4gaSE9PXZvaWQgMCYmKGFyZ3VtZW50cy5sZW5ndGg9PT0wP24uX2NyZWF0ZVBhdGNoTWFwKHQpOmlbb10hPT12b2lkIDAmJmRlbGV0ZSBpW29dKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19X3BhdGNoQWRkTGlzdGVuZXIodCxyLG4pe2xldCBvPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGksYSl7aWYoby5fd3JhcHBlZClyZXR1cm4gci5jYWxsKHRoaXMsaSxhKTtsZXQgdT1vLl9nZXRQYXRjaE1hcCh0KTt1PT09dm9pZCAwJiYodT1vLl9jcmVhdGVQYXRjaE1hcCh0KSk7bGV0IGM9dVtpXTtjPT09dm9pZCAwJiYoYz1uZXcgV2Vha01hcCx1W2ldPWMpO2xldCBzPW8uYmluZChuLGEpO2Muc2V0KGEscyksby5fd3JhcHBlZD0hMDt0cnl7cmV0dXJuIHIuY2FsbCh0aGlzLGkscyl9ZmluYWxseXtvLl93cmFwcGVkPSExfX19X2NyZWF0ZVBhdGNoTWFwKHQpe2xldCByPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHRbdGhpcy5fa090TGlzdGVuZXJzXT1yLHJ9X2dldFBhdGNoTWFwKHQpe3JldHVybiB0W3RoaXMuX2tPdExpc3RlbmVyc119fTtfci5BYnN0cmFjdEFzeW5jSG9va3NDb250ZXh0TWFuYWdlcj1Dbn0pO3ZhciBIcz1fKGhyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGhyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2hyLkFzeW5jTG9jYWxTdG9yYWdlQ29udGV4dE1hbmFnZXI9dm9pZCAwO3ZhciBIZj0oRSgpLHcobCkpLEZmPShCcygpLHcocGUpKSxqZj1HcygpLE5uPWNsYXNzIGV4dGVuZHMgamYuQWJzdHJhY3RBc3luY0hvb2tzQ29udGV4dE1hbmFnZXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2FzeW5jTG9jYWxTdG9yYWdlPW5ldyBGZi5Bc3luY0xvY2FsU3RvcmFnZX1hY3RpdmUoKXt2YXIgdDtyZXR1cm4odD10aGlzLl9hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpKSE9PW51bGwmJnQhPT12b2lkIDA/dDpIZi5ST09UX0NPTlRFWFR9d2l0aCh0LHIsbiwuLi5vKXtsZXQgaT1uPT1udWxsP3I6ci5iaW5kKG4pO3JldHVybiB0aGlzLl9hc3luY0xvY2FsU3RvcmFnZS5ydW4odCxpLC4uLm8pfWVuYWJsZSgpe3JldHVybiB0aGlzfWRpc2FibGUoKXtyZXR1cm4gdGhpcy5fYXN5bmNMb2NhbFN0b3JhZ2UuZGlzYWJsZSgpLHRoaXN9fTtoci5Bc3luY0xvY2FsU3RvcmFnZUNvbnRleHRNYW5hZ2VyPU5ufSk7dmFyIEJuPV8oZ3Q9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZ3QsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Z3QudG9BbnlWYWx1ZT1ndC50b0tleVZhbHVlPWd0LnRvQXR0cmlidXRlcz12b2lkIDA7ZnVuY3Rpb24gWWYoZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLm1hcCh0PT5Ebih0LGVbdF0pKX1ndC50b0F0dHJpYnV0ZXM9WWY7ZnVuY3Rpb24gRG4oZSx0KXtyZXR1cm57a2V5OmUsdmFsdWU6VW4odCl9fWd0LnRvS2V5VmFsdWU9RG47ZnVuY3Rpb24gVW4oZSl7bGV0IHQ9dHlwZW9mIGU7cmV0dXJuIHQ9PT1cInN0cmluZ1wiP3tzdHJpbmdWYWx1ZTplfTp0PT09XCJudW1iZXJcIj9OdW1iZXIuaXNJbnRlZ2VyKGUpP3tpbnRWYWx1ZTplfTp7ZG91YmxlVmFsdWU6ZX06dD09PVwiYm9vbGVhblwiP3tib29sVmFsdWU6ZX06ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/e2J5dGVzVmFsdWU6ZX06QXJyYXkuaXNBcnJheShlKT97YXJyYXlWYWx1ZTp7dmFsdWVzOmUubWFwKFVuKX19OnQ9PT1cIm9iamVjdFwiJiZlIT1udWxsP3trdmxpc3RWYWx1ZTp7dmFsdWVzOk9iamVjdC5lbnRyaWVzKGUpLm1hcCgoW3Isbl0pPT5EbihyLG4pKX19Ont9fWd0LnRvQW55VmFsdWU9VW59KTt2YXIgbGE9Xyh5dD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh5dCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt5dC50b090bHBTcGFuRXZlbnQ9eXQudG9PdGxwTGluaz15dC5zZGtTcGFuVG9PdGxwU3Bhbj12b2lkIDA7dmFyIFZuPUJuKCk7ZnVuY3Rpb24gemYoZSx0KXt2YXIgcjtsZXQgbj1lLnNwYW5Db250ZXh0KCksbz1lLnN0YXR1cztyZXR1cm57dHJhY2VJZDp0LmVuY29kZVNwYW5Db250ZXh0KG4udHJhY2VJZCksc3BhbklkOnQuZW5jb2RlU3BhbkNvbnRleHQobi5zcGFuSWQpLHBhcmVudFNwYW5JZDp0LmVuY29kZU9wdGlvbmFsU3BhbkNvbnRleHQoZS5wYXJlbnRTcGFuSWQpLHRyYWNlU3RhdGU6KHI9bi50cmFjZVN0YXRlKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuc2VyaWFsaXplKCksbmFtZTplLm5hbWUsa2luZDplLmtpbmQ9PW51bGw/MDplLmtpbmQrMSxzdGFydFRpbWVVbml4TmFubzp0LmVuY29kZUhyVGltZShlLnN0YXJ0VGltZSksZW5kVGltZVVuaXhOYW5vOnQuZW5jb2RlSHJUaW1lKGUuZW5kVGltZSksYXR0cmlidXRlczooMCxWbi50b0F0dHJpYnV0ZXMpKGUuYXR0cmlidXRlcyksZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDplLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQsZXZlbnRzOmUuZXZlbnRzLm1hcChpPT5jYShpLHQpKSxkcm9wcGVkRXZlbnRzQ291bnQ6ZS5kcm9wcGVkRXZlbnRzQ291bnQsc3RhdHVzOntjb2RlOm8uY29kZSxtZXNzYWdlOm8ubWVzc2FnZX0sbGlua3M6ZS5saW5rcy5tYXAoaT0+dWEoaSx0KSksZHJvcHBlZExpbmtzQ291bnQ6ZS5kcm9wcGVkTGlua3NDb3VudH19eXQuc2RrU3BhblRvT3RscFNwYW49emY7ZnVuY3Rpb24gdWEoZSx0KXt2YXIgcjtyZXR1cm57YXR0cmlidXRlczplLmF0dHJpYnV0ZXM/KDAsVm4udG9BdHRyaWJ1dGVzKShlLmF0dHJpYnV0ZXMpOltdLHNwYW5JZDp0LmVuY29kZVNwYW5Db250ZXh0KGUuY29udGV4dC5zcGFuSWQpLHRyYWNlSWQ6dC5lbmNvZGVTcGFuQ29udGV4dChlLmNvbnRleHQudHJhY2VJZCksdHJhY2VTdGF0ZToocj1lLmNvbnRleHQudHJhY2VTdGF0ZSk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnNlcmlhbGl6ZSgpLGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6ZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50fHwwfX15dC50b090bHBMaW5rPXVhO2Z1bmN0aW9uIGNhKGUsdCl7cmV0dXJue2F0dHJpYnV0ZXM6ZS5hdHRyaWJ1dGVzPygwLFZuLnRvQXR0cmlidXRlcykoZS5hdHRyaWJ1dGVzKTpbXSxuYW1lOmUubmFtZSx0aW1lVW5peE5hbm86dC5lbmNvZGVIclRpbWUoZS50aW1lKSxkcm9wcGVkQXR0cmlidXRlc0NvdW50OmUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudHx8MH19eXQudG9PdGxwU3BhbkV2ZW50PWNhfSk7dmFyIGhhPV8oVz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1cuZ2V0T3RscEVuY29kZXI9Vy5lbmNvZGVBc1N0cmluZz1XLmVuY29kZUFzTG9uZ0JpdHM9Vy50b0xvbmdCaXRzPVcuaHJUaW1lVG9OYW5vcz12b2lkIDA7dmFyIFRyPVAoKSwkZj1CaWdJbnQoMWU5KTtmdW5jdGlvbiBHbihlKXtyZXR1cm4gQmlnSW50KGVbMF0pKiRmK0JpZ0ludChlWzFdKX1XLmhyVGltZVRvTmFub3M9R247ZnVuY3Rpb24gcGEoZSl7bGV0IHQ9TnVtYmVyKEJpZ0ludC5hc1VpbnROKDMyLGUpKSxyPU51bWJlcihCaWdJbnQuYXNVaW50TigzMixlPj5CaWdJbnQoMzIpKSk7cmV0dXJue2xvdzp0LGhpZ2g6cn19Vy50b0xvbmdCaXRzPXBhO2Z1bmN0aW9uIEhuKGUpe2xldCB0PUduKGUpO3JldHVybiBwYSh0KX1XLmVuY29kZUFzTG9uZ0JpdHM9SG47ZnVuY3Rpb24gZGEoZSl7cmV0dXJuIEduKGUpLnRvU3RyaW5nKCl9Vy5lbmNvZGVBc1N0cmluZz1kYTt2YXIgUWY9dHlwZW9mIEJpZ0ludDxcInVcIj9kYTpUci5oclRpbWVUb05hbm9zZWNvbmRzO2Z1bmN0aW9uIGZhKGUpe3JldHVybiBlfWZ1bmN0aW9uIF9hKGUpe2lmKGUhPT12b2lkIDApcmV0dXJuKDAsVHIuaGV4VG9CYXNlNjQpKGUpfXZhciBKZj17ZW5jb2RlSHJUaW1lOkhuLGVuY29kZVNwYW5Db250ZXh0OlRyLmhleFRvQmFzZTY0LGVuY29kZU9wdGlvbmFsU3BhbkNvbnRleHQ6X2F9O2Z1bmN0aW9uIFpmKGUpe3ZhciB0LHI7aWYoZT09PXZvaWQgMClyZXR1cm4gSmY7bGV0IG49KHQ9ZS51c2VMb25nQml0cykhPT1udWxsJiZ0IT09dm9pZCAwP3Q6ITAsbz0ocj1lLnVzZUhleCkhPT1udWxsJiZyIT09dm9pZCAwP3I6ITE7cmV0dXJue2VuY29kZUhyVGltZTpuP0huOlFmLGVuY29kZVNwYW5Db250ZXh0Om8/ZmE6VHIuaGV4VG9CYXNlNjQsZW5jb2RlT3B0aW9uYWxTcGFuQ29udGV4dDpvP2ZhOl9hfX1XLmdldE90bHBFbmNvZGVyPVpmfSk7dmFyIEZuPV8oU3I9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoU3IsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7U3IuY3JlYXRlRXhwb3J0VHJhY2VTZXJ2aWNlUmVxdWVzdD12b2lkIDA7dmFyIHRwPUJuKCksZXA9bGEoKSxycD1oYSgpO2Z1bmN0aW9uIG5wKGUsdCl7bGV0IHI9KDAscnAuZ2V0T3RscEVuY29kZXIpKHQpO3JldHVybntyZXNvdXJjZVNwYW5zOm9wKGUscil9fVNyLmNyZWF0ZUV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3Q9bnA7ZnVuY3Rpb24gaXAoZSl7bGV0IHQ9bmV3IE1hcDtmb3IobGV0IHIgb2YgZSl7bGV0IG49dC5nZXQoci5yZXNvdXJjZSk7bnx8KG49bmV3IE1hcCx0LnNldChyLnJlc291cmNlLG4pKTtsZXQgbz1gJHtyLmluc3RydW1lbnRhdGlvbkxpYnJhcnkubmFtZX1AJHtyLmluc3RydW1lbnRhdGlvbkxpYnJhcnkudmVyc2lvbnx8XCJcIn06JHtyLmluc3RydW1lbnRhdGlvbkxpYnJhcnkuc2NoZW1hVXJsfHxcIlwifWAsaT1uLmdldChvKTtpfHwoaT1bXSxuLnNldChvLGkpKSxpLnB1c2gocil9cmV0dXJuIHR9ZnVuY3Rpb24gb3AoZSx0KXtsZXQgcj1pcChlKSxuPVtdLG89ci5lbnRyaWVzKCksaT1vLm5leHQoKTtmb3IoOyFpLmRvbmU7KXtsZXRbYSx1XT1pLnZhbHVlLGM9W10scz11LnZhbHVlcygpLGY9cy5uZXh0KCk7Zm9yKDshZi5kb25lOyl7bGV0IGQ9Zi52YWx1ZTtpZihkLmxlbmd0aD4wKXtsZXR7bmFtZTptLHZlcnNpb246ZyxzY2hlbWFVcmw6Q309ZFswXS5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LE09ZC5tYXAoVD0+KDAsZXAuc2RrU3BhblRvT3RscFNwYW4pKFQsdCkpO2MucHVzaCh7c2NvcGU6e25hbWU6bSx2ZXJzaW9uOmd9LHNwYW5zOk0sc2NoZW1hVXJsOkN9KX1mPXMubmV4dCgpfWxldCBwPXtyZXNvdXJjZTp7YXR0cmlidXRlczooMCx0cC50b0F0dHJpYnV0ZXMpKGEuYXR0cmlidXRlcyksZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDowfSxzY29wZVNwYW5zOmMsc2NoZW1hVXJsOnZvaWQgMH07bi5wdXNoKHApLGk9by5uZXh0KCl9cmV0dXJuIG59fSk7dmFyIFRhPV8oST0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShJLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0kucGFyc2VSZXRyeUFmdGVyVG9NaWxscz1JLmlzRXhwb3J0UmV0cnlhYmxlPUkuaW52YWxpZFRpbWVvdXQ9SS5jb25maWd1cmVFeHBvcnRlclRpbWVvdXQ9SS5hcHBlbmRSb290UGF0aFRvVXJsSWZOZWVkZWQ9SS5hcHBlbmRSZXNvdXJjZVBhdGhUb1VybD1JLnBhcnNlSGVhZGVycz1JLkRFRkFVTFRfRVhQT1JUX0JBQ0tPRkZfTVVMVElQTElFUj1JLkRFRkFVTFRfRVhQT1JUX01BWF9CQUNLT0ZGPUkuREVGQVVMVF9FWFBPUlRfSU5JVElBTF9CQUNLT0ZGPUkuREVGQVVMVF9FWFBPUlRfTUFYX0FUVEVNUFRTPXZvaWQgMDt2YXIgam49KEUoKSx3KGwpKSxFYT1QKCksbWE9MWU0O0kuREVGQVVMVF9FWFBPUlRfTUFYX0FUVEVNUFRTPTU7SS5ERUZBVUxUX0VYUE9SVF9JTklUSUFMX0JBQ0tPRkY9MWUzO0kuREVGQVVMVF9FWFBPUlRfTUFYX0JBQ0tPRkY9NWUzO0kuREVGQVVMVF9FWFBPUlRfQkFDS09GRl9NVUxUSVBMSUVSPTEuNTtmdW5jdGlvbiBzcChlPXt9KXtsZXQgdD17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoW3Isbl0pPT57dHlwZW9mIG48XCJ1XCI/dFtyXT1TdHJpbmcobik6am4uZGlhZy53YXJuKGBIZWFkZXIgXCIke3J9XCIgaGFzIHdyb25nIHZhbHVlIGFuZCB3aWxsIGJlIGlnbm9yZWRgKX0pLHR9SS5wYXJzZUhlYWRlcnM9c3A7ZnVuY3Rpb24gYXAoZSx0KXtyZXR1cm4gZS5lbmRzV2l0aChcIi9cIil8fChlPWUrXCIvXCIpLGUrdH1JLmFwcGVuZFJlc291cmNlUGF0aFRvVXJsPWFwO2Z1bmN0aW9uIHVwKGUpe3RyeXtsZXQgdD1uZXcgVVJMKGUpO3JldHVybiB0LnBhdGhuYW1lPT09XCJcIiYmKHQucGF0aG5hbWU9dC5wYXRobmFtZStcIi9cIiksdC50b1N0cmluZygpfWNhdGNoe3JldHVybiBqbi5kaWFnLndhcm4oYENvdWxkIG5vdCBwYXJzZSBleHBvcnQgVVJMOiAnJHtlfSdgKSxlfX1JLmFwcGVuZFJvb3RQYXRoVG9VcmxJZk5lZWRlZD11cDtmdW5jdGlvbiBjcChlKXtyZXR1cm4gdHlwZW9mIGU9PVwibnVtYmVyXCI/ZTw9MD9rbihlLG1hKTplOmxwKCl9SS5jb25maWd1cmVFeHBvcnRlclRpbWVvdXQ9Y3A7ZnVuY3Rpb24gbHAoKXt2YXIgZTtsZXQgdD1OdW1iZXIoKGU9KDAsRWEuZ2V0RW52KSgpLk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfVElNRU9VVCkhPT1udWxsJiZlIT09dm9pZCAwP2U6KDAsRWEuZ2V0RW52KSgpLk9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUKTtyZXR1cm4gdDw9MD9rbih0LG1hKTp0fWZ1bmN0aW9uIGtuKGUsdCl7cmV0dXJuIGpuLmRpYWcud2FybihcIlRpbWVvdXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiLGUpLHR9SS5pbnZhbGlkVGltZW91dD1rbjtmdW5jdGlvbiBmcChlKXtyZXR1cm5bNDI5LDUwMiw1MDMsNTA0XS5pbmNsdWRlcyhlKX1JLmlzRXhwb3J0UmV0cnlhYmxlPWZwO2Z1bmN0aW9uIHBwKGUpe2lmKGU9PW51bGwpcmV0dXJuLTE7bGV0IHQ9TnVtYmVyLnBhcnNlSW50KGUsMTApO2lmKE51bWJlci5pc0ludGVnZXIodCkpcmV0dXJuIHQ+MD90KjFlMzotMTtsZXQgcj1uZXcgRGF0ZShlKS5nZXRUaW1lKCktRGF0ZS5ub3coKTtyZXR1cm4gcj49MD9yOjB9SS5wYXJzZVJldHJ5QWZ0ZXJUb01pbGxzPXBwfSk7dmFyIGdhPV8oZ3I9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZ3IsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Z3IuT1RMUEV4cG9ydGVyQmFzZT12b2lkIDA7dmFyIFNhPShFKCksdyhsKSksX2U9UCgpLGRwPVRhKCkscW49Y2xhc3N7Y29uc3RydWN0b3IodD17fSl7dGhpcy5fc2VuZGluZ1Byb21pc2VzPVtdLHRoaXMudXJsPXRoaXMuZ2V0RGVmYXVsdFVybCh0KSx0eXBlb2YgdC5ob3N0bmFtZT09XCJzdHJpbmdcIiYmKHRoaXMuaG9zdG5hbWU9dC5ob3N0bmFtZSksdGhpcy5zaHV0ZG93bj10aGlzLnNodXRkb3duLmJpbmQodGhpcyksdGhpcy5fc2h1dGRvd25PbmNlPW5ldyBfZS5CaW5kT25jZUZ1dHVyZSh0aGlzLl9zaHV0ZG93bix0aGlzKSx0aGlzLl9jb25jdXJyZW5jeUxpbWl0PXR5cGVvZiB0LmNvbmN1cnJlbmN5TGltaXQ9PVwibnVtYmVyXCI/dC5jb25jdXJyZW5jeUxpbWl0OjMwLHRoaXMudGltZW91dE1pbGxpcz0oMCxkcC5jb25maWd1cmVFeHBvcnRlclRpbWVvdXQpKHQudGltZW91dE1pbGxpcyksdGhpcy5vbkluaXQodCl9ZXhwb3J0KHQscil7aWYodGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkKXtyKHtjb2RlOl9lLkV4cG9ydFJlc3VsdENvZGUuRkFJTEVELGVycm9yOm5ldyBFcnJvcihcIkV4cG9ydGVyIGhhcyBiZWVuIHNodXRkb3duXCIpfSk7cmV0dXJufWlmKHRoaXMuX3NlbmRpbmdQcm9taXNlcy5sZW5ndGg+PXRoaXMuX2NvbmN1cnJlbmN5TGltaXQpe3Ioe2NvZGU6X2UuRXhwb3J0UmVzdWx0Q29kZS5GQUlMRUQsZXJyb3I6bmV3IEVycm9yKFwiQ29uY3VycmVudCBleHBvcnQgbGltaXQgcmVhY2hlZFwiKX0pO3JldHVybn10aGlzLl9leHBvcnQodCkudGhlbigoKT0+e3Ioe2NvZGU6X2UuRXhwb3J0UmVzdWx0Q29kZS5TVUNDRVNTfSl9KS5jYXRjaChuPT57cih7Y29kZTpfZS5FeHBvcnRSZXN1bHRDb2RlLkZBSUxFRCxlcnJvcjpufSl9KX1fZXhwb3J0KHQpe3JldHVybiBuZXcgUHJvbWlzZSgocixuKT0+e3RyeXtTYS5kaWFnLmRlYnVnKFwiaXRlbXMgdG8gYmUgc2VudFwiLHQpLHRoaXMuc2VuZCh0LHIsbil9Y2F0Y2gobyl7bihvKX19KX1zaHV0ZG93bigpe3JldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuY2FsbCgpfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fc2VuZGluZ1Byb21pc2VzKS50aGVuKCgpPT57fSl9X3NodXRkb3duKCl7cmV0dXJuIFNhLmRpYWcuZGVidWcoXCJzaHV0ZG93biBzdGFydGVkXCIpLHRoaXMub25TaHV0ZG93bigpLHRoaXMuZm9yY2VGbHVzaCgpfX07Z3IuT1RMUEV4cG9ydGVyQmFzZT1xbn0pO3ZhciBSYT1fKCh5bSxBYSk9PntcInVzZSBzdHJpY3RcIjtBYS5leHBvcnRzPUVwO2Z1bmN0aW9uIEVwKGUsdCl7Zm9yKHZhciByPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MCxvPTIsaT0hMDtvPGFyZ3VtZW50cy5sZW5ndGg7KXJbbisrXT1hcmd1bWVudHNbbysrXTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odSxjKXtyW25dPWZ1bmN0aW9uKGYpe2lmKGkpaWYoaT0hMSxmKWMoZik7ZWxzZXtmb3IodmFyIHA9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZD0wO2Q8cC5sZW5ndGg7KXBbZCsrXT1hcmd1bWVudHNbZF07dS5hcHBseShudWxsLHApfX07dHJ5e2UuYXBwbHkodHx8bnVsbCxyKX1jYXRjaChzKXtpJiYoaT0hMSxjKHMpKX19KX19KTt2YXIgUGE9XyhMYT0+e1widXNlIHN0cmljdFwiO3ZhciB2cj1MYTt2ci5sZW5ndGg9ZnVuY3Rpb24odCl7dmFyIHI9dC5sZW5ndGg7aWYoIXIpcmV0dXJuIDA7Zm9yKHZhciBuPTA7LS1yJTQ+MSYmdC5jaGFyQXQocik9PT1cIj1cIjspKytuO3JldHVybiBNYXRoLmNlaWwodC5sZW5ndGgqMykvNC1ufTt2YXIgSnQ9bmV3IEFycmF5KDY0KSxiYT1uZXcgQXJyYXkoMTIzKTtmb3IoWj0wO1o8NjQ7KWJhW0p0W1pdPVo8MjY/Wis2NTpaPDUyP1orNzE6Wjw2Mj9aLTQ6Wi01OXw0M109WisrO3ZhciBaO3ZyLmVuY29kZT1mdW5jdGlvbih0LHIsbil7Zm9yKHZhciBvPW51bGwsaT1bXSxhPTAsdT0wLGM7cjxuOyl7dmFyIHM9dFtyKytdO3N3aXRjaCh1KXtjYXNlIDA6aVthKytdPUp0W3M+PjJdLGM9KHMmMyk8PDQsdT0xO2JyZWFrO2Nhc2UgMTppW2ErK109SnRbY3xzPj40XSxjPShzJjE1KTw8Mix1PTI7YnJlYWs7Y2FzZSAyOmlbYSsrXT1KdFtjfHM+PjZdLGlbYSsrXT1KdFtzJjYzXSx1PTA7YnJlYWt9YT44MTkxJiYoKG98fChvPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxpKSksYT0wKX1yZXR1cm4gdSYmKGlbYSsrXT1KdFtjXSxpW2ErK109NjEsdT09PTEmJihpW2ErK109NjEpKSxvPyhhJiZvLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsaS5zbGljZSgwLGEpKSksby5qb2luKFwiXCIpKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxpLnNsaWNlKDAsYSkpfTt2YXIgT2E9XCJpbnZhbGlkIGVuY29kaW5nXCI7dnIuZGVjb2RlPWZ1bmN0aW9uKHQscixuKXtmb3IodmFyIG89bixpPTAsYSx1PTA7dTx0Lmxlbmd0aDspe3ZhciBjPXQuY2hhckNvZGVBdCh1KyspO2lmKGM9PT02MSYmaT4xKWJyZWFrO2lmKChjPWJhW2NdKT09PXZvaWQgMCl0aHJvdyBFcnJvcihPYSk7c3dpdGNoKGkpe2Nhc2UgMDphPWMsaT0xO2JyZWFrO2Nhc2UgMTpyW24rK109YTw8MnwoYyY0OCk+PjQsYT1jLGk9MjticmVhaztjYXNlIDI6cltuKytdPShhJjE1KTw8NHwoYyY2MCk+PjIsYT1jLGk9MzticmVhaztjYXNlIDM6cltuKytdPShhJjMpPDw2fGMsaT0wO2JyZWFrfX1pZihpPT09MSl0aHJvdyBFcnJvcihPYSk7cmV0dXJuIG4tb307dnIudGVzdD1mdW5jdGlvbih0KXtyZXR1cm4vXig/OltBLVphLXowLTkrL117NH0pKig/OltBLVphLXowLTkrL117Mn09PXxbQS1aYS16MC05Ky9dezN9PSk/JC8udGVzdCh0KX19KTt2YXIgQ2E9XygoQW0sSWEpPT57XCJ1c2Ugc3RyaWN0XCI7SWEuZXhwb3J0cz1BcjtmdW5jdGlvbiBBcigpe3RoaXMuX2xpc3RlbmVycz17fX1Bci5wcm90b3R5cGUub249ZnVuY3Rpb24odCxyLG4pe3JldHVybih0aGlzLl9saXN0ZW5lcnNbdF18fCh0aGlzLl9saXN0ZW5lcnNbdF09W10pKS5wdXNoKHtmbjpyLGN0eDpufHx0aGlzfSksdGhpc307QXIucHJvdG90eXBlLm9mZj1mdW5jdGlvbih0LHIpe2lmKHQ9PT12b2lkIDApdGhpcy5fbGlzdGVuZXJzPXt9O2Vsc2UgaWYocj09PXZvaWQgMCl0aGlzLl9saXN0ZW5lcnNbdF09W107ZWxzZSBmb3IodmFyIG49dGhpcy5fbGlzdGVuZXJzW3RdLG89MDtvPG4ubGVuZ3RoOyluW29dLmZuPT09cj9uLnNwbGljZShvLDEpOisrbztyZXR1cm4gdGhpc307QXIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fbGlzdGVuZXJzW3RdO2lmKHIpe2Zvcih2YXIgbj1bXSxvPTE7bzxhcmd1bWVudHMubGVuZ3RoOyluLnB1c2goYXJndW1lbnRzW28rK10pO2ZvcihvPTA7bzxyLmxlbmd0aDspcltvXS5mbi5hcHBseShyW28rK10uY3R4LG4pfXJldHVybiB0aGlzfX0pO3ZhciBCYT1fKChSbSxVYSk9PntcInVzZSBzdHJpY3RcIjtVYS5leHBvcnRzPU5hKE5hKTtmdW5jdGlvbiBOYShlKXtyZXR1cm4gdHlwZW9mIEZsb2F0MzJBcnJheTxcInVcIj9mdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDMyQXJyYXkoWy0wXSkscj1uZXcgVWludDhBcnJheSh0LmJ1ZmZlciksbj1yWzNdPT09MTI4O2Z1bmN0aW9uIG8oYyxzLGYpe3RbMF09YyxzW2ZdPXJbMF0sc1tmKzFdPXJbMV0sc1tmKzJdPXJbMl0sc1tmKzNdPXJbM119ZnVuY3Rpb24gaShjLHMsZil7dFswXT1jLHNbZl09clszXSxzW2YrMV09clsyXSxzW2YrMl09clsxXSxzW2YrM109clswXX1lLndyaXRlRmxvYXRMRT1uP286aSxlLndyaXRlRmxvYXRCRT1uP2k6bztmdW5jdGlvbiBhKGMscyl7cmV0dXJuIHJbMF09Y1tzXSxyWzFdPWNbcysxXSxyWzJdPWNbcysyXSxyWzNdPWNbcyszXSx0WzBdfWZ1bmN0aW9uIHUoYyxzKXtyZXR1cm4gclszXT1jW3NdLHJbMl09Y1tzKzFdLHJbMV09Y1tzKzJdLHJbMF09Y1tzKzNdLHRbMF19ZS5yZWFkRmxvYXRMRT1uP2E6dSxlLnJlYWRGbG9hdEJFPW4/dTphfSgpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuLG8saSxhKXt2YXIgdT1vPDA/MTowO2lmKHUmJihvPS1vKSxvPT09MCluKDEvbz4wPzA6MjE0NzQ4MzY0OCxpLGEpO2Vsc2UgaWYoaXNOYU4obykpbigyMTQzMjg5MzQ0LGksYSk7ZWxzZSBpZihvPjM0MDI4MjM0NjYzODUyODg2ZTIyKW4oKHU8PDMxfDIxMzkwOTUwNDApPj4+MCxpLGEpO2Vsc2UgaWYobzwxMTc1NDk0MzUwODIyMjg3NWUtNTQpbigodTw8MzF8TWF0aC5yb3VuZChvLzE0MDEyOTg0NjQzMjQ4MTdlLTYwKSk+Pj4wLGksYSk7ZWxzZXt2YXIgYz1NYXRoLmZsb29yKE1hdGgubG9nKG8pL01hdGguTE4yKSxzPU1hdGgucm91bmQobypNYXRoLnBvdygyLC1jKSo4Mzg4NjA4KSY4Mzg4NjA3O24oKHU8PDMxfGMrMTI3PDwyM3xzKT4+PjAsaSxhKX19ZS53cml0ZUZsb2F0TEU9dC5iaW5kKG51bGwsd2EpLGUud3JpdGVGbG9hdEJFPXQuYmluZChudWxsLE1hKTtmdW5jdGlvbiByKG4sbyxpKXt2YXIgYT1uKG8saSksdT0oYT4+MzEpKjIrMSxjPWE+Pj4yMyYyNTUscz1hJjgzODg2MDc7cmV0dXJuIGM9PT0yNTU/cz9OYU46dSooMS8wKTpjPT09MD91KjE0MDEyOTg0NjQzMjQ4MTdlLTYwKnM6dSpNYXRoLnBvdygyLGMtMTUwKSoocys4Mzg4NjA4KX1lLnJlYWRGbG9hdExFPXIuYmluZChudWxsLHhhKSxlLnJlYWRGbG9hdEJFPXIuYmluZChudWxsLERhKX0oKSx0eXBlb2YgRmxvYXQ2NEFycmF5PFwidVwiP2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IEZsb2F0NjRBcnJheShbLTBdKSxyPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxuPXJbN109PT0xMjg7ZnVuY3Rpb24gbyhjLHMsZil7dFswXT1jLHNbZl09clswXSxzW2YrMV09clsxXSxzW2YrMl09clsyXSxzW2YrM109clszXSxzW2YrNF09cls0XSxzW2YrNV09cls1XSxzW2YrNl09cls2XSxzW2YrN109cls3XX1mdW5jdGlvbiBpKGMscyxmKXt0WzBdPWMsc1tmXT1yWzddLHNbZisxXT1yWzZdLHNbZisyXT1yWzVdLHNbZiszXT1yWzRdLHNbZis0XT1yWzNdLHNbZis1XT1yWzJdLHNbZis2XT1yWzFdLHNbZis3XT1yWzBdfWUud3JpdGVEb3VibGVMRT1uP286aSxlLndyaXRlRG91YmxlQkU9bj9pOm87ZnVuY3Rpb24gYShjLHMpe3JldHVybiByWzBdPWNbc10sclsxXT1jW3MrMV0sclsyXT1jW3MrMl0sclszXT1jW3MrM10scls0XT1jW3MrNF0scls1XT1jW3MrNV0scls2XT1jW3MrNl0scls3XT1jW3MrN10sdFswXX1mdW5jdGlvbiB1KGMscyl7cmV0dXJuIHJbN109Y1tzXSxyWzZdPWNbcysxXSxyWzVdPWNbcysyXSxyWzRdPWNbcyszXSxyWzNdPWNbcys0XSxyWzJdPWNbcys1XSxyWzFdPWNbcys2XSxyWzBdPWNbcys3XSx0WzBdfWUucmVhZERvdWJsZUxFPW4/YTp1LGUucmVhZERvdWJsZUJFPW4/dTphfSgpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChuLG8saSxhLHUsYyl7dmFyIHM9YTwwPzE6MDtpZihzJiYoYT0tYSksYT09PTApbigwLHUsYytvKSxuKDEvYT4wPzA6MjE0NzQ4MzY0OCx1LGMraSk7ZWxzZSBpZihpc05hTihhKSluKDAsdSxjK28pLG4oMjE0Njk1OTM2MCx1LGMraSk7ZWxzZSBpZihhPjE3OTc2OTMxMzQ4NjIzMTU3ZTI5MiluKDAsdSxjK28pLG4oKHM8PDMxfDIxNDY0MzUwNzIpPj4+MCx1LGMraSk7ZWxzZXt2YXIgZjtpZihhPDIyMjUwNzM4NTg1MDcyMDE0ZS0zMjQpZj1hLzVlLTMyNCxuKGY+Pj4wLHUsYytvKSxuKChzPDwzMXxmLzQyOTQ5NjcyOTYpPj4+MCx1LGMraSk7ZWxzZXt2YXIgcD1NYXRoLmZsb29yKE1hdGgubG9nKGEpL01hdGguTE4yKTtwPT09MTAyNCYmKHA9MTAyMyksZj1hKk1hdGgucG93KDIsLXApLG4oZio0NTAzNTk5NjI3MzcwNDk2Pj4+MCx1LGMrbyksbigoczw8MzF8cCsxMDIzPDwyMHxmKjEwNDg1NzYmMTA0ODU3NSk+Pj4wLHUsYytpKX19fWUud3JpdGVEb3VibGVMRT10LmJpbmQobnVsbCx3YSwwLDQpLGUud3JpdGVEb3VibGVCRT10LmJpbmQobnVsbCxNYSw0LDApO2Z1bmN0aW9uIHIobixvLGksYSx1KXt2YXIgYz1uKGEsdStvKSxzPW4oYSx1K2kpLGY9KHM+PjMxKSoyKzEscD1zPj4+MjAmMjA0NyxkPTQyOTQ5NjcyOTYqKHMmMTA0ODU3NSkrYztyZXR1cm4gcD09PTIwNDc/ZD9OYU46ZiooMS8wKTpwPT09MD9mKjVlLTMyNCpkOmYqTWF0aC5wb3coMixwLTEwNzUpKihkKzQ1MDM1OTk2MjczNzA0OTYpfWUucmVhZERvdWJsZUxFPXIuYmluZChudWxsLHhhLDAsNCksZS5yZWFkRG91YmxlQkU9ci5iaW5kKG51bGwsRGEsNCwwKX0oKSxlfWZ1bmN0aW9uIHdhKGUsdCxyKXt0W3JdPWUmMjU1LHRbcisxXT1lPj4+OCYyNTUsdFtyKzJdPWU+Pj4xNiYyNTUsdFtyKzNdPWU+Pj4yNH1mdW5jdGlvbiBNYShlLHQscil7dFtyXT1lPj4+MjQsdFtyKzFdPWU+Pj4xNiYyNTUsdFtyKzJdPWU+Pj44JjI1NSx0W3IrM109ZSYyNTV9ZnVuY3Rpb24geGEoZSx0KXtyZXR1cm4oZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0KT4+PjB9ZnVuY3Rpb24gRGEoZSx0KXtyZXR1cm4oZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdKT4+PjB9fSk7dmFyIEdhPV8oKE9tLFZhKT0+e1widXNlIHN0cmljdFwiO1ZhLmV4cG9ydHM9bXA7ZnVuY3Rpb24gbXAoZSl7cmV0dXJuIG51bGx9fSk7dmFyIEZhPV8oSGE9PntcInVzZSBzdHJpY3RcIjt2YXIgS249SGE7S24ubGVuZ3RoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wLG49MCxvPTA7bzx0Lmxlbmd0aDsrK28pbj10LmNoYXJDb2RlQXQobyksbjwxMjg/cis9MTpuPDIwNDg/cis9MjoobiY2NDUxMik9PT01NTI5NiYmKHQuY2hhckNvZGVBdChvKzEpJjY0NTEyKT09PTU2MzIwPygrK28scis9NCk6cis9MztyZXR1cm4gcn07S24ucmVhZD1mdW5jdGlvbih0LHIsbil7dmFyIG89bi1yO2lmKG88MSlyZXR1cm5cIlwiO2Zvcih2YXIgaT1udWxsLGE9W10sdT0wLGM7cjxuOyljPXRbcisrXSxjPDEyOD9hW3UrK109YzpjPjE5MSYmYzwyMjQ/YVt1KytdPShjJjMxKTw8Nnx0W3IrK10mNjM6Yz4yMzkmJmM8MzY1PyhjPSgoYyY3KTw8MTh8KHRbcisrXSY2Myk8PDEyfCh0W3IrK10mNjMpPDw2fHRbcisrXSY2MyktNjU1MzYsYVt1KytdPTU1Mjk2KyhjPj4xMCksYVt1KytdPTU2MzIwKyhjJjEwMjMpKTphW3UrK109KGMmMTUpPDwxMnwodFtyKytdJjYzKTw8Nnx0W3IrK10mNjMsdT44MTkxJiYoKGl8fChpPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxhKSksdT0wKTtyZXR1cm4gaT8odSYmaS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGEuc2xpY2UoMCx1KSkpLGkuam9pbihcIlwiKSk6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsYS5zbGljZSgwLHUpKX07S24ud3JpdGU9ZnVuY3Rpb24odCxyLG4pe2Zvcih2YXIgbz1uLGksYSx1PTA7dTx0Lmxlbmd0aDsrK3UpaT10LmNoYXJDb2RlQXQodSksaTwxMjg/cltuKytdPWk6aTwyMDQ4PyhyW24rK109aT4+NnwxOTIscltuKytdPWkmNjN8MTI4KTooaSY2NDUxMik9PT01NTI5NiYmKChhPXQuY2hhckNvZGVBdCh1KzEpKSY2NDUxMik9PT01NjMyMD8oaT02NTUzNisoKGkmMTAyMyk8PDEwKSsoYSYxMDIzKSwrK3UscltuKytdPWk+PjE4fDI0MCxyW24rK109aT4+MTImNjN8MTI4LHJbbisrXT1pPj42JjYzfDEyOCxyW24rK109aSY2M3wxMjgpOihyW24rK109aT4+MTJ8MjI0LHJbbisrXT1pPj42JjYzfDEyOCxyW24rK109aSY2M3wxMjgpO3JldHVybiBuLW99fSk7dmFyIGthPV8oKExtLGphKT0+e1widXNlIHN0cmljdFwiO2phLmV4cG9ydHM9VHA7ZnVuY3Rpb24gVHAoZSx0LHIpe3ZhciBuPXJ8fDgxOTIsbz1uPj4+MSxpPW51bGwsYT1uO3JldHVybiBmdW5jdGlvbihjKXtpZihjPDF8fGM+bylyZXR1cm4gZShjKTthK2M+biYmKGk9ZShuKSxhPTApO3ZhciBzPXQuY2FsbChpLGEsYSs9Yyk7cmV0dXJuIGEmNyYmKGE9KGF8NykrMSksc319fSk7dmFyIFhhPV8oKFBtLHFhKT0+e1widXNlIHN0cmljdFwiO3FhLmV4cG9ydHM9RDt2YXIgaGU9QXQoKTtmdW5jdGlvbiBEKGUsdCl7dGhpcy5sbz1lPj4+MCx0aGlzLmhpPXQ+Pj4wfXZhciBEdD1ELnplcm89bmV3IEQoMCwwKTtEdC50b051bWJlcj1mdW5jdGlvbigpe3JldHVybiAwfTtEdC56ekVuY29kZT1EdC56ekRlY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtEdC5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gMX07dmFyIFNwPUQuemVyb0hhc2g9XCJcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcIjtELmZyb21OdW1iZXI9ZnVuY3Rpb24odCl7aWYodD09PTApcmV0dXJuIER0O3ZhciByPXQ8MDtyJiYodD0tdCk7dmFyIG49dD4+PjAsbz0odC1uKS80Mjk0OTY3Mjk2Pj4+MDtyZXR1cm4gciYmKG89fm8+Pj4wLG49fm4+Pj4wLCsrbj40Mjk0OTY3Mjk1JiYobj0wLCsrbz40Mjk0OTY3Mjk1JiYobz0wKSkpLG5ldyBEKG4sbyl9O0QuZnJvbT1mdW5jdGlvbih0KXtpZih0eXBlb2YgdD09XCJudW1iZXJcIilyZXR1cm4gRC5mcm9tTnVtYmVyKHQpO2lmKGhlLmlzU3RyaW5nKHQpKWlmKGhlLkxvbmcpdD1oZS5Mb25nLmZyb21TdHJpbmcodCk7ZWxzZSByZXR1cm4gRC5mcm9tTnVtYmVyKHBhcnNlSW50KHQsMTApKTtyZXR1cm4gdC5sb3d8fHQuaGlnaD9uZXcgRCh0Lmxvdz4+PjAsdC5oaWdoPj4+MCk6RHR9O0QucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKHQpe2lmKCF0JiZ0aGlzLmhpPj4+MzEpe3ZhciByPX50aGlzLmxvKzE+Pj4wLG49fnRoaXMuaGk+Pj4wO3JldHVybiByfHwobj1uKzE+Pj4wKSwtKHIrbio0Mjk0OTY3Mjk2KX1yZXR1cm4gdGhpcy5sbyt0aGlzLmhpKjQyOTQ5NjcyOTZ9O0QucHJvdG90eXBlLnRvTG9uZz1mdW5jdGlvbih0KXtyZXR1cm4gaGUuTG9uZz9uZXcgaGUuTG9uZyh0aGlzLmxvfDAsdGhpcy5oaXwwLCEhdCk6e2xvdzp0aGlzLmxvfDAsaGlnaDp0aGlzLmhpfDAsdW5zaWduZWQ6ISF0fX07dmFyIHZ0PVN0cmluZy5wcm90b3R5cGUuY2hhckNvZGVBdDtELmZyb21IYXNoPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09U3A/RHQ6bmV3IEQoKHZ0LmNhbGwodCwwKXx2dC5jYWxsKHQsMSk8PDh8dnQuY2FsbCh0LDIpPDwxNnx2dC5jYWxsKHQsMyk8PDI0KT4+PjAsKHZ0LmNhbGwodCw0KXx2dC5jYWxsKHQsNSk8PDh8dnQuY2FsbCh0LDYpPDwxNnx2dC5jYWxsKHQsNyk8PDI0KT4+PjApfTtELnByb3RvdHlwZS50b0hhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmxvJjI1NSx0aGlzLmxvPj4+OCYyNTUsdGhpcy5sbz4+PjE2JjI1NSx0aGlzLmxvPj4+MjQsdGhpcy5oaSYyNTUsdGhpcy5oaT4+PjgmMjU1LHRoaXMuaGk+Pj4xNiYyNTUsdGhpcy5oaT4+PjI0KX07RC5wcm90b3R5cGUuenpFbmNvZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmhpPj4zMTtyZXR1cm4gdGhpcy5oaT0oKHRoaXMuaGk8PDF8dGhpcy5sbz4+PjMxKV50KT4+PjAsdGhpcy5sbz0odGhpcy5sbzw8MV50KT4+PjAsdGhpc307RC5wcm90b3R5cGUuenpEZWNvZGU9ZnVuY3Rpb24oKXt2YXIgdD0tKHRoaXMubG8mMSk7cmV0dXJuIHRoaXMubG89KCh0aGlzLmxvPj4+MXx0aGlzLmhpPDwzMSledCk+Pj4wLHRoaXMuaGk9KHRoaXMuaGk+Pj4xXnQpPj4+MCx0aGlzfTtELnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxvLHI9KHRoaXMubG8+Pj4yOHx0aGlzLmhpPDw0KT4+PjAsbj10aGlzLmhpPj4+MjQ7cmV0dXJuIG49PT0wP3I9PT0wP3Q8MTYzODQ/dDwxMjg/MToyOnQ8MjA5NzE1Mj8zOjQ6cjwxNjM4ND9yPDEyOD81OjY6cjwyMDk3MTUyPzc6ODpuPDEyOD85OjEwfX0pO3ZhciBBdD1fKFduPT57XCJ1c2Ugc3RyaWN0XCI7dmFyIGg9V247aC5hc1Byb21pc2U9UmEoKTtoLmJhc2U2ND1QYSgpO2guRXZlbnRFbWl0dGVyPUNhKCk7aC5mbG9hdD1CYSgpO2guaW5xdWlyZT1HYSgpO2gudXRmOD1GYSgpO2gucG9vbD1rYSgpO2guTG9uZ0JpdHM9WGEoKTtoLmlzTm9kZT0hISh0eXBlb2YgZ2xvYmFsPFwidVwiJiZnbG9iYWwmJmdsb2JhbC5wcm9jZXNzJiZnbG9iYWwucHJvY2Vzcy52ZXJzaW9ucyYmZ2xvYmFsLnByb2Nlc3MudmVyc2lvbnMubm9kZSk7aC5nbG9iYWw9aC5pc05vZGUmJmdsb2JhbHx8dHlwZW9mIHdpbmRvdzxcInVcIiYmd2luZG93fHx0eXBlb2Ygc2VsZjxcInVcIiYmc2VsZnx8V247aC5lbXB0eUFycmF5PU9iamVjdC5mcmVlemU/T2JqZWN0LmZyZWV6ZShbXSk6W107aC5lbXB0eU9iamVjdD1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoe30pOnt9O2guaXNJbnRlZ2VyPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09XCJudW1iZXJcIiYmaXNGaW5pdGUodCkmJk1hdGguZmxvb3IodCk9PT10fTtoLmlzU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdD09XCJzdHJpbmdcInx8dCBpbnN0YW5jZW9mIFN0cmluZ307aC5pc09iamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIHQ9PVwib2JqZWN0XCJ9O2guaXNzZXQ9aC5pc1NldD1mdW5jdGlvbih0LHIpe3ZhciBuPXRbcl07cmV0dXJuIG4hPW51bGwmJnQuaGFzT3duUHJvcGVydHkocik/dHlwZW9mIG4hPVwib2JqZWN0XCJ8fChBcnJheS5pc0FycmF5KG4pP24ubGVuZ3RoOk9iamVjdC5rZXlzKG4pLmxlbmd0aCk+MDohMX07aC5CdWZmZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9aC5pbnF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjtyZXR1cm4gZS5wcm90b3R5cGUudXRmOFdyaXRlP2U6bnVsbH1jYXRjaHtyZXR1cm4gbnVsbH19KCk7aC5fQnVmZmVyX2Zyb209bnVsbDtoLl9CdWZmZXJfYWxsb2NVbnNhZmU9bnVsbDtoLm5ld0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQ9PVwibnVtYmVyXCI/aC5CdWZmZXI/aC5fQnVmZmVyX2FsbG9jVW5zYWZlKHQpOm5ldyBoLkFycmF5KHQpOmguQnVmZmVyP2guX0J1ZmZlcl9mcm9tKHQpOnR5cGVvZiBVaW50OEFycmF5PlwidVwiP3Q6bmV3IFVpbnQ4QXJyYXkodCl9O2guQXJyYXk9dHlwZW9mIFVpbnQ4QXJyYXk8XCJ1XCI/VWludDhBcnJheTpBcnJheTtoLkxvbmc9aC5nbG9iYWwuZGNvZGVJTyYmaC5nbG9iYWwuZGNvZGVJTy5Mb25nfHxoLmdsb2JhbC5Mb25nfHxoLmlucXVpcmUoXCJsb25nXCIpO2gua2V5MlJlPS9edHJ1ZXxmYWxzZXwwfDEkLztoLmtleTMyUmU9L14tPyg/OjB8WzEtOV1bMC05XSopJC87aC5rZXk2NFJlPS9eKD86W1xcXFx4MDAtXFxcXHhmZl17OH18LT8oPzowfFsxLTldWzAtOV0qKSkkLztoLmxvbmdUb0hhc2g9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/aC5Mb25nQml0cy5mcm9tKHQpLnRvSGFzaCgpOmguTG9uZ0JpdHMuemVyb0hhc2h9O2gubG9uZ0Zyb21IYXNoPWZ1bmN0aW9uKHQscil7dmFyIG49aC5Mb25nQml0cy5mcm9tSGFzaCh0KTtyZXR1cm4gaC5Mb25nP2guTG9uZy5mcm9tQml0cyhuLmxvLG4uaGkscik6bi50b051bWJlcighIXIpfTtmdW5jdGlvbiBLYShlLHQscil7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLG89MDtvPG4ubGVuZ3RoOysrbykoZVtuW29dXT09PXZvaWQgMHx8IXIpJiYoZVtuW29dXT10W25bb11dKTtyZXR1cm4gZX1oLm1lcmdlPUthO2gubGNGaXJzdD1mdW5jdGlvbih0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt0LnN1YnN0cmluZygxKX07ZnVuY3Rpb24gV2EoZSl7ZnVuY3Rpb24gdChyLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIHQpKXJldHVybiBuZXcgdChyLG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibWVzc2FnZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn19KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHQpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwic3RhY2tcIix7dmFsdWU6bmV3IEVycm9yKCkuc3RhY2t8fFwiXCJ9KSxuJiZLYSh0aGlzLG4pfXJldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9LG5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiBlfSxzZXQ6dm9pZCAwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSx0b1N0cmluZzp7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lK1wiOiBcIit0aGlzLm1lc3NhZ2V9LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfX0pLHR9aC5uZXdFcnJvcj1XYTtoLlByb3RvY29sRXJyb3I9V2EoXCJQcm90b2NvbEVycm9yXCIpO2gub25lT2ZHZXR0ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciByPXt9LG49MDtuPHQubGVuZ3RoOysrbilyW3Rbbl1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBvPU9iamVjdC5rZXlzKHRoaXMpLGk9by5sZW5ndGgtMTtpPi0xOy0taSlpZihyW29baV1dPT09MSYmdGhpc1tvW2ldXSE9PXZvaWQgMCYmdGhpc1tvW2ldXSE9PW51bGwpcmV0dXJuIG9baV19fTtoLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihyKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoOysrbil0W25dIT09ciYmZGVsZXRlIHRoaXNbdFtuXV19fTtoLnRvSlNPTk9wdGlvbnM9e2xvbmdzOlN0cmluZyxlbnVtczpTdHJpbmcsYnl0ZXM6U3RyaW5nLGpzb246ITB9O2guX2NvbmZpZ3VyZT1mdW5jdGlvbigpe3ZhciBlPWguQnVmZmVyO2lmKCFlKXtoLl9CdWZmZXJfZnJvbT1oLl9CdWZmZXJfYWxsb2NVbnNhZmU9bnVsbDtyZXR1cm59aC5fQnVmZmVyX2Zyb209ZS5mcm9tIT09VWludDhBcnJheS5mcm9tJiZlLmZyb218fGZ1bmN0aW9uKHIsbil7cmV0dXJuIG5ldyBlKHIsbil9LGguX0J1ZmZlcl9hbGxvY1Vuc2FmZT1lLmFsbG9jVW5zYWZlfHxmdW5jdGlvbihyKXtyZXR1cm4gbmV3IGUocil9fX0pO3ZhciB0aT1fKChDbSxRYSk9PntcInVzZSBzdHJpY3RcIjtRYS5leHBvcnRzPXk7dmFyIFk9QXQoKSxZbixScj1ZLkxvbmdCaXRzLFlhPVkuYmFzZTY0LHphPVkudXRmODtmdW5jdGlvbiBFZShlLHQscil7dGhpcy5mbj1lLHRoaXMubGVuPXQsdGhpcy5uZXh0PXZvaWQgMCx0aGlzLnZhbD1yfWZ1bmN0aW9uICRuKCl7fWZ1bmN0aW9uIGdwKGUpe3RoaXMuaGVhZD1lLmhlYWQsdGhpcy50YWlsPWUudGFpbCx0aGlzLmxlbj1lLmxlbix0aGlzLm5leHQ9ZS5zdGF0ZXN9ZnVuY3Rpb24geSgpe3RoaXMubGVuPTAsdGhpcy5oZWFkPW5ldyBFZSgkbiwwLDApLHRoaXMudGFpbD10aGlzLmhlYWQsdGhpcy5zdGF0ZXM9bnVsbH12YXIgJGE9ZnVuY3Rpb24oKXtyZXR1cm4gWS5CdWZmZXI/ZnVuY3Rpb24oKXtyZXR1cm4oeS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFlufSkoKX06ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHl9fTt5LmNyZWF0ZT0kYSgpO3kuYWxsb2M9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBZLkFycmF5KHQpfTtZLkFycmF5IT09QXJyYXkmJih5LmFsbG9jPVkucG9vbCh5LmFsbG9jLFkuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5KSk7eS5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24odCxyLG4pe3JldHVybiB0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IEVlKHQscixuKSx0aGlzLmxlbis9cix0aGlzfTtmdW5jdGlvbiBRbihlLHQscil7dFtyXT1lJjI1NX1mdW5jdGlvbiB5cChlLHQscil7Zm9yKDtlPjEyNzspdFtyKytdPWUmMTI3fDEyOCxlPj4+PTc7dFtyXT1lfWZ1bmN0aW9uIEpuKGUsdCl7dGhpcy5sZW49ZSx0aGlzLm5leHQ9dm9pZCAwLHRoaXMudmFsPXR9Sm4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRWUucHJvdG90eXBlKTtKbi5wcm90b3R5cGUuZm49eXA7eS5wcm90b3R5cGUudWludDMyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbis9KHRoaXMudGFpbD10aGlzLnRhaWwubmV4dD1uZXcgSm4oKHQ9dD4+PjApPDEyOD8xOnQ8MTYzODQ/Mjp0PDIwOTcxNTI/Mzp0PDI2ODQzNTQ1Nj80OjUsdCkpLmxlbix0aGlzfTt5LnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbih0KXtyZXR1cm4gdDwwP3RoaXMuX3B1c2goWm4sMTAsUnIuZnJvbU51bWJlcih0KSk6dGhpcy51aW50MzIodCl9O3kucHJvdG90eXBlLnNpbnQzMj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy51aW50MzIoKHQ8PDFedD4+MzEpPj4+MCl9O2Z1bmN0aW9uIFpuKGUsdCxyKXtmb3IoO2UuaGk7KXRbcisrXT1lLmxvJjEyN3wxMjgsZS5sbz0oZS5sbz4+Pjd8ZS5oaTw8MjUpPj4+MCxlLmhpPj4+PTc7Zm9yKDtlLmxvPjEyNzspdFtyKytdPWUubG8mMTI3fDEyOCxlLmxvPWUubG8+Pj43O3RbcisrXT1lLmxvfXkucHJvdG90eXBlLnVpbnQ2ND1mdW5jdGlvbih0KXt2YXIgcj1Sci5mcm9tKHQpO3JldHVybiB0aGlzLl9wdXNoKFpuLHIubGVuZ3RoKCkscil9O3kucHJvdG90eXBlLmludDY0PXkucHJvdG90eXBlLnVpbnQ2NDt5LnByb3RvdHlwZS5zaW50NjQ9ZnVuY3Rpb24odCl7dmFyIHI9UnIuZnJvbSh0KS56ekVuY29kZSgpO3JldHVybiB0aGlzLl9wdXNoKFpuLHIubGVuZ3RoKCkscil9O3kucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B1c2goUW4sMSx0PzE6MCl9O2Z1bmN0aW9uIHpuKGUsdCxyKXt0W3JdPWUmMjU1LHRbcisxXT1lPj4+OCYyNTUsdFtyKzJdPWU+Pj4xNiYyNTUsdFtyKzNdPWU+Pj4yNH15LnByb3RvdHlwZS5maXhlZDMyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdXNoKHpuLDQsdD4+PjApfTt5LnByb3RvdHlwZS5zZml4ZWQzMj15LnByb3RvdHlwZS5maXhlZDMyO3kucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24odCl7dmFyIHI9UnIuZnJvbSh0KTtyZXR1cm4gdGhpcy5fcHVzaCh6biw0LHIubG8pLl9wdXNoKHpuLDQsci5oaSl9O3kucHJvdG90eXBlLnNmaXhlZDY0PXkucHJvdG90eXBlLmZpeGVkNjQ7eS5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3B1c2goWS5mbG9hdC53cml0ZUZsb2F0TEUsNCx0KX07eS5wcm90b3R5cGUuZG91YmxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wdXNoKFkuZmxvYXQud3JpdGVEb3VibGVMRSw4LHQpfTt2YXIgdnA9WS5BcnJheS5wcm90b3R5cGUuc2V0P2Z1bmN0aW9uKHQscixuKXtyLnNldCh0LG4pfTpmdW5jdGlvbih0LHIsbil7Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDsrK28pcltuK29dPXRbb119O3kucHJvdG90eXBlLmJ5dGVzPWZ1bmN0aW9uKHQpe3ZhciByPXQubGVuZ3RoPj4+MDtpZighcilyZXR1cm4gdGhpcy5fcHVzaChRbiwxLDApO2lmKFkuaXNTdHJpbmcodCkpe3ZhciBuPXkuYWxsb2Mocj1ZYS5sZW5ndGgodCkpO1lhLmRlY29kZSh0LG4sMCksdD1ufXJldHVybiB0aGlzLnVpbnQzMihyKS5fcHVzaCh2cCxyLHQpfTt5LnByb3RvdHlwZS5zdHJpbmc9ZnVuY3Rpb24odCl7dmFyIHI9emEubGVuZ3RoKHQpO3JldHVybiByP3RoaXMudWludDMyKHIpLl9wdXNoKHphLndyaXRlLHIsdCk6dGhpcy5fcHVzaChRbiwxLDApfTt5LnByb3RvdHlwZS5mb3JrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPW5ldyBncCh0aGlzKSx0aGlzLmhlYWQ9dGhpcy50YWlsPW5ldyBFZSgkbiwwLDApLHRoaXMubGVuPTAsdGhpc307eS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZXM/KHRoaXMuaGVhZD10aGlzLnN0YXRlcy5oZWFkLHRoaXMudGFpbD10aGlzLnN0YXRlcy50YWlsLHRoaXMubGVuPXRoaXMuc3RhdGVzLmxlbix0aGlzLnN0YXRlcz10aGlzLnN0YXRlcy5uZXh0KToodGhpcy5oZWFkPXRoaXMudGFpbD1uZXcgRWUoJG4sMCwwKSx0aGlzLmxlbj0wKSx0aGlzfTt5LnByb3RvdHlwZS5sZGVsaW09ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmhlYWQscj10aGlzLnRhaWwsbj10aGlzLmxlbjtyZXR1cm4gdGhpcy5yZXNldCgpLnVpbnQzMihuKSxuJiYodGhpcy50YWlsLm5leHQ9dC5uZXh0LHRoaXMudGFpbD1yLHRoaXMubGVuKz1uKSx0aGlzfTt5LnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5oZWFkLm5leHQscj10aGlzLmNvbnN0cnVjdG9yLmFsbG9jKHRoaXMubGVuKSxuPTA7dDspdC5mbih0LnZhbCxyLG4pLG4rPXQubGVuLHQ9dC5uZXh0O3JldHVybiByfTt5Ll9jb25maWd1cmU9ZnVuY3Rpb24oZSl7WW49ZSx5LmNyZWF0ZT0kYSgpLFluLl9jb25maWd1cmUoKX19KTt2YXIgdHU9XygoTm0sWmEpPT57XCJ1c2Ugc3RyaWN0XCI7WmEuZXhwb3J0cz1pdDt2YXIgSmE9dGkoKTsoaXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSmEucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aXQ7dmFyIFJ0PUF0KCk7ZnVuY3Rpb24gaXQoKXtKYS5jYWxsKHRoaXMpfWl0Ll9jb25maWd1cmU9ZnVuY3Rpb24oKXtpdC5hbGxvYz1SdC5fQnVmZmVyX2FsbG9jVW5zYWZlLGl0LndyaXRlQnl0ZXNCdWZmZXI9UnQuQnVmZmVyJiZSdC5CdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheSYmUnQuQnVmZmVyLnByb3RvdHlwZS5zZXQubmFtZT09PVwic2V0XCI/ZnVuY3Rpb24odCxyLG4pe3Iuc2V0KHQsbil9OmZ1bmN0aW9uKHQscixuKXtpZih0LmNvcHkpdC5jb3B5KHIsbiwwLHQubGVuZ3RoKTtlbHNlIGZvcih2YXIgbz0wO288dC5sZW5ndGg7KXJbbisrXT10W28rK119fTtpdC5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24odCl7UnQuaXNTdHJpbmcodCkmJih0PVJ0Ll9CdWZmZXJfZnJvbSh0LFwiYmFzZTY0XCIpKTt2YXIgcj10Lmxlbmd0aD4+PjA7cmV0dXJuIHRoaXMudWludDMyKHIpLHImJnRoaXMuX3B1c2goaXQud3JpdGVCeXRlc0J1ZmZlcixyLHQpLHRoaXN9O2Z1bmN0aW9uIEFwKGUsdCxyKXtlLmxlbmd0aDw0MD9SdC51dGY4LndyaXRlKGUsdCxyKTp0LnV0ZjhXcml0ZT90LnV0ZjhXcml0ZShlLHIpOnQud3JpdGUoZSxyKX1pdC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciByPVJ0LkJ1ZmZlci5ieXRlTGVuZ3RoKHQpO3JldHVybiB0aGlzLnVpbnQzMihyKSxyJiZ0aGlzLl9wdXNoKEFwLHIsdCksdGhpc307aXQuX2NvbmZpZ3VyZSgpfSk7dmFyIG5pPV8oKHdtLG91KT0+e1widXNlIHN0cmljdFwiO291LmV4cG9ydHM9Tjt2YXIgdHQ9QXQoKSxyaSxudT10dC5Mb25nQml0cyxScD10dC51dGY4O2Z1bmN0aW9uIGV0KGUsdCl7cmV0dXJuIFJhbmdlRXJyb3IoXCJpbmRleCBvdXQgb2YgcmFuZ2U6IFwiK2UucG9zK1wiICsgXCIrKHR8fDEpK1wiID4gXCIrZS5sZW4pfWZ1bmN0aW9uIE4oZSl7dGhpcy5idWY9ZSx0aGlzLnBvcz0wLHRoaXMubGVuPWUubGVuZ3RofXZhciBldT10eXBlb2YgVWludDhBcnJheTxcInVcIj9mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheXx8QXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gbmV3IE4odCk7dGhyb3cgRXJyb3IoXCJpbGxlZ2FsIGJ1ZmZlclwiKX06ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gbmV3IE4odCk7dGhyb3cgRXJyb3IoXCJpbGxlZ2FsIGJ1ZmZlclwiKX0saXU9ZnVuY3Rpb24oKXtyZXR1cm4gdHQuQnVmZmVyP2Z1bmN0aW9uKHIpe3JldHVybihOLmNyZWF0ZT1mdW5jdGlvbihvKXtyZXR1cm4gdHQuQnVmZmVyLmlzQnVmZmVyKG8pP25ldyByaShvKTpldShvKX0pKHIpfTpldX07Ti5jcmVhdGU9aXUoKTtOLnByb3RvdHlwZS5fc2xpY2U9dHQuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5fHx0dC5BcnJheS5wcm90b3R5cGUuc2xpY2U7Ti5wcm90b3R5cGUudWludDMyPWZ1bmN0aW9uKCl7dmFyIHQ9NDI5NDk2NzI5NTtyZXR1cm4gZnVuY3Rpb24oKXtpZih0PSh0aGlzLmJ1Zlt0aGlzLnBvc10mMTI3KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4fHwodD0odHwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PDcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpfHwodD0odHwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PDE0KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXx8KHQ9KHR8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDwyMSk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOCl8fCh0PSh0fCh0aGlzLmJ1Zlt0aGlzLnBvc10mMTUpPDwyOCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOCkpcmV0dXJuIHQ7aWYoKHRoaXMucG9zKz01KT50aGlzLmxlbil0aHJvdyB0aGlzLnBvcz10aGlzLmxlbixldCh0aGlzLDEwKTtyZXR1cm4gdH19KCk7Ti5wcm90b3R5cGUuaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aW50MzIoKXwwfTtOLnByb3RvdHlwZS5zaW50MzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnVpbnQzMigpO3JldHVybiB0Pj4+MV4tKHQmMSl8MH07ZnVuY3Rpb24gZWkoKXt2YXIgZT1uZXcgbnUoMCwwKSx0PTA7aWYodGhpcy5sZW4tdGhpcy5wb3M+NCl7Zm9yKDt0PDQ7Kyt0KWlmKGUubG89KGUubG98KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDx0KjcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGU7aWYoZS5sbz0oZS5sb3wodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PDI4KT4+PjAsZS5oaT0oZS5oaXwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk+PjQpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIGU7dD0wfWVsc2V7Zm9yKDt0PDM7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgZXQodGhpcyk7aWYoZS5sbz0oZS5sb3wodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PHQqNyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gZX1yZXR1cm4gZS5sbz0oZS5sb3wodGhpcy5idWZbdGhpcy5wb3MrK10mMTI3KTw8dCo3KT4+PjAsZX1pZih0aGlzLmxlbi10aGlzLnBvcz40KXtmb3IoO3Q8NTsrK3QpaWYoZS5oaT0oZS5oaXwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PHQqNyszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfWVsc2UgZm9yKDt0PDU7Kyt0KXtpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgZXQodGhpcyk7aWYoZS5oaT0oZS5oaXwodGhpcy5idWZbdGhpcy5wb3NdJjEyNyk8PHQqNyszKT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiBlfXRocm93IEVycm9yKFwiaW52YWxpZCB2YXJpbnQgZW5jb2RpbmdcIil9Ti5wcm90b3R5cGUuYm9vbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVpbnQzMigpIT09MH07ZnVuY3Rpb24gT3IoZSx0KXtyZXR1cm4oZVt0LTRdfGVbdC0zXTw8OHxlW3QtMl08PDE2fGVbdC0xXTw8MjQpPj4+MH1OLnByb3RvdHlwZS5maXhlZDMyPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrND50aGlzLmxlbil0aHJvdyBldCh0aGlzLDQpO3JldHVybiBPcih0aGlzLmJ1Zix0aGlzLnBvcys9NCl9O04ucHJvdG90eXBlLnNmaXhlZDMyPWZ1bmN0aW9uKCl7aWYodGhpcy5wb3MrND50aGlzLmxlbil0aHJvdyBldCh0aGlzLDQpO3JldHVybiBPcih0aGlzLmJ1Zix0aGlzLnBvcys9NCl8MH07ZnVuY3Rpb24gcnUoKXtpZih0aGlzLnBvcys4PnRoaXMubGVuKXRocm93IGV0KHRoaXMsOCk7cmV0dXJuIG5ldyBudShPcih0aGlzLmJ1Zix0aGlzLnBvcys9NCksT3IodGhpcy5idWYsdGhpcy5wb3MrPTQpKX1OLnByb3RvdHlwZS5mbG9hdD1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgZXQodGhpcyw0KTt2YXIgdD10dC5mbG9hdC5yZWFkRmxvYXRMRSh0aGlzLmJ1Zix0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9O04ucHJvdG90eXBlLmRvdWJsZT1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzg+dGhpcy5sZW4pdGhyb3cgZXQodGhpcyw0KTt2YXIgdD10dC5mbG9hdC5yZWFkRG91YmxlTEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9OCx0fTtOLnByb3RvdHlwZS5ieXRlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMudWludDMyKCkscj10aGlzLnBvcyxuPXRoaXMucG9zK3Q7aWYobj50aGlzLmxlbil0aHJvdyBldCh0aGlzLHQpO2lmKHRoaXMucG9zKz10LEFycmF5LmlzQXJyYXkodGhpcy5idWYpKXJldHVybiB0aGlzLmJ1Zi5zbGljZShyLG4pO2lmKHI9PT1uKXt2YXIgbz10dC5CdWZmZXI7cmV0dXJuIG8/by5hbGxvYygwKTpuZXcgdGhpcy5idWYuY29uc3RydWN0b3IoMCl9cmV0dXJuIHRoaXMuX3NsaWNlLmNhbGwodGhpcy5idWYscixuKX07Ti5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ieXRlcygpO3JldHVybiBScC5yZWFkKHQsMCx0Lmxlbmd0aCl9O04ucHJvdG90eXBlLnNraXA9ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQ9PVwibnVtYmVyXCIpe2lmKHRoaXMucG9zK3Q+dGhpcy5sZW4pdGhyb3cgZXQodGhpcyx0KTt0aGlzLnBvcys9dH1lbHNlIGRvIGlmKHRoaXMucG9zPj10aGlzLmxlbil0aHJvdyBldCh0aGlzKTt3aGlsZSh0aGlzLmJ1Zlt0aGlzLnBvcysrXSYxMjgpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5za2lwVHlwZT1mdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSAwOnRoaXMuc2tpcCgpO2JyZWFrO2Nhc2UgMTp0aGlzLnNraXAoOCk7YnJlYWs7Y2FzZSAyOnRoaXMuc2tpcCh0aGlzLnVpbnQzMigpKTticmVhaztjYXNlIDM6Zm9yKDsoZT10aGlzLnVpbnQzMigpJjcpIT09NDspdGhpcy5za2lwVHlwZShlKTticmVhaztjYXNlIDU6dGhpcy5za2lwKDQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoXCJpbnZhbGlkIHdpcmUgdHlwZSBcIitlK1wiIGF0IG9mZnNldCBcIit0aGlzLnBvcyl9cmV0dXJuIHRoaXN9O04uX2NvbmZpZ3VyZT1mdW5jdGlvbihlKXtyaT1lLE4uY3JlYXRlPWl1KCkscmkuX2NvbmZpZ3VyZSgpO3ZhciB0PXR0Lkxvbmc/XCJ0b0xvbmdcIjpcInRvTnVtYmVyXCI7dHQubWVyZ2UoTi5wcm90b3R5cGUse2ludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIGVpLmNhbGwodGhpcylbdF0oITEpfSx1aW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gZWkuY2FsbCh0aGlzKVt0XSghMCl9LHNpbnQ2NDpmdW5jdGlvbigpe3JldHVybiBlaS5jYWxsKHRoaXMpLnp6RGVjb2RlKClbdF0oITEpfSxmaXhlZDY0OmZ1bmN0aW9uKCl7cmV0dXJuIHJ1LmNhbGwodGhpcylbdF0oITApfSxzZml4ZWQ2NDpmdW5jdGlvbigpe3JldHVybiBydS5jYWxsKHRoaXMpW3RdKCExKX19KX19KTt2YXIgY3U9XygoTW0sdXUpPT57XCJ1c2Ugc3RyaWN0XCI7dXUuZXhwb3J0cz1VdDt2YXIgYXU9bmkoKTsoVXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYXUucHJvdG90eXBlKSkuY29uc3RydWN0b3I9VXQ7dmFyIHN1PUF0KCk7ZnVuY3Rpb24gVXQoZSl7YXUuY2FsbCh0aGlzLGUpfVV0Ll9jb25maWd1cmU9ZnVuY3Rpb24oKXtzdS5CdWZmZXImJihVdC5wcm90b3R5cGUuX3NsaWNlPXN1LkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpfTtVdC5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy51aW50MzIoKTtyZXR1cm4gdGhpcy5idWYudXRmOFNsaWNlP3RoaXMuYnVmLnV0ZjhTbGljZSh0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcyt0LHRoaXMubGVuKSk6dGhpcy5idWYudG9TdHJpbmcoXCJ1dGYtOFwiLHRoaXMucG9zLHRoaXMucG9zPU1hdGgubWluKHRoaXMucG9zK3QsdGhpcy5sZW4pKX07VXQuX2NvbmZpZ3VyZSgpfSk7dmFyIGZ1PV8oKHhtLGx1KT0+e1widXNlIHN0cmljdFwiO2x1LmV4cG9ydHM9bWU7dmFyIGlpPUF0KCk7KG1lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGlpLkV2ZW50RW1pdHRlci5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1tZTtmdW5jdGlvbiBtZShlLHQscil7aWYodHlwZW9mIGUhPVwiZnVuY3Rpb25cIil0aHJvdyBUeXBlRXJyb3IoXCJycGNJbXBsIG11c3QgYmUgYSBmdW5jdGlvblwiKTtpaS5FdmVudEVtaXR0ZXIuY2FsbCh0aGlzKSx0aGlzLnJwY0ltcGw9ZSx0aGlzLnJlcXVlc3REZWxpbWl0ZWQ9ISF0LHRoaXMucmVzcG9uc2VEZWxpbWl0ZWQ9ISFyfW1lLnByb3RvdHlwZS5ycGNDYWxsPWZ1bmN0aW9uIGUodCxyLG4sbyxpKXtpZighbyl0aHJvdyBUeXBlRXJyb3IoXCJyZXF1ZXN0IG11c3QgYmUgc3BlY2lmaWVkXCIpO3ZhciBhPXRoaXM7aWYoIWkpcmV0dXJuIGlpLmFzUHJvbWlzZShlLGEsdCxyLG4sbyk7aWYoIWEucnBjSW1wbCl7c2V0VGltZW91dChmdW5jdGlvbigpe2koRXJyb3IoXCJhbHJlYWR5IGVuZGVkXCIpKX0sMCk7cmV0dXJufXRyeXtyZXR1cm4gYS5ycGNJbXBsKHQsclthLnJlcXVlc3REZWxpbWl0ZWQ/XCJlbmNvZGVEZWxpbWl0ZWRcIjpcImVuY29kZVwiXShvKS5maW5pc2goKSxmdW5jdGlvbihjLHMpe2lmKGMpcmV0dXJuIGEuZW1pdChcImVycm9yXCIsYyx0KSxpKGMpO2lmKHM9PT1udWxsKXthLmVuZCghMCk7cmV0dXJufWlmKCEocyBpbnN0YW5jZW9mIG4pKXRyeXtzPW5bYS5yZXNwb25zZURlbGltaXRlZD9cImRlY29kZURlbGltaXRlZFwiOlwiZGVjb2RlXCJdKHMpfWNhdGNoKGYpe3JldHVybiBhLmVtaXQoXCJlcnJvclwiLGYsdCksaShmKX1yZXR1cm4gYS5lbWl0KFwiZGF0YVwiLHMsdCksaShudWxsLHMpfSl9Y2F0Y2godSl7YS5lbWl0KFwiZXJyb3JcIix1LHQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpKHUpfSwwKTtyZXR1cm59fTttZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJwY0ltcGwmJih0fHx0aGlzLnJwY0ltcGwobnVsbCxudWxsLG51bGwpLHRoaXMucnBjSW1wbD1udWxsLHRoaXMuZW1pdChcImVuZFwiKS5vZmYoKSksdGhpc319KTt2YXIgZHU9XyhwdT0+e1widXNlIHN0cmljdFwiO3ZhciBPcD1wdTtPcC5TZXJ2aWNlPWZ1KCl9KTt2YXIgaHU9XygoVW0sX3UpPT57XCJ1c2Ugc3RyaWN0XCI7X3UuZXhwb3J0cz17fX0pO3ZhciBUdT1fKG11PT57XCJ1c2Ugc3RyaWN0XCI7dmFyIEY9bXU7Ri5idWlsZD1cIm1pbmltYWxcIjtGLldyaXRlcj10aSgpO0YuQnVmZmVyV3JpdGVyPXR1KCk7Ri5SZWFkZXI9bmkoKTtGLkJ1ZmZlclJlYWRlcj1jdSgpO0YudXRpbD1BdCgpO0YucnBjPWR1KCk7Ri5yb290cz1odSgpO0YuY29uZmlndXJlPUV1O2Z1bmN0aW9uIEV1KCl7Ri51dGlsLl9jb25maWd1cmUoKSxGLldyaXRlci5fY29uZmlndXJlKEYuQnVmZmVyV3JpdGVyKSxGLlJlYWRlci5fY29uZmlndXJlKEYuQnVmZmVyUmVhZGVyKX1FdSgpfSk7dmFyIGd1PV8oKFZtLFN1KT0+e1widXNlIHN0cmljdFwiO1N1LmV4cG9ydHM9VHUoKX0pO0UoKTt2YXIgS3Q9dihQKCkpO0UoKTt2YXIgYj12KFAoKSksaHQ9dihzZSgpKTt2YXIgZ289XCJleGNlcHRpb25cIjt2YXIgcWw9ZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZTeW1ib2wuaXRlcmF0b3Iscj10JiZlW3RdLG49MDtpZihyKXJldHVybiByLmNhbGwoZSk7aWYoZSYmdHlwZW9mIGUubGVuZ3RoPT1cIm51bWJlclwiKXJldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGUmJm4+PWUubGVuZ3RoJiYoZT12b2lkIDApLHt2YWx1ZTplJiZlW24rK10sZG9uZTohZX19fTt0aHJvdyBuZXcgVHlwZUVycm9yKHQ/XCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiOlwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKX0sWGw9ZnVuY3Rpb24oZSx0KXt2YXIgcj10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighcilyZXR1cm4gZTt2YXIgbj1yLmNhbGwoZSksbyxpPVtdLGE7dHJ5e2Zvcig7KHQ9PT12b2lkIDB8fHQtLSA+MCkmJiEobz1uLm5leHQoKSkuZG9uZTspaS5wdXNoKG8udmFsdWUpfWNhdGNoKHUpe2E9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihyPW4ucmV0dXJuKSYmci5jYWxsKG4pfWZpbmFsbHl7aWYoYSl0aHJvdyBhLmVycm9yfX1yZXR1cm4gaX0seW89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscixuLG8saSxhLHUsYyxzLGYpe3U9PT12b2lkIDAmJih1PVtdKSx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5saW5rcz1bXSx0aGlzLmV2ZW50cz1bXSx0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50PTAsdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50PTAsdGhpcy5fZHJvcHBlZExpbmtzQ291bnQ9MCx0aGlzLnN0YXR1cz17Y29kZTpsLlNwYW5TdGF0dXNDb2RlLlVOU0VUfSx0aGlzLmVuZFRpbWU9WzAsMF0sdGhpcy5fZW5kZWQ9ITEsdGhpcy5fZHVyYXRpb249Wy0xLC0xXSx0aGlzLm5hbWU9bix0aGlzLl9zcGFuQ29udGV4dD1vLHRoaXMucGFyZW50U3BhbklkPWEsdGhpcy5raW5kPWksdGhpcy5saW5rcz11O3ZhciBwPURhdGUubm93KCk7dGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWU9Yi5vdHBlcmZvcm1hbmNlLm5vdygpLHRoaXMuX3BlcmZvcm1hbmNlT2Zmc2V0PXAtKHRoaXMuX3BlcmZvcm1hbmNlU3RhcnRUaW1lKygwLGIuZ2V0VGltZU9yaWdpbikoKSksdGhpcy5fc3RhcnRUaW1lUHJvdmlkZWQ9YyE9bnVsbCx0aGlzLnN0YXJ0VGltZT10aGlzLl9nZXRUaW1lKGM/P3ApLHRoaXMucmVzb3VyY2U9dC5yZXNvdXJjZSx0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnk9dC5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LHRoaXMuX3NwYW5MaW1pdHM9dC5nZXRTcGFuTGltaXRzKCksZiE9bnVsbCYmdGhpcy5zZXRBdHRyaWJ1dGVzKGYpLHRoaXMuX3NwYW5Qcm9jZXNzb3I9dC5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCksdGhpcy5fc3BhblByb2Nlc3Nvci5vblN0YXJ0KHRoaXMsciksdGhpcy5fYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdD10aGlzLl9zcGFuTGltaXRzLmF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR8fDB9cmV0dXJuIGUucHJvdG90eXBlLnNwYW5Db250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwYW5Db250ZXh0fSxlLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gcj09bnVsbHx8dGhpcy5faXNTcGFuRW5kZWQoKT90aGlzOnQubGVuZ3RoPT09MD8obC5kaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSBrZXk6IFwiK3QpLHRoaXMpOigwLGIuaXNBdHRyaWJ1dGVWYWx1ZSkocik/T2JqZWN0LmtleXModGhpcy5hdHRyaWJ1dGVzKS5sZW5ndGg+PXRoaXMuX3NwYW5MaW1pdHMuYXR0cmlidXRlQ291bnRMaW1pdCYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmF0dHJpYnV0ZXMsdCk/KHRoaXMuX2Ryb3BwZWRBdHRyaWJ1dGVzQ291bnQrKyx0aGlzKToodGhpcy5hdHRyaWJ1dGVzW3RdPXRoaXMuX3RydW5jYXRlVG9TaXplKHIpLHRoaXMpOihsLmRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIHZhbHVlIHNldCBmb3Iga2V5OiBcIit0KSx0aGlzKX0sZS5wcm90b3R5cGUuc2V0QXR0cmlidXRlcz1mdW5jdGlvbih0KXt2YXIgcixuO3RyeXtmb3IodmFyIG89cWwoT2JqZWN0LmVudHJpZXModCkpLGk9by5uZXh0KCk7IWkuZG9uZTtpPW8ubmV4dCgpKXt2YXIgYT1YbChpLnZhbHVlLDIpLHU9YVswXSxjPWFbMV07dGhpcy5zZXRBdHRyaWJ1dGUodSxjKX19Y2F0Y2gocyl7cj17ZXJyb3I6c319ZmluYWxseXt0cnl7aSYmIWkuZG9uZSYmKG49by5yZXR1cm4pJiZuLmNhbGwobyl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5hZGRFdmVudD1mdW5jdGlvbih0LHIsbil7aWYodGhpcy5faXNTcGFuRW5kZWQoKSlyZXR1cm4gdGhpcztpZih0aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdD09PTApcmV0dXJuIGwuZGlhZy53YXJuKFwiTm8gZXZlbnRzIGFsbG93ZWQuXCIpLHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrLHRoaXM7dGhpcy5ldmVudHMubGVuZ3RoPj10aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCYmKGwuZGlhZy53YXJuKFwiRHJvcHBpbmcgZXh0cmEgZXZlbnRzLlwiKSx0aGlzLmV2ZW50cy5zaGlmdCgpLHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrKSwoMCxiLmlzVGltZUlucHV0KShyKSYmKCgwLGIuaXNUaW1lSW5wdXQpKG4pfHwobj1yKSxyPXZvaWQgMCk7dmFyIG89KDAsYi5zYW5pdGl6ZUF0dHJpYnV0ZXMpKHIpO3JldHVybiB0aGlzLmV2ZW50cy5wdXNoKHtuYW1lOnQsYXR0cmlidXRlczpvLHRpbWU6dGhpcy5fZ2V0VGltZShuKSxkcm9wcGVkQXR0cmlidXRlc0NvdW50OjB9KSx0aGlzfSxlLnByb3RvdHlwZS5zZXRTdGF0dXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2lzU3BhbkVuZGVkKCk/dGhpczoodGhpcy5zdGF0dXM9dCx0aGlzKX0sZS5wcm90b3R5cGUudXBkYXRlTmFtZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXNTcGFuRW5kZWQoKT90aGlzOih0aGlzLm5hbWU9dCx0aGlzKX0sZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2lzU3BhbkVuZGVkKCkpe2wuZGlhZy5lcnJvcih0aGlzLm5hbWUrXCIgXCIrdGhpcy5fc3BhbkNvbnRleHQudHJhY2VJZCtcIi1cIit0aGlzLl9zcGFuQ29udGV4dC5zcGFuSWQrXCIgLSBZb3UgY2FuIG9ubHkgY2FsbCBlbmQoKSBvbiBhIHNwYW4gb25jZS5cIik7cmV0dXJufXRoaXMuX2VuZGVkPSEwLHRoaXMuZW5kVGltZT10aGlzLl9nZXRUaW1lKHQpLHRoaXMuX2R1cmF0aW9uPSgwLGIuaHJUaW1lRHVyYXRpb24pKHRoaXMuc3RhcnRUaW1lLHRoaXMuZW5kVGltZSksdGhpcy5fZHVyYXRpb25bMF08MCYmKGwuZGlhZy53YXJuKFwiSW5jb25zaXN0ZW50IHN0YXJ0IGFuZCBlbmQgdGltZSwgc3RhcnRUaW1lID4gZW5kVGltZS4gU2V0dGluZyBzcGFuIGR1cmF0aW9uIHRvIDBtcy5cIix0aGlzLnN0YXJ0VGltZSx0aGlzLmVuZFRpbWUpLHRoaXMuZW5kVGltZT10aGlzLnN0YXJ0VGltZS5zbGljZSgpLHRoaXMuX2R1cmF0aW9uPVswLDBdKSx0aGlzLl9zcGFuUHJvY2Vzc29yLm9uRW5kKHRoaXMpfSxlLnByb3RvdHlwZS5fZ2V0VGltZT1mdW5jdGlvbih0KXtpZih0eXBlb2YgdD09XCJudW1iZXJcIiYmdDxiLm90cGVyZm9ybWFuY2Uubm93KCkpcmV0dXJuKDAsYi5oclRpbWUpKHQrdGhpcy5fcGVyZm9ybWFuY2VPZmZzZXQpO2lmKHR5cGVvZiB0PT1cIm51bWJlclwiKXJldHVybigwLGIubWlsbGlzVG9IclRpbWUpKHQpO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybigwLGIubWlsbGlzVG9IclRpbWUpKHQuZ2V0VGltZSgpKTtpZigoMCxiLmlzVGltZUlucHV0SHJUaW1lKSh0KSlyZXR1cm4gdDtpZih0aGlzLl9zdGFydFRpbWVQcm92aWRlZClyZXR1cm4oMCxiLm1pbGxpc1RvSHJUaW1lKShEYXRlLm5vdygpKTt2YXIgcj1iLm90cGVyZm9ybWFuY2Uubm93KCktdGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWU7cmV0dXJuKDAsYi5hZGRIclRpbWVzKSh0aGlzLnN0YXJ0VGltZSwoMCxiLm1pbGxpc1RvSHJUaW1lKShyKSl9LGUucHJvdG90eXBlLmlzUmVjb3JkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZGVkPT09ITF9LGUucHJvdG90eXBlLnJlY29yZEV4Y2VwdGlvbj1mdW5jdGlvbih0LHIpe3ZhciBuPXt9O3R5cGVvZiB0PT1cInN0cmluZ1wiP25baHQuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9NRVNTQUdFXT10OnQmJih0LmNvZGU/bltodC5TZW1hbnRpY0F0dHJpYnV0ZXMuRVhDRVBUSU9OX1RZUEVdPXQuY29kZS50b1N0cmluZygpOnQubmFtZSYmKG5baHQuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9UWVBFXT10Lm5hbWUpLHQubWVzc2FnZSYmKG5baHQuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9NRVNTQUdFXT10Lm1lc3NhZ2UpLHQuc3RhY2smJihuW2h0LlNlbWFudGljQXR0cmlidXRlcy5FWENFUFRJT05fU1RBQ0tUUkFDRV09dC5zdGFjaykpLG5baHQuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9UWVBFXXx8bltodC5TZW1hbnRpY0F0dHJpYnV0ZXMuRVhDRVBUSU9OX01FU1NBR0VdP3RoaXMuYWRkRXZlbnQoZ28sbixyKTpsLmRpYWcud2FybihcIkZhaWxlZCB0byByZWNvcmQgYW4gZXhjZXB0aW9uIFwiK3QpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJkdXJhdGlvblwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiZW5kZWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZGVkfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Ryb3BwZWRBdHRyaWJ1dGVzQ291bnR9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiZHJvcHBlZEV2ZW50c0NvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnR9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiZHJvcHBlZExpbmtzQ291bnRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Ryb3BwZWRMaW5rc0NvdW50fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLl9pc1NwYW5FbmRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbmRlZCYmbC5kaWFnLndhcm4oXCJDYW4gbm90IGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBvbiBlbmRlZCBTcGFuIHt0cmFjZUlkOiBcIit0aGlzLl9zcGFuQ29udGV4dC50cmFjZUlkK1wiLCBzcGFuSWQ6IFwiK3RoaXMuX3NwYW5Db250ZXh0LnNwYW5JZCtcIn1cIiksdGhpcy5fZW5kZWR9LGUucHJvdG90eXBlLl90cnVuY2F0ZVRvTGltaXRVdGlsPWZ1bmN0aW9uKHQscil7cmV0dXJuIHQubGVuZ3RoPD1yP3Q6dC5zdWJzdHIoMCxyKX0sZS5wcm90b3R5cGUuX3RydW5jYXRlVG9TaXplPWZ1bmN0aW9uKHQpe3ZhciByPXRoaXMsbj10aGlzLl9hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0O3JldHVybiBuPD0wPyhsLmRpYWcud2FybihcIkF0dHJpYnV0ZSB2YWx1ZSBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBnb3QgXCIrbiksdCk6dHlwZW9mIHQ9PVwic3RyaW5nXCI/dGhpcy5fdHJ1bmNhdGVUb0xpbWl0VXRpbCh0LG4pOkFycmF5LmlzQXJyYXkodCk/dC5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIHR5cGVvZiBvPT1cInN0cmluZ1wiP3IuX3RydW5jYXRlVG9MaW1pdFV0aWwobyxuKTpvfSk6dH0sZX0oKTtFKCk7dmFyIHg9dihQKCkpO3ZhciBvdDsoZnVuY3Rpb24oZSl7ZVtlLk5PVF9SRUNPUkQ9MF09XCJOT1RfUkVDT1JEXCIsZVtlLlJFQ09SRD0xXT1cIlJFQ09SRFwiLGVbZS5SRUNPUkRfQU5EX1NBTVBMRUQ9Ml09XCJSRUNPUkRfQU5EX1NBTVBMRURcIn0pKG90fHwob3Q9e30pKTt2YXIgc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLnByb3RvdHlwZS5zaG91bGRTYW1wbGU9ZnVuY3Rpb24oKXtyZXR1cm57ZGVjaXNpb246b3QuTk9UX1JFQ09SRH19LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJBbHdheXNPZmZTYW1wbGVyXCJ9LGV9KCk7dmFyIFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLnByb3RvdHlwZS5zaG91bGRTYW1wbGU9ZnVuY3Rpb24oKXtyZXR1cm57ZGVjaXNpb246b3QuUkVDT1JEX0FORF9TQU1QTEVEfX0sZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkFsd2F5c09uU2FtcGxlclwifSxlfSgpO0UoKTt2YXIgdm89dihQKCkpO3ZhciBFdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIHIsbixvLGk7dGhpcy5fcm9vdD10LnJvb3QsdGhpcy5fcm9vdHx8KCgwLHZvLmdsb2JhbEVycm9ySGFuZGxlcikobmV3IEVycm9yKFwiUGFyZW50QmFzZWRTYW1wbGVyIG11c3QgaGF2ZSBhIHJvb3Qgc2FtcGxlciBjb25maWd1cmVkXCIpKSx0aGlzLl9yb290PW5ldyBYKSx0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkPShyPXQucmVtb3RlUGFyZW50U2FtcGxlZCkhPT1udWxsJiZyIT09dm9pZCAwP3I6bmV3IFgsdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZD0obj10LnJlbW90ZVBhcmVudE5vdFNhbXBsZWQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOm5ldyBzdCx0aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQ9KG89dC5sb2NhbFBhcmVudFNhbXBsZWQpIT09bnVsbCYmbyE9PXZvaWQgMD9vOm5ldyBYLHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZD0oaT10LmxvY2FsUGFyZW50Tm90U2FtcGxlZCkhPT1udWxsJiZpIT09dm9pZCAwP2k6bmV3IHN0fXJldHVybiBlLnByb3RvdHlwZS5zaG91bGRTYW1wbGU9ZnVuY3Rpb24odCxyLG4sbyxpLGEpe3ZhciB1PWwudHJhY2UuZ2V0U3BhbkNvbnRleHQodCk7cmV0dXJuIXV8fCEoMCxsLmlzU3BhbkNvbnRleHRWYWxpZCkodSk/dGhpcy5fcm9vdC5zaG91bGRTYW1wbGUodCxyLG4sbyxpLGEpOnUuaXNSZW1vdGU/dS50cmFjZUZsYWdzJmwuVHJhY2VGbGFncy5TQU1QTEVEP3RoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQuc2hvdWxkU2FtcGxlKHQscixuLG8saSxhKTp0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZSh0LHIsbixvLGksYSk6dS50cmFjZUZsYWdzJmwuVHJhY2VGbGFncy5TQU1QTEVEP3RoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUodCxyLG4sbyxpLGEpOnRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUodCxyLG4sbyxpLGEpfSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiUGFyZW50QmFzZWR7cm9vdD1cIit0aGlzLl9yb290LnRvU3RyaW5nKCkrXCIsIHJlbW90ZVBhcmVudFNhbXBsZWQ9XCIrdGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC50b1N0cmluZygpK1wiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiK3RoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKStcIiwgbG9jYWxQYXJlbnRTYW1wbGVkPVwiK3RoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpK1wiLCBsb2NhbFBhcmVudE5vdFNhbXBsZWQ9XCIrdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnRvU3RyaW5nKCkrXCJ9XCJ9LGV9KCk7RSgpO3ZhciBrdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dD09PXZvaWQgMCYmKHQ9MCksdGhpcy5fcmF0aW89dCx0aGlzLl9yYXRpbz10aGlzLl9ub3JtYWxpemUodCksdGhpcy5fdXBwZXJCb3VuZD1NYXRoLmZsb29yKHRoaXMuX3JhdGlvKjQyOTQ5NjcyOTUpfXJldHVybiBlLnByb3RvdHlwZS5zaG91bGRTYW1wbGU9ZnVuY3Rpb24odCxyKXtyZXR1cm57ZGVjaXNpb246KDAsbC5pc1ZhbGlkVHJhY2VJZCkocikmJnRoaXMuX2FjY3VtdWxhdGUocik8dGhpcy5fdXBwZXJCb3VuZD9vdC5SRUNPUkRfQU5EX1NBTVBMRUQ6b3QuTk9UX1JFQ09SRH19LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJUcmFjZUlkUmF0aW9CYXNlZHtcIit0aGlzLl9yYXRpbytcIn1cIn0sZS5wcm90b3R5cGUuX25vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHQhPVwibnVtYmVyXCJ8fGlzTmFOKHQpPzA6dD49MT8xOnQ8PTA/MDp0fSxlLnByb3RvdHlwZS5fYWNjdW11bGF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIHI9MCxuPTA7bjx0Lmxlbmd0aC84O24rKyl7dmFyIG89bio4LGk9cGFyc2VJbnQodC5zbGljZShvLG8rOCksMTYpO3I9KHJeaSk+Pj4wfXJldHVybiByfSxlfSgpO3ZhciBLbD0oMCx4LmdldEVudikoKSxXbD14LlRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT24scXQ9MTtmdW5jdGlvbiBaZSgpe3JldHVybntzYW1wbGVyOm1uKEtsKSxmb3JjZUZsdXNoVGltZW91dE1pbGxpczozZTQsZ2VuZXJhbExpbWl0czp7YXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDooMCx4LmdldEVudikoKS5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsYXR0cmlidXRlQ291bnRMaW1pdDooMCx4LmdldEVudikoKS5PVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVH0sc3BhbkxpbWl0czp7YXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDooMCx4LmdldEVudikoKS5PVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxhdHRyaWJ1dGVDb3VudExpbWl0OigwLHguZ2V0RW52KSgpLk9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQsbGlua0NvdW50TGltaXQ6KDAseC5nZXRFbnYpKCkuT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQsZXZlbnRDb3VudExpbWl0OigwLHguZ2V0RW52KSgpLk9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVCxhdHRyaWJ1dGVQZXJFdmVudENvdW50TGltaXQ6KDAseC5nZXRFbnYpKCkuT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQsYXR0cmlidXRlUGVyTGlua0NvdW50TGltaXQ6KDAseC5nZXRFbnYpKCkuT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVH19fWZ1bmN0aW9uIG1uKGUpe3N3aXRjaChlPT09dm9pZCAwJiYoZT0oMCx4LmdldEVudikoKSksZS5PVEVMX1RSQUNFU19TQU1QTEVSKXtjYXNlIHguVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPbjpyZXR1cm4gbmV3IFg7Y2FzZSB4LlRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT2ZmOnJldHVybiBuZXcgc3Q7Y2FzZSB4LlRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbjpyZXR1cm4gbmV3IEV0KHtyb290Om5ldyBYfSk7Y2FzZSB4LlRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPZmY6cmV0dXJuIG5ldyBFdCh7cm9vdDpuZXcgc3R9KTtjYXNlIHguVHJhY2VzU2FtcGxlclZhbHVlcy5UcmFjZUlkUmF0aW86cmV0dXJuIG5ldyBrdChBbyhlKSk7Y2FzZSB4LlRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRUcmFjZUlkUmF0aW86cmV0dXJuIG5ldyBFdCh7cm9vdDpuZXcga3QoQW8oZSkpfSk7ZGVmYXVsdDpyZXR1cm4gbC5kaWFnLmVycm9yKCdPVEVMX1RSQUNFU19TQU1QTEVSIHZhbHVlIFwiJytlLk9URUxfVFJBQ0VTX1NBTVBMRVIrXCIgaW52YWxpZCwgZGVmYXVsdGluZyB0byBcIitXbCsnXCIuJyksbmV3IFh9fWZ1bmN0aW9uIEFvKGUpe2lmKGUuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9PT12b2lkIDB8fGUuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9PT1cIlwiKXJldHVybiBsLmRpYWcuZXJyb3IoXCJPVEVMX1RSQUNFU19TQU1QTEVSX0FSRyBpcyBibGFuaywgZGVmYXVsdGluZyB0byBcIitxdCtcIi5cIikscXQ7dmFyIHQ9TnVtYmVyKGUuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcpO3JldHVybiBpc05hTih0KT8obC5kaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9XCIrZS5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRytcIiB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBpbnZhbGlkLCBkZWZhdWx0aW5nIHRvIFwiK3F0K1wiLlwiKSxxdCk6dDwwfHx0PjE/KGwuZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPVwiK2UuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcrXCIgd2FzIGdpdmVuLCBidXQgaXQgaXMgb3V0IG9mIHJhbmdlIChbMC4uMV0pLCBkZWZhdWx0aW5nIHRvIFwiK3F0K1wiLlwiKSxxdCk6dH12YXIgWHQ9dihQKCkpO2Z1bmN0aW9uIFJvKGUpe3ZhciB0PXtzYW1wbGVyOm1uKCl9LHI9WmUoKSxuPU9iamVjdC5hc3NpZ24oe30scix0LGUpO3JldHVybiBuLmdlbmVyYWxMaW1pdHM9T2JqZWN0LmFzc2lnbih7fSxyLmdlbmVyYWxMaW1pdHMsZS5nZW5lcmFsTGltaXRzfHx7fSksbi5zcGFuTGltaXRzPU9iamVjdC5hc3NpZ24oe30sci5zcGFuTGltaXRzLGUuc3BhbkxpbWl0c3x8e30pLG59ZnVuY3Rpb24gT28oZSl7dmFyIHQscixuLG8saSxhLHUsYyxzLGYscCxkLG09T2JqZWN0LmFzc2lnbih7fSxlLnNwYW5MaW1pdHMpLGc9KDAsWHQuZ2V0RW52V2l0aG91dERlZmF1bHRzKSgpO3JldHVybiBtLmF0dHJpYnV0ZUNvdW50TGltaXQ9KGE9KGk9KG89KHI9KHQ9ZS5zcGFuTGltaXRzKT09PW51bGx8fHQ9PT12b2lkIDA/dm9pZCAwOnQuYXR0cmlidXRlQ291bnRMaW1pdCkhPT1udWxsJiZyIT09dm9pZCAwP3I6KG49ZS5nZW5lcmFsTGltaXRzKT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uYXR0cmlidXRlQ291bnRMaW1pdCkhPT1udWxsJiZvIT09dm9pZCAwP286Zy5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJmkhPT12b2lkIDA/aTpnLk9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJmEhPT12b2lkIDA/YTpYdC5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxtLmF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ9KGQ9KHA9KGY9KGM9KHU9ZS5zcGFuTGltaXRzKT09PW51bGx8fHU9PT12b2lkIDA/dm9pZCAwOnUuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkhPT1udWxsJiZjIT09dm9pZCAwP2M6KHM9ZS5nZW5lcmFsTGltaXRzKT09PW51bGx8fHM9PT12b2lkIDA/dm9pZCAwOnMuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkhPT1udWxsJiZmIT09dm9pZCAwP2Y6Zy5PVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCkhPT1udWxsJiZwIT09dm9pZCAwP3A6Zy5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpIT09bnVsbCYmZCE9PXZvaWQgMD9kOlh0LkRFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxPYmplY3QuYXNzaWduKHt9LGUse3NwYW5MaW1pdHM6bX0pfUUoKTt2YXIgaz12KFAoKSksYm89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7dGhpcy5fZXhwb3J0ZXI9dCx0aGlzLl9pc0V4cG9ydGluZz0hMSx0aGlzLl9maW5pc2hlZFNwYW5zPVtdLHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50PTA7dmFyIG49KDAsay5nZXRFbnYpKCk7dGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplPXR5cGVvZiByPy5tYXhFeHBvcnRCYXRjaFNpemU9PVwibnVtYmVyXCI/ci5tYXhFeHBvcnRCYXRjaFNpemU6bi5PVEVMX0JTUF9NQVhfRVhQT1JUX0JBVENIX1NJWkUsdGhpcy5fbWF4UXVldWVTaXplPXR5cGVvZiByPy5tYXhRdWV1ZVNpemU9PVwibnVtYmVyXCI/ci5tYXhRdWV1ZVNpemU6bi5PVEVMX0JTUF9NQVhfUVVFVUVfU0laRSx0aGlzLl9zY2hlZHVsZWREZWxheU1pbGxpcz10eXBlb2Ygcj8uc2NoZWR1bGVkRGVsYXlNaWxsaXM9PVwibnVtYmVyXCI/ci5zY2hlZHVsZWREZWxheU1pbGxpczpuLk9URUxfQlNQX1NDSEVEVUxFX0RFTEFZLHRoaXMuX2V4cG9ydFRpbWVvdXRNaWxsaXM9dHlwZW9mIHI/LmV4cG9ydFRpbWVvdXRNaWxsaXM9PVwibnVtYmVyXCI/ci5leHBvcnRUaW1lb3V0TWlsbGlzOm4uT1RFTF9CU1BfRVhQT1JUX1RJTUVPVVQsdGhpcy5fc2h1dGRvd25PbmNlPW5ldyBrLkJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLHRoaXMpLHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZT50aGlzLl9tYXhRdWV1ZVNpemUmJihsLmRpYWcud2FybihcIkJhdGNoU3BhblByb2Nlc3NvcjogbWF4RXhwb3J0QmF0Y2hTaXplIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBtYXhRdWV1ZVNpemUsIHNldHRpbmcgbWF4RXhwb3J0QmF0Y2hTaXplIHRvIG1hdGNoIG1heFF1ZXVlU2l6ZVwiKSx0aGlzLl9tYXhFeHBvcnRCYXRjaFNpemU9dGhpcy5fbWF4UXVldWVTaXplKX1yZXR1cm4gZS5wcm90b3R5cGUuZm9yY2VGbHVzaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQ/dGhpcy5fc2h1dGRvd25PbmNlLnByb21pc2U6dGhpcy5fZmx1c2hBbGwoKX0sZS5wcm90b3R5cGUub25TdGFydD1mdW5jdGlvbih0LHIpe30sZS5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24odCl7dGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkfHx0LnNwYW5Db250ZXh0KCkudHJhY2VGbGFncyZsLlRyYWNlRmxhZ3MuU0FNUExFRCYmdGhpcy5fYWRkVG9CdWZmZXIodCl9LGUucHJvdG90eXBlLnNodXRkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCl9LGUucHJvdG90eXBlLl9zaHV0ZG93bj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gdC5vblNodXRkb3duKCl9KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHQuX2ZsdXNoQWxsKCl9KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHQuX2V4cG9ydGVyLnNodXRkb3duKCl9KX0sZS5wcm90b3R5cGUuX2FkZFRvQnVmZmVyPWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoPj10aGlzLl9tYXhRdWV1ZVNpemUpe3RoaXMuX2Ryb3BwZWRTcGFuc0NvdW50PT09MCYmbC5kaWFnLmRlYnVnKFwibWF4UXVldWVTaXplIHJlYWNoZWQsIGRyb3BwaW5nIHNwYW5zXCIpLHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50Kys7cmV0dXJufXRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50PjAmJihsLmRpYWcud2FybihcIkRyb3BwZWQgXCIrdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQrXCIgc3BhbnMgYmVjYXVzZSBtYXhRdWV1ZVNpemUgcmVhY2hlZFwiKSx0aGlzLl9kcm9wcGVkU3BhbnNDb3VudD0wKSx0aGlzLl9maW5pc2hlZFNwYW5zLnB1c2godCksdGhpcy5fbWF5YmVTdGFydFRpbWVyKCl9LGUucHJvdG90eXBlLl9mbHVzaEFsbD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsbil7Zm9yKHZhciBvPVtdLGk9TWF0aC5jZWlsKHQuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoL3QuX21heEV4cG9ydEJhdGNoU2l6ZSksYT0wLHU9aTthPHU7YSsrKW8ucHVzaCh0Ll9mbHVzaE9uZUJhdGNoKCkpO1Byb21pc2UuYWxsKG8pLnRoZW4oZnVuY3Rpb24oKXtyKCl9KS5jYXRjaChuKX0pfSxlLnByb3RvdHlwZS5fZmx1c2hPbmVCYXRjaD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuX2NsZWFyVGltZXIoKSx0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aD09PTA/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IFByb21pc2UoZnVuY3Rpb24ocixuKXt2YXIgbz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bihuZXcgRXJyb3IoXCJUaW1lb3V0XCIpKX0sdC5fZXhwb3J0VGltZW91dE1pbGxpcyk7bC5jb250ZXh0LndpdGgoKDAsay5zdXBwcmVzc1RyYWNpbmcpKGwuY29udGV4dC5hY3RpdmUoKSksZnVuY3Rpb24oKXt2YXIgaT10Ll9maW5pc2hlZFNwYW5zLnNwbGljZSgwLHQuX21heEV4cG9ydEJhdGNoU2l6ZSksYT1mdW5jdGlvbigpe3JldHVybiB0Ll9leHBvcnRlci5leHBvcnQoaSxmdW5jdGlvbihjKXt2YXIgcztjbGVhclRpbWVvdXQobyksYy5jb2RlPT09ay5FeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1M/cigpOm4oKHM9Yy5lcnJvcikhPT1udWxsJiZzIT09dm9pZCAwP3M6bmV3IEVycm9yKFwiQmF0Y2hTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWRcIikpfSl9LHU9aS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGMucmVzb3VyY2V9KS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZ30pO3UubGVuZ3RoPT09MD9hKCk6UHJvbWlzZS5hbGwodS5tYXAoZnVuY3Rpb24oYyl7dmFyIHM7cmV0dXJuKHM9Yy53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKT09PW51bGx8fHM9PT12b2lkIDA/dm9pZCAwOnMuY2FsbChjKX0pKS50aGVuKGEsZnVuY3Rpb24oYyl7KDAsay5nbG9iYWxFcnJvckhhbmRsZXIpKGMpLG4oYyl9KX0pfSl9LGUucHJvdG90eXBlLl9tYXliZVN0YXJ0VGltZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9pc0V4cG9ydGluZyl7dmFyIHI9ZnVuY3Rpb24oKXt0Ll9pc0V4cG9ydGluZz0hMCx0Ll9mbHVzaE9uZUJhdGNoKCkudGhlbihmdW5jdGlvbigpe3QuX2lzRXhwb3J0aW5nPSExLHQuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoPjAmJih0Ll9jbGVhclRpbWVyKCksdC5fbWF5YmVTdGFydFRpbWVyKCkpfSkuY2F0Y2goZnVuY3Rpb24obil7dC5faXNFeHBvcnRpbmc9ITEsKDAsay5nbG9iYWxFcnJvckhhbmRsZXIpKG4pfSl9O2lmKHRoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoPj10aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpcmV0dXJuIHIoKTt0aGlzLl90aW1lcj09PXZvaWQgMCYmKHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcigpfSx0aGlzLl9zY2hlZHVsZWREZWxheU1pbGxpcyksKDAsay51bnJlZlRpbWVyKSh0aGlzLl90aW1lcikpfX0sZS5wcm90b3R5cGUuX2NsZWFyVGltZXI9ZnVuY3Rpb24oKXt0aGlzLl90aW1lciE9PXZvaWQgMCYmKGNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKX0sZX0oKTt2YXIgWWw9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LHIpe3JldHVybiBlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihuLG8pe24uX19wcm90b19fPW99fHxmdW5jdGlvbihuLG8pe2Zvcih2YXIgaSBpbiBvKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGkpJiYobltpXT1vW2ldKX0sZSh0LHIpfTtyZXR1cm4gZnVuY3Rpb24odCxyKXtpZih0eXBlb2YgciE9XCJmdW5jdGlvblwiJiZyIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIitTdHJpbmcocikrXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtlKHQscik7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH10LnByb3RvdHlwZT1yPT09bnVsbD9PYmplY3QuY3JlYXRlKHIpOihuLnByb3RvdHlwZT1yLnByb3RvdHlwZSxuZXcgbil9fSgpLE10PWZ1bmN0aW9uKGUpe1lsKHQsZSk7ZnVuY3Rpb24gdChyLG4pe3ZhciBvPWUuY2FsbCh0aGlzLHIsbil8fHRoaXM7cmV0dXJuIG8ub25Jbml0KG4pLG99cmV0dXJuIHQucHJvdG90eXBlLm9uSW5pdD1mdW5jdGlvbihyKXt2YXIgbj10aGlzO3I/LmRpc2FibGVBdXRvRmx1c2hPbkRvY3VtZW50SGlkZSE9PSEwJiZ0eXBlb2YgZG9jdW1lbnQ8XCJ1XCImJih0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXI9ZnVuY3Rpb24oKXtkb2N1bWVudC52aXNpYmlsaXR5U3RhdGU9PT1cImhpZGRlblwiJiZuLmZvcmNlRmx1c2goKX0sdGhpcy5fcGFnZUhpZGVMaXN0ZW5lcj1mdW5jdGlvbigpe24uZm9yY2VGbHVzaCgpfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VMaXN0ZW5lciksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsdGhpcy5fcGFnZUhpZGVMaXN0ZW5lcikpfSx0LnByb3RvdHlwZS5vblNodXRkb3duPWZ1bmN0aW9uKCl7dHlwZW9mIGRvY3VtZW50PFwidVwiJiYodGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyJiZkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VMaXN0ZW5lciksdGhpcy5fcGFnZUhpZGVMaXN0ZW5lciYmZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsdGhpcy5fcGFnZUhpZGVMaXN0ZW5lcikpfSx0fShibyk7dmFyIHpsPTgsJGw9MTYsZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5nZW5lcmF0ZVRyYWNlSWQ9TG8oJGwpLHRoaXMuZ2VuZXJhdGVTcGFuSWQ9TG8oemwpfXJldHVybiBlfSgpO3ZhciB0cj1BcnJheSgzMik7ZnVuY3Rpb24gTG8oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciByPTA7cjxlKjI7cisrKXRyW3JdPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxNikrNDgsdHJbcl0+PTU4JiYodHJbcl0rPTM5KTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHRyLnNsaWNlKDAsZSoyKSl9fXZhciBQbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyLG4pe3RoaXMuX3RyYWNlclByb3ZpZGVyPW47dmFyIG89Um8ocik7dGhpcy5fc2FtcGxlcj1vLnNhbXBsZXIsdGhpcy5fZ2VuZXJhbExpbWl0cz1vLmdlbmVyYWxMaW1pdHMsdGhpcy5fc3BhbkxpbWl0cz1vLnNwYW5MaW1pdHMsdGhpcy5faWRHZW5lcmF0b3I9ci5pZEdlbmVyYXRvcnx8bmV3IGVyLHRoaXMucmVzb3VyY2U9bi5yZXNvdXJjZSx0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnk9dH1yZXR1cm4gZS5wcm90b3R5cGUuc3RhcnRTcGFuPWZ1bmN0aW9uKHQscixuKXt2YXIgbyxpLGE7cj09PXZvaWQgMCYmKHI9e30pLG49PT12b2lkIDAmJihuPWwuY29udGV4dC5hY3RpdmUoKSksci5yb290JiYobj1sLnRyYWNlLmRlbGV0ZVNwYW4obikpO3ZhciB1PWwudHJhY2UuZ2V0U3BhbihuKTtpZigoMCxLdC5pc1RyYWNpbmdTdXBwcmVzc2VkKShuKSl7bC5kaWFnLmRlYnVnKFwiSW5zdHJ1bWVudGF0aW9uIHN1cHByZXNzZWQsIHJldHVybmluZyBOb29wIFNwYW5cIik7dmFyIGM9bC50cmFjZS53cmFwU3BhbkNvbnRleHQobC5JTlZBTElEX1NQQU5fQ09OVEVYVCk7cmV0dXJuIGN9dmFyIHM9dT8uc3BhbkNvbnRleHQoKSxmPXRoaXMuX2lkR2VuZXJhdG9yLmdlbmVyYXRlU3BhbklkKCkscCxkLG07IXN8fCFsLnRyYWNlLmlzU3BhbkNvbnRleHRWYWxpZChzKT9wPXRoaXMuX2lkR2VuZXJhdG9yLmdlbmVyYXRlVHJhY2VJZCgpOihwPXMudHJhY2VJZCxkPXMudHJhY2VTdGF0ZSxtPXMuc3BhbklkKTt2YXIgZz0obz1yLmtpbmQpIT09bnVsbCYmbyE9PXZvaWQgMD9vOmwuU3BhbktpbmQuSU5URVJOQUwsQz0oKGk9ci5saW5rcykhPT1udWxsJiZpIT09dm9pZCAwP2k6W10pLm1hcChmdW5jdGlvbihidCl7cmV0dXJue2NvbnRleHQ6YnQuY29udGV4dCxhdHRyaWJ1dGVzOigwLEt0LnNhbml0aXplQXR0cmlidXRlcykoYnQuYXR0cmlidXRlcyl9fSksTT0oMCxLdC5zYW5pdGl6ZUF0dHJpYnV0ZXMpKHIuYXR0cmlidXRlcyksVD10aGlzLl9zYW1wbGVyLnNob3VsZFNhbXBsZShuLHAsdCxnLE0sQyk7ZD0oYT1ULnRyYWNlU3RhdGUpIT09bnVsbCYmYSE9PXZvaWQgMD9hOmQ7dmFyIHJ0PVQuZGVjaXNpb249PT1sLlNhbXBsaW5nRGVjaXNpb24uUkVDT1JEX0FORF9TQU1QTEVEP2wuVHJhY2VGbGFncy5TQU1QTEVEOmwuVHJhY2VGbGFncy5OT05FLHE9e3RyYWNlSWQ6cCxzcGFuSWQ6Zix0cmFjZUZsYWdzOnJ0LHRyYWNlU3RhdGU6ZH07aWYoVC5kZWNpc2lvbj09PWwuU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JEKXtsLmRpYWcuZGVidWcoXCJSZWNvcmRpbmcgaXMgb2ZmLCBwcm9wYWdhdGluZyBjb250ZXh0IGluIGEgbm9uLXJlY29yZGluZyBzcGFuXCIpO3ZhciBjPWwudHJhY2Uud3JhcFNwYW5Db250ZXh0KHEpO3JldHVybiBjfXZhciBVPSgwLEt0LnNhbml0aXplQXR0cmlidXRlcykoT2JqZWN0LmFzc2lnbihNLFQuYXR0cmlidXRlcykpLHdyPW5ldyB5byh0aGlzLG4sdCxxLGcsbSxDLHIuc3RhcnRUaW1lLHZvaWQgMCxVKTtyZXR1cm4gd3J9LGUucHJvdG90eXBlLnN0YXJ0QWN0aXZlU3Bhbj1mdW5jdGlvbih0LHIsbixvKXt2YXIgaSxhLHU7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXthcmd1bWVudHMubGVuZ3RoPT09Mj91PXI6YXJndW1lbnRzLmxlbmd0aD09PTM/KGk9cix1PW4pOihpPXIsYT1uLHU9byk7dmFyIGM9YT8/bC5jb250ZXh0LmFjdGl2ZSgpLHM9dGhpcy5zdGFydFNwYW4odCxpLGMpLGY9bC50cmFjZS5zZXRTcGFuKGMscyk7cmV0dXJuIGwuY29udGV4dC53aXRoKGYsdSx2b2lkIDAscyl9fSxlLnByb3RvdHlwZS5nZXRHZW5lcmFsTGltaXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dlbmVyYWxMaW1pdHN9LGUucHJvdG90eXBlLmdldFNwYW5MaW1pdHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BhbkxpbWl0c30sZS5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmFjZXJQcm92aWRlci5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCl9LGV9KCk7RSgpO3ZhciBRPXYoUCgpKTtFKCk7dmFyIG10PXYoc2UoKSkscnI9dihQKCkpO2Z1bmN0aW9uIElvKCl7cmV0dXJuXCJ1bmtub3duX3NlcnZpY2VcIn12YXIgVHQ9ZnVuY3Rpb24oKXtyZXR1cm4gVHQ9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LHI9MSxuPWFyZ3VtZW50cy5sZW5ndGg7cjxuO3IrKyl7dD1hcmd1bWVudHNbcl07Zm9yKHZhciBvIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJihlW29dPXRbb10pfXJldHVybiBlfSxUdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFFsPWZ1bmN0aW9uKGUsdCxyLG4pe2Z1bmN0aW9uIG8oaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiByP2k6bmV3IHIoZnVuY3Rpb24oYSl7YShpKX0pfXJldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKGZ1bmN0aW9uKGksYSl7ZnVuY3Rpb24gdShmKXt0cnl7cyhuLm5leHQoZikpfWNhdGNoKHApe2EocCl9fWZ1bmN0aW9uIGMoZil7dHJ5e3Mobi50aHJvdyhmKSl9Y2F0Y2gocCl7YShwKX19ZnVuY3Rpb24gcyhmKXtmLmRvbmU/aShmLnZhbHVlKTpvKGYudmFsdWUpLnRoZW4odSxjKX1zKChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KX0sSmw9ZnVuY3Rpb24oZSx0KXt2YXIgcj17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoaVswXSYxKXRocm93IGlbMV07cmV0dXJuIGlbMV19LHRyeXM6W10sb3BzOltdfSxuLG8saSxhO3JldHVybiBhPXtuZXh0OnUoMCksdGhyb3c6dSgxKSxyZXR1cm46dSgyKX0sdHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoYVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxhO2Z1bmN0aW9uIHUocyl7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBjKFtzLGZdKX19ZnVuY3Rpb24gYyhzKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7cjspdHJ5e2lmKG49MSxvJiYoaT1zWzBdJjI/by5yZXR1cm46c1swXT9vLnRocm93fHwoKGk9by5yZXR1cm4pJiZpLmNhbGwobyksMCk6by5uZXh0KSYmIShpPWkuY2FsbChvLHNbMV0pKS5kb25lKXJldHVybiBpO3N3aXRjaChvPTAsaSYmKHM9W3NbMF0mMixpLnZhbHVlXSksc1swXSl7Y2FzZSAwOmNhc2UgMTppPXM7YnJlYWs7Y2FzZSA0OnJldHVybiByLmxhYmVsKysse3ZhbHVlOnNbMV0sZG9uZTohMX07Y2FzZSA1OnIubGFiZWwrKyxvPXNbMV0scz1bMF07Y29udGludWU7Y2FzZSA3OnM9ci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoaT1yLnRyeXMsIShpPWkubGVuZ3RoPjAmJmlbaS5sZW5ndGgtMV0pJiYoc1swXT09PTZ8fHNbMF09PT0yKSl7cj0wO2NvbnRpbnVlfWlmKHNbMF09PT0zJiYoIWl8fHNbMV0+aVswXSYmc1sxXTxpWzNdKSl7ci5sYWJlbD1zWzFdO2JyZWFrfWlmKHNbMF09PT02JiZyLmxhYmVsPGlbMV0pe3IubGFiZWw9aVsxXSxpPXM7YnJlYWt9aWYoaSYmci5sYWJlbDxpWzJdKXtyLmxhYmVsPWlbMl0sci5vcHMucHVzaChzKTticmVha31pWzJdJiZyLm9wcy5wb3AoKSxyLnRyeXMucG9wKCk7Y29udGludWV9cz10LmNhbGwoZSxyKX1jYXRjaChmKXtzPVs2LGZdLG89MH1maW5hbGx5e249aT0wfWlmKHNbMF0mNSl0aHJvdyBzWzFdO3JldHVybnt2YWx1ZTpzWzBdP3NbMV06dm9pZCAwLGRvbmU6ITB9fX0sWmw9ZnVuY3Rpb24oZSx0KXt2YXIgcj10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighcilyZXR1cm4gZTt2YXIgbj1yLmNhbGwoZSksbyxpPVtdLGE7dHJ5e2Zvcig7KHQ9PT12b2lkIDB8fHQtLSA+MCkmJiEobz1uLm5leHQoKSkuZG9uZTspaS5wdXNoKG8udmFsdWUpfWNhdGNoKHUpe2E9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihyPW4ucmV0dXJuKSYmci5jYWxsKG4pfWZpbmFsbHl7aWYoYSl0aHJvdyBhLmVycm9yfX1yZXR1cm4gaX0sSD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXt2YXIgbj10aGlzLG87dGhpcy5fYXR0cmlidXRlcz10LHRoaXMuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZz1yIT1udWxsLHRoaXMuX3N5bmNBdHRyaWJ1dGVzPShvPXRoaXMuX2F0dHJpYnV0ZXMpIT09bnVsbCYmbyE9PXZvaWQgMD9vOnt9LHRoaXMuX2FzeW5jQXR0cmlidXRlc1Byb21pc2U9cj8udGhlbihmdW5jdGlvbihpKXtyZXR1cm4gbi5fYXR0cmlidXRlcz1PYmplY3QuYXNzaWduKHt9LG4uX2F0dHJpYnV0ZXMsaSksbi5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nPSExLGl9LGZ1bmN0aW9uKGkpe3JldHVybiBsLmRpYWcuZGVidWcoXCJhIHJlc291cmNlJ3MgYXN5bmMgYXR0cmlidXRlcyBwcm9taXNlIHJlamVjdGVkOiAlc1wiLGkpLG4uYXN5bmNBdHRyaWJ1dGVzUGVuZGluZz0hMSx7fX0pfXJldHVybiBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGUuRU1QVFl9LGUuZGVmYXVsdD1mdW5jdGlvbigpe3ZhciB0O3JldHVybiBuZXcgZSgodD17fSx0W210LlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlNFUlZJQ0VfTkFNRV09SW8oKSx0W210LlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlRFTEVNRVRSWV9TREtfTEFOR1VBR0VdPXJyLlNES19JTkZPW210LlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlRFTEVNRVRSWV9TREtfTEFOR1VBR0VdLHRbbXQuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19OQU1FXT1yci5TREtfSU5GT1ttdC5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5URUxFTUVUUllfU0RLX05BTUVdLHRbbXQuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19WRVJTSU9OXT1yci5TREtfSU5GT1ttdC5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5URUxFTUVUUllfU0RLX1ZFUlNJT05dLHQpKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiYXR0cmlidXRlc1wiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nJiZsLmRpYWcuZXJyb3IoXCJBY2Nlc3NpbmcgcmVzb3VyY2UgYXR0cmlidXRlcyBiZWZvcmUgYXN5bmMgYXR0cmlidXRlcyBzZXR0bGVkXCIpLCh0PXRoaXMuX2F0dHJpYnV0ZXMpIT09bnVsbCYmdCE9PXZvaWQgMD90Ont9fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLndhaXRGb3JBc3luY0F0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gUWwodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIEpsKHRoaXMsZnVuY3Rpb24odCl7c3dpdGNoKHQubGFiZWwpe2Nhc2UgMDpyZXR1cm4gdGhpcy5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nP1s0LHRoaXMuX2FzeW5jQXR0cmlidXRlc1Byb21pc2VdOlszLDJdO2Nhc2UgMTp0LnNlbnQoKSx0LmxhYmVsPTI7Y2FzZSAyOnJldHVyblsyXX19KX0pfSxlLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbih0KXt2YXIgcj10aGlzLG47aWYoIXQpcmV0dXJuIHRoaXM7dmFyIG89VHQoVHQoe30sdGhpcy5fc3luY0F0dHJpYnV0ZXMpLChuPXQuX3N5bmNBdHRyaWJ1dGVzKSE9PW51bGwmJm4hPT12b2lkIDA/bjp0LmF0dHJpYnV0ZXMpO2lmKCF0aGlzLl9hc3luY0F0dHJpYnV0ZXNQcm9taXNlJiYhdC5fYXN5bmNBdHRyaWJ1dGVzUHJvbWlzZSlyZXR1cm4gbmV3IGUobyk7dmFyIGk9UHJvbWlzZS5hbGwoW3RoaXMuX2FzeW5jQXR0cmlidXRlc1Byb21pc2UsdC5fYXN5bmNBdHRyaWJ1dGVzUHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24oYSl7dmFyIHUsYz1abChhLDIpLHM9Y1swXSxmPWNbMV07cmV0dXJuIFR0KFR0KFR0KFR0KHt9LHIuX3N5bmNBdHRyaWJ1dGVzKSxzKSwodT10Ll9zeW5jQXR0cmlidXRlcykhPT1udWxsJiZ1IT09dm9pZCAwP3U6dC5hdHRyaWJ1dGVzKSxmKX0pO3JldHVybiBuZXcgZShvLGkpfSxlLkVNUFRZPW5ldyBlKHt9KSxlfSgpO0UoKTt2YXIgQ289dihQKCkpLE5vPXYoc2UoKSk7dmFyIHRmPWZ1bmN0aW9uKGUpe3ZhciB0PXR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmU3ltYm9sLml0ZXJhdG9yLHI9dCYmZVt0XSxuPTA7aWYocilyZXR1cm4gci5jYWxsKGUpO2lmKGUmJnR5cGVvZiBlLmxlbmd0aD09XCJudW1iZXJcIilyZXR1cm57bmV4dDpmdW5jdGlvbigpe3JldHVybiBlJiZuPj1lLmxlbmd0aCYmKGU9dm9pZCAwKSx7dmFsdWU6ZSYmZVtuKytdLGRvbmU6IWV9fX07dGhyb3cgbmV3IFR5cGVFcnJvcih0P1wiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIjpcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIil9LGVmPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZlW1N5bWJvbC5pdGVyYXRvcl07aWYoIXIpcmV0dXJuIGU7dmFyIG49ci5jYWxsKGUpLG8saT1bXSxhO3RyeXtmb3IoOyh0PT09dm9pZCAwfHx0LS0gPjApJiYhKG89bi5uZXh0KCkpLmRvbmU7KWkucHVzaChvLnZhbHVlKX1jYXRjaCh1KXthPXtlcnJvcjp1fX1maW5hbGx5e3RyeXtvJiYhby5kb25lJiYocj1uLnJldHVybikmJnIuY2FsbChuKX1maW5hbGx5e2lmKGEpdGhyb3cgYS5lcnJvcn19cmV0dXJuIGl9LHJmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuX01BWF9MRU5HVEg9MjU1LHRoaXMuX0NPTU1BX1NFUEFSQVRPUj1cIixcIix0aGlzLl9MQUJFTF9LRVlfVkFMVUVfU1BMSVRURVI9XCI9XCIsdGhpcy5fRVJST1JfTUVTU0FHRV9JTlZBTElEX0NIQVJTPVwic2hvdWxkIGJlIGEgQVNDSUkgc3RyaW5nIHdpdGggYSBsZW5ndGggZ3JlYXRlciB0aGFuIDAgYW5kIG5vdCBleGNlZWQgXCIrdGhpcy5fTUFYX0xFTkdUSCtcIiBjaGFyYWN0ZXJzLlwiLHRoaXMuX0VSUk9SX01FU1NBR0VfSU5WQUxJRF9WQUxVRT1cInNob3VsZCBiZSBhIEFTQ0lJIHN0cmluZyB3aXRoIGEgbGVuZ3RoIG5vdCBleGNlZWQgXCIrdGhpcy5fTUFYX0xFTkdUSCtcIiBjaGFyYWN0ZXJzLlwifXJldHVybiBlLnByb3RvdHlwZS5kZXRlY3Q9ZnVuY3Rpb24odCl7dmFyIHI9e30sbj0oMCxDby5nZXRFbnYpKCksbz1uLk9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUyxpPW4uT1RFTF9TRVJWSUNFX05BTUU7aWYobyl0cnl7dmFyIGE9dGhpcy5fcGFyc2VSZXNvdXJjZUF0dHJpYnV0ZXMobyk7T2JqZWN0LmFzc2lnbihyLGEpfWNhdGNoKHUpe2wuZGlhZy5kZWJ1ZyhcIkVudkRldGVjdG9yIGZhaWxlZDogXCIrdS5tZXNzYWdlKX1yZXR1cm4gaSYmKHJbTm8uU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuU0VSVklDRV9OQU1FXT1pKSxuZXcgSChyKX0sZS5wcm90b3R5cGUuX3BhcnNlUmVzb3VyY2VBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3ZhciByLG47aWYoIXQpcmV0dXJue307dmFyIG89e30saT10LnNwbGl0KHRoaXMuX0NPTU1BX1NFUEFSQVRPUiwtMSk7dHJ5e2Zvcih2YXIgYT10ZihpKSx1PWEubmV4dCgpOyF1LmRvbmU7dT1hLm5leHQoKSl7dmFyIGM9dS52YWx1ZSxzPWMuc3BsaXQodGhpcy5fTEFCRUxfS0VZX1ZBTFVFX1NQTElUVEVSLC0xKTtpZihzLmxlbmd0aD09PTIpe3ZhciBmPWVmKHMsMikscD1mWzBdLGQ9ZlsxXTtpZihwPXAudHJpbSgpLGQ9ZC50cmltKCkuc3BsaXQoL15cInxcIiQvKS5qb2luKFwiXCIpLCF0aGlzLl9pc1ZhbGlkQW5kTm90RW1wdHkocCkpdGhyb3cgbmV3IEVycm9yKFwiQXR0cmlidXRlIGtleSBcIit0aGlzLl9FUlJPUl9NRVNTQUdFX0lOVkFMSURfQ0hBUlMpO2lmKCF0aGlzLl9pc1ZhbGlkKGQpKXRocm93IG5ldyBFcnJvcihcIkF0dHJpYnV0ZSB2YWx1ZSBcIit0aGlzLl9FUlJPUl9NRVNTQUdFX0lOVkFMSURfVkFMVUUpO29bcF09ZGVjb2RlVVJJQ29tcG9uZW50KGQpfX19Y2F0Y2gobSl7cj17ZXJyb3I6bX19ZmluYWxseXt0cnl7dSYmIXUuZG9uZSYmKG49YS5yZXR1cm4pJiZuLmNhbGwoYSl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fXJldHVybiBvfSxlLnByb3RvdHlwZS5faXNWYWxpZD1mdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGg8PXRoaXMuX01BWF9MRU5HVEgmJnRoaXMuX2lzQmFnZ2FnZU9jdGV0U3RyaW5nKHQpfSxlLnByb3RvdHlwZS5faXNCYWdnYWdlT2N0ZXRTdHJpbmc9ZnVuY3Rpb24odCl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXQuY2hhckNvZGVBdChyKTtpZihuPDMzfHxuPT09NDR8fG49PT01OXx8bj09PTkyfHxuPjEyNilyZXR1cm4hMX1yZXR1cm4hMH0sZS5wcm90b3R5cGUuX2lzVmFsaWRBbmROb3RFbXB0eT1mdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGg+MCYmdGhpcy5faXNWYWxpZCh0KX0sZX0oKSx3bz1uZXcgcmY7RSgpO3ZhciBNbz1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT1cIm9iamVjdFwiJiZ0eXBlb2YgZS50aGVuPT1cImZ1bmN0aW9uXCJ9O3ZhciBuZj1mdW5jdGlvbihlLHQscixuKXtmdW5jdGlvbiBvKGkpe3JldHVybiBpIGluc3RhbmNlb2Ygcj9pOm5ldyByKGZ1bmN0aW9uKGEpe2EoaSl9KX1yZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKShmdW5jdGlvbihpLGEpe2Z1bmN0aW9uIHUoZil7dHJ5e3Mobi5uZXh0KGYpKX1jYXRjaChwKXthKHApfX1mdW5jdGlvbiBjKGYpe3RyeXtzKG4udGhyb3coZikpfWNhdGNoKHApe2EocCl9fWZ1bmN0aW9uIHMoZil7Zi5kb25lP2koZi52YWx1ZSk6byhmLnZhbHVlKS50aGVuKHUsYyl9cygobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSl9LG9mPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKGlbMF0mMSl0aHJvdyBpWzFdO3JldHVybiBpWzFdfSx0cnlzOltdLG9wczpbXX0sbixvLGksYTtyZXR1cm4gYT17bmV4dDp1KDApLHRocm93OnUoMSkscmV0dXJuOnUoMil9LHR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmKGFbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksYTtmdW5jdGlvbiB1KHMpe3JldHVybiBmdW5jdGlvbihmKXtyZXR1cm4gYyhbcyxmXSl9fWZ1bmN0aW9uIGMocyl7aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtmb3IoO3I7KXRyeXtpZihuPTEsbyYmKGk9c1swXSYyP28ucmV0dXJuOnNbMF0/by50aHJvd3x8KChpPW8ucmV0dXJuKSYmaS5jYWxsKG8pLDApOm8ubmV4dCkmJiEoaT1pLmNhbGwobyxzWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobz0wLGkmJihzPVtzWzBdJjIsaS52YWx1ZV0pLHNbMF0pe2Nhc2UgMDpjYXNlIDE6aT1zO2JyZWFrO2Nhc2UgNDpyZXR1cm4gci5sYWJlbCsrLHt2YWx1ZTpzWzFdLGRvbmU6ITF9O2Nhc2UgNTpyLmxhYmVsKyssbz1zWzFdLHM9WzBdO2NvbnRpbnVlO2Nhc2UgNzpzPXIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKGk9ci50cnlzLCEoaT1pLmxlbmd0aD4wJiZpW2kubGVuZ3RoLTFdKSYmKHNbMF09PT02fHxzWzBdPT09Mikpe3I9MDtjb250aW51ZX1pZihzWzBdPT09MyYmKCFpfHxzWzFdPmlbMF0mJnNbMV08aVszXSkpe3IubGFiZWw9c1sxXTticmVha31pZihzWzBdPT09NiYmci5sYWJlbDxpWzFdKXtyLmxhYmVsPWlbMV0saT1zO2JyZWFrfWlmKGkmJnIubGFiZWw8aVsyXSl7ci5sYWJlbD1pWzJdLHIub3BzLnB1c2gocyk7YnJlYWt9aVsyXSYmci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlfXM9dC5jYWxsKGUscil9Y2F0Y2goZil7cz1bNixmXSxvPTB9ZmluYWxseXtuPWk9MH1pZihzWzBdJjUpdGhyb3cgc1sxXTtyZXR1cm57dmFsdWU6c1swXT9zWzFdOnZvaWQgMCxkb25lOiEwfX19O3ZhciB4bz1mdW5jdGlvbihlKXt2YXIgdDtlPT09dm9pZCAwJiYoZT17fSk7dmFyIHI9KCh0PWUuZGV0ZWN0b3JzKSE9PW51bGwmJnQhPT12b2lkIDA/dDpbXSkubWFwKGZ1bmN0aW9uKG8pe3RyeXt2YXIgaT1vLmRldGVjdChlKSxhO2lmKE1vKGkpKXt2YXIgdT1mdW5jdGlvbigpe3JldHVybiBuZih2b2lkIDAsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBjO3JldHVybiBvZih0aGlzLGZ1bmN0aW9uKHMpe3N3aXRjaChzLmxhYmVsKXtjYXNlIDA6cmV0dXJuWzQsaV07Y2FzZSAxOnJldHVybiBjPXMuc2VudCgpLFsyLGMuYXR0cmlidXRlc119fSl9KX07YT1uZXcgSCh7fSx1KCkpfWVsc2UgYT1pO3JldHVybiBhLndhaXRGb3JBc3luY0F0dHJpYnV0ZXM/YS53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBsLmRpYWcuZGVidWcoby5jb25zdHJ1Y3Rvci5uYW1lK1wiIGZvdW5kIHJlc291cmNlLlwiLGEpfSk6bC5kaWFnLmRlYnVnKG8uY29uc3RydWN0b3IubmFtZStcIiBmb3VuZCByZXNvdXJjZS5cIixhKSxhfWNhdGNoKGMpe3JldHVybiBsLmRpYWcuZXJyb3Ioby5jb25zdHJ1Y3Rvci5uYW1lK1wiIGZhaWxlZDogXCIrYy5tZXNzYWdlKSxILmVtcHR5KCl9fSksbj1yLnJlZHVjZShmdW5jdGlvbihvLGkpe3JldHVybiBvLm1lcmdlKGkpfSxILmVtcHR5KCkpO3JldHVybiBuLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMmJm4ud2FpdEZvckFzeW5jQXR0cmlidXRlcygpLnRoZW4oZnVuY3Rpb24oKXtzZihyKX0pLG59LHNmPWZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbih0KXtpZihPYmplY3Qua2V5cyh0LmF0dHJpYnV0ZXMpLmxlbmd0aD4wKXt2YXIgcj1KU09OLnN0cmluZ2lmeSh0LmF0dHJpYnV0ZXMsbnVsbCw0KTtsLmRpYWcudmVyYm9zZShyKX19KX07dmFyIERvPXYoUCgpKSxucj1mdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5pdGVyYXRvcixyPXQmJmVbdF0sbj0wO2lmKHIpcmV0dXJuIHIuY2FsbChlKTtpZihlJiZ0eXBlb2YgZS5sZW5ndGg9PVwibnVtYmVyXCIpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSYmbj49ZS5sZW5ndGgmJihlPXZvaWQgMCkse3ZhbHVlOmUmJmVbbisrXSxkb25lOiFlfX19O3Rocm93IG5ldyBUeXBlRXJyb3IodD9cIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCI6XCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpfSxVbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dGhpcy5fc3BhblByb2Nlc3NvcnM9dH1yZXR1cm4gZS5wcm90b3R5cGUuZm9yY2VGbHVzaD1mdW5jdGlvbigpe3ZhciB0LHIsbj1bXTt0cnl7Zm9yKHZhciBvPW5yKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSxpPW8ubmV4dCgpOyFpLmRvbmU7aT1vLm5leHQoKSl7dmFyIGE9aS52YWx1ZTtuLnB1c2goYS5mb3JjZUZsdXNoKCkpfX1jYXRjaCh1KXt0PXtlcnJvcjp1fX1maW5hbGx5e3RyeXtpJiYhaS5kb25lJiYocj1vLnJldHVybikmJnIuY2FsbChvKX1maW5hbGx5e2lmKHQpdGhyb3cgdC5lcnJvcn19cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHUpe1Byb21pc2UuYWxsKG4pLnRoZW4oZnVuY3Rpb24oKXt1KCl9KS5jYXRjaChmdW5jdGlvbihjKXsoMCxEby5nbG9iYWxFcnJvckhhbmRsZXIpKGN8fG5ldyBFcnJvcihcIk11bHRpU3BhblByb2Nlc3NvcjogZm9yY2VGbHVzaCBmYWlsZWRcIikpLHUoKX0pfSl9LGUucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24odCxyKXt2YXIgbixvO3RyeXtmb3IodmFyIGk9bnIodGhpcy5fc3BhblByb2Nlc3NvcnMpLGE9aS5uZXh0KCk7IWEuZG9uZTthPWkubmV4dCgpKXt2YXIgdT1hLnZhbHVlO3Uub25TdGFydCh0LHIpfX1jYXRjaChjKXtuPXtlcnJvcjpjfX1maW5hbGx5e3RyeXthJiYhYS5kb25lJiYobz1pLnJldHVybikmJm8uY2FsbChpKX1maW5hbGx5e2lmKG4pdGhyb3cgbi5lcnJvcn19fSxlLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih0KXt2YXIgcixuO3RyeXtmb3IodmFyIG89bnIodGhpcy5fc3BhblByb2Nlc3NvcnMpLGk9by5uZXh0KCk7IWkuZG9uZTtpPW8ubmV4dCgpKXt2YXIgYT1pLnZhbHVlO2Eub25FbmQodCl9fWNhdGNoKHUpe3I9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e2kmJiFpLmRvbmUmJihuPW8ucmV0dXJuKSYmbi5jYWxsKG8pfWZpbmFsbHl7aWYocil0aHJvdyByLmVycm9yfX19LGUucHJvdG90eXBlLnNodXRkb3duPWZ1bmN0aW9uKCl7dmFyIHQscixuPVtdO3RyeXtmb3IodmFyIG89bnIodGhpcy5fc3BhblByb2Nlc3NvcnMpLGk9by5uZXh0KCk7IWkuZG9uZTtpPW8ubmV4dCgpKXt2YXIgYT1pLnZhbHVlO24ucHVzaChhLnNodXRkb3duKCkpfX1jYXRjaCh1KXt0PXtlcnJvcjp1fX1maW5hbGx5e3RyeXtpJiYhaS5kb25lJiYocj1vLnJldHVybikmJnIuY2FsbChvKX1maW5hbGx5e2lmKHQpdGhyb3cgdC5lcnJvcn19cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHUsYyl7UHJvbWlzZS5hbGwobikudGhlbihmdW5jdGlvbigpe3UoKX0sYyl9KX0sZX0oKTt2YXIgQm89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLnByb3RvdHlwZS5vblN0YXJ0PWZ1bmN0aW9uKHQscil7fSxlLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbih0KXt9LGUucHJvdG90eXBlLnNodXRkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfSxlLnByb3RvdHlwZS5mb3JjZUZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfSxlfSgpO3ZhciB4dDsoZnVuY3Rpb24oZSl7ZVtlLnJlc29sdmVkPTBdPVwicmVzb2x2ZWRcIixlW2UudGltZW91dD0xXT1cInRpbWVvdXRcIixlW2UuZXJyb3I9Ml09XCJlcnJvclwiLGVbZS51bnJlc29sdmVkPTNdPVwidW5yZXNvbHZlZFwifSkoeHR8fCh4dD17fSkpO3ZhciBWbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciByO3RoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycz1bXSx0aGlzLl90cmFjZXJzPW5ldyBNYXA7dmFyIG49KDAsUS5tZXJnZSkoe30sWmUoKSxPbyh0KSk7dGhpcy5yZXNvdXJjZT0ocj1uLnJlc291cmNlKSE9PW51bGwmJnIhPT12b2lkIDA/cjpILmVtcHR5KCksdGhpcy5yZXNvdXJjZT1ILmRlZmF1bHQoKS5tZXJnZSh0aGlzLnJlc291cmNlKSx0aGlzLl9jb25maWc9T2JqZWN0LmFzc2lnbih7fSxuLHtyZXNvdXJjZTp0aGlzLnJlc291cmNlfSk7dmFyIG89dGhpcy5fYnVpbGRFeHBvcnRlckZyb21FbnYoKTtpZihvIT09dm9pZCAwKXt2YXIgaT1uZXcgTXQobyk7dGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yPWl9ZWxzZSB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3I9bmV3IEJvfXJldHVybiBlLnByb3RvdHlwZS5nZXRUcmFjZXI9ZnVuY3Rpb24odCxyLG4pe3ZhciBvPXQrXCJAXCIrKHJ8fFwiXCIpK1wiOlwiKyhuPy5zY2hlbWFVcmx8fFwiXCIpO3JldHVybiB0aGlzLl90cmFjZXJzLmhhcyhvKXx8dGhpcy5fdHJhY2Vycy5zZXQobyxuZXcgUG8oe25hbWU6dCx2ZXJzaW9uOnIsc2NoZW1hVXJsOm4/LnNjaGVtYVVybH0sdGhpcy5fY29uZmlnLHRoaXMpKSx0aGlzLl90cmFjZXJzLmdldChvKX0sZS5wcm90b3R5cGUuYWRkU3BhblByb2Nlc3Nvcj1mdW5jdGlvbih0KXt0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMubGVuZ3RoPT09MCYmdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yLnNodXRkb3duKCkuY2F0Y2goZnVuY3Rpb24ocil7cmV0dXJuIGwuZGlhZy5lcnJvcihcIkVycm9yIHdoaWxlIHRyeWluZyB0byBzaHV0ZG93biBjdXJyZW50IHNwYW4gcHJvY2Vzc29yXCIscil9KSx0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMucHVzaCh0KSx0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3I9bmV3IFVvKHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyl9LGUucHJvdG90eXBlLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yfSxlLnByb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbih0KXt0PT09dm9pZCAwJiYodD17fSksbC50cmFjZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlcih0aGlzKSx0LnByb3BhZ2F0b3I9PT12b2lkIDAmJih0LnByb3BhZ2F0b3I9dGhpcy5fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpKSx0LmNvbnRleHRNYW5hZ2VyJiZsLmNvbnRleHQuc2V0R2xvYmFsQ29udGV4dE1hbmFnZXIodC5jb250ZXh0TWFuYWdlciksdC5wcm9wYWdhdG9yJiZsLnByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IodC5wcm9wYWdhdG9yKX0sZS5wcm90b3R5cGUuZm9yY2VGbHVzaD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbmZpZy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcyxyPXRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG8pe3ZhciBpLGE9c2V0VGltZW91dChmdW5jdGlvbigpe28obmV3IEVycm9yKFwiU3BhbiBwcm9jZXNzb3IgZGlkIG5vdCBjb21wbGV0ZWQgd2l0aGluIHRpbWVvdXQgcGVyaW9kIG9mIFwiK3QrXCIgbXNcIikpLGk9eHQudGltZW91dH0sdCk7bi5mb3JjZUZsdXNoKCkudGhlbihmdW5jdGlvbigpe2NsZWFyVGltZW91dChhKSxpIT09eHQudGltZW91dCYmKGk9eHQucmVzb2x2ZWQsbyhpKSl9KS5jYXRjaChmdW5jdGlvbih1KXtjbGVhclRpbWVvdXQoYSksaT14dC5lcnJvcixvKHUpfSl9KX0pO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLG8pe1Byb21pc2UuYWxsKHIpLnRoZW4oZnVuY3Rpb24oaSl7dmFyIGE9aS5maWx0ZXIoZnVuY3Rpb24odSl7cmV0dXJuIHUhPT14dC5yZXNvbHZlZH0pO2EubGVuZ3RoPjA/byhhKTpuKCl9KS5jYXRjaChmdW5jdGlvbihpKXtyZXR1cm4gbyhbaV0pfSl9KX0sZS5wcm90b3R5cGUuc2h1dGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yLnNodXRkb3duKCl9LGUucHJvdG90eXBlLl9nZXRQcm9wYWdhdG9yPWZ1bmN0aW9uKHQpe3ZhciByO3JldHVybihyPXRoaXMuY29uc3RydWN0b3IuX3JlZ2lzdGVyZWRQcm9wYWdhdG9ycy5nZXQodCkpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6cigpfSxlLnByb3RvdHlwZS5fZ2V0U3BhbkV4cG9ydGVyPWZ1bmN0aW9uKHQpe3ZhciByO3JldHVybihyPXRoaXMuY29uc3RydWN0b3IuX3JlZ2lzdGVyZWRFeHBvcnRlcnMuZ2V0KHQpKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIoKX0sZS5wcm90b3R5cGUuX2J1aWxkUHJvcGFnYXRvckZyb21FbnY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHI9QXJyYXkuZnJvbShuZXcgU2V0KCgwLFEuZ2V0RW52KSgpLk9URUxfUFJPUEFHQVRPUlMpKSxuPXIubWFwKGZ1bmN0aW9uKGkpe3ZhciBhPXQuX2dldFByb3BhZ2F0b3IoaSk7cmV0dXJuIGF8fGwuZGlhZy53YXJuKCdQcm9wYWdhdG9yIFwiJytpKydcIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS4nKSxhfSksbz1uLnJlZHVjZShmdW5jdGlvbihpLGEpe3JldHVybiBhJiZpLnB1c2goYSksaX0sW10pO2lmKG8ubGVuZ3RoIT09MClyZXR1cm4gci5sZW5ndGg9PT0xP29bMF06bmV3IFEuQ29tcG9zaXRlUHJvcGFnYXRvcih7cHJvcGFnYXRvcnM6b30pfSxlLnByb3RvdHlwZS5fYnVpbGRFeHBvcnRlckZyb21FbnY9ZnVuY3Rpb24oKXt2YXIgdD0oMCxRLmdldEVudikoKS5PVEVMX1RSQUNFU19FWFBPUlRFUjtpZighKHQ9PT1cIm5vbmVcInx8dD09PVwiXCIpKXt2YXIgcj10aGlzLl9nZXRTcGFuRXhwb3J0ZXIodCk7cmV0dXJuIHJ8fGwuZGlhZy5lcnJvcignRXhwb3J0ZXIgXCInK3QrJ1wiIHJlcXVlc3RlZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlLicpLHJ9fSxlLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnM9bmV3IE1hcChbW1widHJhY2Vjb250ZXh0XCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFEuVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcn1dLFtcImJhZ2dhZ2VcIixmdW5jdGlvbigpe3JldHVybiBuZXcgUS5XM0NCYWdnYWdlUHJvcGFnYXRvcn1dXSksZS5fcmVnaXN0ZXJlZEV4cG9ydGVycz1uZXcgTWFwLGV9KCk7RSgpO3ZhciBhdD17fTt6KGF0LHVoKTtpbXBvcnQqYXMgdWggZnJvbVwiQG9wZW50ZWxlbWV0cnkvYXBpLWxvZ3NcIjt2YXIgSHU9dihqbygpLDEpO0UoKTt2YXIgb3I9dihQKCkpO0UoKTtFKCk7RSgpO3ZhciBXdD12KFAoKSksbGY9ZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZTeW1ib2wuaXRlcmF0b3Iscj10JiZlW3RdLG49MDtpZihyKXJldHVybiByLmNhbGwoZSk7aWYoZSYmdHlwZW9mIGUubGVuZ3RoPT1cIm51bWJlclwiKXJldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGUmJm4+PWUubGVuZ3RoJiYoZT12b2lkIDApLHt2YWx1ZTplJiZlW24rK10sZG9uZTohZX19fTt0aHJvdyBuZXcgVHlwZUVycm9yKHQ/XCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiOlwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKX0sZmY9ZnVuY3Rpb24oZSx0KXt2YXIgcj10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighcilyZXR1cm4gZTt2YXIgbj1yLmNhbGwoZSksbyxpPVtdLGE7dHJ5e2Zvcig7KHQ9PT12b2lkIDB8fHQtLSA+MCkmJiEobz1uLm5leHQoKSkuZG9uZTspaS5wdXNoKG8udmFsdWUpfWNhdGNoKHUpe2E9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihyPW4ucmV0dXJuKSYmci5jYWxsKG4pfWZpbmFsbHl7aWYoYSl0aHJvdyBhLmVycm9yfX1yZXR1cm4gaX0sa289ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscixuKXt0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy50b3RhbEF0dHJpYnV0ZXNDb3VudD0wLHRoaXMuX2lzUmVhZG9ubHk9ITE7dmFyIG89bi50aW1lc3RhbXAsaT1uLm9ic2VydmVkVGltZXN0YW1wLGE9bi5zZXZlcml0eU51bWJlcix1PW4uc2V2ZXJpdHlUZXh0LGM9bi5ib2R5LHM9bi5hdHRyaWJ1dGVzLGY9cz09PXZvaWQgMD97fTpzLHA9bi5jb250ZXh0LGQ9RGF0ZS5ub3coKTtpZih0aGlzLmhyVGltZT0oMCxXdC50aW1lSW5wdXRUb0hyVGltZSkobz8/ZCksdGhpcy5oclRpbWVPYnNlcnZlZD0oMCxXdC50aW1lSW5wdXRUb0hyVGltZSkoaT8/ZCkscCl7dmFyIG09bC50cmFjZS5nZXRTcGFuQ29udGV4dChwKTttJiZsLmlzU3BhbkNvbnRleHRWYWxpZChtKSYmKHRoaXMuc3BhbkNvbnRleHQ9bSl9dGhpcy5zZXZlcml0eU51bWJlcj1hLHRoaXMuc2V2ZXJpdHlUZXh0PXUsdGhpcy5ib2R5PWMsdGhpcy5yZXNvdXJjZT10LnJlc291cmNlLHRoaXMuaW5zdHJ1bWVudGF0aW9uU2NvcGU9cix0aGlzLl9sb2dSZWNvcmRMaW1pdHM9dC5sb2dSZWNvcmRMaW1pdHMsdGhpcy5zZXRBdHRyaWJ1dGVzKGYpfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJzZXZlcml0eVRleHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldmVyaXR5VGV4dH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX2lzTG9nUmVjb3JkUmVhZG9ubHkoKXx8KHRoaXMuX3NldmVyaXR5VGV4dD10KX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJzZXZlcml0eU51bWJlclwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V2ZXJpdHlOdW1iZXJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9pc0xvZ1JlY29yZFJlYWRvbmx5KCl8fCh0aGlzLl9zZXZlcml0eU51bWJlcj10KX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJib2R5XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib2R5fSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5faXNMb2dSZWNvcmRSZWFkb25seSgpfHwodGhpcy5fYm9keT10KX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvdGFsQXR0cmlidXRlc0NvdW50LU9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcykubGVuZ3RofSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLnNldEF0dHJpYnV0ZT1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLl9pc0xvZ1JlY29yZFJlYWRvbmx5KCk/dGhpczpyPT09bnVsbD90aGlzOnQubGVuZ3RoPT09MD8obC5kaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSBrZXk6IFwiK3QpLHRoaXMpOiEoMCxXdC5pc0F0dHJpYnV0ZVZhbHVlKShyKSYmISh0eXBlb2Ygcj09XCJvYmplY3RcIiYmIUFycmF5LmlzQXJyYXkocikmJk9iamVjdC5rZXlzKHIpLmxlbmd0aD4wKT8obC5kaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIrdCksdGhpcyk6KHRoaXMudG90YWxBdHRyaWJ1dGVzQ291bnQrPTEsT2JqZWN0LmtleXModGhpcy5hdHRyaWJ1dGVzKS5sZW5ndGg+PXRoaXMuX2xvZ1JlY29yZExpbWl0cy5hdHRyaWJ1dGVDb3VudExpbWl0JiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYXR0cmlidXRlcyx0KT90aGlzOigoMCxXdC5pc0F0dHJpYnV0ZVZhbHVlKShyKT90aGlzLmF0dHJpYnV0ZXNbdF09dGhpcy5fdHJ1bmNhdGVUb1NpemUocik6dGhpcy5hdHRyaWJ1dGVzW3RdPXIsdGhpcykpfSxlLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3ZhciByLG47dHJ5e2Zvcih2YXIgbz1sZihPYmplY3QuZW50cmllcyh0KSksaT1vLm5leHQoKTshaS5kb25lO2k9by5uZXh0KCkpe3ZhciBhPWZmKGkudmFsdWUsMiksdT1hWzBdLGM9YVsxXTt0aGlzLnNldEF0dHJpYnV0ZSh1LGMpfX1jYXRjaChzKXtyPXtlcnJvcjpzfX1maW5hbGx5e3RyeXtpJiYhaS5kb25lJiYobj1vLnJldHVybikmJm4uY2FsbChvKX1maW5hbGx5e2lmKHIpdGhyb3cgci5lcnJvcn19cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLnNldEJvZHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYm9keT10LHRoaXN9LGUucHJvdG90eXBlLnNldFNldmVyaXR5TnVtYmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldmVyaXR5TnVtYmVyPXQsdGhpc30sZS5wcm90b3R5cGUuc2V0U2V2ZXJpdHlUZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldmVyaXR5VGV4dD10LHRoaXN9LGUucHJvdG90eXBlLl9tYWtlUmVhZG9ubHk9ZnVuY3Rpb24oKXt0aGlzLl9pc1JlYWRvbmx5PSEwfSxlLnByb3RvdHlwZS5fdHJ1bmNhdGVUb1NpemU9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcyxuPXRoaXMuX2xvZ1JlY29yZExpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0O3JldHVybiBuPD0wPyhsLmRpYWcud2FybihcIkF0dHJpYnV0ZSB2YWx1ZSBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBnb3QgXCIrbiksdCk6dHlwZW9mIHQ9PVwic3RyaW5nXCI/dGhpcy5fdHJ1bmNhdGVUb0xpbWl0VXRpbCh0LG4pOkFycmF5LmlzQXJyYXkodCk/dC5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIHR5cGVvZiBvPT1cInN0cmluZ1wiP3IuX3RydW5jYXRlVG9MaW1pdFV0aWwobyxuKTpvfSk6dH0sZS5wcm90b3R5cGUuX3RydW5jYXRlVG9MaW1pdFV0aWw9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdC5sZW5ndGg8PXI/dDp0LnN1YnN0cmluZygwLHIpfSxlLnByb3RvdHlwZS5faXNMb2dSZWNvcmRSZWFkb25seT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1JlYWRvbmx5JiZsLmRpYWcud2FybihcIkNhbiBub3QgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uIG9uIGVtaXR0ZWQgbG9nIHJlY29yZFwiKSx0aGlzLl9pc1JlYWRvbmx5fSxlfSgpO3ZhciBTbj1mdW5jdGlvbigpe3JldHVybiBTbj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQscj0xLG49YXJndW1lbnRzLmxlbmd0aDtyPG47cisrKXt0PWFyZ3VtZW50c1tyXTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmKGVbb109dFtvXSl9cmV0dXJuIGV9LFNuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scW89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7dGhpcy5pbnN0cnVtZW50YXRpb25TY29wZT10LHRoaXMuX3NoYXJlZFN0YXRlPXJ9cmV0dXJuIGUucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dmFyIHI9dC5jb250ZXh0fHxsLmNvbnRleHQuYWN0aXZlKCksbj1uZXcga28odGhpcy5fc2hhcmVkU3RhdGUsdGhpcy5pbnN0cnVtZW50YXRpb25TY29wZSxTbih7Y29udGV4dDpyfSx0KSk7dGhpcy5fc2hhcmVkU3RhdGUuYWN0aXZlUHJvY2Vzc29yLm9uRW1pdChuLHIpLG4uX21ha2VSZWFkb25seSgpfSxlfSgpO3ZhciB1dD12KFAoKSk7ZnVuY3Rpb24gWG8oKXtyZXR1cm57Zm9yY2VGbHVzaFRpbWVvdXRNaWxsaXM6M2U0LGxvZ1JlY29yZExpbWl0czp7YXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDooMCx1dC5nZXRFbnYpKCkuT1RFTF9MT0dSRUNPUkRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxhdHRyaWJ1dGVDb3VudExpbWl0OigwLHV0LmdldEVudikoKS5PVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfQ09VTlRfTElNSVR9LGluY2x1ZGVUcmFjZUNvbnRleHQ6ITB9fWZ1bmN0aW9uIEtvKGUpe3ZhciB0LHIsbixvLGksYSx1PSgwLHV0LmdldEVudldpdGhvdXREZWZhdWx0cykoKTtyZXR1cm57YXR0cmlidXRlQ291bnRMaW1pdDoobj0ocj0odD1lLmF0dHJpYnV0ZUNvdW50TGltaXQpIT09bnVsbCYmdCE9PXZvaWQgMD90OnUuT1RFTF9MT0dSRUNPUkRfQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJnIhPT12b2lkIDA/cjp1Lk9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJm4hPT12b2lkIDA/bjp1dC5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OihhPShpPShvPWUuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkhPT1udWxsJiZvIT09dm9pZCAwP286dS5PVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSE9PW51bGwmJmkhPT12b2lkIDA/aTp1Lk9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCkhPT1udWxsJiZhIT09dm9pZCAwP2E6dXQuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUfX12YXIgem89dihQKCkpLFdvPWZ1bmN0aW9uKGUsdCxyLG4pe2Z1bmN0aW9uIG8oaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiByP2k6bmV3IHIoZnVuY3Rpb24oYSl7YShpKX0pfXJldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKGZ1bmN0aW9uKGksYSl7ZnVuY3Rpb24gdShmKXt0cnl7cyhuLm5leHQoZikpfWNhdGNoKHApe2EocCl9fWZ1bmN0aW9uIGMoZil7dHJ5e3Mobi50aHJvdyhmKSl9Y2F0Y2gocCl7YShwKX19ZnVuY3Rpb24gcyhmKXtmLmRvbmU/aShmLnZhbHVlKTpvKGYudmFsdWUpLnRoZW4odSxjKX1zKChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KX0sWW89ZnVuY3Rpb24oZSx0KXt2YXIgcj17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoaVswXSYxKXRocm93IGlbMV07cmV0dXJuIGlbMV19LHRyeXM6W10sb3BzOltdfSxuLG8saSxhO3JldHVybiBhPXtuZXh0OnUoMCksdGhyb3c6dSgxKSxyZXR1cm46dSgyKX0sdHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoYVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxhO2Z1bmN0aW9uIHUocyl7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBjKFtzLGZdKX19ZnVuY3Rpb24gYyhzKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7cjspdHJ5e2lmKG49MSxvJiYoaT1zWzBdJjI/by5yZXR1cm46c1swXT9vLnRocm93fHwoKGk9by5yZXR1cm4pJiZpLmNhbGwobyksMCk6by5uZXh0KSYmIShpPWkuY2FsbChvLHNbMV0pKS5kb25lKXJldHVybiBpO3N3aXRjaChvPTAsaSYmKHM9W3NbMF0mMixpLnZhbHVlXSksc1swXSl7Y2FzZSAwOmNhc2UgMTppPXM7YnJlYWs7Y2FzZSA0OnJldHVybiByLmxhYmVsKysse3ZhbHVlOnNbMV0sZG9uZTohMX07Y2FzZSA1OnIubGFiZWwrKyxvPXNbMV0scz1bMF07Y29udGludWU7Y2FzZSA3OnM9ci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoaT1yLnRyeXMsIShpPWkubGVuZ3RoPjAmJmlbaS5sZW5ndGgtMV0pJiYoc1swXT09PTZ8fHNbMF09PT0yKSl7cj0wO2NvbnRpbnVlfWlmKHNbMF09PT0zJiYoIWl8fHNbMV0+aVswXSYmc1sxXTxpWzNdKSl7ci5sYWJlbD1zWzFdO2JyZWFrfWlmKHNbMF09PT02JiZyLmxhYmVsPGlbMV0pe3IubGFiZWw9aVsxXSxpPXM7YnJlYWt9aWYoaSYmci5sYWJlbDxpWzJdKXtyLmxhYmVsPWlbMl0sci5vcHMucHVzaChzKTticmVha31pWzJdJiZyLm9wcy5wb3AoKSxyLnRyeXMucG9wKCk7Y29udGludWV9cz10LmNhbGwoZSxyKX1jYXRjaChmKXtzPVs2LGZdLG89MH1maW5hbGx5e249aT0wfWlmKHNbMF0mNSl0aHJvdyBzWzFdO3JldHVybnt2YWx1ZTpzWzBdP3NbMV06dm9pZCAwLGRvbmU6ITB9fX0sJG89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7dGhpcy5wcm9jZXNzb3JzPXQsdGhpcy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcz1yfXJldHVybiBlLnByb3RvdHlwZS5mb3JjZUZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuIFdvKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB0O3JldHVybiBZbyh0aGlzLGZ1bmN0aW9uKHIpe3N3aXRjaChyLmxhYmVsKXtjYXNlIDA6cmV0dXJuIHQ9dGhpcy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcyxbNCxQcm9taXNlLmFsbCh0aGlzLnByb2Nlc3NvcnMubWFwKGZ1bmN0aW9uKG4pe3JldHVybigwLHpvLmNhbGxXaXRoVGltZW91dCkobi5mb3JjZUZsdXNoKCksdCl9KSldO2Nhc2UgMTpyZXR1cm4gci5zZW50KCksWzJdfX0pfSl9LGUucHJvdG90eXBlLm9uRW1pdD1mdW5jdGlvbih0LHIpe3RoaXMucHJvY2Vzc29ycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe3JldHVybiBuLm9uRW1pdCh0LHIpfSl9LGUucHJvdG90eXBlLnNodXRkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIFdvKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBZbyh0aGlzLGZ1bmN0aW9uKHQpe3N3aXRjaCh0LmxhYmVsKXtjYXNlIDA6cmV0dXJuWzQsUHJvbWlzZS5hbGwodGhpcy5wcm9jZXNzb3JzLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5zaHV0ZG93bigpfSkpXTtjYXNlIDE6cmV0dXJuIHQuc2VudCgpLFsyXX19KX0pfSxlfSgpO3ZhciBRbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmZvcmNlRmx1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9LGUucHJvdG90eXBlLm9uRW1pdD1mdW5jdGlvbih0LHIpe30sZS5wcm90b3R5cGUuc2h1dGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9LGV9KCk7dmFyIEpvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LHIsbil7dGhpcy5yZXNvdXJjZT10LHRoaXMuZm9yY2VGbHVzaFRpbWVvdXRNaWxsaXM9cix0aGlzLmxvZ1JlY29yZExpbWl0cz1uLHRoaXMubG9nZ2Vycz1uZXcgTWFwLHRoaXMucmVnaXN0ZXJlZExvZ1JlY29yZFByb2Nlc3NvcnM9W10sdGhpcy5hY3RpdmVQcm9jZXNzb3I9bmV3IFFvfXJldHVybiBlfSgpO3ZhciBwZj1cInVua25vd25cIixnbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciByPSgwLG9yLm1lcmdlKSh7fSxYbygpLHQpLG49ci5yZXNvdXJjZSxvPW49PT12b2lkIDA/SC5kZWZhdWx0KCk6bixpPXIubG9nUmVjb3JkTGltaXRzLGE9ci5mb3JjZUZsdXNoVGltZW91dE1pbGxpczt0aGlzLl9zaGFyZWRTdGF0ZT1uZXcgSm8obyxhLEtvKGkpKSx0aGlzLl9zaHV0ZG93bk9uY2U9bmV3IG9yLkJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS5nZXRMb2dnZXI9ZnVuY3Rpb24odCxyLG4pe2lmKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZClyZXR1cm4gbC5kaWFnLndhcm4oXCJBIHNodXRkb3duIExvZ2dlclByb3ZpZGVyIGNhbm5vdCBwcm92aWRlIGEgTG9nZ2VyXCIpLGF0Lk5PT1BfTE9HR0VSO3R8fGwuZGlhZy53YXJuKFwiTG9nZ2VyIHJlcXVlc3RlZCB3aXRob3V0IGluc3RydW1lbnRhdGlvbiBzY29wZSBuYW1lLlwiKTt2YXIgbz10fHxwZixpPW8rXCJAXCIrKHJ8fFwiXCIpK1wiOlwiKyhuPy5zY2hlbWFVcmx8fFwiXCIpO3JldHVybiB0aGlzLl9zaGFyZWRTdGF0ZS5sb2dnZXJzLmhhcyhpKXx8dGhpcy5fc2hhcmVkU3RhdGUubG9nZ2Vycy5zZXQoaSxuZXcgcW8oe25hbWU6byx2ZXJzaW9uOnIsc2NoZW1hVXJsOm4/LnNjaGVtYVVybH0sdGhpcy5fc2hhcmVkU3RhdGUpKSx0aGlzLl9zaGFyZWRTdGF0ZS5sb2dnZXJzLmdldChpKX0sZS5wcm90b3R5cGUuYWRkTG9nUmVjb3JkUHJvY2Vzc29yPWZ1bmN0aW9uKHQpe3RoaXMuX3NoYXJlZFN0YXRlLnJlZ2lzdGVyZWRMb2dSZWNvcmRQcm9jZXNzb3JzLmxlbmd0aD09PTAmJnRoaXMuX3NoYXJlZFN0YXRlLmFjdGl2ZVByb2Nlc3Nvci5zaHV0ZG93bigpLmNhdGNoKGZ1bmN0aW9uKHIpe3JldHVybiBsLmRpYWcuZXJyb3IoXCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBsb2cgcmVjb3JkIHByb2Nlc3NvclwiLHIpfSksdGhpcy5fc2hhcmVkU3RhdGUucmVnaXN0ZXJlZExvZ1JlY29yZFByb2Nlc3NvcnMucHVzaCh0KSx0aGlzLl9zaGFyZWRTdGF0ZS5hY3RpdmVQcm9jZXNzb3I9bmV3ICRvKHRoaXMuX3NoYXJlZFN0YXRlLnJlZ2lzdGVyZWRMb2dSZWNvcmRQcm9jZXNzb3JzLHRoaXMuX3NoYXJlZFN0YXRlLmZvcmNlRmx1c2hUaW1lb3V0TWlsbGlzKX0sZS5wcm90b3R5cGUuZm9yY2VGbHVzaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQ/KGwuZGlhZy53YXJuKFwiaW52YWxpZCBhdHRlbXB0IHRvIGZvcmNlIGZsdXNoIGFmdGVyIExvZ2dlclByb3ZpZGVyIHNodXRkb3duXCIpLHRoaXMuX3NodXRkb3duT25jZS5wcm9taXNlKTp0aGlzLl9zaGFyZWRTdGF0ZS5hY3RpdmVQcm9jZXNzb3IuZm9yY2VGbHVzaCgpfSxlLnByb3RvdHlwZS5zaHV0ZG93bj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQ/KGwuZGlhZy53YXJuKFwic2h1dGRvd24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIExvZ2dlclByb3ZpZGVyXCIpLHRoaXMuX3NodXRkb3duT25jZS5wcm9taXNlKTp0aGlzLl9zaHV0ZG93bk9uY2UuY2FsbCgpfSxlLnByb3RvdHlwZS5fc2h1dGRvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hhcmVkU3RhdGUuYWN0aXZlUHJvY2Vzc29yLnNodXRkb3duKCl9LGV9KCk7dmFyIHNyOyhmdW5jdGlvbihlKXtlW2UuREVMVEE9MF09XCJERUxUQVwiLGVbZS5DVU1VTEFUSVZFPTFdPVwiQ1VNVUxBVElWRVwifSkoc3J8fChzcj17fSkpO3ZhciBkZj1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQscil7cmV0dXJuIGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKG4sbyl7bi5fX3Byb3RvX189b318fGZ1bmN0aW9uKG4sbyl7Zm9yKHZhciBpIGluIG8pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8saSkmJihuW2ldPW9baV0pfSxlKHQscil9O3JldHVybiBmdW5jdGlvbih0LHIpe2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCImJnIhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiK1N0cmluZyhyKStcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO2UodCxyKTtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXQucHJvdG90eXBlPXI9PT1udWxsP09iamVjdC5jcmVhdGUocik6KG4ucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyBuKX19KCksWm89ZnVuY3Rpb24oZSx0LHIsbil7ZnVuY3Rpb24gbyhpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIHI/aTpuZXcgcihmdW5jdGlvbihhKXthKGkpfSl9cmV0dXJuIG5ldyhyfHwocj1Qcm9taXNlKSkoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiB1KGYpe3RyeXtzKG4ubmV4dChmKSl9Y2F0Y2gocCl7YShwKX19ZnVuY3Rpb24gYyhmKXt0cnl7cyhuLnRocm93KGYpKX1jYXRjaChwKXthKHApfX1mdW5jdGlvbiBzKGYpe2YuZG9uZT9pKGYudmFsdWUpOm8oZi52YWx1ZSkudGhlbih1LGMpfXMoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pfSx0cz1mdW5jdGlvbihlLHQpe3ZhciByPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZihpWzBdJjEpdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119LG4sbyxpLGE7cmV0dXJuIGE9e25leHQ6dSgwKSx0aHJvdzp1KDEpLHJldHVybjp1KDIpfSx0eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJihhW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGE7ZnVuY3Rpb24gdShzKXtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIGMoW3MsZl0pfX1mdW5jdGlvbiBjKHMpe2lmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7Zm9yKDtyOyl0cnl7aWYobj0xLG8mJihpPXNbMF0mMj9vLnJldHVybjpzWzBdP28udGhyb3d8fCgoaT1vLnJldHVybikmJmkuY2FsbChvKSwwKTpvLm5leHQpJiYhKGk9aS5jYWxsKG8sc1sxXSkpLmRvbmUpcmV0dXJuIGk7c3dpdGNoKG89MCxpJiYocz1bc1swXSYyLGkudmFsdWVdKSxzWzBdKXtjYXNlIDA6Y2FzZSAxOmk9czticmVhaztjYXNlIDQ6cmV0dXJuIHIubGFiZWwrKyx7dmFsdWU6c1sxXSxkb25lOiExfTtjYXNlIDU6ci5sYWJlbCsrLG89c1sxXSxzPVswXTtjb250aW51ZTtjYXNlIDc6cz1yLm9wcy5wb3AoKSxyLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZihpPXIudHJ5cywhKGk9aS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXSkmJihzWzBdPT09Nnx8c1swXT09PTIpKXtyPTA7Y29udGludWV9aWYoc1swXT09PTMmJighaXx8c1sxXT5pWzBdJiZzWzFdPGlbM10pKXtyLmxhYmVsPXNbMV07YnJlYWt9aWYoc1swXT09PTYmJnIubGFiZWw8aVsxXSl7ci5sYWJlbD1pWzFdLGk9czticmVha31pZihpJiZyLmxhYmVsPGlbMl0pe3IubGFiZWw9aVsyXSxyLm9wcy5wdXNoKHMpO2JyZWFrfWlbMl0mJnIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZX1zPXQuY2FsbChlLHIpfWNhdGNoKGYpe3M9WzYsZl0sbz0wfWZpbmFsbHl7bj1pPTB9aWYoc1swXSY1KXRocm93IHNbMV07cmV0dXJue3ZhbHVlOnNbMF0/c1sxXTp2b2lkIDAsZG9uZTohMH19fTt2YXIgX2Y9ZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZTeW1ib2wuaXRlcmF0b3Iscj10JiZlW3RdLG49MDtpZihyKXJldHVybiByLmNhbGwoZSk7aWYoZSYmdHlwZW9mIGUubGVuZ3RoPT1cIm51bWJlclwiKXJldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGUmJm4+PWUubGVuZ3RoJiYoZT12b2lkIDApLHt2YWx1ZTplJiZlW24rK10sZG9uZTohZX19fTt0aHJvdyBuZXcgVHlwZUVycm9yKHQ/XCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiOlwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKX07ZnVuY3Rpb24gZXMoZSl7cmV0dXJuIGUhPW51bGx9ZnVuY3Rpb24gcnMoZSl7dmFyIHQ9T2JqZWN0LmtleXMoZSk7cmV0dXJuIHQubGVuZ3RoPT09MD9cIlwiOih0PXQuc29ydCgpLEpTT04uc3RyaW5naWZ5KHQubWFwKGZ1bmN0aW9uKHIpe3JldHVybltyLGVbcl1dfSkpKX1mdW5jdGlvbiBucyhlKXt2YXIgdCxyO3JldHVybiBlLm5hbWUrXCI6XCIrKCh0PWUudmVyc2lvbikhPT1udWxsJiZ0IT09dm9pZCAwP3Q6XCJcIikrXCI6XCIrKChyPWUuc2NoZW1hVXJsKSE9PW51bGwmJnIhPT12b2lkIDA/cjpcIlwiKX12YXIgaGY9ZnVuY3Rpb24oZSl7ZGYodCxlKTtmdW5jdGlvbiB0KHIpe3ZhciBuPWUuY2FsbCh0aGlzLHIpfHx0aGlzO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yobix0LnByb3RvdHlwZSksbn1yZXR1cm4gdH0oRXJyb3IpO2Z1bmN0aW9uIHluKGUsdCl7dmFyIHIsbj1uZXcgUHJvbWlzZShmdW5jdGlvbihpLGEpe3I9c2V0VGltZW91dChmdW5jdGlvbigpe2EobmV3IGhmKFwiT3BlcmF0aW9uIHRpbWVkIG91dC5cIikpfSx0KX0pO3JldHVybiBQcm9taXNlLnJhY2UoW2Usbl0pLnRoZW4oZnVuY3Rpb24obyl7cmV0dXJuIGNsZWFyVGltZW91dChyKSxvfSxmdW5jdGlvbihvKXt0aHJvdyBjbGVhclRpbWVvdXQociksb30pfWZ1bmN0aW9uIGlzKGUpe3JldHVybiBabyh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0cyh0aGlzLGZ1bmN0aW9uKHIpe3JldHVyblsyLFByb21pc2UuYWxsKGUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBabyh0LHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgbyxpO3JldHVybiB0cyh0aGlzLGZ1bmN0aW9uKGEpe3N3aXRjaChhLmxhYmVsKXtjYXNlIDA6cmV0dXJuIGEudHJ5cy5wdXNoKFswLDIsLDNdKSxbNCxuXTtjYXNlIDE6cmV0dXJuIG89YS5zZW50KCksWzIse3N0YXR1czpcImZ1bGZpbGxlZFwiLHZhbHVlOm99XTtjYXNlIDI6cmV0dXJuIGk9YS5zZW50KCksWzIse3N0YXR1czpcInJlamVjdGVkXCIscmVhc29uOml9XTtjYXNlIDM6cmV0dXJuWzJdfX0pfSl9KSldfSl9KX1mdW5jdGlvbiBvcyhlKXtyZXR1cm4gZS5zdGF0dXM9PT1cInJlamVjdGVkXCJ9ZnVuY3Rpb24gc3MoZSx0KXt2YXIgcixuO2lmKGUuc2l6ZSE9PXQuc2l6ZSlyZXR1cm4hMTt0cnl7Zm9yKHZhciBvPV9mKGUpLGk9by5uZXh0KCk7IWkuZG9uZTtpPW8ubmV4dCgpKXt2YXIgYT1pLnZhbHVlO2lmKCF0LmhhcyhhKSlyZXR1cm4hMX19Y2F0Y2godSl7cj17ZXJyb3I6dX19ZmluYWxseXt0cnl7aSYmIWkuZG9uZSYmKG49by5yZXR1cm4pJiZuLmNhbGwobyl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fXJldHVybiEwfWZ1bmN0aW9uIGFzKGUsdCl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX1FKCk7dmFyIGN0OyhmdW5jdGlvbihlKXtlLkNPVU5URVI9XCJDT1VOVEVSXCIsZS5ISVNUT0dSQU09XCJISVNUT0dSQU1cIixlLlVQX0RPV05fQ09VTlRFUj1cIlVQX0RPV05fQ09VTlRFUlwiLGUuT0JTRVJWQUJMRV9DT1VOVEVSPVwiT0JTRVJWQUJMRV9DT1VOVEVSXCIsZS5PQlNFUlZBQkxFX0dBVUdFPVwiT0JTRVJWQUJMRV9HQVVHRVwiLGUuT0JTRVJWQUJMRV9VUF9ET1dOX0NPVU5URVI9XCJPQlNFUlZBQkxFX1VQX0RPV05fQ09VTlRFUlwifSkoY3R8fChjdD17fSkpO2Z1bmN0aW9uIGx0KGUsdCxyKXt2YXIgbixvLGksYTtyZXR1cm4gbWYoZSl8fGwuZGlhZy53YXJuKCdJbnZhbGlkIG1ldHJpYyBuYW1lOiBcIicrZSsnXCIuIFRoZSBtZXRyaWMgbmFtZSBzaG91bGQgYmUgYSBBU0NJSSBzdHJpbmcgd2l0aCBhIGxlbmd0aCBubyBncmVhdGVyIHRoYW4gMjU1IGNoYXJhY3RlcnMuJykse25hbWU6ZSx0eXBlOnQsZGVzY3JpcHRpb246KG49cj8uZGVzY3JpcHRpb24pIT09bnVsbCYmbiE9PXZvaWQgMD9uOlwiXCIsdW5pdDoobz1yPy51bml0KSE9PW51bGwmJm8hPT12b2lkIDA/bzpcIlwiLHZhbHVlVHlwZTooaT1yPy52YWx1ZVR5cGUpIT09bnVsbCYmaSE9PXZvaWQgMD9pOmwuVmFsdWVUeXBlLkRPVUJMRSxhZHZpY2U6KGE9cj8uYWR2aWNlKSE9PW51bGwmJmEhPT12b2lkIDA/YTp7fX19ZnVuY3Rpb24gdXMoZSx0KXt2YXIgcixuO3JldHVybntuYW1lOihyPWUubmFtZSkhPT1udWxsJiZyIT09dm9pZCAwP3I6dC5uYW1lLGRlc2NyaXB0aW9uOihuPWUuZGVzY3JpcHRpb24pIT09bnVsbCYmbiE9PXZvaWQgMD9uOnQuZGVzY3JpcHRpb24sdHlwZTp0LnR5cGUsdW5pdDp0LnVuaXQsdmFsdWVUeXBlOnQudmFsdWVUeXBlLGFkdmljZTp0LmFkdmljZX19ZnVuY3Rpb24gY3MoZSx0KXtyZXR1cm4gYXMoZS5uYW1lLHQubmFtZSkmJmUudW5pdD09PXQudW5pdCYmZS50eXBlPT09dC50eXBlJiZlLnZhbHVlVHlwZT09PXQudmFsdWVUeXBlfXZhciBFZj0vXlthLXpdW2EtejAtOV8uXFwtL117MCwyNTR9JC9pO2Z1bmN0aW9uIG1mKGUpe3JldHVybiBlLm1hdGNoKEVmKSE9bnVsbH1FKCk7dmFyIGxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuX3JlZ2lzdGVyZWRWaWV3cz1bXX1yZXR1cm4gZS5wcm90b3R5cGUuYWRkVmlldz1mdW5jdGlvbih0KXt0aGlzLl9yZWdpc3RlcmVkVmlld3MucHVzaCh0KX0sZS5wcm90b3R5cGUuZmluZFZpZXdzPWZ1bmN0aW9uKHQscil7dmFyIG49dGhpcyxvPXRoaXMuX3JlZ2lzdGVyZWRWaWV3cy5maWx0ZXIoZnVuY3Rpb24oaSl7cmV0dXJuIG4uX21hdGNoSW5zdHJ1bWVudChpLmluc3RydW1lbnRTZWxlY3Rvcix0KSYmbi5fbWF0Y2hNZXRlcihpLm1ldGVyU2VsZWN0b3Iscil9KTtyZXR1cm4gb30sZS5wcm90b3R5cGUuX21hdGNoSW5zdHJ1bWVudD1mdW5jdGlvbih0LHIpe3JldHVybih0LmdldFR5cGUoKT09PXZvaWQgMHx8ci50eXBlPT09dC5nZXRUeXBlKCkpJiZ0LmdldE5hbWVGaWx0ZXIoKS5tYXRjaChyLm5hbWUpJiZ0LmdldFVuaXRGaWx0ZXIoKS5tYXRjaChyLnVuaXQpfSxlLnByb3RvdHlwZS5fbWF0Y2hNZXRlcj1mdW5jdGlvbih0LHIpe3JldHVybiB0LmdldE5hbWVGaWx0ZXIoKS5tYXRjaChyLm5hbWUpJiYoci52ZXJzaW9uPT09dm9pZCAwfHx0LmdldFZlcnNpb25GaWx0ZXIoKS5tYXRjaChyLnZlcnNpb24pKSYmKHIuc2NoZW1hVXJsPT09dm9pZCAwfHx0LmdldFNjaGVtYVVybEZpbHRlcigpLm1hdGNoKHIuc2NoZW1hVXJsKSl9LGV9KCk7RSgpO3ZhciBmcz12KFAoKSksWXQ9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LHIpe3JldHVybiBlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihuLG8pe24uX19wcm90b19fPW99fHxmdW5jdGlvbihuLG8pe2Zvcih2YXIgaSBpbiBvKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGkpJiYobltpXT1vW2ldKX0sZSh0LHIpfTtyZXR1cm4gZnVuY3Rpb24odCxyKXtpZih0eXBlb2YgciE9XCJmdW5jdGlvblwiJiZyIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIitTdHJpbmcocikrXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtlKHQscik7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH10LnByb3RvdHlwZT1yPT09bnVsbD9PYmplY3QuY3JlYXRlKHIpOihuLnByb3RvdHlwZT1yLnByb3RvdHlwZSxuZXcgbil9fSgpLHZuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LHIpe3RoaXMuX3dyaXRhYmxlTWV0cmljU3RvcmFnZT10LHRoaXMuX2Rlc2NyaXB0b3I9cn1yZXR1cm4gZS5wcm90b3R5cGUuX3JlY29yZD1mdW5jdGlvbih0LHIsbil7aWYocj09PXZvaWQgMCYmKHI9e30pLG49PT12b2lkIDAmJihuPWwuY29udGV4dC5hY3RpdmUoKSksdHlwZW9mIHQhPVwibnVtYmVyXCIpe2wuZGlhZy53YXJuKFwibm9uLW51bWJlciB2YWx1ZSBwcm92aWRlZCB0byBtZXRyaWMgXCIrdGhpcy5fZGVzY3JpcHRvci5uYW1lK1wiOiBcIit0KTtyZXR1cm59dGhpcy5fZGVzY3JpcHRvci52YWx1ZVR5cGU9PT1sLlZhbHVlVHlwZS5JTlQmJiFOdW1iZXIuaXNJbnRlZ2VyKHQpJiYobC5kaWFnLndhcm4oXCJJTlQgdmFsdWUgdHlwZSBjYW5ub3QgYWNjZXB0IGEgZmxvYXRpbmctcG9pbnQgdmFsdWUgZm9yIFwiK3RoaXMuX2Rlc2NyaXB0b3IubmFtZStcIiwgaWdub3JpbmcgdGhlIGZyYWN0aW9uYWwgZGlnaXRzLlwiKSx0PU1hdGgudHJ1bmModCksIU51bWJlci5pc0ludGVnZXIodCkpfHx0aGlzLl93cml0YWJsZU1ldHJpY1N0b3JhZ2UucmVjb3JkKHQscixuLCgwLGZzLm1pbGxpc1RvSHJUaW1lKShEYXRlLm5vdygpKSl9LGV9KCk7dmFyIHBzPWZ1bmN0aW9uKGUpe1l0KHQsZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlIT09bnVsbCYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihyLG4sbyl7dGhpcy5fcmVjb3JkKHIsbixvKX0sdH0odm4pO3ZhciBkcz1mdW5jdGlvbihlKXtZdCh0LGUpO2Z1bmN0aW9uIHQoKXtyZXR1cm4gZSE9PW51bGwmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiB0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24ocixuLG8pe2lmKHI8MCl7bC5kaWFnLndhcm4oXCJuZWdhdGl2ZSB2YWx1ZSBwcm92aWRlZCB0byBjb3VudGVyIFwiK3RoaXMuX2Rlc2NyaXB0b3IubmFtZStcIjogXCIrcik7cmV0dXJufXRoaXMuX3JlY29yZChyLG4sbyl9LHR9KHZuKTt2YXIgX3M9ZnVuY3Rpb24oZSl7WXQodCxlKTtmdW5jdGlvbiB0KCl7cmV0dXJuIGUhPT1udWxsJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gdC5wcm90b3R5cGUucmVjb3JkPWZ1bmN0aW9uKHIsbixvKXtpZihyPDApe2wuZGlhZy53YXJuKFwibmVnYXRpdmUgdmFsdWUgcHJvdmlkZWQgdG8gaGlzdG9ncmFtIFwiK3RoaXMuX2Rlc2NyaXB0b3IubmFtZStcIjogXCIrcik7cmV0dXJufXRoaXMuX3JlY29yZChyLG4sbyl9LHR9KHZuKTt2YXIgYXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscixuKXt0aGlzLl9vYnNlcnZhYmxlUmVnaXN0cnk9bix0aGlzLl9kZXNjcmlwdG9yPXQsdGhpcy5fbWV0cmljU3RvcmFnZXM9cn1yZXR1cm4gZS5wcm90b3R5cGUuYWRkQ2FsbGJhY2s9ZnVuY3Rpb24odCl7dGhpcy5fb2JzZXJ2YWJsZVJlZ2lzdHJ5LmFkZENhbGxiYWNrKHQsdGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHQpe3RoaXMuX29ic2VydmFibGVSZWdpc3RyeS5yZW1vdmVDYWxsYmFjayh0LHRoaXMpfSxlfSgpO3ZhciBocz1mdW5jdGlvbihlKXtZdCh0LGUpO2Z1bmN0aW9uIHQoKXtyZXR1cm4gZSE9PW51bGwmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiB0fShhcik7dmFyIEVzPWZ1bmN0aW9uKGUpe1l0KHQsZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlIT09bnVsbCYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIHR9KGFyKTt2YXIgbXM9ZnVuY3Rpb24oZSl7WXQodCxlKTtmdW5jdGlvbiB0KCl7cmV0dXJuIGUhPT1udWxsJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gdH0oYXIpO2Z1bmN0aW9uIGZlKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYXJ9dmFyIFRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt0aGlzLl9tZXRlclNoYXJlZFN0YXRlPXR9cmV0dXJuIGUucHJvdG90eXBlLmNyZWF0ZUhpc3RvZ3JhbT1mdW5jdGlvbih0LHIpe3ZhciBuPWx0KHQsY3QuSElTVE9HUkFNLHIpLG89dGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5yZWdpc3Rlck1ldHJpY1N0b3JhZ2Uobik7cmV0dXJuIG5ldyBfcyhvLG4pfSxlLnByb3RvdHlwZS5jcmVhdGVDb3VudGVyPWZ1bmN0aW9uKHQscil7dmFyIG49bHQodCxjdC5DT1VOVEVSLHIpLG89dGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5yZWdpc3Rlck1ldHJpY1N0b3JhZ2Uobik7cmV0dXJuIG5ldyBkcyhvLG4pfSxlLnByb3RvdHlwZS5jcmVhdGVVcERvd25Db3VudGVyPWZ1bmN0aW9uKHQscil7dmFyIG49bHQodCxjdC5VUF9ET1dOX0NPVU5URVIsciksbz10aGlzLl9tZXRlclNoYXJlZFN0YXRlLnJlZ2lzdGVyTWV0cmljU3RvcmFnZShuKTtyZXR1cm4gbmV3IHBzKG8sbil9LGUucHJvdG90eXBlLmNyZWF0ZU9ic2VydmFibGVHYXVnZT1mdW5jdGlvbih0LHIpe3ZhciBuPWx0KHQsY3QuT0JTRVJWQUJMRV9HQVVHRSxyKSxvPXRoaXMuX21ldGVyU2hhcmVkU3RhdGUucmVnaXN0ZXJBc3luY01ldHJpY1N0b3JhZ2Uobik7cmV0dXJuIG5ldyBFcyhuLG8sdGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5vYnNlcnZhYmxlUmVnaXN0cnkpfSxlLnByb3RvdHlwZS5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcj1mdW5jdGlvbih0LHIpe3ZhciBuPWx0KHQsY3QuT0JTRVJWQUJMRV9DT1VOVEVSLHIpLG89dGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5yZWdpc3RlckFzeW5jTWV0cmljU3RvcmFnZShuKTtyZXR1cm4gbmV3IGhzKG4sbyx0aGlzLl9tZXRlclNoYXJlZFN0YXRlLm9ic2VydmFibGVSZWdpc3RyeSl9LGUucHJvdG90eXBlLmNyZWF0ZU9ic2VydmFibGVVcERvd25Db3VudGVyPWZ1bmN0aW9uKHQscil7dmFyIG49bHQodCxjdC5PQlNFUlZBQkxFX1VQX0RPV05fQ09VTlRFUixyKSxvPXRoaXMuX21ldGVyU2hhcmVkU3RhdGUucmVnaXN0ZXJBc3luY01ldHJpY1N0b3JhZ2Uobik7cmV0dXJuIG5ldyBtcyhuLG8sdGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5vYnNlcnZhYmxlUmVnaXN0cnkpfSxlLnByb3RvdHlwZS5hZGRCYXRjaE9ic2VydmFibGVDYWxsYmFjaz1mdW5jdGlvbih0LHIpe3RoaXMuX21ldGVyU2hhcmVkU3RhdGUub2JzZXJ2YWJsZVJlZ2lzdHJ5LmFkZEJhdGNoQ2FsbGJhY2sodCxyKX0sZS5wcm90b3R5cGUucmVtb3ZlQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2s9ZnVuY3Rpb24odCxyKXt0aGlzLl9tZXRlclNoYXJlZFN0YXRlLm9ic2VydmFibGVSZWdpc3RyeS5yZW1vdmVCYXRjaENhbGxiYWNrKHQscil9LGV9KCk7dmFyIHVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvcj10fXJldHVybiBlLnByb3RvdHlwZS5nZXRJbnN0cnVtZW50RGVzY3JpcHRvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvcn0sZS5wcm90b3R5cGUudXBkYXRlRGVzY3JpcHRpb249ZnVuY3Rpb24odCl7dGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3I9bHQodGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3IubmFtZSx0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvci50eXBlLHtkZXNjcmlwdGlvbjp0LHZhbHVlVHlwZTp0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvci52YWx1ZVR5cGUsdW5pdDp0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvci51bml0LGFkdmljZTp0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvci5hZHZpY2V9KX0sZX0oKTt2YXIgVGY9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0LHIpe3JldHVybiBlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihuLG8pe24uX19wcm90b19fPW99fHxmdW5jdGlvbihuLG8pe2Zvcih2YXIgaSBpbiBvKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLGkpJiYobltpXT1vW2ldKX0sZSh0LHIpfTtyZXR1cm4gZnVuY3Rpb24odCxyKXtpZih0eXBlb2YgciE9XCJmdW5jdGlvblwiJiZyIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIitTdHJpbmcocikrXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtlKHQscik7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH10LnByb3RvdHlwZT1yPT09bnVsbD9PYmplY3QuY3JlYXRlKHIpOihuLnByb3RvdHlwZT1yLnByb3RvdHlwZSxuZXcgbil9fSgpLFNzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKGlbMF0mMSl0aHJvdyBpWzFdO3JldHVybiBpWzFdfSx0cnlzOltdLG9wczpbXX0sbixvLGksYTtyZXR1cm4gYT17bmV4dDp1KDApLHRocm93OnUoMSkscmV0dXJuOnUoMil9LHR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmKGFbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksYTtmdW5jdGlvbiB1KHMpe3JldHVybiBmdW5jdGlvbihmKXtyZXR1cm4gYyhbcyxmXSl9fWZ1bmN0aW9uIGMocyl7aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtmb3IoO3I7KXRyeXtpZihuPTEsbyYmKGk9c1swXSYyP28ucmV0dXJuOnNbMF0/by50aHJvd3x8KChpPW8ucmV0dXJuKSYmaS5jYWxsKG8pLDApOm8ubmV4dCkmJiEoaT1pLmNhbGwobyxzWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobz0wLGkmJihzPVtzWzBdJjIsaS52YWx1ZV0pLHNbMF0pe2Nhc2UgMDpjYXNlIDE6aT1zO2JyZWFrO2Nhc2UgNDpyZXR1cm4gci5sYWJlbCsrLHt2YWx1ZTpzWzFdLGRvbmU6ITF9O2Nhc2UgNTpyLmxhYmVsKyssbz1zWzFdLHM9WzBdO2NvbnRpbnVlO2Nhc2UgNzpzPXIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKGk9ci50cnlzLCEoaT1pLmxlbmd0aD4wJiZpW2kubGVuZ3RoLTFdKSYmKHNbMF09PT02fHxzWzBdPT09Mikpe3I9MDtjb250aW51ZX1pZihzWzBdPT09MyYmKCFpfHxzWzFdPmlbMF0mJnNbMV08aVszXSkpe3IubGFiZWw9c1sxXTticmVha31pZihzWzBdPT09NiYmci5sYWJlbDxpWzFdKXtyLmxhYmVsPWlbMV0saT1zO2JyZWFrfWlmKGkmJnIubGFiZWw8aVsyXSl7ci5sYWJlbD1pWzJdLHIub3BzLnB1c2gocyk7YnJlYWt9aVsyXSYmci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlfXM9dC5jYWxsKGUscil9Y2F0Y2goZil7cz1bNixmXSxvPTB9ZmluYWxseXtuPWk9MH1pZihzWzBdJjUpdGhyb3cgc1sxXTtyZXR1cm57dmFsdWU6c1swXT9zWzFdOnZvaWQgMCxkb25lOiEwfX19LFNmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt0aGlzLl9oYXNoPXQsdGhpcy5fdmFsdWVNYXA9bmV3IE1hcCx0aGlzLl9rZXlNYXA9bmV3IE1hcH1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQscil7cmV0dXJuIHI/PyhyPXRoaXMuX2hhc2godCkpLHRoaXMuX3ZhbHVlTWFwLmdldChyKX0sZS5wcm90b3R5cGUuZ2V0T3JEZWZhdWx0PWZ1bmN0aW9uKHQscil7dmFyIG49dGhpcy5faGFzaCh0KTtpZih0aGlzLl92YWx1ZU1hcC5oYXMobikpcmV0dXJuIHRoaXMuX3ZhbHVlTWFwLmdldChuKTt2YXIgbz1yKCk7cmV0dXJuIHRoaXMuX2tleU1hcC5oYXMobil8fHRoaXMuX2tleU1hcC5zZXQobix0KSx0aGlzLl92YWx1ZU1hcC5zZXQobixvKSxvfSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxyLG4pe24/PyhuPXRoaXMuX2hhc2godCkpLHRoaXMuX2tleU1hcC5oYXMobil8fHRoaXMuX2tleU1hcC5zZXQobix0KSx0aGlzLl92YWx1ZU1hcC5zZXQobixyKX0sZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQscil7cmV0dXJuIHI/PyhyPXRoaXMuX2hhc2godCkpLHRoaXMuX3ZhbHVlTWFwLmhhcyhyKX0sZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciB0LHI7cmV0dXJuIFNzKHRoaXMsZnVuY3Rpb24obil7c3dpdGNoKG4ubGFiZWwpe2Nhc2UgMDp0PXRoaXMuX2tleU1hcC5lbnRyaWVzKCkscj10Lm5leHQoKSxuLmxhYmVsPTE7Y2FzZSAxOnJldHVybiByLmRvbmU9PT0hMD9bMywzXTpbNCxbci52YWx1ZVsxXSxyLnZhbHVlWzBdXV07Y2FzZSAyOnJldHVybiBuLnNlbnQoKSxyPXQubmV4dCgpLFszLDFdO2Nhc2UgMzpyZXR1cm5bMl19fSl9LGUucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgdCxyO3JldHVybiBTcyh0aGlzLGZ1bmN0aW9uKG4pe3N3aXRjaChuLmxhYmVsKXtjYXNlIDA6dD10aGlzLl92YWx1ZU1hcC5lbnRyaWVzKCkscj10Lm5leHQoKSxuLmxhYmVsPTE7Y2FzZSAxOnJldHVybiByLmRvbmU9PT0hMD9bMywzXTpbNCxbdGhpcy5fa2V5TWFwLmdldChyLnZhbHVlWzBdKSxyLnZhbHVlWzFdLHIudmFsdWVbMF1dXTtjYXNlIDI6cmV0dXJuIG4uc2VudCgpLHI9dC5uZXh0KCksWzMsMV07Y2FzZSAzOnJldHVyblsyXX19KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwic2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFsdWVNYXAuc2l6ZX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlfSgpO3ZhciBKPWZ1bmN0aW9uKGUpe1RmKHQsZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmNhbGwodGhpcyxycyl8fHRoaXN9cmV0dXJuIHR9KFNmKTt2YXIgZ2Y9ZnVuY3Rpb24oZSx0KXt2YXIgcj10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighcilyZXR1cm4gZTt2YXIgbj1yLmNhbGwoZSksbyxpPVtdLGE7dHJ5e2Zvcig7KHQ9PT12b2lkIDB8fHQtLSA+MCkmJiEobz1uLm5leHQoKSkuZG9uZTspaS5wdXNoKG8udmFsdWUpfWNhdGNoKHUpe2E9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihyPW4ucmV0dXJuKSYmci5jYWxsKG4pfWZpbmFsbHl7aWYoYSl0aHJvdyBhLmVycm9yfX1yZXR1cm4gaX0sY3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3RoaXMuX2FnZ3JlZ2F0b3I9dCx0aGlzLl9hY3RpdmVDb2xsZWN0aW9uU3RvcmFnZT1uZXcgSix0aGlzLl9jdW11bGF0aXZlTWVtb1N0b3JhZ2U9bmV3IEp9cmV0dXJuIGUucHJvdG90eXBlLnJlY29yZD1mdW5jdGlvbih0LHIsbixvKXt2YXIgaT10aGlzLGE9dGhpcy5fYWN0aXZlQ29sbGVjdGlvblN0b3JhZ2UuZ2V0T3JEZWZhdWx0KHIsZnVuY3Rpb24oKXtyZXR1cm4gaS5fYWdncmVnYXRvci5jcmVhdGVBY2N1bXVsYXRpb24obyl9KTthPy5yZWNvcmQodCl9LGUucHJvdG90eXBlLmJhdGNoQ3VtdWxhdGU9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO0FycmF5LmZyb20odC5lbnRyaWVzKCkpLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9Z2YobywzKSxhPWlbMF0sdT1pWzFdLGM9aVsyXSxzPW4uX2FnZ3JlZ2F0b3IuY3JlYXRlQWNjdW11bGF0aW9uKHIpO3M/LnJlY29yZCh1KTt2YXIgZj1zO2lmKG4uX2N1bXVsYXRpdmVNZW1vU3RvcmFnZS5oYXMoYSxjKSl7dmFyIHA9bi5fY3VtdWxhdGl2ZU1lbW9TdG9yYWdlLmdldChhLGMpO2Y9bi5fYWdncmVnYXRvci5kaWZmKHAscyl9aWYobi5fYWN0aXZlQ29sbGVjdGlvblN0b3JhZ2UuaGFzKGEsYykpe3ZhciBkPW4uX2FjdGl2ZUNvbGxlY3Rpb25TdG9yYWdlLmdldChhLGMpO2Y9bi5fYWdncmVnYXRvci5tZXJnZShkLGYpfW4uX2N1bXVsYXRpdmVNZW1vU3RvcmFnZS5zZXQoYSxzLGMpLG4uX2FjdGl2ZUNvbGxlY3Rpb25TdG9yYWdlLnNldChhLGYsYyl9KX0sZS5wcm90b3R5cGUuY29sbGVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2FjdGl2ZUNvbGxlY3Rpb25TdG9yYWdlO3JldHVybiB0aGlzLl9hY3RpdmVDb2xsZWN0aW9uU3RvcmFnZT1uZXcgSix0fSxlfSgpO3ZhciBBbj1mdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5pdGVyYXRvcixyPXQmJmVbdF0sbj0wO2lmKHIpcmV0dXJuIHIuY2FsbChlKTtpZihlJiZ0eXBlb2YgZS5sZW5ndGg9PVwibnVtYmVyXCIpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSYmbj49ZS5sZW5ndGgmJihlPXZvaWQgMCkse3ZhbHVlOmUmJmVbbisrXSxkb25lOiFlfX19O3Rocm93IG5ldyBUeXBlRXJyb3IodD9cIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCI6XCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpfSxncz1mdW5jdGlvbihlLHQpe3ZhciByPXR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmZVtTeW1ib2wuaXRlcmF0b3JdO2lmKCFyKXJldHVybiBlO3ZhciBuPXIuY2FsbChlKSxvLGk9W10sYTt0cnl7Zm9yKDsodD09PXZvaWQgMHx8dC0tID4wKSYmIShvPW4ubmV4dCgpKS5kb25lOylpLnB1c2goby52YWx1ZSl9Y2F0Y2godSl7YT17ZXJyb3I6dX19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKHI9bi5yZXR1cm4pJiZyLmNhbGwobil9ZmluYWxseXtpZihhKXRocm93IGEuZXJyb3J9fXJldHVybiBpfSxscj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXt2YXIgbj10aGlzO3RoaXMuX2FnZ3JlZ2F0b3I9dCx0aGlzLl91bnJlcG9ydGVkQWNjdW11bGF0aW9ucz1uZXcgTWFwLHRoaXMuX3JlcG9ydEhpc3Rvcnk9bmV3IE1hcCxyLmZvckVhY2goZnVuY3Rpb24obyl7bi5fdW5yZXBvcnRlZEFjY3VtdWxhdGlvbnMuc2V0KG8sW10pfSl9cmV0dXJuIGUucHJvdG90eXBlLmJ1aWxkTWV0cmljcz1mdW5jdGlvbih0LHIsbixvKXt0aGlzLl9zdGFzaEFjY3VtdWxhdGlvbnMobik7dmFyIGk9dGhpcy5fZ2V0TWVyZ2VkVW5yZXBvcnRlZEFjY3VtdWxhdGlvbnModCksYT1pLHU7aWYodGhpcy5fcmVwb3J0SGlzdG9yeS5oYXModCkpe3ZhciBjPXRoaXMuX3JlcG9ydEhpc3RvcnkuZ2V0KHQpLHM9Yy5jb2xsZWN0aW9uVGltZTt1PWMuYWdncmVnYXRpb25UZW1wb3JhbGl0eSx1PT09c3IuQ1VNVUxBVElWRT9hPWUubWVyZ2UoYy5hY2N1bXVsYXRpb25zLGksdGhpcy5fYWdncmVnYXRvcik6YT1lLmNhbGlicmF0ZVN0YXJ0VGltZShjLmFjY3VtdWxhdGlvbnMsaSxzKX1lbHNlIHU9dC5zZWxlY3RBZ2dyZWdhdGlvblRlbXBvcmFsaXR5KHIudHlwZSk7dGhpcy5fcmVwb3J0SGlzdG9yeS5zZXQodCx7YWNjdW11bGF0aW9uczphLGNvbGxlY3Rpb25UaW1lOm8sYWdncmVnYXRpb25UZW1wb3JhbGl0eTp1fSk7dmFyIGY9eWYoYSk7aWYoZi5sZW5ndGghPT0wKXJldHVybiB0aGlzLl9hZ2dyZWdhdG9yLnRvTWV0cmljRGF0YShyLHUsZixvKX0sZS5wcm90b3R5cGUuX3N0YXNoQWNjdW11bGF0aW9ucz1mdW5jdGlvbih0KXt2YXIgcixuLG89dGhpcy5fdW5yZXBvcnRlZEFjY3VtdWxhdGlvbnMua2V5cygpO3RyeXtmb3IodmFyIGk9QW4obyksYT1pLm5leHQoKTshYS5kb25lO2E9aS5uZXh0KCkpe3ZhciB1PWEudmFsdWUsYz10aGlzLl91bnJlcG9ydGVkQWNjdW11bGF0aW9ucy5nZXQodSk7Yz09PXZvaWQgMCYmKGM9W10sdGhpcy5fdW5yZXBvcnRlZEFjY3VtdWxhdGlvbnMuc2V0KHUsYykpLGMucHVzaCh0KX19Y2F0Y2gocyl7cj17ZXJyb3I6c319ZmluYWxseXt0cnl7YSYmIWEuZG9uZSYmKG49aS5yZXR1cm4pJiZuLmNhbGwoaSl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fX0sZS5wcm90b3R5cGUuX2dldE1lcmdlZFVucmVwb3J0ZWRBY2N1bXVsYXRpb25zPWZ1bmN0aW9uKHQpe3ZhciByLG4sbz1uZXcgSixpPXRoaXMuX3VucmVwb3J0ZWRBY2N1bXVsYXRpb25zLmdldCh0KTtpZih0aGlzLl91bnJlcG9ydGVkQWNjdW11bGF0aW9ucy5zZXQodCxbXSksaT09PXZvaWQgMClyZXR1cm4gbzt0cnl7Zm9yKHZhciBhPUFuKGkpLHU9YS5uZXh0KCk7IXUuZG9uZTt1PWEubmV4dCgpKXt2YXIgYz11LnZhbHVlO289ZS5tZXJnZShvLGMsdGhpcy5fYWdncmVnYXRvcil9fWNhdGNoKHMpe3I9e2Vycm9yOnN9fWZpbmFsbHl7dHJ5e3UmJiF1LmRvbmUmJihuPWEucmV0dXJuKSYmbi5jYWxsKGEpfWZpbmFsbHl7aWYocil0aHJvdyByLmVycm9yfX1yZXR1cm4gb30sZS5tZXJnZT1mdW5jdGlvbih0LHIsbil7Zm9yKHZhciBvPXQsaT1yLmVudHJpZXMoKSxhPWkubmV4dCgpO2EuZG9uZSE9PSEwOyl7dmFyIHU9Z3MoYS52YWx1ZSwzKSxjPXVbMF0scz11WzFdLGY9dVsyXTtpZih0LmhhcyhjLGYpKXt2YXIgcD10LmdldChjLGYpLGQ9bi5tZXJnZShwLHMpO28uc2V0KGMsZCxmKX1lbHNlIG8uc2V0KGMscyxmKTthPWkubmV4dCgpfXJldHVybiBvfSxlLmNhbGlicmF0ZVN0YXJ0VGltZT1mdW5jdGlvbih0LHIsbil7dmFyIG8saTt0cnl7Zm9yKHZhciBhPUFuKHQua2V5cygpKSx1PWEubmV4dCgpOyF1LmRvbmU7dT1hLm5leHQoKSl7dmFyIGM9Z3ModS52YWx1ZSwyKSxzPWNbMF0sZj1jWzFdLHA9ci5nZXQocyxmKTtwPy5zZXRTdGFydFRpbWUobil9fWNhdGNoKGQpe289e2Vycm9yOmR9fWZpbmFsbHl7dHJ5e3UmJiF1LmRvbmUmJihpPWEucmV0dXJuKSYmaS5jYWxsKGEpfWZpbmFsbHl7aWYobyl0aHJvdyBvLmVycm9yfX1yZXR1cm4gcn0sZX0oKTtmdW5jdGlvbiB5ZihlKXtyZXR1cm4gQXJyYXkuZnJvbShlLmVudHJpZXMoKSl9dmFyIHZmPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24obixvKXtuLl9fcHJvdG9fXz1vfXx8ZnVuY3Rpb24obixvKXtmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9LGUodCxyKX07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIiYmciE9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIrU3RyaW5nKHIpK1wiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7ZSh0LHIpO2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9dC5wcm90b3R5cGU9cj09PW51bGw/T2JqZWN0LmNyZWF0ZShyKToobi5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IG4pfX0oKSxBZj1mdW5jdGlvbihlLHQpe3ZhciByPXR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmZVtTeW1ib2wuaXRlcmF0b3JdO2lmKCFyKXJldHVybiBlO3ZhciBuPXIuY2FsbChlKSxvLGk9W10sYTt0cnl7Zm9yKDsodD09PXZvaWQgMHx8dC0tID4wKSYmIShvPW4ubmV4dCgpKS5kb25lOylpLnB1c2goby52YWx1ZSl9Y2F0Y2godSl7YT17ZXJyb3I6dX19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKHI9bi5yZXR1cm4pJiZyLmNhbGwobil9ZmluYWxseXtpZihhKXRocm93IGEuZXJyb3J9fXJldHVybiBpfSx5cz1mdW5jdGlvbihlKXt2Zih0LGUpO2Z1bmN0aW9uIHQocixuLG8saSl7dmFyIGE9ZS5jYWxsKHRoaXMscil8fHRoaXM7cmV0dXJuIGEuX2F0dHJpYnV0ZXNQcm9jZXNzb3I9byxhLl9kZWx0YU1ldHJpY1N0b3JhZ2U9bmV3IGNyKG4pLGEuX3RlbXBvcmFsTWV0cmljU3RvcmFnZT1uZXcgbHIobixpKSxhfXJldHVybiB0LnByb3RvdHlwZS5yZWNvcmQ9ZnVuY3Rpb24ocixuKXt2YXIgbz10aGlzLGk9bmV3IEo7QXJyYXkuZnJvbShyLmVudHJpZXMoKSkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1BZihhLDIpLGM9dVswXSxzPXVbMV07aS5zZXQoby5fYXR0cmlidXRlc1Byb2Nlc3Nvci5wcm9jZXNzKGMpLHMpfSksdGhpcy5fZGVsdGFNZXRyaWNTdG9yYWdlLmJhdGNoQ3VtdWxhdGUoaSxuKX0sdC5wcm90b3R5cGUuY29sbGVjdD1mdW5jdGlvbihyLG4pe3ZhciBvPXRoaXMuX2RlbHRhTWV0cmljU3RvcmFnZS5jb2xsZWN0KCk7cmV0dXJuIHRoaXMuX3RlbXBvcmFsTWV0cmljU3RvcmFnZS5idWlsZE1ldHJpY3Mocix0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvcixvLG4pfSx0fSh1cik7RSgpO2Z1bmN0aW9uIFJuKGUsdCl7dmFyIHI9XCJcIjtyZXR1cm4gZS51bml0IT09dC51bml0JiYocis9XCJcdC0gVW5pdCAnXCIrZS51bml0K1wiJyBkb2VzIG5vdCBtYXRjaCAnXCIrdC51bml0K2AnXG5gKSxlLnR5cGUhPT10LnR5cGUmJihyKz1cIlx0LSBUeXBlICdcIitlLnR5cGUrXCInIGRvZXMgbm90IG1hdGNoICdcIit0LnR5cGUrYCdcbmApLGUudmFsdWVUeXBlIT09dC52YWx1ZVR5cGUmJihyKz1cIlx0LSBWYWx1ZSBUeXBlICdcIitlLnZhbHVlVHlwZStcIicgZG9lcyBub3QgbWF0Y2ggJ1wiK3QudmFsdWVUeXBlK2AnXG5gKSxlLmRlc2NyaXB0aW9uIT09dC5kZXNjcmlwdGlvbiYmKHIrPVwiXHQtIERlc2NyaXB0aW9uICdcIitlLmRlc2NyaXB0aW9uK1wiJyBkb2VzIG5vdCBtYXRjaCAnXCIrdC5kZXNjcmlwdGlvbitgJ1xuYCkscn1mdW5jdGlvbiBSZihlLHQpe3JldHVyblwiXHQtIHVzZSB2YWx1ZVR5cGUgJ1wiK2UudmFsdWVUeXBlK1wiJyBvbiBpbnN0cnVtZW50IGNyZWF0aW9uIG9yIHVzZSBhbiBpbnN0cnVtZW50IG5hbWUgb3RoZXIgdGhhbiAnXCIrdC5uYW1lK1wiJ1wifWZ1bmN0aW9uIE9mKGUsdCl7cmV0dXJuXCJcdC0gdXNlIHVuaXQgJ1wiK2UudW5pdCtcIicgb24gaW5zdHJ1bWVudCBjcmVhdGlvbiBvciB1c2UgYW4gaW5zdHJ1bWVudCBuYW1lIG90aGVyIHRoYW4gJ1wiK3QubmFtZStcIidcIn1mdW5jdGlvbiBiZihlLHQpe3ZhciByPXtuYW1lOnQubmFtZSx0eXBlOnQudHlwZSx1bml0OnQudW5pdH0sbj1KU09OLnN0cmluZ2lmeShyKTtyZXR1cm5cIlx0LSBjcmVhdGUgYSBuZXcgdmlldyB3aXRoIGEgbmFtZSBvdGhlciB0aGFuICdcIitlLm5hbWUrXCInIGFuZCBJbnN0cnVtZW50U2VsZWN0b3IgJ1wiK24rXCInXCJ9ZnVuY3Rpb24gTGYoZSx0KXt2YXIgcj17bmFtZTp0Lm5hbWUsdHlwZTp0LnR5cGUsdW5pdDp0LnVuaXR9LG49SlNPTi5zdHJpbmdpZnkocik7cmV0dXJuXCJcdC0gY3JlYXRlIGEgbmV3IHZpZXcgd2l0aCBhIG5hbWUgb3RoZXIgdGhhbiAnXCIrZS5uYW1lK1wiJyBhbmQgSW5zdHJ1bWVudFNlbGVjdG9yICdcIituK2AnXG4gICAgXHQtIE9SIC0gY3JlYXRlIGEgbmV3IHZpZXcgd2l0aCB0aGUgbmFtZSBgK2UubmFtZStcIiBhbmQgZGVzY3JpcHRpb24gJ1wiK2UuZGVzY3JpcHRpb24rXCInIGFuZCBJbnN0cnVtZW50U2VsZWN0b3IgXCIrbitgXG4gICAgXHQtIE9SIC0gY3JlYXRlIGEgbmV3IHZpZXcgd2l0aCB0aGUgbmFtZSBgK3QubmFtZStcIiBhbmQgZGVzY3JpcHRpb24gJ1wiK2UuZGVzY3JpcHRpb24rXCInIGFuZCBJbnN0cnVtZW50U2VsZWN0b3IgXCIrbn1mdW5jdGlvbiBPbihlLHQpe3JldHVybiBlLnZhbHVlVHlwZSE9PXQudmFsdWVUeXBlP1JmKGUsdCk6ZS51bml0IT09dC51bml0P09mKGUsdCk6ZS50eXBlIT09dC50eXBlP2JmKGUsdCk6ZS5kZXNjcmlwdGlvbiE9PXQuZGVzY3JpcHRpb24/TGYoZSx0KTpcIlwifXZhciBibj1mdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5pdGVyYXRvcixyPXQmJmVbdF0sbj0wO2lmKHIpcmV0dXJuIHIuY2FsbChlKTtpZihlJiZ0eXBlb2YgZS5sZW5ndGg9PVwibnVtYmVyXCIpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSYmbj49ZS5sZW5ndGgmJihlPXZvaWQgMCkse3ZhbHVlOmUmJmVbbisrXSxkb25lOiFlfX19O3Rocm93IG5ldyBUeXBlRXJyb3IodD9cIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCI6XCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpfSx2cz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLl9zaGFyZWRSZWdpc3RyeT1uZXcgTWFwLHRoaXMuX3BlckNvbGxlY3RvclJlZ2lzdHJ5PW5ldyBNYXB9cmV0dXJuIGUuY3JlYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlfSxlLnByb3RvdHlwZS5nZXRTdG9yYWdlcz1mdW5jdGlvbih0KXt2YXIgcixuLG8saSxhPVtdO3RyeXtmb3IodmFyIHU9Ym4odGhpcy5fc2hhcmVkUmVnaXN0cnkudmFsdWVzKCkpLGM9dS5uZXh0KCk7IWMuZG9uZTtjPXUubmV4dCgpKXt2YXIgcz1jLnZhbHVlO2E9YS5jb25jYXQocyl9fWNhdGNoKG0pe3I9e2Vycm9yOm19fWZpbmFsbHl7dHJ5e2MmJiFjLmRvbmUmJihuPXUucmV0dXJuKSYmbi5jYWxsKHUpfWZpbmFsbHl7aWYocil0aHJvdyByLmVycm9yfX12YXIgZj10aGlzLl9wZXJDb2xsZWN0b3JSZWdpc3RyeS5nZXQodCk7aWYoZiE9bnVsbCl0cnl7Zm9yKHZhciBwPWJuKGYudmFsdWVzKCkpLGQ9cC5uZXh0KCk7IWQuZG9uZTtkPXAubmV4dCgpKXt2YXIgcz1kLnZhbHVlO2E9YS5jb25jYXQocyl9fWNhdGNoKG0pe289e2Vycm9yOm19fWZpbmFsbHl7dHJ5e2QmJiFkLmRvbmUmJihpPXAucmV0dXJuKSYmaS5jYWxsKHApfWZpbmFsbHl7aWYobyl0aHJvdyBvLmVycm9yfX1yZXR1cm4gYX0sZS5wcm90b3R5cGUucmVnaXN0ZXI9ZnVuY3Rpb24odCl7dGhpcy5fcmVnaXN0ZXJTdG9yYWdlKHQsdGhpcy5fc2hhcmVkUmVnaXN0cnkpfSxlLnByb3RvdHlwZS5yZWdpc3RlckZvckNvbGxlY3Rvcj1mdW5jdGlvbih0LHIpe3ZhciBuPXRoaXMuX3BlckNvbGxlY3RvclJlZ2lzdHJ5LmdldCh0KTtuPT1udWxsJiYobj1uZXcgTWFwLHRoaXMuX3BlckNvbGxlY3RvclJlZ2lzdHJ5LnNldCh0LG4pKSx0aGlzLl9yZWdpc3RlclN0b3JhZ2UocixuKX0sZS5wcm90b3R5cGUuZmluZE9yVXBkYXRlQ29tcGF0aWJsZVN0b3JhZ2U9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fc2hhcmVkUmVnaXN0cnkuZ2V0KHQubmFtZSk7cmV0dXJuIHI9PT12b2lkIDA/bnVsbDp0aGlzLl9maW5kT3JVcGRhdGVDb21wYXRpYmxlU3RvcmFnZSh0LHIpfSxlLnByb3RvdHlwZS5maW5kT3JVcGRhdGVDb21wYXRpYmxlQ29sbGVjdG9yU3RvcmFnZT1mdW5jdGlvbih0LHIpe3ZhciBuPXRoaXMuX3BlckNvbGxlY3RvclJlZ2lzdHJ5LmdldCh0KTtpZihuPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBvPW4uZ2V0KHIubmFtZSk7cmV0dXJuIG89PT12b2lkIDA/bnVsbDp0aGlzLl9maW5kT3JVcGRhdGVDb21wYXRpYmxlU3RvcmFnZShyLG8pfSxlLnByb3RvdHlwZS5fcmVnaXN0ZXJTdG9yYWdlPWZ1bmN0aW9uKHQscil7dmFyIG49dC5nZXRJbnN0cnVtZW50RGVzY3JpcHRvcigpLG89ci5nZXQobi5uYW1lKTtpZihvPT09dm9pZCAwKXtyLnNldChuLm5hbWUsW3RdKTtyZXR1cm59by5wdXNoKHQpfSxlLnByb3RvdHlwZS5fZmluZE9yVXBkYXRlQ29tcGF0aWJsZVN0b3JhZ2U9ZnVuY3Rpb24odCxyKXt2YXIgbixvLGk9bnVsbDt0cnl7Zm9yKHZhciBhPWJuKHIpLHU9YS5uZXh0KCk7IXUuZG9uZTt1PWEubmV4dCgpKXt2YXIgYz11LnZhbHVlLHM9Yy5nZXRJbnN0cnVtZW50RGVzY3JpcHRvcigpO2NzKHMsdCk/KHMuZGVzY3JpcHRpb24hPT10LmRlc2NyaXB0aW9uJiYodC5kZXNjcmlwdGlvbi5sZW5ndGg+cy5kZXNjcmlwdGlvbi5sZW5ndGgmJmMudXBkYXRlRGVzY3JpcHRpb24odC5kZXNjcmlwdGlvbiksbC5kaWFnLndhcm4oXCJBIHZpZXcgb3IgaW5zdHJ1bWVudCB3aXRoIHRoZSBuYW1lIFwiLHQubmFtZSxgIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgYnV0IGhhcyBhIGRpZmZlcmVudCBkZXNjcmlwdGlvbiBhbmQgaXMgaW5jb21wYXRpYmxlIHdpdGggYW5vdGhlciByZWdpc3RlcmVkIHZpZXcuXG5gLGBEZXRhaWxzOlxuYCxSbihzLHQpLGBUaGUgbG9uZ2VyIGRlc2NyaXB0aW9uIHdpbGwgYmUgdXNlZC5cblRvIHJlc29sdmUgdGhlIGNvbmZsaWN0OmAsT24ocyx0KSkpLGk9Yyk6bC5kaWFnLndhcm4oXCJBIHZpZXcgb3IgaW5zdHJ1bWVudCB3aXRoIHRoZSBuYW1lIFwiLHQubmFtZSxgIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBhbmQgaXMgaW5jb21wYXRpYmxlIHdpdGggYW5vdGhlciByZWdpc3RlcmVkIHZpZXcuXG5gLGBEZXRhaWxzOlxuYCxSbihzLHQpLGBUbyByZXNvbHZlIHRoZSBjb25mbGljdDpcbmAsT24ocyx0KSl9fWNhdGNoKGYpe249e2Vycm9yOmZ9fWZpbmFsbHl7dHJ5e3UmJiF1LmRvbmUmJihvPWEucmV0dXJuKSYmby5jYWxsKGEpfWZpbmFsbHl7aWYobil0aHJvdyBuLmVycm9yfX1yZXR1cm4gaX0sZX0oKTt2YXIgQXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3RoaXMuX2JhY2tpbmdTdG9yYWdlcz10fXJldHVybiBlLnByb3RvdHlwZS5yZWNvcmQ9ZnVuY3Rpb24odCxyLG4sbyl7dGhpcy5fYmFja2luZ1N0b3JhZ2VzLmZvckVhY2goZnVuY3Rpb24oaSl7aS5yZWNvcmQodCxyLG4sbyl9KX0sZX0oKTtFKCk7RSgpO3ZhciBScz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxyKXt0aGlzLl9pbnN0cnVtZW50TmFtZT10LHRoaXMuX3ZhbHVlVHlwZT1yLHRoaXMuX2J1ZmZlcj1uZXcgSn1yZXR1cm4gZS5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbih0LHIpe2lmKHI9PT12b2lkIDAmJihyPXt9KSx0eXBlb2YgdCE9XCJudW1iZXJcIil7bC5kaWFnLndhcm4oXCJub24tbnVtYmVyIHZhbHVlIHByb3ZpZGVkIHRvIG1ldHJpYyBcIit0aGlzLl9pbnN0cnVtZW50TmFtZStcIjogXCIrdCk7cmV0dXJufXRoaXMuX3ZhbHVlVHlwZT09PWwuVmFsdWVUeXBlLklOVCYmIU51bWJlci5pc0ludGVnZXIodCkmJihsLmRpYWcud2FybihcIklOVCB2YWx1ZSB0eXBlIGNhbm5vdCBhY2NlcHQgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBmb3IgXCIrdGhpcy5faW5zdHJ1bWVudE5hbWUrXCIsIGlnbm9yaW5nIHRoZSBmcmFjdGlvbmFsIGRpZ2l0cy5cIiksdD1NYXRoLnRydW5jKHQpLCFOdW1iZXIuaXNJbnRlZ2VyKHQpKXx8dGhpcy5fYnVmZmVyLnNldChyLHQpfSxlfSgpO3ZhciBPcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLl9idWZmZXI9bmV3IE1hcH1yZXR1cm4gZS5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbih0LHIsbil7aWYobj09PXZvaWQgMCYmKG49e30pLCEhZmUodCkpe3ZhciBvPXRoaXMuX2J1ZmZlci5nZXQodCk7aWYobz09bnVsbCYmKG89bmV3IEosdGhpcy5fYnVmZmVyLnNldCh0LG8pKSx0eXBlb2YgciE9XCJudW1iZXJcIil7bC5kaWFnLndhcm4oXCJub24tbnVtYmVyIHZhbHVlIHByb3ZpZGVkIHRvIG1ldHJpYyBcIit0Ll9kZXNjcmlwdG9yLm5hbWUrXCI6IFwiK3IpO3JldHVybn10Ll9kZXNjcmlwdG9yLnZhbHVlVHlwZT09PWwuVmFsdWVUeXBlLklOVCYmIU51bWJlci5pc0ludGVnZXIocikmJihsLmRpYWcud2FybihcIklOVCB2YWx1ZSB0eXBlIGNhbm5vdCBhY2NlcHQgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBmb3IgXCIrdC5fZGVzY3JpcHRvci5uYW1lK1wiLCBpZ25vcmluZyB0aGUgZnJhY3Rpb25hbCBkaWdpdHMuXCIpLHI9TWF0aC50cnVuYyhyKSwhTnVtYmVyLmlzSW50ZWdlcihyKSl8fG8uc2V0KG4scil9fSxlfSgpO3ZhciBMbj1mdW5jdGlvbihlLHQscixuKXtmdW5jdGlvbiBvKGkpe3JldHVybiBpIGluc3RhbmNlb2Ygcj9pOm5ldyByKGZ1bmN0aW9uKGEpe2EoaSl9KX1yZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKShmdW5jdGlvbihpLGEpe2Z1bmN0aW9uIHUoZil7dHJ5e3Mobi5uZXh0KGYpKX1jYXRjaChwKXthKHApfX1mdW5jdGlvbiBjKGYpe3RyeXtzKG4udGhyb3coZikpfWNhdGNoKHApe2EocCl9fWZ1bmN0aW9uIHMoZil7Zi5kb25lP2koZi52YWx1ZSk6byhmLnZhbHVlKS50aGVuKHUsYyl9cygobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSl9LFBuPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKGlbMF0mMSl0aHJvdyBpWzFdO3JldHVybiBpWzFdfSx0cnlzOltdLG9wczpbXX0sbixvLGksYTtyZXR1cm4gYT17bmV4dDp1KDApLHRocm93OnUoMSkscmV0dXJuOnUoMil9LHR5cGVvZiBTeW1ib2w9PVwiZnVuY3Rpb25cIiYmKGFbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksYTtmdW5jdGlvbiB1KHMpe3JldHVybiBmdW5jdGlvbihmKXtyZXR1cm4gYyhbcyxmXSl9fWZ1bmN0aW9uIGMocyl7aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtmb3IoO3I7KXRyeXtpZihuPTEsbyYmKGk9c1swXSYyP28ucmV0dXJuOnNbMF0/by50aHJvd3x8KChpPW8ucmV0dXJuKSYmaS5jYWxsKG8pLDApOm8ubmV4dCkmJiEoaT1pLmNhbGwobyxzWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobz0wLGkmJihzPVtzWzBdJjIsaS52YWx1ZV0pLHNbMF0pe2Nhc2UgMDpjYXNlIDE6aT1zO2JyZWFrO2Nhc2UgNDpyZXR1cm4gci5sYWJlbCsrLHt2YWx1ZTpzWzFdLGRvbmU6ITF9O2Nhc2UgNTpyLmxhYmVsKyssbz1zWzFdLHM9WzBdO2NvbnRpbnVlO2Nhc2UgNzpzPXIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKGk9ci50cnlzLCEoaT1pLmxlbmd0aD4wJiZpW2kubGVuZ3RoLTFdKSYmKHNbMF09PT02fHxzWzBdPT09Mikpe3I9MDtjb250aW51ZX1pZihzWzBdPT09MyYmKCFpfHxzWzFdPmlbMF0mJnNbMV08aVszXSkpe3IubGFiZWw9c1sxXTticmVha31pZihzWzBdPT09NiYmci5sYWJlbDxpWzFdKXtyLmxhYmVsPWlbMV0saT1zO2JyZWFrfWlmKGkmJnIubGFiZWw8aVsyXSl7ci5sYWJlbD1pWzJdLHIub3BzLnB1c2gocyk7YnJlYWt9aVsyXSYmci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlfXM9dC5jYWxsKGUscil9Y2F0Y2goZil7cz1bNixmXSxvPTB9ZmluYWxseXtuPWk9MH1pZihzWzBdJjUpdGhyb3cgc1sxXTtyZXR1cm57dmFsdWU6c1swXT9zWzFdOnZvaWQgMCxkb25lOiEwfX19LGJzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZlW1N5bWJvbC5pdGVyYXRvcl07aWYoIXIpcmV0dXJuIGU7dmFyIG49ci5jYWxsKGUpLG8saT1bXSxhO3RyeXtmb3IoOyh0PT09dm9pZCAwfHx0LS0gPjApJiYhKG89bi5uZXh0KCkpLmRvbmU7KWkucHVzaChvLnZhbHVlKX1jYXRjaCh1KXthPXtlcnJvcjp1fX1maW5hbGx5e3RyeXtvJiYhby5kb25lJiYocj1uLnJldHVybikmJnIuY2FsbChuKX1maW5hbGx5e2lmKGEpdGhyb3cgYS5lcnJvcn19cmV0dXJuIGl9LExzPWZ1bmN0aW9uKGUsdCxyKXtpZihyfHxhcmd1bWVudHMubGVuZ3RoPT09Milmb3IodmFyIG49MCxvPXQubGVuZ3RoLGk7bjxvO24rKykoaXx8IShuIGluIHQpKSYmKGl8fChpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCxuKSksaVtuXT10W25dKTtyZXR1cm4gZS5jb25jYXQoaXx8QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpfSxQcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fYmF0Y2hDYWxsYmFja3M9W119cmV0dXJuIGUucHJvdG90eXBlLmFkZENhbGxiYWNrPWZ1bmN0aW9uKHQscil7dmFyIG49dGhpcy5fZmluZENhbGxiYWNrKHQscik7bj49MHx8dGhpcy5fY2FsbGJhY2tzLnB1c2goe2NhbGxiYWNrOnQsaW5zdHJ1bWVudDpyfSl9LGUucHJvdG90eXBlLnJlbW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHQscil7dmFyIG49dGhpcy5fZmluZENhbGxiYWNrKHQscik7bjwwfHx0aGlzLl9jYWxsYmFja3Muc3BsaWNlKG4sMSl9LGUucHJvdG90eXBlLmFkZEJhdGNoQ2FsbGJhY2s9ZnVuY3Rpb24odCxyKXt2YXIgbj1uZXcgU2V0KHIuZmlsdGVyKGZlKSk7aWYobi5zaXplPT09MCl7bC5kaWFnLmVycm9yKFwiQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2sgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB2YWxpZCBpbnN0cnVtZW50c1wiLHIpO3JldHVybn12YXIgbz10aGlzLl9maW5kQmF0Y2hDYWxsYmFjayh0LG4pO28+PTB8fHRoaXMuX2JhdGNoQ2FsbGJhY2tzLnB1c2goe2NhbGxiYWNrOnQsaW5zdHJ1bWVudHM6bn0pfSxlLnByb3RvdHlwZS5yZW1vdmVCYXRjaENhbGxiYWNrPWZ1bmN0aW9uKHQscil7dmFyIG49bmV3IFNldChyLmZpbHRlcihmZSkpLG89dGhpcy5fZmluZEJhdGNoQ2FsbGJhY2sodCxuKTtvPDB8fHRoaXMuX2JhdGNoQ2FsbGJhY2tzLnNwbGljZShvLDEpfSxlLnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKHQscil7cmV0dXJuIExuKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBuLG8saSxhO3JldHVybiBQbih0aGlzLGZ1bmN0aW9uKHUpe3N3aXRjaCh1LmxhYmVsKXtjYXNlIDA6cmV0dXJuIG49dGhpcy5fb2JzZXJ2ZUNhbGxiYWNrcyh0LHIpLG89dGhpcy5fb2JzZXJ2ZUJhdGNoQ2FsbGJhY2tzKHQsciksWzQsaXMoTHMoTHMoW10sYnMobiksITEpLGJzKG8pLCExKSldO2Nhc2UgMTpyZXR1cm4gaT11LnNlbnQoKSxhPWkuZmlsdGVyKG9zKS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGMucmVhc29ufSksWzIsYV19fSl9KX0sZS5wcm90b3R5cGUuX29ic2VydmVDYWxsYmFja3M9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO3JldHVybiB0aGlzLl9jYWxsYmFja3MubWFwKGZ1bmN0aW9uKG8pe3ZhciBpPW8uY2FsbGJhY2ssYT1vLmluc3RydW1lbnQ7cmV0dXJuIExuKG4sdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciB1LGM7cmV0dXJuIFBuKHRoaXMsZnVuY3Rpb24ocyl7c3dpdGNoKHMubGFiZWwpe2Nhc2UgMDpyZXR1cm4gdT1uZXcgUnMoYS5fZGVzY3JpcHRvci5uYW1lLGEuX2Rlc2NyaXB0b3IudmFsdWVUeXBlKSxjPVByb21pc2UucmVzb2x2ZShpKHUpKSxyIT1udWxsJiYoYz15bihjLHIpKSxbNCxjXTtjYXNlIDE6cmV0dXJuIHMuc2VudCgpLGEuX21ldHJpY1N0b3JhZ2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5yZWNvcmQodS5fYnVmZmVyLHQpfSksWzJdfX0pfSl9KX0sZS5wcm90b3R5cGUuX29ic2VydmVCYXRjaENhbGxiYWNrcz1mdW5jdGlvbih0LHIpe3ZhciBuPXRoaXM7cmV0dXJuIHRoaXMuX2JhdGNoQ2FsbGJhY2tzLm1hcChmdW5jdGlvbihvKXt2YXIgaT1vLmNhbGxiYWNrLGE9by5pbnN0cnVtZW50cztyZXR1cm4gTG4obix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIHUsYztyZXR1cm4gUG4odGhpcyxmdW5jdGlvbihzKXtzd2l0Y2gocy5sYWJlbCl7Y2FzZSAwOnJldHVybiB1PW5ldyBPcyxjPVByb21pc2UucmVzb2x2ZShpKHUpKSxyIT1udWxsJiYoYz15bihjLHIpKSxbNCxjXTtjYXNlIDE6cmV0dXJuIHMuc2VudCgpLGEuZm9yRWFjaChmdW5jdGlvbihmKXt2YXIgcD11Ll9idWZmZXIuZ2V0KGYpO3AhPW51bGwmJmYuX21ldHJpY1N0b3JhZ2VzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5yZWNvcmQocCx0KX0pfSksWzJdfX0pfSl9KX0sZS5wcm90b3R5cGUuX2ZpbmRDYWxsYmFjaz1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLl9jYWxsYmFja3MuZmluZEluZGV4KGZ1bmN0aW9uKG4pe3JldHVybiBuLmNhbGxiYWNrPT09dCYmbi5pbnN0cnVtZW50PT09cn0pfSxlLnByb3RvdHlwZS5fZmluZEJhdGNoQ2FsbGJhY2s9ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5fYmF0Y2hDYWxsYmFja3MuZmluZEluZGV4KGZ1bmN0aW9uKG4pe3JldHVybiBuLmNhbGxiYWNrPT09dCYmc3Mobi5pbnN0cnVtZW50cyxyKX0pfSxlfSgpO3ZhciBQZj1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQscil7cmV0dXJuIGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKG4sbyl7bi5fX3Byb3RvX189b318fGZ1bmN0aW9uKG4sbyl7Zm9yKHZhciBpIGluIG8pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8saSkmJihuW2ldPW9baV0pfSxlKHQscil9O3JldHVybiBmdW5jdGlvbih0LHIpe2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCImJnIhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiK1N0cmluZyhyKStcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO2UodCxyKTtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXQucHJvdG90eXBlPXI9PT1udWxsP09iamVjdC5jcmVhdGUocik6KG4ucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyBuKX19KCksSXM9ZnVuY3Rpb24oZSl7UGYodCxlKTtmdW5jdGlvbiB0KHIsbixvLGkpe3ZhciBhPWUuY2FsbCh0aGlzLHIpfHx0aGlzO3JldHVybiBhLl9hdHRyaWJ1dGVzUHJvY2Vzc29yPW8sYS5fZGVsdGFNZXRyaWNTdG9yYWdlPW5ldyBjcihuKSxhLl90ZW1wb3JhbE1ldHJpY1N0b3JhZ2U9bmV3IGxyKG4saSksYX1yZXR1cm4gdC5wcm90b3R5cGUucmVjb3JkPWZ1bmN0aW9uKHIsbixvLGkpe249dGhpcy5fYXR0cmlidXRlc1Byb2Nlc3Nvci5wcm9jZXNzKG4sbyksdGhpcy5fZGVsdGFNZXRyaWNTdG9yYWdlLnJlY29yZChyLG4sbyxpKX0sdC5wcm90b3R5cGUuY29sbGVjdD1mdW5jdGlvbihyLG4pe3ZhciBvPXRoaXMuX2RlbHRhTWV0cmljU3RvcmFnZS5jb2xsZWN0KCk7cmV0dXJuIHRoaXMuX3RlbXBvcmFsTWV0cmljU3RvcmFnZS5idWlsZE1ldHJpY3Mocix0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvcixvLG4pfSx0fSh1cik7dmFyIENzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gZT1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24obixvKXtuLl9fcHJvdG9fXz1vfXx8ZnVuY3Rpb24obixvKXtmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKG5baV09b1tpXSl9LGUodCxyKX07cmV0dXJuIGZ1bmN0aW9uKHQscil7aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIiYmciE9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIrU3RyaW5nKHIpK1wiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7ZSh0LHIpO2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXR9dC5wcm90b3R5cGU9cj09PW51bGw/T2JqZWN0LmNyZWF0ZShyKToobi5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IG4pfX0oKSxmcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUuTm9vcD1mdW5jdGlvbigpe3JldHVybiBDZn0sZX0oKTt2YXIgSWY9ZnVuY3Rpb24oZSl7Q3ModCxlKTtmdW5jdGlvbiB0KCl7cmV0dXJuIGUhPT1udWxsJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gdC5wcm90b3R5cGUucHJvY2Vzcz1mdW5jdGlvbihyLG4pe3JldHVybiByfSx0fShmcik7dmFyIGdFPWZ1bmN0aW9uKGUpe0NzKHQsZSk7ZnVuY3Rpb24gdChyKXt2YXIgbj1lLmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2FsbG93ZWRBdHRyaWJ1dGVOYW1lcz1yLG59cmV0dXJuIHQucHJvdG90eXBlLnByb2Nlc3M9ZnVuY3Rpb24ocixuKXt2YXIgbz10aGlzLGk9e307cmV0dXJuIE9iamVjdC5rZXlzKHIpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gby5fYWxsb3dlZEF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKGEpfSkuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gaVthXT1yW2FdfSksaX0sdH0oZnIpO3ZhciBDZj1uZXcgSWY7dmFyIE5mPWZ1bmN0aW9uKGUsdCxyLG4pe2Z1bmN0aW9uIG8oaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiByP2k6bmV3IHIoZnVuY3Rpb24oYSl7YShpKX0pfXJldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKGZ1bmN0aW9uKGksYSl7ZnVuY3Rpb24gdShmKXt0cnl7cyhuLm5leHQoZikpfWNhdGNoKHApe2EocCl9fWZ1bmN0aW9uIGMoZil7dHJ5e3Mobi50aHJvdyhmKSl9Y2F0Y2gocCl7YShwKX19ZnVuY3Rpb24gcyhmKXtmLmRvbmU/aShmLnZhbHVlKTpvKGYudmFsdWUpLnRoZW4odSxjKX1zKChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KX0sd2Y9ZnVuY3Rpb24oZSx0KXt2YXIgcj17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoaVswXSYxKXRocm93IGlbMV07cmV0dXJuIGlbMV19LHRyeXM6W10sb3BzOltdfSxuLG8saSxhO3JldHVybiBhPXtuZXh0OnUoMCksdGhyb3c6dSgxKSxyZXR1cm46dSgyKX0sdHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoYVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxhO2Z1bmN0aW9uIHUocyl7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBjKFtzLGZdKX19ZnVuY3Rpb24gYyhzKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7cjspdHJ5e2lmKG49MSxvJiYoaT1zWzBdJjI/by5yZXR1cm46c1swXT9vLnRocm93fHwoKGk9by5yZXR1cm4pJiZpLmNhbGwobyksMCk6by5uZXh0KSYmIShpPWkuY2FsbChvLHNbMV0pKS5kb25lKXJldHVybiBpO3N3aXRjaChvPTAsaSYmKHM9W3NbMF0mMixpLnZhbHVlXSksc1swXSl7Y2FzZSAwOmNhc2UgMTppPXM7YnJlYWs7Y2FzZSA0OnJldHVybiByLmxhYmVsKysse3ZhbHVlOnNbMV0sZG9uZTohMX07Y2FzZSA1OnIubGFiZWwrKyxvPXNbMV0scz1bMF07Y29udGludWU7Y2FzZSA3OnM9ci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoaT1yLnRyeXMsIShpPWkubGVuZ3RoPjAmJmlbaS5sZW5ndGgtMV0pJiYoc1swXT09PTZ8fHNbMF09PT0yKSl7cj0wO2NvbnRpbnVlfWlmKHNbMF09PT0zJiYoIWl8fHNbMV0+aVswXSYmc1sxXTxpWzNdKSl7ci5sYWJlbD1zWzFdO2JyZWFrfWlmKHNbMF09PT02JiZyLmxhYmVsPGlbMV0pe3IubGFiZWw9aVsxXSxpPXM7YnJlYWt9aWYoaSYmci5sYWJlbDxpWzJdKXtyLmxhYmVsPWlbMl0sci5vcHMucHVzaChzKTticmVha31pWzJdJiZyLm9wcy5wb3AoKSxyLnRyeXMucG9wKCk7Y29udGludWV9cz10LmNhbGwoZSxyKX1jYXRjaChmKXtzPVs2LGZdLG89MH1maW5hbGx5e249aT0wfWlmKHNbMF0mNSl0aHJvdyBzWzFdO3JldHVybnt2YWx1ZTpzWzBdP3NbMV06dm9pZCAwLGRvbmU6ITB9fX0sTWY9ZnVuY3Rpb24oZSx0KXt2YXIgcj10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighcilyZXR1cm4gZTt2YXIgbj1yLmNhbGwoZSksbyxpPVtdLGE7dHJ5e2Zvcig7KHQ9PT12b2lkIDB8fHQtLSA+MCkmJiEobz1uLm5leHQoKSkuZG9uZTspaS5wdXNoKG8udmFsdWUpfWNhdGNoKHUpe2E9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihyPW4ucmV0dXJuKSYmci5jYWxsKG4pfWZpbmFsbHl7aWYoYSl0aHJvdyBhLmVycm9yfX1yZXR1cm4gaX0sTnM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQscil7dGhpcy5fbWV0ZXJQcm92aWRlclNoYXJlZFN0YXRlPXQsdGhpcy5faW5zdHJ1bWVudGF0aW9uU2NvcGU9cix0aGlzLm1ldHJpY1N0b3JhZ2VSZWdpc3RyeT1uZXcgdnMsdGhpcy5vYnNlcnZhYmxlUmVnaXN0cnk9bmV3IFBzLHRoaXMubWV0ZXI9bmV3IFRzKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS5yZWdpc3Rlck1ldHJpY1N0b3JhZ2U9ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5fcmVnaXN0ZXJNZXRyaWNTdG9yYWdlKHQsSXMpO3JldHVybiByLmxlbmd0aD09PTE/clswXTpuZXcgQXMocil9LGUucHJvdG90eXBlLnJlZ2lzdGVyQXN5bmNNZXRyaWNTdG9yYWdlPWZ1bmN0aW9uKHQpe3ZhciByPXRoaXMuX3JlZ2lzdGVyTWV0cmljU3RvcmFnZSh0LHlzKTtyZXR1cm4gcn0sZS5wcm90b3R5cGUuY29sbGVjdD1mdW5jdGlvbih0LHIsbil7cmV0dXJuIE5mKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBvLGksYTtyZXR1cm4gd2YodGhpcyxmdW5jdGlvbih1KXtzd2l0Y2godS5sYWJlbCl7Y2FzZSAwOnJldHVybls0LHRoaXMub2JzZXJ2YWJsZVJlZ2lzdHJ5Lm9ic2VydmUocixuPy50aW1lb3V0TWlsbGlzKV07Y2FzZSAxOnJldHVybiBvPXUuc2VudCgpLGk9dGhpcy5tZXRyaWNTdG9yYWdlUmVnaXN0cnkuZ2V0U3RvcmFnZXModCksaS5sZW5ndGg9PT0wP1syLG51bGxdOihhPWkubWFwKGZ1bmN0aW9uKGMpe3JldHVybiBjLmNvbGxlY3QodCxyKX0pLmZpbHRlcihlcyksYS5sZW5ndGg9PT0wP1syLHtlcnJvcnM6b31dOlsyLHtzY29wZU1ldHJpY3M6e3Njb3BlOnRoaXMuX2luc3RydW1lbnRhdGlvblNjb3BlLG1ldHJpY3M6YX0sZXJyb3JzOm99XSl9fSl9KX0sZS5wcm90b3R5cGUuX3JlZ2lzdGVyTWV0cmljU3RvcmFnZT1mdW5jdGlvbih0LHIpe3ZhciBuPXRoaXMsbz10aGlzLl9tZXRlclByb3ZpZGVyU2hhcmVkU3RhdGUudmlld1JlZ2lzdHJ5LmZpbmRWaWV3cyh0LHRoaXMuX2luc3RydW1lbnRhdGlvblNjb3BlKSxpPW8ubWFwKGZ1bmN0aW9uKGMpe3ZhciBzPXVzKGMsdCksZj1uLm1ldHJpY1N0b3JhZ2VSZWdpc3RyeS5maW5kT3JVcGRhdGVDb21wYXRpYmxlU3RvcmFnZShzKTtpZihmIT1udWxsKXJldHVybiBmO3ZhciBwPWMuYWdncmVnYXRpb24uY3JlYXRlQWdncmVnYXRvcihzKSxkPW5ldyByKHMscCxjLmF0dHJpYnV0ZXNQcm9jZXNzb3Isbi5fbWV0ZXJQcm92aWRlclNoYXJlZFN0YXRlLm1ldHJpY0NvbGxlY3RvcnMpO3JldHVybiBuLm1ldHJpY1N0b3JhZ2VSZWdpc3RyeS5yZWdpc3RlcihkKSxkfSk7aWYoaS5sZW5ndGg9PT0wKXt2YXIgYT10aGlzLl9tZXRlclByb3ZpZGVyU2hhcmVkU3RhdGUuc2VsZWN0QWdncmVnYXRpb25zKHQudHlwZSksdT1hLm1hcChmdW5jdGlvbihjKXt2YXIgcz1NZihjLDIpLGY9c1swXSxwPXNbMV0sZD1uLm1ldHJpY1N0b3JhZ2VSZWdpc3RyeS5maW5kT3JVcGRhdGVDb21wYXRpYmxlQ29sbGVjdG9yU3RvcmFnZShmLHQpO2lmKGQhPW51bGwpcmV0dXJuIGQ7dmFyIG09cC5jcmVhdGVBZ2dyZWdhdG9yKHQpLGc9bmV3IHIodCxtLGZyLk5vb3AoKSxbZl0pO3JldHVybiBuLm1ldHJpY1N0b3JhZ2VSZWdpc3RyeS5yZWdpc3RlckZvckNvbGxlY3RvcihmLGcpLGd9KTtpPWkuY29uY2F0KHUpfXJldHVybiBpfSxlfSgpO3ZhciB4Zj1mdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5pdGVyYXRvcixyPXQmJmVbdF0sbj0wO2lmKHIpcmV0dXJuIHIuY2FsbChlKTtpZihlJiZ0eXBlb2YgZS5sZW5ndGg9PVwibnVtYmVyXCIpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSYmbj49ZS5sZW5ndGgmJihlPXZvaWQgMCkse3ZhbHVlOmUmJmVbbisrXSxkb25lOiFlfX19O3Rocm93IG5ldyBUeXBlRXJyb3IodD9cIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCI6XCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpfSx3cz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dGhpcy5yZXNvdXJjZT10LHRoaXMudmlld1JlZ2lzdHJ5PW5ldyBscyx0aGlzLm1ldHJpY0NvbGxlY3RvcnM9W10sdGhpcy5tZXRlclNoYXJlZFN0YXRlcz1uZXcgTWFwfXJldHVybiBlLnByb3RvdHlwZS5nZXRNZXRlclNoYXJlZFN0YXRlPWZ1bmN0aW9uKHQpe3ZhciByPW5zKHQpLG49dGhpcy5tZXRlclNoYXJlZFN0YXRlcy5nZXQocik7cmV0dXJuIG49PW51bGwmJihuPW5ldyBOcyh0aGlzLHQpLHRoaXMubWV0ZXJTaGFyZWRTdGF0ZXMuc2V0KHIsbikpLG59LGUucHJvdG90eXBlLnNlbGVjdEFnZ3JlZ2F0aW9ucz1mdW5jdGlvbih0KXt2YXIgcixuLG89W107dHJ5e2Zvcih2YXIgaT14Zih0aGlzLm1ldHJpY0NvbGxlY3RvcnMpLGE9aS5uZXh0KCk7IWEuZG9uZTthPWkubmV4dCgpKXt2YXIgdT1hLnZhbHVlO28ucHVzaChbdSx1LnNlbGVjdEFnZ3JlZ2F0aW9uKHQpXSl9fWNhdGNoKGMpe3I9e2Vycm9yOmN9fWZpbmFsbHl7dHJ5e2EmJiFhLmRvbmUmJihuPWkucmV0dXJuKSYmbi5jYWxsKGkpfWZpbmFsbHl7aWYocil0aHJvdyByLmVycm9yfX1yZXR1cm4gb30sZX0oKTt2YXIgTXM9dihQKCkpLHByPWZ1bmN0aW9uKGUsdCxyLG4pe2Z1bmN0aW9uIG8oaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiByP2k6bmV3IHIoZnVuY3Rpb24oYSl7YShpKX0pfXJldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKGZ1bmN0aW9uKGksYSl7ZnVuY3Rpb24gdShmKXt0cnl7cyhuLm5leHQoZikpfWNhdGNoKHApe2EocCl9fWZ1bmN0aW9uIGMoZil7dHJ5e3Mobi50aHJvdyhmKSl9Y2F0Y2gocCl7YShwKX19ZnVuY3Rpb24gcyhmKXtmLmRvbmU/aShmLnZhbHVlKTpvKGYudmFsdWUpLnRoZW4odSxjKX1zKChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KX0sZHI9ZnVuY3Rpb24oZSx0KXt2YXIgcj17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoaVswXSYxKXRocm93IGlbMV07cmV0dXJuIGlbMV19LHRyeXM6W10sb3BzOltdfSxuLG8saSxhO3JldHVybiBhPXtuZXh0OnUoMCksdGhyb3c6dSgxKSxyZXR1cm46dSgyKX0sdHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoYVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxhO2Z1bmN0aW9uIHUocyl7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBjKFtzLGZdKX19ZnVuY3Rpb24gYyhzKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO2Zvcig7cjspdHJ5e2lmKG49MSxvJiYoaT1zWzBdJjI/by5yZXR1cm46c1swXT9vLnRocm93fHwoKGk9by5yZXR1cm4pJiZpLmNhbGwobyksMCk6by5uZXh0KSYmIShpPWkuY2FsbChvLHNbMV0pKS5kb25lKXJldHVybiBpO3N3aXRjaChvPTAsaSYmKHM9W3NbMF0mMixpLnZhbHVlXSksc1swXSl7Y2FzZSAwOmNhc2UgMTppPXM7YnJlYWs7Y2FzZSA0OnJldHVybiByLmxhYmVsKysse3ZhbHVlOnNbMV0sZG9uZTohMX07Y2FzZSA1OnIubGFiZWwrKyxvPXNbMV0scz1bMF07Y29udGludWU7Y2FzZSA3OnM9ci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlO2RlZmF1bHQ6aWYoaT1yLnRyeXMsIShpPWkubGVuZ3RoPjAmJmlbaS5sZW5ndGgtMV0pJiYoc1swXT09PTZ8fHNbMF09PT0yKSl7cj0wO2NvbnRpbnVlfWlmKHNbMF09PT0zJiYoIWl8fHNbMV0+aVswXSYmc1sxXTxpWzNdKSl7ci5sYWJlbD1zWzFdO2JyZWFrfWlmKHNbMF09PT02JiZyLmxhYmVsPGlbMV0pe3IubGFiZWw9aVsxXSxpPXM7YnJlYWt9aWYoaSYmci5sYWJlbDxpWzJdKXtyLmxhYmVsPWlbMl0sci5vcHMucHVzaChzKTticmVha31pWzJdJiZyLm9wcy5wb3AoKSxyLnRyeXMucG9wKCk7Y29udGludWV9cz10LmNhbGwoZSxyKX1jYXRjaChmKXtzPVs2LGZdLG89MH1maW5hbGx5e249aT0wfWlmKHNbMF0mNSl0aHJvdyBzWzFdO3JldHVybnt2YWx1ZTpzWzBdP3NbMV06dm9pZCAwLGRvbmU6ITB9fX0sRGY9ZnVuY3Rpb24oZSx0KXt2YXIgcj10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighcilyZXR1cm4gZTt2YXIgbj1yLmNhbGwoZSksbyxpPVtdLGE7dHJ5e2Zvcig7KHQ9PT12b2lkIDB8fHQtLSA+MCkmJiEobz1uLm5leHQoKSkuZG9uZTspaS5wdXNoKG8udmFsdWUpfWNhdGNoKHUpe2E9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihyPW4ucmV0dXJuKSYmci5jYWxsKG4pfWZpbmFsbHl7aWYoYSl0aHJvdyBhLmVycm9yfX1yZXR1cm4gaX0sVWY9ZnVuY3Rpb24oZSx0LHIpe2lmKHJ8fGFyZ3VtZW50cy5sZW5ndGg9PT0yKWZvcih2YXIgbj0wLG89dC5sZW5ndGgsaTtuPG87bisrKShpfHwhKG4gaW4gdCkpJiYoaXx8KGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwwLG4pKSxpW25dPXRbbl0pO3JldHVybiBlLmNvbmNhdChpfHxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSl9LHhzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LHIpe3RoaXMuX3NoYXJlZFN0YXRlPXQsdGhpcy5fbWV0cmljUmVhZGVyPXJ9cmV0dXJuIGUucHJvdG90eXBlLmNvbGxlY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHByKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciByLG4sbyxpLGE9dGhpcztyZXR1cm4gZHIodGhpcyxmdW5jdGlvbih1KXtzd2l0Y2godS5sYWJlbCl7Y2FzZSAwOnJldHVybiByPSgwLE1zLm1pbGxpc1RvSHJUaW1lKShEYXRlLm5vdygpKSxuPVtdLG89W10saT1BcnJheS5mcm9tKHRoaXMuX3NoYXJlZFN0YXRlLm1ldGVyU2hhcmVkU3RhdGVzLnZhbHVlcygpKS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIHByKGEsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBzO3JldHVybiBkcih0aGlzLGZ1bmN0aW9uKGYpe3N3aXRjaChmLmxhYmVsKXtjYXNlIDA6cmV0dXJuWzQsYy5jb2xsZWN0KHRoaXMscix0KV07Y2FzZSAxOnJldHVybiBzPWYuc2VudCgpLHM/LnNjb3BlTWV0cmljcyE9bnVsbCYmbi5wdXNoKHMuc2NvcGVNZXRyaWNzKSxzPy5lcnJvcnMhPW51bGwmJm8ucHVzaC5hcHBseShvLFVmKFtdLERmKHMuZXJyb3JzKSwhMSkpLFsyXX19KX0pfSksWzQsUHJvbWlzZS5hbGwoaSldO2Nhc2UgMTpyZXR1cm4gdS5zZW50KCksWzIse3Jlc291cmNlTWV0cmljczp7cmVzb3VyY2U6dGhpcy5fc2hhcmVkU3RhdGUucmVzb3VyY2Usc2NvcGVNZXRyaWNzOm59LGVycm9yczpvfV19fSl9KX0sZS5wcm90b3R5cGUuZm9yY2VGbHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gcHIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIGRyKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDpyZXR1cm5bNCx0aGlzLl9tZXRyaWNSZWFkZXIuZm9yY2VGbHVzaCh0KV07Y2FzZSAxOnJldHVybiByLnNlbnQoKSxbMl19fSl9KX0sZS5wcm90b3R5cGUuc2h1dGRvd249ZnVuY3Rpb24odCl7cmV0dXJuIHByKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBkcih0aGlzLGZ1bmN0aW9uKHIpe3N3aXRjaChyLmxhYmVsKXtjYXNlIDA6cmV0dXJuWzQsdGhpcy5fbWV0cmljUmVhZGVyLnNodXRkb3duKHQpXTtjYXNlIDE6cmV0dXJuIHIuc2VudCgpLFsyXX19KX0pfSxlLnByb3RvdHlwZS5zZWxlY3RBZ2dyZWdhdGlvblRlbXBvcmFsaXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tZXRyaWNSZWFkZXIuc2VsZWN0QWdncmVnYXRpb25UZW1wb3JhbGl0eSh0KX0sZS5wcm90b3R5cGUuc2VsZWN0QWdncmVnYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21ldHJpY1JlYWRlci5zZWxlY3RBZ2dyZWdhdGlvbih0KX0sZX0oKTt2YXIgRHM9ZnVuY3Rpb24oZSx0LHIsbil7ZnVuY3Rpb24gbyhpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIHI/aTpuZXcgcihmdW5jdGlvbihhKXthKGkpfSl9cmV0dXJuIG5ldyhyfHwocj1Qcm9taXNlKSkoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiB1KGYpe3RyeXtzKG4ubmV4dChmKSl9Y2F0Y2gocCl7YShwKX19ZnVuY3Rpb24gYyhmKXt0cnl7cyhuLnRocm93KGYpKX1jYXRjaChwKXthKHApfX1mdW5jdGlvbiBzKGYpe2YuZG9uZT9pKGYudmFsdWUpOm8oZi52YWx1ZSkudGhlbih1LGMpfXMoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pfSxVcz1mdW5jdGlvbihlLHQpe3ZhciByPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZihpWzBdJjEpdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119LG4sbyxpLGE7cmV0dXJuIGE9e25leHQ6dSgwKSx0aHJvdzp1KDEpLHJldHVybjp1KDIpfSx0eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJihhW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLGE7ZnVuY3Rpb24gdShzKXtyZXR1cm4gZnVuY3Rpb24oZil7cmV0dXJuIGMoW3MsZl0pfX1mdW5jdGlvbiBjKHMpe2lmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7Zm9yKDtyOyl0cnl7aWYobj0xLG8mJihpPXNbMF0mMj9vLnJldHVybjpzWzBdP28udGhyb3d8fCgoaT1vLnJldHVybikmJmkuY2FsbChvKSwwKTpvLm5leHQpJiYhKGk9aS5jYWxsKG8sc1sxXSkpLmRvbmUpcmV0dXJuIGk7c3dpdGNoKG89MCxpJiYocz1bc1swXSYyLGkudmFsdWVdKSxzWzBdKXtjYXNlIDA6Y2FzZSAxOmk9czticmVhaztjYXNlIDQ6cmV0dXJuIHIubGFiZWwrKyx7dmFsdWU6c1sxXSxkb25lOiExfTtjYXNlIDU6ci5sYWJlbCsrLG89c1sxXSxzPVswXTtjb250aW51ZTtjYXNlIDc6cz1yLm9wcy5wb3AoKSxyLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZihpPXIudHJ5cywhKGk9aS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXSkmJihzWzBdPT09Nnx8c1swXT09PTIpKXtyPTA7Y29udGludWV9aWYoc1swXT09PTMmJighaXx8c1sxXT5pWzBdJiZzWzFdPGlbM10pKXtyLmxhYmVsPXNbMV07YnJlYWt9aWYoc1swXT09PTYmJnIubGFiZWw8aVsxXSl7ci5sYWJlbD1pWzFdLGk9czticmVha31pZihpJiZyLmxhYmVsPGlbMl0pe3IubGFiZWw9aVsyXSxyLm9wcy5wdXNoKHMpO2JyZWFrfWlbMl0mJnIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZX1zPXQuY2FsbChlLHIpfWNhdGNoKGYpe3M9WzYsZl0sbz0wfWZpbmFsbHl7bj1pPTB9aWYoc1swXSY1KXRocm93IHNbMV07cmV0dXJue3ZhbHVlOnNbMF0/c1sxXTp2b2lkIDAsZG9uZTohMH19fSxCZj1mdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5pdGVyYXRvcixyPXQmJmVbdF0sbj0wO2lmKHIpcmV0dXJuIHIuY2FsbChlKTtpZihlJiZ0eXBlb2YgZS5sZW5ndGg9PVwibnVtYmVyXCIpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSYmbj49ZS5sZW5ndGgmJihlPXZvaWQgMCkse3ZhbHVlOmUmJmVbbisrXSxkb25lOiFlfX19O3Rocm93IG5ldyBUeXBlRXJyb3IodD9cIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCI6XCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpfSxJbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIHIsbixvO3RoaXMuX3NodXRkb3duPSExO3ZhciBpPUguZGVmYXVsdCgpLm1lcmdlKChvPXQ/LnJlc291cmNlKSE9PW51bGwmJm8hPT12b2lkIDA/bzpILmVtcHR5KCkpO2lmKHRoaXMuX3NoYXJlZFN0YXRlPW5ldyB3cyhpKSx0Py52aWV3cyE9bnVsbCYmdC52aWV3cy5sZW5ndGg+MCl0cnl7Zm9yKHZhciBhPUJmKHQudmlld3MpLHU9YS5uZXh0KCk7IXUuZG9uZTt1PWEubmV4dCgpKXt2YXIgYz11LnZhbHVlO3RoaXMuX3NoYXJlZFN0YXRlLnZpZXdSZWdpc3RyeS5hZGRWaWV3KGMpfX1jYXRjaChzKXtyPXtlcnJvcjpzfX1maW5hbGx5e3RyeXt1JiYhdS5kb25lJiYobj1hLnJldHVybikmJm4uY2FsbChhKX1maW5hbGx5e2lmKHIpdGhyb3cgci5lcnJvcn19fXJldHVybiBlLnByb3RvdHlwZS5nZXRNZXRlcj1mdW5jdGlvbih0LHIsbil7cmV0dXJuIHI9PT12b2lkIDAmJihyPVwiXCIpLG49PT12b2lkIDAmJihuPXt9KSx0aGlzLl9zaHV0ZG93bj8obC5kaWFnLndhcm4oXCJBIHNodXRkb3duIE1ldGVyUHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgYSBNZXRlclwiKSwoMCxsLmNyZWF0ZU5vb3BNZXRlcikoKSk6dGhpcy5fc2hhcmVkU3RhdGUuZ2V0TWV0ZXJTaGFyZWRTdGF0ZSh7bmFtZTp0LHZlcnNpb246cixzY2hlbWFVcmw6bi5zY2hlbWFVcmx9KS5tZXRlcn0sZS5wcm90b3R5cGUuYWRkTWV0cmljUmVhZGVyPWZ1bmN0aW9uKHQpe3ZhciByPW5ldyB4cyh0aGlzLl9zaGFyZWRTdGF0ZSx0KTt0LnNldE1ldHJpY1Byb2R1Y2VyKHIpLHRoaXMuX3NoYXJlZFN0YXRlLm1ldHJpY0NvbGxlY3RvcnMucHVzaChyKX0sZS5wcm90b3R5cGUuc2h1dGRvd249ZnVuY3Rpb24odCl7cmV0dXJuIERzKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBVcyh0aGlzLGZ1bmN0aW9uKHIpe3N3aXRjaChyLmxhYmVsKXtjYXNlIDA6cmV0dXJuIHRoaXMuX3NodXRkb3duPyhsLmRpYWcud2FybihcInNodXRkb3duIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBNZXRlclByb3ZpZGVyXCIpLFsyXSk6KHRoaXMuX3NodXRkb3duPSEwLFs0LFByb21pc2UuYWxsKHRoaXMuX3NoYXJlZFN0YXRlLm1ldHJpY0NvbGxlY3RvcnMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLnNodXRkb3duKHQpfSkpXSk7Y2FzZSAxOnJldHVybiByLnNlbnQoKSxbMl19fSl9KX0sZS5wcm90b3R5cGUuZm9yY2VGbHVzaD1mdW5jdGlvbih0KXtyZXR1cm4gRHModGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIFVzKHRoaXMsZnVuY3Rpb24ocil7c3dpdGNoKHIubGFiZWwpe2Nhc2UgMDpyZXR1cm4gdGhpcy5fc2h1dGRvd24/KGwuZGlhZy53YXJuKFwiaW52YWxpZCBhdHRlbXB0IHRvIGZvcmNlIGZsdXNoIGFmdGVyIE1ldGVyUHJvdmlkZXIgc2h1dGRvd25cIiksWzJdKTpbNCxQcm9taXNlLmFsbCh0aGlzLl9zaGFyZWRTdGF0ZS5tZXRyaWNDb2xsZWN0b3JzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi5mb3JjZUZsdXNoKHQpfSkpXTtjYXNlIDE6cmV0dXJuIHIuc2VudCgpLFsyXX19KX0pfSxlfSgpO3ZhciBOcj12KGJlKCksMSksRnU9dihIcygpLDEpLE90PXYoUCgpLDEpO0UoKTt2YXIga2Y9U3ltYm9sLmZvcihcIkB2ZXJjZWwvcmVxdWVzdC1jb250ZXh0XCIpO2Z1bmN0aW9uIEsoKXtyZXR1cm4gZ2xvYmFsVGhpc1trZl0/LmdldCgpfXZhciBGcz1cImh0dHAubWV0aG9kXCIsanM9XCJodHRwLnVybFwiLEVyPVwiaHR0cC5ob3N0XCIsa3M9XCJodHRwLnNjaGVtZVwiLHduPVwiaHR0cC5zdGF0dXNfY29kZVwiLHFzPVwiaHR0cC51c2VyX2FnZW50XCIsTW49XCJodHRwLnJlc3BvbnNlX2NvbnRlbnRfbGVuZ3RoX3VuY29tcHJlc3NlZFwiLFhzPVwibmV0LnBlZXIucG9ydFwiLEtzPVwibmV0LnBlZXIubmFtZVwiLFdzPVwiY2xvdWQucmVnaW9uXCI7dmFyIFlzPVwiZGVwbG95bWVudC5lbnZpcm9ubWVudC5uYW1lXCIsenM9XCJkZXBsb3ltZW50LmlkXCI7dmFyICRzPVwicHJvY2Vzcy5ydW50aW1lLm5hbWVcIixRcz1cInZjcy5yZWYuaGVhZC5uYW1lXCIsSnM9XCJ2Y3MucmVmLmhlYWQucmV2aXNpb25cIixacz1cInZjcy5yZXBvc2l0b3J5Lm5hbWVcIix0YT1cInZjcy5yZXBvc2l0b3J5LnJlZi5yZXZpc2lvblwiO3ZhciBlYT1cInNlcnZpY2UubmFtZVwiLHJhPVwic2VydmljZS52ZXJzaW9uXCI7ZnVuY3Rpb24geG4oZSl7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhlKS5maWx0ZXIoKFt0LHJdKT0+ciE9PXZvaWQgMCkpfWZ1bmN0aW9uIGlhKHthdHRyaWJ1dGVzOmUsZW52OnQ9cHJvY2Vzcy5lbnYscnVudGltZTpyLHNlcnZpY2VOYW1lOm59KXtsZXQgbz10LlZFUkNFTF9FTlZ8fHQuTkVYVF9QVUJMSUNfVkVSQ0VMX0VOVixpPXQuVkVSQ0VMX0RFUExPWU1FTlRfSUQsYT10LlZFUkNFTF9HSVRfQ09NTUlUX1NIQXx8dC5ORVhUX1BVQkxJQ19WRVJDRUxfR0lUX0NPTU1JVF9TSEEsdT10LlZFUkNFTF9SRUdJT04sYz10LlZFUkNFTF9HSVRfQ09NTUlUX1JFRixzPXQuVkVSQ0VMX1VSTHx8dC5ORVhUX1BVQkxJQ19WRVJDRUxfVVJMfHx2b2lkIDAsZj10LlZFUkNFTF9CUkFOQ0hfVVJMfHx0Lk5FWFRfUFVCTElDX1ZFUkNFTF9CUkFOQ0hfVVJMfHx2b2lkIDAscD10LlZFUkNFTF9HSVRfUkVQT19TTFVHO3JldHVybiB4bih7W2VhXTpuLFwibm9kZS5jaVwiOnQuQ0k/ITA6dm9pZCAwLFwibm9kZS5lbnZcIjp0Lk5PREVfRU5WLFtZc106byxlbnY6byxbV3NdOnUsXCJ2ZXJjZWwucmVnaW9uXCI6dSxbJHNdOnIsXCJ2ZXJjZWwucnVudGltZVwiOnIsW1FzXTpjLFtKc106YSxbWnNdOnAsW3RhXTphLFwidmVyY2VsLnNoYVwiOmEsXCJ2ZXJjZWwuaG9zdFwiOnMsXCJ2ZXJjZWwuYnJhbmNoX2hvc3RcIjpmLFt6c106aSxcInZlcmNlbC5kZXBsb3ltZW50X2lkXCI6aSxbcmFdOmksXCJ2ZXJjZWwucHJvamVjdF9pZFwiOnQuVkVSQ0VMX1BST0pFQ1RfSUR8fHZvaWQgMCwuLi5lfSl9ZnVuY3Rpb24gb2EoZSl7cmV0dXJuIGU/ZS5zcGxpdChcIjo6XCIpLmF0KC0xKTp2b2lkIDB9ZnVuY3Rpb24gc2EoZT1LKCksdCl7aWYoIWUpcmV0dXJuO2xldCByPXQ/WGYodCxlLmhlYWRlcnMpOnZvaWQgMDtyZXR1cm4geG4oe1tFcl06ZS5oZWFkZXJzLmhvc3QsW3FzXTplLmhlYWRlcnNbXCJ1c2VyLWFnZW50XCJdLFwiaHR0cC5yZWZlcmVyXCI6ZS5oZWFkZXJzLnJlZmVyZXIsXCJ2ZXJjZWwucmVxdWVzdF9pZFwiOm9hKGUuaGVhZGVyc1tcIngtdmVyY2VsLWlkXCJdKSxcInZlcmNlbC5tYXRjaGVkX3BhdGhcIjplLmhlYWRlcnNbXCJ4LW1hdGNoZWQtcGF0aFwiXSxcInZlcmNlbC5lZGdlX3JlZ2lvblwiOnByb2Nlc3MuZW52LlZFUkNFTF9SRUdJT04sLi4ucn0pfXZhciBxZj17a2V5cyhlKXtyZXR1cm5bXX0sZ2V0KGUsdCl7cmV0dXJuIGVbdC50b0xvY2FsZUxvd2VyQ2FzZSgpXX19O2Z1bmN0aW9uIFhmKGUsdCl7aWYodHlwZW9mIGU9PVwiZnVuY3Rpb25cIilyZXR1cm4gZSh0LHFmKTtsZXQgcj17fTtmb3IobGV0W24sb11vZiBPYmplY3QuZW50cmllcyhlKSl7bGV0IGk9dFtvLnRvTG9jYWxlTG93ZXJDYXNlKCldO2khPT12b2lkIDAmJihyW25dPWkpfXJldHVybiByfUUoKTtmdW5jdGlvbiB6dChlKXtyZXR1cm4oZSZsLlRyYWNlRmxhZ3MuU0FNUExFRCkhPT0wfXZhciBtcj1jbGFzc3tjb25zdHJ1Y3Rvcih0LHIpe3RoaXMucHJvY2Vzc29ycz10O3RoaXMuYXR0cmlidXRlc0Zyb21IZWFkZXJzPXI7dGhpcy5yb290U3Bhbklkcz1uZXcgTWFwO3RoaXMud2FpdFNwYW5FbmQ9bmV3IE1hcH1mb3JjZUZsdXNoKCl7cmV0dXJuIFByb21pc2UuYWxsKHRoaXMucHJvY2Vzc29ycy5tYXAodD0+dC5mb3JjZUZsdXNoKCkuY2F0Y2gocj0+e2wuZGlhZy5lcnJvcihcIkB2ZXJjZWwvb3RlbDogZm9yY2VGbHVzaCBmYWlsZWQ6XCIscil9KSkpLnRoZW4oKCk9Pnt9KX1zaHV0ZG93bigpe3JldHVybiBQcm9taXNlLmFsbCh0aGlzLnByb2Nlc3NvcnMubWFwKHQ9PnQuc2h1dGRvd24oKS5jYXRjaCgoKT0+e30pKSkudGhlbigoKT0+e30pfW9uU3RhcnQodCxyKXtsZXR7dHJhY2VJZDpuLHNwYW5JZDpvLHRyYWNlRmxhZ3M6aX09dC5zcGFuQ29udGV4dCgpLGE9IXQucGFyZW50U3BhbklkfHwhdGhpcy5yb290U3Bhbklkcy5oYXMobik7aWYoYT90aGlzLnJvb3RTcGFuSWRzLnNldChuLHtyb290U3BhbklkOm8sb3BlbjpbXX0pOnRoaXMucm9vdFNwYW5JZHMuZ2V0KG4pPy5vcGVuLnB1c2godCksYSYmenQoaSkpe2xldCB1PUsoKSxjPXNhKHUsdGhpcy5hdHRyaWJ1dGVzRnJvbUhlYWRlcnMpO2MmJnQuc2V0QXR0cmlidXRlcyhjKSx1JiZ1LndhaXRVbnRpbChhc3luYygpPT57aWYodGhpcy5yb290U3Bhbklkcy5oYXMobikpe2xldCBzPW5ldyBQcm9taXNlKHA9Pnt0aGlzLndhaXRTcGFuRW5kLnNldChuLHApfSksZjthd2FpdCBQcm9taXNlLnJhY2UoW3MsbmV3IFByb21pc2UocD0+e2Y9c2V0VGltZW91dCgoKT0+e3RoaXMud2FpdFNwYW5FbmQuZGVsZXRlKG4pLHAodm9pZCAwKX0sNTApfSldKSxmJiZjbGVhclRpbWVvdXQoZil9cmV0dXJuIHRoaXMuZm9yY2VGbHVzaCgpfSl9Zm9yKGxldCB1IG9mIHRoaXMucHJvY2Vzc29ycyl1Lm9uU3RhcnQodCxyKX1vbkVuZCh0KXtsZXR7dHJhY2VJZDpyLHNwYW5JZDpuLHRyYWNlRmxhZ3M6b309dC5zcGFuQ29udGV4dCgpLGk9enQobyksYT10aGlzLnJvb3RTcGFuSWRzLmdldChyKSx1PWE/LnJvb3RTcGFuSWQ9PT1uO2lmKGkpe2xldCBjPVdmKHQpO2MmJk9iamVjdC5hc3NpZ24odC5hdHRyaWJ1dGVzLGMpfWlmKHUpe2lmKHRoaXMucm9vdFNwYW5JZHMuZGVsZXRlKHIpLGEub3Blbi5sZW5ndGg+MCl7Zm9yKGxldCBjIG9mIGEub3BlbilpZighYy5lbmRlZCYmYy5zcGFuQ29udGV4dCgpLnNwYW5JZCE9PW4pdHJ5e2MuZW5kKCl9Y2F0Y2gocyl7bC5kaWFnLmVycm9yKFwiQHZlcmNlbC9vdGVsOiBvbkVuZCBmYWlsZWQ6XCIscyl9fX1lbHNlIGlmKGEpZm9yKGxldCBjPTA7YzxhLm9wZW4ubGVuZ3RoO2MrKylhLm9wZW5bY10/LnNwYW5Db250ZXh0KCkuc3BhbklkPT09biYmYS5vcGVuLnNwbGljZShjLDEpO2ZvcihsZXQgYyBvZiB0aGlzLnByb2Nlc3NvcnMpYy5vbkVuZCh0KTtpZih1KXtsZXQgYz10aGlzLndhaXRTcGFuRW5kLmdldChyKTtjJiYodGhpcy53YWl0U3BhbkVuZC5kZWxldGUociksYygpKX19fSxLZj17W2wuU3BhbktpbmQuSU5URVJOQUxdOlwiaW50ZXJuYWxcIixbbC5TcGFuS2luZC5TRVJWRVJdOlwic2VydmVyXCIsW2wuU3BhbktpbmQuQ0xJRU5UXTpcImNsaWVudFwiLFtsLlNwYW5LaW5kLlBST0RVQ0VSXTpcInByb2R1Y2VyXCIsW2wuU3BhbktpbmQuQ09OU1VNRVJdOlwiY29uc3VtZXJcIn07ZnVuY3Rpb24gV2YoZSl7bGV0e2tpbmQ6dCxhdHRyaWJ1dGVzOnJ9PWUse1wib3BlcmF0aW9uLm5hbWVcIjpuLFwicmVzb3VyY2UubmFtZVwiOm8sXCJzcGFuLnR5cGVcIjppLFwibmV4dC5zcGFuX3R5cGVcIjphLFwiaHR0cC5tZXRob2RcIjp1LFwiaHR0cC5yb3V0ZVwiOmN9PXI7aWYobilyZXR1cm47bGV0IHM9bz8/KHUmJnR5cGVvZiB1PT1cInN0cmluZ1wiJiZjJiZ0eXBlb2YgYz09XCJzdHJpbmdcIj9gJHt1fSAke2N9YDpjKTtpZihlLmtpbmQ9PT1sLlNwYW5LaW5kLlNFUlZFUiYmdSYmYyYmdHlwZW9mIHU9PVwic3RyaW5nXCImJnR5cGVvZiBjPT1cInN0cmluZ1wiKXJldHVybntcIm9wZXJhdGlvbi5uYW1lXCI6XCJ3ZWIucmVxdWVzdFwiLFwicmVzb3VyY2UubmFtZVwiOnN9O2xldCBmPWUuaW5zdHJ1bWVudGF0aW9uTGlicmFyeS5uYW1lLHA9YT8/aTtpZihwJiZ0eXBlb2YgcD09XCJzdHJpbmdcIil7bGV0IGQ9YWEoZixwKTtyZXR1cm4gYz97XCJvcGVyYXRpb24ubmFtZVwiOmQsXCJyZXNvdXJjZS5uYW1lXCI6c306e1wib3BlcmF0aW9uLm5hbWVcIjpkfX1yZXR1cm57XCJvcGVyYXRpb24ubmFtZVwiOmFhKGYsdD09PWwuU3BhbktpbmQuSU5URVJOQUw/XCJcIjpLZlt0XSl9fWZ1bmN0aW9uIGFhKGUsdCl7aWYoIWUpcmV0dXJuIHQ7bGV0IHI9ZS5yZXBsYWNlKC9bIEAuL10vZyxcIl9cIik7cmV0dXJuIHIuc3RhcnRzV2l0aChcIl9cIikmJihyPXIuc2xpY2UoMSkpLHQ/YCR7cn0uJHt0fWA6cn12YXIgdmE9dihGbigpLDEpO3ZhciB5YT12KGdhKCksMSk7RSgpO3ZhciAkdD1jbGFzcyBleHRlbmRzIHlhLk9UTFBFeHBvcnRlckJhc2V7Y29uc3RydWN0b3IodD17fSl7c3VwZXIodCksdC5oZWFkZXJzJiYodGhpcy5faGVhZGVycz10LmhlYWRlcnMpfW9uU2h1dGRvd24oKXtsLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWwvb3RscDogb25TaHV0ZG93blwiKX1vbkluaXQoKXtsLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWwvb3RscDogb25Jbml0XCIpfXNlbmQodCxyLG4pe2lmKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZCl7bC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsL290bHA6IFNodXRkb3duIGFscmVhZHkgc3RhcnRlZC4gQ2Fubm90IHNlbmQgb2JqZWN0c1wiKTtyZXR1cm59bGV0IG89dGhpcy5jb252ZXJ0KHQpLGksYSx1O3RyeXsoe2JvZHk6aSxjb250ZW50VHlwZTphLGhlYWRlcnM6dX09dGhpcy50b01lc3NhZ2UobykpfWNhdGNoKHMpe2wuZGlhZy53YXJuKFwiQHZlcmNlbC9vdGVsL290bHA6IG5vIHByb3RvXCIscyk7cmV0dXJufWxldCBjPWZldGNoKHRoaXMudXJsLHttZXRob2Q6XCJQT1NUXCIsYm9keTppLGhlYWRlcnM6ey4uLnRoaXMuX2hlYWRlcnMsLi4udSxcIkNvbnRlbnQtVHlwZVwiOmEsXCJVc2VyLUFnZW50XCI6XCJPVGVsLU9UTFAtRXhwb3J0ZXItSmF2YVNjcmlwdC8wLjQ2LjBcIn0sbmV4dDp7aW50ZXJuYWw6ITB9fSkudGhlbihzPT57bC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsL290bHA6IG9uU3VjY2Vzc1wiLHMuc3RhdHVzLHMuc3RhdHVzVGV4dCkscigpLHMuYXJyYXlCdWZmZXIoKS5jYXRjaCgoKT0+e30pfSkuY2F0Y2gocz0+e2wuZGlhZy5lcnJvcihcIkB2ZXJjZWwvb3RlbC9vdGxwOiBvbkVycm9yXCIscyksbihzKX0pLmZpbmFsbHkoKCk9PntsZXQgcz10aGlzLl9zZW5kaW5nUHJvbWlzZXMuaW5kZXhPZihjKTt0aGlzLl9zZW5kaW5nUHJvbWlzZXMuc3BsaWNlKHMsMSl9KTt0aGlzLl9zZW5kaW5nUHJvbWlzZXMucHVzaChjKX1nZXREZWZhdWx0VXJsKHQpe3Rocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpfX07dmFyIF9wPVwidjEvdHJhY2VzXCIsaHA9YGh0dHA6Ly9sb2NhbGhvc3Q6NDMxOC8ke19wfWA7ZnVuY3Rpb24geXIoZSl7cmV0dXJuIHR5cGVvZiBlLnVybD09XCJzdHJpbmdcIj9lLnVybDpocH12YXIgUXQ9Y2xhc3N7Y29uc3RydWN0b3IodD17fSl7dGhpcy5pbXBsPW5ldyBYbih0KX1leHBvcnQodCxyKXt0aGlzLmltcGwuZXhwb3J0KHQscil9c2h1dGRvd24oKXtyZXR1cm4gdGhpcy5pbXBsLnNodXRkb3duKCl9Zm9yY2VGbHVzaCgpe3JldHVybiB0aGlzLmltcGwuZm9yY2VGbHVzaCgpfX0sWG49Y2xhc3MgZXh0ZW5kcyAkdHtjb252ZXJ0KHQpe3JldHVybigwLHZhLmNyZWF0ZUV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3QpKHQse3VzZUhleDohMCx1c2VMb25nQml0czohMX0pfXRvTWVzc2FnZSh0KXtyZXR1cm57Ym9keTpKU09OLnN0cmluZ2lmeSh0KSxjb250ZW50VHlwZTpcImFwcGxpY2F0aW9uL2pzb25cIn19Z2V0RGVmYXVsdFVybCh0KXtyZXR1cm4geXIodCl9fTt2YXIgUnU9dihGbigpLDEpO3ZhciB5dT12KGd1KCksMSk7ZnVuY3Rpb24gdnUoZSl7bGV0IHQ9bmV3IHl1LldyaXRlcjtyZXR1cm4gYnAoZSx0KSx0LmZpbmlzaCgpfWZ1bmN0aW9uIGJwKGUsdCl7aWYoZS5yZXNvdXJjZVNwYW5zIT1udWxsJiZlLnJlc291cmNlU3BhbnMubGVuZ3RoKWZvcihsZXQgcj0wO3I8ZS5yZXNvdXJjZVNwYW5zLmxlbmd0aDsrK3IpTHAoZS5yZXNvdXJjZVNwYW5zW3JdLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fWZ1bmN0aW9uIExwKGUsdCl7aWYoZS5yZXNvdXJjZSE9bnVsbCYmUHAoZS5yZXNvdXJjZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSxlLnNjb3BlU3BhbnMhPW51bGwmJmUuc2NvcGVTcGFucy5sZW5ndGgpZm9yKGxldCByPTA7cjxlLnNjb3BlU3BhbnMubGVuZ3RoOysrcilJcChlLnNjb3BlU3BhbnNbcl0sdC51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIGUuc2NoZW1hVXJsIT1udWxsJiZ0LnVpbnQzMigyNikuc3RyaW5nKGUuc2NoZW1hVXJsKSx0fWZ1bmN0aW9uIFBwKGUsdCl7aWYoZS5hdHRyaWJ1dGVzIT1udWxsJiZlLmF0dHJpYnV0ZXMubGVuZ3RoKWZvcihsZXQgcj0wO3I8ZS5hdHRyaWJ1dGVzLmxlbmd0aDsrK3IpWnQoZS5hdHRyaWJ1dGVzW3JdLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQhPW51bGwmJnQudWludDMyKDE2KS51aW50MzIoZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSx0fWZ1bmN0aW9uIElwKGUsdCl7aWYoZS5zY29wZSE9bnVsbCYmd3AoZS5zY29wZSx0LnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSxlLnNwYW5zIT1udWxsJiZlLnNwYW5zLmxlbmd0aClmb3IobGV0IHI9MDtyPGUuc3BhbnMubGVuZ3RoOysrcilNcChlLnNwYW5zW3JdLHQudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBlLnNjaGVtYVVybCE9bnVsbCYmdC51aW50MzIoMjYpLnN0cmluZyhlLnNjaGVtYVVybCksdH1mdW5jdGlvbiBadChlLHQpe3JldHVybiBlLmtleSE9bnVsbCYmdC51aW50MzIoMTApLnN0cmluZyhlLmtleSksZS52YWx1ZSE9bnVsbCYmQXUoZS52YWx1ZSx0LnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKSx0fWZ1bmN0aW9uIEF1KGUsdCl7cmV0dXJuIGUuc3RyaW5nVmFsdWUhPW51bGwmJnQudWludDMyKDEwKS5zdHJpbmcoZS5zdHJpbmdWYWx1ZSksZS5ib29sVmFsdWUhPW51bGwmJnQudWludDMyKDE2KS5ib29sKGUuYm9vbFZhbHVlKSxlLmludFZhbHVlIT1udWxsJiZ0LnVpbnQzMigyNCkuaW50NjQoZS5pbnRWYWx1ZSksZS5kb3VibGVWYWx1ZSE9bnVsbCYmdC51aW50MzIoMzMpLmRvdWJsZShlLmRvdWJsZVZhbHVlKSxlLmFycmF5VmFsdWUhPW51bGwmJkNwKGUuYXJyYXlWYWx1ZSx0LnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKSxlLmt2bGlzdFZhbHVlIT1udWxsJiZOcChlLmt2bGlzdFZhbHVlLHQudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpLGUuYnl0ZXNWYWx1ZSE9bnVsbCYmdC51aW50MzIoNTgpLmJ5dGVzKGUuYnl0ZXNWYWx1ZSksdH1mdW5jdGlvbiBDcChlLHQpe2lmKGUudmFsdWVzIT1udWxsJiZlLnZhbHVlcy5sZW5ndGgpZm9yKGxldCByPTA7cjxlLnZhbHVlcy5sZW5ndGg7KytyKUF1KGUudmFsdWVzW3JdLHQudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiB0fWZ1bmN0aW9uIE5wKGUsdCl7aWYoZS52YWx1ZXMhPW51bGwmJmUudmFsdWVzLmxlbmd0aClmb3IobGV0IHI9MDtyPGUudmFsdWVzLmxlbmd0aDsrK3IpWnQoZS52YWx1ZXNbcl0sdC51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHR9ZnVuY3Rpb24gd3AoZSx0KXtpZihlLm5hbWUhPW51bGwmJnQudWludDMyKDEwKS5zdHJpbmcoZS5uYW1lKSxlLnZlcnNpb24hPW51bGwmJnQudWludDMyKDE4KS5zdHJpbmcoZS52ZXJzaW9uKSxlLmF0dHJpYnV0ZXMhPW51bGwmJmUuYXR0cmlidXRlcy5sZW5ndGgpZm9yKGxldCByPTA7cjxlLmF0dHJpYnV0ZXMubGVuZ3RoOysrciladChlLmF0dHJpYnV0ZXNbcl0sdC51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCE9bnVsbCYmdC51aW50MzIoMzIpLnVpbnQzMihlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLHR9ZnVuY3Rpb24gTXAoZSx0KXtpZihlLnRyYWNlSWQhPW51bGwmJnQudWludDMyKDEwKS5ieXRlcyhlLnRyYWNlSWQpLGUuc3BhbklkIT1udWxsJiZ0LnVpbnQzMigxOCkuYnl0ZXMoZS5zcGFuSWQpLGUudHJhY2VTdGF0ZSE9bnVsbCYmdC51aW50MzIoMjYpLnN0cmluZyhlLnRyYWNlU3RhdGUpLGUucGFyZW50U3BhbklkIT1udWxsJiZ0LnVpbnQzMigzNCkuYnl0ZXMoZS5wYXJlbnRTcGFuSWQpLGUubmFtZSE9bnVsbCYmdC51aW50MzIoNDIpLnN0cmluZyhlLm5hbWUpLGUua2luZCE9bnVsbCYmdC51aW50MzIoNDgpLmludDMyKGUua2luZCksZS5zdGFydFRpbWVVbml4TmFubyE9bnVsbCYmdC51aW50MzIoNTcpLmZpeGVkNjQoZS5zdGFydFRpbWVVbml4TmFubyksZS5lbmRUaW1lVW5peE5hbm8hPW51bGwmJnQudWludDMyKDY1KS5maXhlZDY0KGUuZW5kVGltZVVuaXhOYW5vKSxlLmF0dHJpYnV0ZXMhPW51bGwmJmUuYXR0cmlidXRlcy5sZW5ndGgpZm9yKGxldCByPTA7cjxlLmF0dHJpYnV0ZXMubGVuZ3RoOysrciladChlLmF0dHJpYnV0ZXNbcl0sdC51aW50MzIoNzQpLmZvcmsoKSkubGRlbGltKCk7aWYoZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50IT1udWxsJiZ0LnVpbnQzMig4MCkudWludDMyKGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCksZS5ldmVudHMhPW51bGwmJmUuZXZlbnRzLmxlbmd0aClmb3IobGV0IHI9MDtyPGUuZXZlbnRzLmxlbmd0aDsrK3IpRHAoZS5ldmVudHNbcl0sdC51aW50MzIoOTApLmZvcmsoKSkubGRlbGltKCk7aWYoZS5kcm9wcGVkRXZlbnRzQ291bnQhPW51bGwmJnQudWludDMyKDk2KS51aW50MzIoZS5kcm9wcGVkRXZlbnRzQ291bnQpLGUubGlua3MhPW51bGwmJmUubGlua3MubGVuZ3RoKWZvcihsZXQgcj0wO3I8ZS5saW5rcy5sZW5ndGg7KytyKVVwKGUubGlua3Nbcl0sdC51aW50MzIoMTA2KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBlLmRyb3BwZWRMaW5rc0NvdW50IT1udWxsJiZ0LnVpbnQzMigxMTIpLnVpbnQzMihlLmRyb3BwZWRMaW5rc0NvdW50KSxlLnN0YXR1cyE9bnVsbCYmeHAoZS5zdGF0dXMsdC51aW50MzIoMTIyKS5mb3JrKCkpLmxkZWxpbSgpLHR9ZnVuY3Rpb24geHAoZSx0KXtyZXR1cm4gZS5tZXNzYWdlIT1udWxsJiZ0LnVpbnQzMigxOCkuc3RyaW5nKGUubWVzc2FnZSksZS5jb2RlIT1udWxsJiZ0LnVpbnQzMigyNCkuaW50MzIoZS5jb2RlKSx0fWZ1bmN0aW9uIERwKGUsdCl7aWYoZS50aW1lVW5peE5hbm8hPW51bGwmJnQudWludDMyKDkpLmZpeGVkNjQoZS50aW1lVW5peE5hbm8pLGUubmFtZSE9bnVsbCYmdC51aW50MzIoMTgpLnN0cmluZyhlLm5hbWUpLGUuYXR0cmlidXRlcyE9bnVsbCYmZS5hdHRyaWJ1dGVzLmxlbmd0aClmb3IobGV0IHI9MDtyPGUuYXR0cmlidXRlcy5sZW5ndGg7KytyKVp0KGUuYXR0cmlidXRlc1tyXSx0LnVpbnQzMigyNikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50IT1udWxsJiZ0LnVpbnQzMigzMikudWludDMyKGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCksdH1mdW5jdGlvbiBVcChlLHQpe2lmKGUudHJhY2VJZCE9bnVsbCYmdC51aW50MzIoMTApLmJ5dGVzKGUudHJhY2VJZCksZS5zcGFuSWQhPW51bGwmJnQudWludDMyKDE4KS5ieXRlcyhlLnNwYW5JZCksZS50cmFjZVN0YXRlIT1udWxsJiZ0LnVpbnQzMigyNikuc3RyaW5nKGUudHJhY2VTdGF0ZSksZS5hdHRyaWJ1dGVzIT1udWxsJiZlLmF0dHJpYnV0ZXMubGVuZ3RoKWZvcihsZXQgcj0wO3I8ZS5hdHRyaWJ1dGVzLmxlbmd0aDsrK3IpWnQoZS5hdHRyaWJ1dGVzW3JdLHQudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQhPW51bGwmJnQudWludDMyKDQwKS51aW50MzIoZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSx0fXZhciBCdD1jbGFzc3tjb25zdHJ1Y3Rvcih0PXt9KXt0aGlzLmltcGw9bmV3IG9pKHQpfWV4cG9ydCh0LHIpe3RoaXMuaW1wbC5leHBvcnQodCxyKX1zaHV0ZG93bigpe3JldHVybiB0aGlzLmltcGwuc2h1dGRvd24oKX1mb3JjZUZsdXNoKCl7cmV0dXJuIHRoaXMuaW1wbC5mb3JjZUZsdXNoKCl9fSxvaT1jbGFzcyBleHRlbmRzICR0e2NvbnZlcnQodCl7cmV0dXJuKDAsUnUuY3JlYXRlRXhwb3J0VHJhY2VTZXJ2aWNlUmVxdWVzdCkodCx2b2lkIDApfXRvTWVzc2FnZSh0KXtyZXR1cm57Ym9keTp2dSh0KSxjb250ZW50VHlwZTpcImFwcGxpY2F0aW9uL3gtcHJvdG9idWZcIixoZWFkZXJzOnthY2NlcHQ6XCJhcHBsaWNhdGlvbi94LXByb3RvYnVmXCJ9fX1nZXREZWZhdWx0VXJsKHQpe3JldHVybiB5cih0KX19O0UoKTtmdW5jdGlvbiBPdShlLHQpe3JldHVybiBlLnJlcGxhY2UoL1xceyg/PHRlbXAxPltee31dKylcXH0vZywocixuKT0+e2xldCBvPXRbbl07cmV0dXJuIG8hPT12b2lkIDA/U3RyaW5nKG8pOnJ9KX12YXIgdGU9Y2xhc3N7Y29uc3RydWN0b3IodD17fSl7dGhpcy5pbnN0cnVtZW50YXRpb25OYW1lPVwiQHZlcmNlbC9vdGVsL2ZldGNoXCI7dGhpcy5pbnN0cnVtZW50YXRpb25WZXJzaW9uPVwiMS4wLjBcIjt0aGlzLmNvbmZpZz10fWdldENvbmZpZygpe3JldHVybiB0aGlzLmNvbmZpZ31zZXRDb25maWcoKXt9c2V0VHJhY2VyUHJvdmlkZXIodCl7dGhpcy50cmFjZXJQcm92aWRlcj10fXNldE1ldGVyUHJvdmlkZXIoKXt9c2hvdWxkSWdub3JlKHQscil7bGV0IG49dGhpcy5jb25maWcuaWdub3JlVXJscz8/W107aWYocj8ub3BlbnRlbGVtZXRyeT8uaWdub3JlIT09dm9pZCAwKXJldHVybiByLm9wZW50ZWxlbWV0cnkuaWdub3JlO2lmKG4ubGVuZ3RoPT09MClyZXR1cm4hMTtsZXQgbz10LnRvU3RyaW5nKCk7cmV0dXJuIG4uc29tZShpPT50eXBlb2YgaT09XCJzdHJpbmdcIj9pPT09XCIqXCI/ITA6by5zdGFydHNXaXRoKGkpOmkudGVzdChvKSl9c2hvdWxkUHJvcGFnYXRlKHQscil7bGV0IG49cHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTHx8cHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfVkVSQ0VMX1VSTHx8bnVsbCxvPXByb2Nlc3MuZW52LlZFUkNFTF9CUkFOQ0hfVVJMfHxwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19WRVJDRUxfQlJBTkNIX1VSTHx8bnVsbCxpPXRoaXMuY29uZmlnLnByb3BhZ2F0ZUNvbnRleHRVcmxzPz9bXSxhPXRoaXMuY29uZmlnLmRvbnRQcm9wYWdhdGVDb250ZXh0VXJscz8/W107aWYocj8ub3BlbnRlbGVtZXRyeT8ucHJvcGFnYXRlQ29udGV4dClyZXR1cm4gci5vcGVudGVsZW1ldHJ5LnByb3BhZ2F0ZUNvbnRleHQ7bGV0IHU9dC50b1N0cmluZygpO3JldHVybiBhLmxlbmd0aD4wJiZhLnNvbWUoYz0+dHlwZW9mIGM9PVwic3RyaW5nXCI/Yz09PVwiKlwiPyEwOnUuc3RhcnRzV2l0aChjKTpjLnRlc3QodSkpPyExOm4mJnQucHJvdG9jb2w9PT1cImh0dHBzOlwiJiYodC5ob3N0PT09bnx8dC5ob3N0PT09b3x8dC5ob3N0PT09SygpPy5oZWFkZXJzLmhvc3QpfHwhbiYmdC5wcm90b2NvbD09PVwiaHR0cDpcIiYmdC5ob3N0bmFtZT09PVwibG9jYWxob3N0XCI/ITA6aS5zb21lKGM9PnR5cGVvZiBjPT1cInN0cmluZ1wiP2M9PT1cIipcIj8hMDp1LnN0YXJ0c1dpdGgoYyk6Yy50ZXN0KHUpKX1zdGFydFNwYW4oe3RyYWNlcjp0LHVybDpyLGZldGNoVHlwZTpuLG1ldGhvZDpvPVwiR0VUXCIsbmFtZTppLGF0dHJpYnV0ZXM6YT17fX0pe2xldCB1PXRoaXMuY29uZmlnLnJlc291cmNlTmFtZVRlbXBsYXRlLGM9e1tGc106byxbanNdOnIudG9TdHJpbmcoKSxbRXJdOnIuaG9zdCxba3NdOnIucHJvdG9jb2wucmVwbGFjZShcIjpcIixcIlwiKSxbS3NdOnIuaG9zdG5hbWUsW1hzXTpyLnBvcnR9LHM9dT9PdSh1LGMpOkdwKHIudG9TdHJpbmcoKSksZj1pPz9gJHtufSAke299ICR7ci50b1N0cmluZygpfWAscD1sLmNvbnRleHQuYWN0aXZlKCk7cmV0dXJuIHQuc3RhcnRTcGFuKGYse2tpbmQ6bC5TcGFuS2luZC5DTElFTlQsYXR0cmlidXRlczp7Li4uYyxcIm9wZXJhdGlvbi5uYW1lXCI6YCR7bn0uJHtvfWAsXCJodHRwLmNsaWVudC5uYW1lXCI6bixcInJlc291cmNlLm5hbWVcIjpzLC4uLmF9fSxwKX1pbnN0cnVtZW50SHR0cCh0LHIpe2xldHt0cmFjZXJQcm92aWRlcjpufT10aGlzO2lmKCFuKXJldHVybjtsZXQgbz1uLmdldFRyYWNlcih0aGlzLmluc3RydW1lbnRhdGlvbk5hbWUsdGhpcy5pbnN0cnVtZW50YXRpb25WZXJzaW9uKSx7YXR0cmlidXRlc0Zyb21SZXF1ZXN0SGVhZGVyczppLGF0dHJpYnV0ZXNGcm9tUmVzcG9uc2VIZWFkZXJzOmF9PXRoaXMuY29uZmlnLHU9dC5yZXF1ZXN0LGM9dC5nZXQscz1mPT4ocCxkLG0pPT57bGV0IGcsQz17fSxNO2lmKHR5cGVvZiBwPT1cInN0cmluZ1wifHxwIGluc3RhbmNlb2YgVVJMPyhnPW5ldyBVUkwocC50b1N0cmluZygpKSx0eXBlb2YgZD09XCJmdW5jdGlvblwiP009ZDpkJiZ0eXBlb2YgbT09XCJmdW5jdGlvblwiPyhDPWQsTT1tKTpkJiYoQz1kKSk6KEM9cCx0eXBlb2YgZD09XCJmdW5jdGlvblwiJiYoTT1kKSxnPUZwKEMscikpLHRoaXMuc2hvdWxkSWdub3JlKGcpKXJldHVybiBmLmFwcGx5KHRoaXMsW2csQyxNXSk7bGV0IFQ9dGhpcy5zdGFydFNwYW4oe3RyYWNlcjpvLHVybDpnLGZldGNoVHlwZTpcImh0dHBcIixtZXRob2Q6Qy5tZXRob2R8fFwiR0VUXCJ9KTtpZighVC5pc1JlY29yZGluZygpfHwhenQoVC5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MpKXJldHVybiBULmVuZCgpLGYuYXBwbHkodGhpcyxbZyxDLE1dKTtpZih0aGlzLnNob3VsZFByb3BhZ2F0ZShnKSl7bGV0IHJ0PWwuY29udGV4dC5hY3RpdmUoKSxxPWwudHJhY2Uuc2V0U3BhbihydCxUKTtsLnByb3BhZ2F0aW9uLmluamVjdChxLEMuaGVhZGVyc3x8e30sVnApfWkmJmJyKFQsaSxDLmhlYWRlcnN8fHt9LEx1KTt0cnl7bGV0IHJ0PURhdGUubm93KCkscT1mLmFwcGx5KHRoaXMsW2csQyxNXSk7cmV0dXJuIHEucHJlcGVuZExpc3RlbmVyKFwicmVzcG9uc2VcIixVPT57bGV0IHdyPURhdGUubm93KCktcnQ7VC5zZXRBdHRyaWJ1dGUoXCJodHRwLnJlc3BvbnNlX3RpbWVcIix3ciksVS5zdGF0dXNDb2RlIT09dm9pZCAwPyhULnNldEF0dHJpYnV0ZSh3bixVLnN0YXR1c0NvZGUpLFUuc3RhdHVzQ29kZT49NTAwJiZWdChULGBTdGF0dXM6ICR7VS5zdGF0dXNDb2RlfWApKTpWdChULFwiUmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgdW5kZWZpbmVkXCIpLGEmJmJyKFQsYSxVLmhlYWRlcnMsTHUpLHEubGlzdGVuZXJDb3VudChcInJlc3BvbnNlXCIpPD0xJiZVLnJlc3VtZSgpLFUub24oXCJlbmRcIiwoKT0+e2xldCBidCxNcj1VLnN0YXR1c0NvZGU7VS5hYm9ydGVkJiYhVS5jb21wbGV0ZT9idD17Y29kZTpsLlNwYW5TdGF0dXNDb2RlLkVSUk9SfTpNciYmTXI+PTEwMCYmTXI8NTAwP2J0PXtjb2RlOmwuU3BhblN0YXR1c0NvZGUuVU5TRVR9OmJ0PXtjb2RlOmwuU3BhblN0YXR1c0NvZGUuRVJST1J9LFQuc2V0U3RhdHVzKGJ0KSxULmlzUmVjb3JkaW5nKCkmJihVLmhlYWRlcnNbXCJjb250ZW50LWxlbmd0aFwiXSYmVC5zZXRBdHRyaWJ1dGUoTW4sVS5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0pLFQuZW5kKCkpfSl9KSxxLm9uKFwiZXJyb3JcIixVPT57VC5pc1JlY29yZGluZygpJiYoVnQoVCxVKSxULmVuZCgpKX0pLHEub24oXCJjbG9zZVwiLCgpPT57VC5pc1JlY29yZGluZygpJiZULmVuZCgpfSkscX1jYXRjaChydCl7dGhyb3cgVnQoVCxydCksVC5lbmQoKSxydH19O3QucmVxdWVzdD1zKHUpLHQuZ2V0PXMoYyl9aW5zdHJ1bWVudEZldGNoKCl7bGV0e3RyYWNlclByb3ZpZGVyOnR9PXRoaXM7aWYoIXQpcmV0dXJuO2xldCByPXQuZ2V0VHJhY2VyKHRoaXMuaW5zdHJ1bWVudGF0aW9uTmFtZSx0aGlzLmluc3RydW1lbnRhdGlvblZlcnNpb24pLHthdHRyaWJ1dGVzRnJvbVJlcXVlc3RIZWFkZXJzOm4sYXR0cmlidXRlc0Zyb21SZXNwb25zZUhlYWRlcnM6b309dGhpcy5jb25maWc7cHJvY2Vzcy5lbnYuTkVYVF9PVEVMX0ZFVENIX0RJU0FCTEVEPVwiMVwiO2xldCBpPWdsb2JhbFRoaXMuZmV0Y2g7dGhpcy5vcmlnaW5hbEZldGNoPWk7bGV0IGE9YXN5bmModSxjKT0+e2xldCBzPWM7aWYocz8ubmV4dD8uaW50ZXJuYWwpcmV0dXJuIGkodSxzKTtsZXQgZj1uZXcgUmVxdWVzdCh1IGluc3RhbmNlb2YgUmVxdWVzdD91LmNsb25lKCk6dSxzKSxwPW5ldyBVUkwoZi51cmwpO2lmKHRoaXMuc2hvdWxkSWdub3JlKHAscykpcmV0dXJuIGkodSxzKTtsZXQgZD10aGlzLnN0YXJ0U3Bhbih7dHJhY2VyOnIsdXJsOnAsZmV0Y2hUeXBlOlwiZmV0Y2hcIixtZXRob2Q6Zi5tZXRob2QsbmFtZTpzPy5vcGVudGVsZW1ldHJ5Py5zcGFuTmFtZSxhdHRyaWJ1dGVzOnM/Lm9wZW50ZWxlbWV0cnk/LmF0dHJpYnV0ZXN9KTtpZighZC5pc1JlY29yZGluZygpfHwhenQoZC5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MpKXJldHVybiBkLmVuZCgpLGkodSxzKTtpZih0aGlzLnNob3VsZFByb3BhZ2F0ZShwLHMpKXtsZXQgbT1sLmNvbnRleHQuYWN0aXZlKCksZz1sLnRyYWNlLnNldFNwYW4obSxkKTtsLnByb3BhZ2F0aW9uLmluamVjdChnLGYuaGVhZGVycyxCcCl9biYmYnIoZCxuLGYuaGVhZGVycyxidSk7dHJ5e2xldCBtPURhdGUubm93KCk7cz8uYm9keSYmcy5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEmJmYuaGVhZGVycy5kZWxldGUoXCJjb250ZW50LXR5cGVcIik7bGV0IGc9YXdhaXQgaSh1LHsuLi5zLGhlYWRlcnM6Zi5oZWFkZXJzfSksQz1EYXRlLm5vdygpLW07cmV0dXJuIGQuc2V0QXR0cmlidXRlKHduLGcuc3RhdHVzKSxkLnNldEF0dHJpYnV0ZShcImh0dHAucmVzcG9uc2VfdGltZVwiLEMpLG8mJmJyKGQsbyxnLmhlYWRlcnMsYnUpLGcuc3RhdHVzPj01MDAmJlZ0KGQsYFN0YXR1czogJHtnLnN0YXR1c30gKCR7Zy5zdGF0dXNUZXh0fSlgKSxnLmJvZHk/SHAoZykudGhlbihNPT57ZC5pc1JlY29yZGluZygpJiYoZC5zZXRBdHRyaWJ1dGUoTW4sTSksZC5lbmQoKSl9LE09PntkLmlzUmVjb3JkaW5nKCkmJihWdChkLE0pLGQuZW5kKCkpfSk6ZC5lbmQoKSxnfWNhdGNoKG0pe3Rocm93IFZ0KGQsbSksZC5lbmQoKSxtfX07Z2xvYmFsVGhpcy5mZXRjaD1hfWVuYWJsZSgpe3RoaXMuZGlzYWJsZSgpLHRoaXMuaW5zdHJ1bWVudEZldGNoKCk7dHJ5e2xldCB0PWxpKFwibm9kZTpodHRwXCIpLHI9bGkoXCJub2RlOmh0dHBzXCIpO3RoaXMuaW5zdHJ1bWVudEh0dHAodCxcImh0dHA6XCIpLHRoaXMuaW5zdHJ1bWVudEh0dHAocixcImh0dHBzOlwiKX1jYXRjaHt9fWRpc2FibGUoKXt0aGlzLm9yaWdpbmFsRmV0Y2gmJihnbG9iYWxUaGlzLmZldGNoPXRoaXMub3JpZ2luYWxGZXRjaCl9fSxCcD17c2V0KGUsdCxyKXtlLnNldCh0LHIpfX0sYnU9e2dldChlLHQpe2xldCByPWUuZ2V0KHQpO2lmKHIhPT1udWxsKXJldHVybiByLmluY2x1ZGVzKFwiLFwiKT9yLnNwbGl0KFwiLFwiKS5tYXAobj0+bi50cmltU3RhcnQoKSk6cn0sa2V5cyhlKXtsZXQgdD1bXTtyZXR1cm4gZS5mb3JFYWNoKChyLG4pPT57dC5wdXNoKG4pfSksdH19LFZwPXtzZXQoZSx0LHIpe2VbdC50b0xvd2VyQ2FzZSgpXT1yfX0sTHU9e2dldChlLHQpe3JldHVybiBlW3QudG9Mb3dlckNhc2UoKV19LGtleXMoZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpfX07ZnVuY3Rpb24gR3AoZSl7bGV0IHQ9ZS5pbmRleE9mKFwiP1wiKTtyZXR1cm4gdD09PS0xP2U6ZS5zdWJzdHJpbmcoMCx0KX1mdW5jdGlvbiBIcChlKXtsZXQgdD0wLG49ZS5jbG9uZSgpLmJvZHk/LmdldFJlYWRlcigpO2lmKCFuKXJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7bGV0IG89KCk9Pm4ucmVhZCgpLnRoZW4oKHtkb25lOmksdmFsdWU6YX0pPT57aWYoIWkpcmV0dXJuIHQrPWEuYnl0ZUxlbmd0aCxvKCl9KTtyZXR1cm4gbygpLnRoZW4oKCk9PnQpfWZ1bmN0aW9uIFZ0KGUsdCl7aWYodCBpbnN0YW5jZW9mIEVycm9yKWUucmVjb3JkRXhjZXB0aW9uKHQpLGUuc2V0U3RhdHVzKHtjb2RlOmwuU3BhblN0YXR1c0NvZGUuRVJST1IsbWVzc2FnZTp0Lm1lc3NhZ2V9KTtlbHNle2xldCByPVN0cmluZyh0KTtlLnNldFN0YXR1cyh7Y29kZTpsLlNwYW5TdGF0dXNDb2RlLkVSUk9SLG1lc3NhZ2U6cn0pfX1mdW5jdGlvbiBicihlLHQscixuKXtmb3IobGV0W28saV1vZiBPYmplY3QuZW50cmllcyh0KSl7bGV0IGE9bi5nZXQocixpKTthIT09dm9pZCAwJiZlLnNldEF0dHJpYnV0ZShvLGEpfX1mdW5jdGlvbiBGcChlLHQpe2lmKGUuc29ja2V0UGF0aCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY29uc3RydWN0IGEgbmV0d29yayBVUkw6IG9wdGlvbnMuc29ja2V0UGF0aCBpcyBzcGVjaWZpZWQsIGluZGljYXRpbmcgYSBVbml4IGRvbWFpbiBzb2NrZXQuXCIpO2xldCByPWUucHJvdG9jb2w/P3Q7ciYmIXIuZW5kc1dpdGgoXCI6XCIpJiYocis9XCI6XCIpO2xldCBuPWUuaG9zdG5hbWUsbz1lLnBvcnQ/P2UuZGVmYXVsdFBvcnQ7aWYoIW4mJmUuaG9zdCl7bGV0IHM9ZS5ob3N0LnNwbGl0KFwiOlwiKTtuPXNbMF07bGV0IGY9c1sxXTtpZihzLmxlbmd0aD4xJiZmJiZvPT09dm9pZCAwKXtsZXQgcD1wYXJzZUludChmLDEwKTtpc05hTihwKXx8KG89cCl9fW58fChuPVwibG9jYWxob3N0XCIpO2xldCBpO2lmKG8hPT12b2lkIDAmJm8hPT1cIlwiKXtsZXQgcz1wYXJzZUludChTdHJpbmcobyksMTApO2lzTmFOKHMpP2k9cj09PVwiaHR0cHM6XCI/NDQzOjgwOmk9c31lbHNlIGk9cj09PVwiaHR0cHM6XCI/NDQzOjgwO2xldCBhPWUucGF0aHx8XCIvXCIsdT1gJHtyfS8vJHtufToke2l9YCxjPW5ldyBVUkwoYSx1KTtpZihlLmF1dGgpe2xldCBzPWUuYXV0aC5zcGxpdChcIjpcIik7Yy51c2VybmFtZT1kZWNvZGVVUklDb21wb25lbnQoc1swXXx8XCJcIikscy5sZW5ndGg+MSYmKGMucGFzc3dvcmQ9ZGVjb2RlVVJJQ29tcG9uZW50KHNbMV18fFwiXCIpKX1yZXR1cm4gY31FKCk7dmFyIFB1PXYoUCgpLDEpLGpwPVwiMDBcIixzaT1cInRyYWNlcGFyZW50XCIsYWk9XCJ0cmFjZXN0YXRlXCIsVGU9Y2xhc3N7ZmllbGRzKCl7cmV0dXJuW3NpLGFpXX1pbmplY3QodCxyLG4pe2xldCBvPWwudHJhY2UuZ2V0U3BhbkNvbnRleHQodCk7aWYoIW98fCgwLFB1LmlzVHJhY2luZ1N1cHByZXNzZWQpKHQpfHwhKDAsbC5pc1NwYW5Db250ZXh0VmFsaWQpKG8pKXJldHVybjtsZXQgaT1gJHtqcH0tJHtvLnRyYWNlSWR9LSR7by5zcGFuSWR9LTAke051bWJlcihvLnRyYWNlRmxhZ3N8fDApLnRvU3RyaW5nKDE2KX1gO24uc2V0KHIsc2ksaSksby50cmFjZVN0YXRlJiZuLnNldChyLGFpLG8udHJhY2VTdGF0ZS5zZXJpYWxpemUoKSl9ZXh0cmFjdCh0LHIsbil7bGV0IG89bi5nZXQocixzaSk7aWYoIW8pcmV0dXJuIHQ7bGV0IGk9QXJyYXkuaXNBcnJheShvKT9vWzBdOm87aWYodHlwZW9mIGkhPVwic3RyaW5nXCIpcmV0dXJuIHQ7bGV0IGE9a3AoaSk7aWYoIWEpcmV0dXJuIHQ7YS5pc1JlbW90ZT0hMDtsZXQgdT1uLmdldChyLGFpKTtpZih1KXtsZXQgYz1BcnJheS5pc0FycmF5KHUpP3Uuam9pbihcIixcIik6dTthLnRyYWNlU3RhdGU9KDAsbC5jcmVhdGVUcmFjZVN0YXRlKSh0eXBlb2YgYz09XCJzdHJpbmdcIj9jOnZvaWQgMCl9cmV0dXJuIGwudHJhY2Uuc2V0U3BhbkNvbnRleHQodCxhKX19O2Z1bmN0aW9uIGtwKGUpe2xldFt0LHIsbixvLGldPWUuc3BsaXQoXCItXCIpO3JldHVybiF0fHwhcnx8IW58fCFvfHx0Lmxlbmd0aCE9PTJ8fHIubGVuZ3RoIT09MzJ8fG4ubGVuZ3RoIT09MTZ8fG8ubGVuZ3RoIT09Mnx8dD09PVwiMDBcIiYmaT9udWxsOnt0cmFjZUlkOnIsc3BhbklkOm4sdHJhY2VGbGFnczpwYXJzZUludChvLDE2KX19RSgpO3ZhciBMcj1jbGFzc3tmaWVsZHMoKXtyZXR1cm5bXX1pbmplY3QoKXt9ZXh0cmFjdCh0KXtsZXQgcj1LKCk7aWYoIXI/LnRlbGVtZXRyeSlyZXR1cm4gbC5kaWFnLndhcm4oXCJAdmVyY2VsL290ZWw6IFZlcmNlbCB0ZWxlbWV0cnkgZXh0ZW5zaW9uIG5vdCBmb3VuZC5cIiksdDtsZXR7cm9vdFNwYW5Db250ZXh0Om59PXIudGVsZW1ldHJ5O3JldHVybiBuPyhsLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IEV4dHJhY3RlZCByb290IFNwYW5Db250ZXh0IGZyb20gVmVyY2VsIHJlcXVlc3QgY29udGV4dC5cIixuKSxsLnRyYWNlLnNldFNwYW5Db250ZXh0KHQsey4uLm4saXNSZW1vdGU6ITAsdHJhY2VGbGFnczpuLnRyYWNlRmxhZ3N8fGwuVHJhY2VGbGFncy5TQU1QTEVEfSkpOnR9fTtFKCk7dmFyIFByPXYoUCgpLDEpO3ZhciBlZT12KFAoKSkscXA9QmlnSW50KDFlOSk7ZnVuY3Rpb24gQ3UoZSl7cmV0dXJuIEJpZ0ludChlWzBdKSpxcCtCaWdJbnQoZVsxXSl9ZnVuY3Rpb24gWHAoZSl7dmFyIHQ9TnVtYmVyKEJpZ0ludC5hc1VpbnROKDMyLGUpKSxyPU51bWJlcihCaWdJbnQuYXNVaW50TigzMixlPj5CaWdJbnQoMzIpKSk7cmV0dXJue2xvdzp0LGhpZ2g6cn19ZnVuY3Rpb24gTnUoZSl7dmFyIHQ9Q3UoZSk7cmV0dXJuIFhwKHQpfWZ1bmN0aW9uIEtwKGUpe3ZhciB0PUN1KGUpO3JldHVybiB0LnRvU3RyaW5nKCl9dmFyIFdwPXR5cGVvZiBCaWdJbnQ8XCJ1XCI/S3A6ZWUuaHJUaW1lVG9OYW5vc2Vjb25kcztmdW5jdGlvbiBJdShlKXtyZXR1cm4gZX1mdW5jdGlvbiB3dShlKXtpZihlIT09dm9pZCAwKXJldHVybigwLGVlLmhleFRvQmFzZTY0KShlKX12YXIgWXA9e2VuY29kZUhyVGltZTpOdSxlbmNvZGVTcGFuQ29udGV4dDplZS5oZXhUb0Jhc2U2NCxlbmNvZGVPcHRpb25hbFNwYW5Db250ZXh0Ond1fTtmdW5jdGlvbiBNdShlKXt2YXIgdCxyO2lmKGU9PT12b2lkIDApcmV0dXJuIFlwO3ZhciBuPSh0PWUudXNlTG9uZ0JpdHMpIT09bnVsbCYmdCE9PXZvaWQgMD90OiEwLG89KHI9ZS51c2VIZXgpIT09bnVsbCYmciE9PXZvaWQgMD9yOiExO3JldHVybntlbmNvZGVIclRpbWU6bj9OdTpXcCxlbmNvZGVTcGFuQ29udGV4dDpvP0l1OmVlLmhleFRvQmFzZTY0LGVuY29kZU9wdGlvbmFsU3BhbkNvbnRleHQ6bz9JdTp3dX19dmFyIHpwPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZlW1N5bWJvbC5pdGVyYXRvcl07aWYoIXIpcmV0dXJuIGU7dmFyIG49ci5jYWxsKGUpLG8saT1bXSxhO3RyeXtmb3IoOyh0PT09dm9pZCAwfHx0LS0gPjApJiYhKG89bi5uZXh0KCkpLmRvbmU7KWkucHVzaChvLnZhbHVlKX1jYXRjaCh1KXthPXtlcnJvcjp1fX1maW5hbGx5e3RyeXtvJiYhby5kb25lJiYocj1uLnJldHVybikmJnIuY2FsbChuKX1maW5hbGx5e2lmKGEpdGhyb3cgYS5lcnJvcn19cmV0dXJuIGl9O2Z1bmN0aW9uIHJlKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHh1KHQsZVt0XSl9KX1mdW5jdGlvbiB4dShlLHQpe3JldHVybntrZXk6ZSx2YWx1ZTpEdSh0KX19ZnVuY3Rpb24gRHUoZSl7dmFyIHQ9dHlwZW9mIGU7cmV0dXJuIHQ9PT1cInN0cmluZ1wiP3tzdHJpbmdWYWx1ZTplfTp0PT09XCJudW1iZXJcIj9OdW1iZXIuaXNJbnRlZ2VyKGUpP3tpbnRWYWx1ZTplfTp7ZG91YmxlVmFsdWU6ZX06dD09PVwiYm9vbGVhblwiP3tib29sVmFsdWU6ZX06ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/e2J5dGVzVmFsdWU6ZX06QXJyYXkuaXNBcnJheShlKT97YXJyYXlWYWx1ZTp7dmFsdWVzOmUubWFwKER1KX19OnQ9PT1cIm9iamVjdFwiJiZlIT1udWxsP3trdmxpc3RWYWx1ZTp7dmFsdWVzOk9iamVjdC5lbnRyaWVzKGUpLm1hcChmdW5jdGlvbihyKXt2YXIgbj16cChyLDIpLG89blswXSxpPW5bMV07cmV0dXJuIHh1KG8saSl9KX19Ont9fWZ1bmN0aW9uIFV1KGUsdCl7dmFyIHIsbj1lLnNwYW5Db250ZXh0KCksbz1lLnN0YXR1cztyZXR1cm57dHJhY2VJZDp0LmVuY29kZVNwYW5Db250ZXh0KG4udHJhY2VJZCksc3BhbklkOnQuZW5jb2RlU3BhbkNvbnRleHQobi5zcGFuSWQpLHBhcmVudFNwYW5JZDp0LmVuY29kZU9wdGlvbmFsU3BhbkNvbnRleHQoZS5wYXJlbnRTcGFuSWQpLHRyYWNlU3RhdGU6KHI9bi50cmFjZVN0YXRlKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuc2VyaWFsaXplKCksbmFtZTplLm5hbWUsa2luZDplLmtpbmQ9PW51bGw/MDplLmtpbmQrMSxzdGFydFRpbWVVbml4TmFubzp0LmVuY29kZUhyVGltZShlLnN0YXJ0VGltZSksZW5kVGltZVVuaXhOYW5vOnQuZW5jb2RlSHJUaW1lKGUuZW5kVGltZSksYXR0cmlidXRlczpyZShlLmF0dHJpYnV0ZXMpLGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6ZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50LGV2ZW50czplLmV2ZW50cy5tYXAoZnVuY3Rpb24oaSl7cmV0dXJuIFFwKGksdCl9KSxkcm9wcGVkRXZlbnRzQ291bnQ6ZS5kcm9wcGVkRXZlbnRzQ291bnQsc3RhdHVzOntjb2RlOm8uY29kZSxtZXNzYWdlOm8ubWVzc2FnZX0sbGlua3M6ZS5saW5rcy5tYXAoZnVuY3Rpb24oaSl7cmV0dXJuICRwKGksdCl9KSxkcm9wcGVkTGlua3NDb3VudDplLmRyb3BwZWRMaW5rc0NvdW50fX1mdW5jdGlvbiAkcChlLHQpe3ZhciByO3JldHVybnthdHRyaWJ1dGVzOmUuYXR0cmlidXRlcz9yZShlLmF0dHJpYnV0ZXMpOltdLHNwYW5JZDp0LmVuY29kZVNwYW5Db250ZXh0KGUuY29udGV4dC5zcGFuSWQpLHRyYWNlSWQ6dC5lbmNvZGVTcGFuQ29udGV4dChlLmNvbnRleHQudHJhY2VJZCksdHJhY2VTdGF0ZToocj1lLmNvbnRleHQudHJhY2VTdGF0ZSk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnNlcmlhbGl6ZSgpLGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6ZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50fHwwfX1mdW5jdGlvbiBRcChlLHQpe3JldHVybnthdHRyaWJ1dGVzOmUuYXR0cmlidXRlcz9yZShlLmF0dHJpYnV0ZXMpOltdLG5hbWU6ZS5uYW1lLHRpbWVVbml4TmFubzp0LmVuY29kZUhyVGltZShlLnRpbWUpLGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6ZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50fHwwfX12YXIgSnA9ZnVuY3Rpb24oZSl7dmFyIHQ9dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiZTeW1ib2wuaXRlcmF0b3Iscj10JiZlW3RdLG49MDtpZihyKXJldHVybiByLmNhbGwoZSk7aWYoZSYmdHlwZW9mIGUubGVuZ3RoPT1cIm51bWJlclwiKXJldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIGUmJm4+PWUubGVuZ3RoJiYoZT12b2lkIDApLHt2YWx1ZTplJiZlW24rK10sZG9uZTohZX19fTt0aHJvdyBuZXcgVHlwZUVycm9yKHQ/XCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiOlwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKX0sWnA9ZnVuY3Rpb24oZSx0KXt2YXIgcj10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJmVbU3ltYm9sLml0ZXJhdG9yXTtpZighcilyZXR1cm4gZTt2YXIgbj1yLmNhbGwoZSksbyxpPVtdLGE7dHJ5e2Zvcig7KHQ9PT12b2lkIDB8fHQtLSA+MCkmJiEobz1uLm5leHQoKSkuZG9uZTspaS5wdXNoKG8udmFsdWUpfWNhdGNoKHUpe2E9e2Vycm9yOnV9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihyPW4ucmV0dXJuKSYmci5jYWxsKG4pfWZpbmFsbHl7aWYoYSl0aHJvdyBhLmVycm9yfX1yZXR1cm4gaX07ZnVuY3Rpb24gdWkoZSx0KXt2YXIgcj1NdSh0KTtyZXR1cm57cmVzb3VyY2VTcGFuczplZChlLHIpfX1mdW5jdGlvbiB0ZChlKXt2YXIgdCxyLG49bmV3IE1hcDt0cnl7Zm9yKHZhciBvPUpwKGUpLGk9by5uZXh0KCk7IWkuZG9uZTtpPW8ubmV4dCgpKXt2YXIgYT1pLnZhbHVlLHU9bi5nZXQoYS5yZXNvdXJjZSk7dXx8KHU9bmV3IE1hcCxuLnNldChhLnJlc291cmNlLHUpKTt2YXIgYz1hLmluc3RydW1lbnRhdGlvbkxpYnJhcnkubmFtZStcIkBcIisoYS5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LnZlcnNpb258fFwiXCIpK1wiOlwiKyhhLmluc3RydW1lbnRhdGlvbkxpYnJhcnkuc2NoZW1hVXJsfHxcIlwiKSxzPXUuZ2V0KGMpO3N8fChzPVtdLHUuc2V0KGMscykpLHMucHVzaChhKX19Y2F0Y2goZil7dD17ZXJyb3I6Zn19ZmluYWxseXt0cnl7aSYmIWkuZG9uZSYmKHI9by5yZXR1cm4pJiZyLmNhbGwobyl9ZmluYWxseXtpZih0KXRocm93IHQuZXJyb3J9fXJldHVybiBufWZ1bmN0aW9uIGVkKGUsdCl7Zm9yKHZhciByPXRkKGUpLG49W10sbz1yLmVudHJpZXMoKSxpPW8ubmV4dCgpOyFpLmRvbmU7KXtmb3IodmFyIGE9WnAoaS52YWx1ZSwyKSx1PWFbMF0sYz1hWzFdLHM9W10sZj1jLnZhbHVlcygpLHA9Zi5uZXh0KCk7IXAuZG9uZTspe3ZhciBkPXAudmFsdWU7aWYoZC5sZW5ndGg+MCl7dmFyIG09ZFswXS5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LGc9bS5uYW1lLEM9bS52ZXJzaW9uLE09bS5zY2hlbWFVcmwsVD1kLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gVXUocSx0KX0pO3MucHVzaCh7c2NvcGU6e25hbWU6Zyx2ZXJzaW9uOkN9LHNwYW5zOlQsc2NoZW1hVXJsOk19KX1wPWYubmV4dCgpfXZhciBydD17cmVzb3VyY2U6e2F0dHJpYnV0ZXM6cmUodS5hdHRyaWJ1dGVzKSxkcm9wcGVkQXR0cmlidXRlc0NvdW50OjB9LHNjb3BlU3BhbnM6cyxzY2hlbWFVcmw6dm9pZCAwfTtuLnB1c2gocnQpLGk9by5uZXh0KCl9cmV0dXJuIG59dmFyIElyPWNsYXNze2V4cG9ydCh0LHIpe2xldCBuPUsoKTtpZighbj8udGVsZW1ldHJ5KXtsLmRpYWcud2FybihcIkB2ZXJjZWwvb3RlbDogbm8gdGVsZW1ldHJ5IGNvbnRleHQgZm91bmRcIikscih7Y29kZTpQci5FeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MsZXJyb3I6dm9pZCAwfSk7cmV0dXJufXRyeXtsZXQgbz11aSh0LHt1c2VIZXg6ITAsdXNlTG9uZ0JpdHM6ITF9KTtuLnRlbGVtZXRyeS5yZXBvcnRTcGFucyhvKSxyKHtjb2RlOlByLkV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUyxlcnJvcjp2b2lkIDB9KX1jYXRjaChvKXtyKHtjb2RlOlByLkV4cG9ydFJlc3VsdENvZGUuRkFJTEVELGVycm9yOm8gaW5zdGFuY2VvZiBFcnJvcj9vOm5ldyBFcnJvcihTdHJpbmcobykpfSl9fXNodXRkb3duKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9fTtFKCk7ZnVuY3Rpb24gY2koKXtyZXR1cm4hIUsoKT8udGVsZW1ldHJ5Py50cmFjZURyYWlucz8ubGVuZ3RofXZhciBCdT0hMSxTZT1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnByb2Nlc3Nvcj10fWZvcmNlRmx1c2goKXtyZXR1cm4gdGhpcy5wcm9jZXNzb3IuZm9yY2VGbHVzaCgpfXNodXRkb3duKCl7cmV0dXJuIHRoaXMucHJvY2Vzc29yLnNodXRkb3duKCl9b25TdGFydCh0LHIpe2lmKGNpKCkpe0J1fHwoQnU9ITAsbC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsOiBza2lwcGluZyBhdXRvbWF0aWMgZXhwb3J0ZXIgZHVlIHRvIGNvbmZpZ3VyZWQgdHJhY2UgZHJhaW5zXCIpKTtyZXR1cm59dGhpcy5wcm9jZXNzb3Iub25TdGFydCh0LHIpfW9uRW5kKHQpe2NpKCl8fHRoaXMucHJvY2Vzc29yLm9uRW5kKHQpfX07dmFyIHJkPXtBTEw6bC5EaWFnTG9nTGV2ZWwuQUxMLFZFUkJPU0U6bC5EaWFnTG9nTGV2ZWwuVkVSQk9TRSxERUJVRzpsLkRpYWdMb2dMZXZlbC5ERUJVRyxJTkZPOmwuRGlhZ0xvZ0xldmVsLklORk8sV0FSTjpsLkRpYWdMb2dMZXZlbC5XQVJOLEVSUk9SOmwuRGlhZ0xvZ0xldmVsLkVSUk9SLE5PTkU6bC5EaWFnTG9nTGV2ZWwuTk9ORX0sQ3I9Y2xhc3N7Y29uc3RydWN0b3IodD17fSl7dGhpcy5jb25maWd1cmF0aW9uPXR9c3RhcnQoKXtsZXQgdD1uZCgpLHI9dGhpcy5jb25maWd1cmF0aW9uLG49cHJvY2Vzcy5lbnYuTkVYVF9SVU5USU1FfHxcIm5vZGVqc1wiLG89ISF0Lk9URUxfU0RLX0RJU0FCTEVEO2lmKHByb2Nlc3MuZW52Lk9URUxfTE9HX0xFVkVMJiZsLmRpYWcuc2V0TG9nZ2VyKG5ldyBsLkRpYWdDb25zb2xlTG9nZ2VyLHtsb2dMZXZlbDpyZFtwcm9jZXNzLmVudi5PVEVMX0xPR19MRVZFTC50b1VwcGVyQ2FzZSgpXX0pLG8pcmV0dXJuO2xldCBpPXIuaWRHZW5lcmF0b3I/P25ldyBlcixhPXIuY29udGV4dE1hbmFnZXI/P25ldyBGdS5Bc3luY0xvY2FsU3RvcmFnZUNvbnRleHRNYW5hZ2VyO2EuZW5hYmxlKCksdGhpcy5jb250ZXh0TWFuYWdlcj1hO2xldCB1PXQuT1RFTF9TRVJWSUNFX05BTUV8fHIuc2VydmljZU5hbWV8fFwiYXBwXCIsYz1uZXcgSChpYSh7YXR0cmlidXRlczpyLmF0dHJpYnV0ZXMscnVudGltZTpuLHNlcnZpY2VOYW1lOnV9KSkscz1yLnJlc291cmNlRGV0ZWN0b3JzPz9bd29dO2lmKHIuYXV0b0RldGVjdFJlc291cmNlcz8/ITApe2xldCBUPXtkZXRlY3RvcnM6c307Yz1jLm1lcmdlKHhvKFQpKX1sZXQgcD1vZChyLnByb3BhZ2F0b3JzLHIsdCksZD1zZChyLnRyYWNlU2FtcGxlcix0KSxtPWFkKHIuc3BhblByb2Nlc3NvcnMscix0KTttLmxlbmd0aD09PTAmJmwuZGlhZy53YXJuKFwiQHZlcmNlbC9vdGVsOiBObyBzcGFuIHByb2Nlc3NvcnMgY29uZmlndXJlZC4gTm8gc3BhbnMgd2lsbCBiZSBleHBvcnRlZC5cIik7bGV0IGc9ci5zcGFuTGltaXRzLEM9bmV3IFZvKHtyZXNvdXJjZTpjLGlkR2VuZXJhdG9yOmksc2FtcGxlcjpkLHNwYW5MaW1pdHM6Z30pO2lmKEMuYWRkU3BhblByb2Nlc3NvcihuZXcgbXIobSxyLmF0dHJpYnV0ZXNGcm9tSGVhZGVycykpLEMucmVnaXN0ZXIoe2NvbnRleHRNYW5hZ2VyOmEscHJvcGFnYXRvcjpuZXcgT3QuQ29tcG9zaXRlUHJvcGFnYXRvcih7cHJvcGFnYXRvcnM6cH0pfSksdGhpcy50cmFjZXJQcm92aWRlcj1DLHIubG9nUmVjb3JkUHJvY2Vzc29yKXtsZXQgVD1uZXcgZ24oe3Jlc291cmNlOmN9KTt0aGlzLmxvZ2dlclByb3ZpZGVyPVQsVC5hZGRMb2dSZWNvcmRQcm9jZXNzb3Ioci5sb2dSZWNvcmRQcm9jZXNzb3IpLGF0LmxvZ3Muc2V0R2xvYmFsTG9nZ2VyUHJvdmlkZXIoVCl9aWYoci5tZXRyaWNSZWFkZXJ8fHIudmlld3Mpe2xldCBUPW5ldyBJbih7cmVzb3VyY2U6Yyx2aWV3czpyLnZpZXdzPz9bXX0pO3IubWV0cmljUmVhZGVyJiZULmFkZE1ldHJpY1JlYWRlcihyLm1ldHJpY1JlYWRlciksbC5tZXRyaWNzLnNldEdsb2JhbE1ldGVyUHJvdmlkZXIoVCksdGhpcy5tZXRlclByb3ZpZGVyPVR9bGV0IE09aWQoci5pbnN0cnVtZW50YXRpb25zLHIuaW5zdHJ1bWVudGF0aW9uQ29uZmlnKTt0aGlzLmRpc2FibGVJbnN0cnVtZW50YXRpb25zPSgwLEh1LnJlZ2lzdGVySW5zdHJ1bWVudGF0aW9ucykoe2luc3RydW1lbnRhdGlvbnM6TX0pLGwuZGlhZy5pbmZvKFwiQHZlcmNlbC9vdGVsOiBzdGFydGVkXCIsdSxuKX1hc3luYyBzaHV0ZG93bigpe2xldCB0PVtdO3RoaXMudHJhY2VyUHJvdmlkZXImJnQucHVzaCh0aGlzLnRyYWNlclByb3ZpZGVyLnNodXRkb3duKCkpLHRoaXMubG9nZ2VyUHJvdmlkZXImJnQucHVzaCh0aGlzLmxvZ2dlclByb3ZpZGVyLnNodXRkb3duKCkpLHRoaXMubWV0ZXJQcm92aWRlciYmdC5wdXNoKHRoaXMubWV0ZXJQcm92aWRlci5zaHV0ZG93bigpKSxsLmRpYWcuaW5mbyhcIkB2ZXJjZWwvb3RlbDogc2h1dHRpbmcgZG93blwiLHQubGVuZ3RoLHByb2Nlc3MuZW52Lk5FWFRfUlVOVElNRSksYXdhaXQgUHJvbWlzZS5hbGwodCksdGhpcy5jb250ZXh0TWFuYWdlciYmdGhpcy5jb250ZXh0TWFuYWdlci5kaXNhYmxlKCk7bGV0e2Rpc2FibGVJbnN0cnVtZW50YXRpb25zOnJ9PXRoaXM7ciYmcigpfX07ZnVuY3Rpb24gbmQoKXtsZXQgZT0oMCxOci5wYXJzZUVudmlyb25tZW50KShwcm9jZXNzLmVudik7cmV0dXJuey4uLk5yLkRFRkFVTFRfRU5WSVJPTk1FTlQsLi4uZX19ZnVuY3Rpb24gaWQoZSx0KXtyZXR1cm4oZT8/W1wiYXV0b1wiXSkubWFwKHI9PnI9PT1cImF1dG9cIj8obC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsOiBDb25maWd1cmUgaW5zdHJ1bWVudGF0aW9uczogZmV0Y2hcIix0Py5mZXRjaCksW25ldyB0ZSh0Py5mZXRjaCldKTpyPT09XCJmZXRjaFwiPyhsLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSBpbnN0cnVtZW50YXRpb25zOiBmZXRjaFwiLHQ/LmZldGNoKSxuZXcgdGUodD8uZmV0Y2gpKTpyKS5mbGF0KCl9ZnVuY3Rpb24gb2QoZSx0LHIpe2xldCBuPXByb2Nlc3MuZW52Lk9URUxfUFJPUEFHQVRPUlMmJnIuT1RFTF9QUk9QQUdBVE9SUyYmci5PVEVMX1BST1BBR0FUT1JTLmxlbmd0aD4wP3IuT1RFTF9QUk9QQUdBVE9SUzp2b2lkIDA7cmV0dXJuKGU/P24/P1tcImF1dG9cIl0pLm1hcChvPT57aWYobz09PVwibm9uZVwiKXJldHVybltdO2lmKG89PT1cImF1dG9cIil7bGV0IGk9W107cmV0dXJuIGkucHVzaCh7bmFtZTpcInRyYWNlY29udGV4dFwiLHByb3BhZ2F0b3I6bmV3IFRlfSksaS5wdXNoKHtuYW1lOlwiYmFnZ2FnZVwiLHByb3BhZ2F0b3I6bmV3IE90LlczQ0JhZ2dhZ2VQcm9wYWdhdG9yfSksaS5wdXNoKHtuYW1lOlwidmVyY2VsLXJ1bnRpbWVcIixwcm9wYWdhdG9yOm5ldyBMcn0pLGwuZGlhZy5kZWJ1ZyhgQHZlcmNlbC9vdGVsOiBDb25maWd1cmUgcHJvcGFnYXRvcnM6ICR7aS5tYXAoYT0+YS5uYW1lKS5qb2luKFwiLCBcIil9YCksaS5tYXAoYT0+YS5wcm9wYWdhdG9yKX1pZihvPT09XCJ0cmFjZWNvbnRleHRcIilyZXR1cm4gbC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsOiBDb25maWd1cmUgcHJvcGFnYXRvcjogdHJhY2Vjb250ZXh0XCIpLG5ldyBUZTtpZihvPT09XCJiYWdnYWdlXCIpcmV0dXJuIGwuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbDogQ29uZmlndXJlIHByb3BhZ2F0b3I6IGJhZ2dhZ2VcIiksbmV3IE90LlczQ0JhZ2dhZ2VQcm9wYWdhdG9yO2lmKHR5cGVvZiBvPT1cInN0cmluZ1wiKXRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9wYWdhdG9yOiBcIiR7b31cImApO3JldHVybiBvfSkuZmxhdCgpfXZhciBWdT1cImFsd2F5c19vblwiLG5lPTE7ZnVuY3Rpb24gc2QoZSx0KXtpZihlJiZ0eXBlb2YgZSE9XCJzdHJpbmdcIilyZXR1cm4gZTtsZXQgcj1lJiZlIT09XCJhdXRvXCI/ZTp0Lk9URUxfVFJBQ0VTX1NBTVBMRVJ8fFZ1O3N3aXRjaChsLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSBzYW1wbGVyOiBcIixyKSxyKXtjYXNlXCJhbHdheXNfb25cIjpyZXR1cm4gbmV3IFg7Y2FzZVwiYWx3YXlzX29mZlwiOnJldHVybiBuZXcgc3Q7Y2FzZVwicGFyZW50YmFzZWRfYWx3YXlzX29uXCI6cmV0dXJuIG5ldyBFdCh7cm9vdDpuZXcgWH0pO2Nhc2VcInBhcmVudGJhc2VkX2Fsd2F5c19vZmZcIjpyZXR1cm4gbmV3IEV0KHtyb290Om5ldyBzdH0pO2Nhc2VcInRyYWNlaWRyYXRpb1wiOnJldHVybiBuZXcga3QoR3UodCkpO2Nhc2VcInBhcmVudGJhc2VkX3RyYWNlaWRyYXRpb1wiOnJldHVybiBuZXcgRXQoe3Jvb3Q6bmV3IGt0KEd1KHQpKX0pO2RlZmF1bHQ6cmV0dXJuIGwuZGlhZy5lcnJvcihgQHZlcmNlbC9vdGVsOiBPVEVMX1RSQUNFU19TQU1QTEVSIHZhbHVlIFwiJHtTdHJpbmcodC5PVEVMX1RSQUNFU19TQU1QTEVSKX0gaW52YWxpZCwgZGVmYXVsdGluZyB0byAke1Z1fVwiLmApLG5ldyBYfX1mdW5jdGlvbiBHdShlKXtpZihlLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPT09dm9pZCAwfHxlLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPT09XCJcIilyZXR1cm4gbC5kaWFnLmVycm9yKGBAdmVyY2VsL290ZWw6IE9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHIGlzIGJsYW5rLCBkZWZhdWx0aW5nIHRvICR7bmV9LmApLG5lO2wuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbDogQ29uZmlndXJlIHNhbXBsZXIgcHJvYmFiaWxpdHk6IFwiLGUuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcpO2xldCB0PU51bWJlcihlLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHKTtyZXR1cm4gaXNOYU4odCk/KGwuZGlhZy5lcnJvcihgQHZlcmNlbC9vdGVsOiBPVEVMX1RSQUNFU19TQU1QTEVSX0FSRz0ke2UuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkd9IHdhcyBnaXZlbiwgYnV0IGl0IGlzIGludmFsaWQsIGRlZmF1bHRpbmcgdG8gJHtuZX0uYCksbmUpOnQ8MHx8dD4xPyhsLmRpYWcuZXJyb3IoYEB2ZXJjZWwvb3RlbDogT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9JHtlLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHfSB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBvdXQgb2YgcmFuZ2UgKFswLi4xXSksIGRlZmF1bHRpbmcgdG8gJHtuZX0uYCksbmUpOnR9ZnVuY3Rpb24gYWQoZSx0LHIpe3JldHVyblsuLi4oZT8/W1wiYXV0b1wiXSkuZmxhdE1hcChuPT57aWYobj09PVwiYXV0b1wiKXtsZXQgbz1bbmV3IE10KG5ldyBJcildO2lmKHByb2Nlc3MuZW52LlZFUkNFTF9PVEVMX0VORFBPSU5UUyl7bGV0IGk9cHJvY2Vzcy5lbnYuVkVSQ0VMX09URUxfRU5EUE9JTlRTX1BPUlR8fFwiNDMxOFwiLGE9cHJvY2Vzcy5lbnYuVkVSQ0VMX09URUxfRU5EUE9JTlRTX1BST1RPQ09MfHxcImh0dHAvcHJvdG9idWZcIjtsLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSB2ZXJjZWwgb3RlbCBjb2xsZWN0b3Igb24gcG9ydDogXCIsaSxhKTtsZXQgdT17dXJsOmBodHRwOi8vbG9jYWxob3N0OiR7aX0vdjEvdHJhY2VzYCxoZWFkZXJzOnt9fSxjPWE9PT1cImh0dHAvcHJvdG9idWZcIj9uZXcgQnQodSk6bmV3IFF0KHUpO28ucHVzaChuZXcgU2UobmV3IE10KGMpKSl9ZWxzZSghdC50cmFjZUV4cG9ydGVyfHx0LnRyYWNlRXhwb3J0ZXI9PT1cImF1dG9cInx8ci5PVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UfHxyLk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCkmJm8ucHVzaChuZXcgU2UobmV3IE10KHVkKHIpKSkpO3JldHVybiBvfXJldHVybiBufSkuZmlsdGVyKGZkKSwuLi50LnRyYWNlRXhwb3J0ZXImJnQudHJhY2VFeHBvcnRlciE9PVwiYXV0b1wiP1tuZXcgTXQodC50cmFjZUV4cG9ydGVyKV06W11dfWZ1bmN0aW9uIHVkKGUpe2xldCB0PXByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfUFJPVE9DT0w/P3Byb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTD8/XCJodHRwL3Byb3RvYnVmXCIscj1sZChlKSxuPXsuLi5PdC5iYWdnYWdlVXRpbHMucGFyc2VLZXlQYWlyc0ludG9SZWNvcmQoZS5PVEVMX0VYUE9SVEVSX09UTFBfSEVBREVSUyksLi4uT3QuYmFnZ2FnZVV0aWxzLnBhcnNlS2V5UGFpcnNJbnRvUmVjb3JkKGUuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19IRUFERVJTKX07c3dpdGNoKGwuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbDogQ29uZmlndXJlIHRyYWNlIGV4cG9ydGVyOiBcIix0LHIsYGhlYWRlcnM6ICR7T2JqZWN0LmtleXMobikuam9pbihcIixcIil8fFwiPG5vbmU+XCJ9YCksdCl7Y2FzZVwiaHR0cC9qc29uXCI6cmV0dXJuIG5ldyBRdCh7dXJsOnIsaGVhZGVyczpufSk7Y2FzZVwiaHR0cC9wcm90b2J1ZlwiOnJldHVybiBuZXcgQnQoe3VybDpyLGhlYWRlcnM6bn0pO2RlZmF1bHQ6cmV0dXJuIGwuZGlhZy53YXJuKGBAdmVyY2VsL290ZWw6IFVuc3VwcG9ydGVkIE9UTFAgdHJhY2VzIHByb3RvY29sOiAke3R9LiBVc2luZyBodHRwL3Byb3RvYnVmLmApLG5ldyBCdH19dmFyIGp1PVwidjEvdHJhY2VzXCIsY2Q9YGh0dHA6Ly9sb2NhbGhvc3Q6NDMxOC8ke2p1fWA7ZnVuY3Rpb24gbGQoZSl7bGV0IHQ9ZS5PVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UO2lmKHQmJnR5cGVvZiB0PT1cInN0cmluZ1wiKXJldHVybiB0O2xldCByPWUuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UO3JldHVybiByJiZ0eXBlb2Ygcj09XCJzdHJpbmdcIj9gJHtyfS8ke2p1fWA6Y2R9ZnVuY3Rpb24gZmQoZSl7cmV0dXJuIGUhPW51bGx9ZnVuY3Rpb24ga1QoZSl7bGV0IHQ7ZT90eXBlb2YgZT09XCJzdHJpbmdcIj90PXtzZXJ2aWNlTmFtZTplfTp0PWU6dD17fSxuZXcgQ3IodCkuc3RhcnQoKX1leHBvcnR7dGUgYXMgRmV0Y2hJbnN0cnVtZW50YXRpb24sUXQgYXMgT1RMUEh0dHBKc29uVHJhY2VFeHBvcnRlcixCdCBhcyBPVExQSHR0cFByb3RvVHJhY2VFeHBvcnRlcixrVCBhcyByZWdpc3Rlck9UZWx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/edge/index.js\n"); + +/***/ }), + +/***/ "(instrument)/./instrumentation.ts": +/*!****************************!*\ + !*** ./instrumentation.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ register: () => (/* binding */ register)\n/* harmony export */ });\n/* harmony import */ var _vercel_otel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vercel/otel */ \"(instrument)/../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/edge/index.js\");\n\nfunction register() {\n (0,_vercel_otel__WEBPACK_IMPORTED_MODULE_0__.registerOTel)({\n serviceName: \"superlog-sample-nextjs\"\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4vaW5zdHJ1bWVudGF0aW9uLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQTRDO0FBRXJDLFNBQVNDO0lBQ2RELDBEQUFZQSxDQUFDO1FBQUVFLGFBQWE7SUFBeUI7QUFDdkQiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9hcHBzL3NhbXBsZS9pbnN0cnVtZW50YXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVnaXN0ZXJPVGVsIH0gZnJvbSBcIkB2ZXJjZWwvb3RlbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIoKSB7XG4gIHJlZ2lzdGVyT1RlbCh7IHNlcnZpY2VOYW1lOiBcInN1cGVybG9nLXNhbXBsZS1uZXh0anNcIiB9KTtcbn1cbiJdLCJuYW1lcyI6WyJyZWdpc3Rlck9UZWwiLCJyZWdpc3RlciIsInNlcnZpY2VOYW1lIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/./instrumentation.ts\n"); + +/***/ }), + +/***/ "async_hooks": +/*!***********************************!*\ + !*** external "node:async_hooks" ***! + \***********************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("node:async_hooks"); + +/***/ }), + +/***/ "events": +/*!******************************!*\ + !*** external "node:events" ***! + \******************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("node:events"); + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__("(instrument)/./instrumentation.ts")); +/******/ (_ENTRIES = typeof _ENTRIES === "undefined" ? {} : _ENTRIES).middleware_instrumentation = __webpack_exports__; +/******/ } +]); \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/edge-runtime-webpack.js b/superlog/apps/sample/.next/server/edge-runtime-webpack.js new file mode 100644 index 0000000000000000000000000000000000000000..270bafbe5c7141b1b539232d62828e5d4dcafffe --- /dev/null +++ b/superlog/apps/sample/.next/server/edge-runtime-webpack.js @@ -0,0 +1,1164 @@ +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({}); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ if (cachedModule.error !== undefined) throw cachedModule.error; +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ var execOptions = { id: moduleId, module: module, factory: __webpack_modules__[moduleId], require: __webpack_require__ }; +/******/ __webpack_require__.i.forEach(function(handler) { handler(execOptions); }); +/******/ module = execOptions.module; +/******/ execOptions.factory.call(module.exports, module, module.exports, execOptions.require); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = __webpack_module_cache__; +/******/ +/******/ // expose the module execution interceptor +/******/ __webpack_require__.i = []; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/create fake namespace object */ +/******/ (() => { +/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); +/******/ var leafPrototypes; +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 16: return value when it's Promise-like +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = this(value); +/******/ if(mode & 8) return value; +/******/ if(typeof value === 'object' && value) { +/******/ if((mode & 4) && value.__esModule) return value; +/******/ if((mode & 16) && typeof value.then === 'function') return value; +/******/ } +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ var def = {}; +/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; +/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { +/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); +/******/ } +/******/ def['default'] = () => (value); +/******/ __webpack_require__.d(ns, def); +/******/ return ns; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript update chunk filename */ +/******/ (() => { +/******/ // This function allow to reference all chunks +/******/ __webpack_require__.hu = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "static/webpack/" + chunkId + "." + __webpack_require__.h() + ".hot-update.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get update manifest filename */ +/******/ (() => { +/******/ __webpack_require__.hmrF = () => ("static/webpack/" + __webpack_require__.h() + ".edge-runtime-webpack.hot-update.json"); +/******/ })(); +/******/ +/******/ /* webpack/runtime/getFullHash */ +/******/ (() => { +/******/ __webpack_require__.h = () => ("4e581b080247626b") +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ var dataWebpackPrefix = "_N_E:"; +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key); +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hot module replacement */ +/******/ (() => { +/******/ var currentModuleData = {}; +/******/ var installedModules = __webpack_require__.c; +/******/ +/******/ // module and require creation +/******/ var currentChildModule; +/******/ var currentParents = []; +/******/ +/******/ // status +/******/ var registeredStatusHandlers = []; +/******/ var currentStatus = "idle"; +/******/ +/******/ // while downloading +/******/ var blockingPromises = 0; +/******/ var blockingPromisesWaiting = []; +/******/ +/******/ // The update info +/******/ var currentUpdateApplyHandlers; +/******/ var queuedInvalidatedModules; +/******/ +/******/ __webpack_require__.hmrD = currentModuleData; +/******/ +/******/ __webpack_require__.i.push(function (options) { +/******/ var module = options.module; +/******/ var require = createRequire(options.require, options.id); +/******/ module.hot = createModuleHotObject(options.id, module); +/******/ module.parents = currentParents; +/******/ module.children = []; +/******/ currentParents = []; +/******/ options.require = require; +/******/ }); +/******/ +/******/ __webpack_require__.hmrC = {}; +/******/ __webpack_require__.hmrI = {}; +/******/ +/******/ function createRequire(require, moduleId) { +/******/ var me = installedModules[moduleId]; +/******/ if (!me) return require; +/******/ var fn = function (request) { +/******/ if (me.hot.active) { +/******/ if (installedModules[request]) { +/******/ var parents = installedModules[request].parents; +/******/ if (parents.indexOf(moduleId) === -1) { +/******/ parents.push(moduleId); +/******/ } +/******/ } else { +/******/ currentParents = [moduleId]; +/******/ currentChildModule = request; +/******/ } +/******/ if (me.children.indexOf(request) === -1) { +/******/ me.children.push(request); +/******/ } +/******/ } else { +/******/ console.warn( +/******/ "[HMR] unexpected require(" + +/******/ request + +/******/ ") from disposed module " + +/******/ moduleId +/******/ ); +/******/ currentParents = []; +/******/ } +/******/ return require(request); +/******/ }; +/******/ var createPropertyDescriptor = function (name) { +/******/ return { +/******/ configurable: true, +/******/ enumerable: true, +/******/ get: function () { +/******/ return require[name]; +/******/ }, +/******/ set: function (value) { +/******/ require[name] = value; +/******/ } +/******/ }; +/******/ }; +/******/ for (var name in require) { +/******/ if (Object.prototype.hasOwnProperty.call(require, name) && name !== "e") { +/******/ Object.defineProperty(fn, name, createPropertyDescriptor(name)); +/******/ } +/******/ } +/******/ fn.e = function (chunkId, fetchPriority) { +/******/ return trackBlockingPromise(require.e(chunkId, fetchPriority)); +/******/ }; +/******/ return fn; +/******/ } +/******/ +/******/ function createModuleHotObject(moduleId, me) { +/******/ var _main = currentChildModule !== moduleId; +/******/ var hot = { +/******/ // private stuff +/******/ _acceptedDependencies: {}, +/******/ _acceptedErrorHandlers: {}, +/******/ _declinedDependencies: {}, +/******/ _selfAccepted: false, +/******/ _selfDeclined: false, +/******/ _selfInvalidated: false, +/******/ _disposeHandlers: [], +/******/ _main: _main, +/******/ _requireSelf: function () { +/******/ currentParents = me.parents.slice(); +/******/ currentChildModule = _main ? undefined : moduleId; +/******/ __webpack_require__(moduleId); +/******/ }, +/******/ +/******/ // Module API +/******/ active: true, +/******/ accept: function (dep, callback, errorHandler) { +/******/ if (dep === undefined) hot._selfAccepted = true; +/******/ else if (typeof dep === "function") hot._selfAccepted = dep; +/******/ else if (typeof dep === "object" && dep !== null) { +/******/ for (var i = 0; i < dep.length; i++) { +/******/ hot._acceptedDependencies[dep[i]] = callback || function () {}; +/******/ hot._acceptedErrorHandlers[dep[i]] = errorHandler; +/******/ } +/******/ } else { +/******/ hot._acceptedDependencies[dep] = callback || function () {}; +/******/ hot._acceptedErrorHandlers[dep] = errorHandler; +/******/ } +/******/ }, +/******/ decline: function (dep) { +/******/ if (dep === undefined) hot._selfDeclined = true; +/******/ else if (typeof dep === "object" && dep !== null) +/******/ for (var i = 0; i < dep.length; i++) +/******/ hot._declinedDependencies[dep[i]] = true; +/******/ else hot._declinedDependencies[dep] = true; +/******/ }, +/******/ dispose: function (callback) { +/******/ hot._disposeHandlers.push(callback); +/******/ }, +/******/ addDisposeHandler: function (callback) { +/******/ hot._disposeHandlers.push(callback); +/******/ }, +/******/ removeDisposeHandler: function (callback) { +/******/ var idx = hot._disposeHandlers.indexOf(callback); +/******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1); +/******/ }, +/******/ invalidate: function () { +/******/ this._selfInvalidated = true; +/******/ switch (currentStatus) { +/******/ case "idle": +/******/ currentUpdateApplyHandlers = []; +/******/ Object.keys(__webpack_require__.hmrI).forEach(function (key) { +/******/ __webpack_require__.hmrI[key]( +/******/ moduleId, +/******/ currentUpdateApplyHandlers +/******/ ); +/******/ }); +/******/ setStatus("ready"); +/******/ break; +/******/ case "ready": +/******/ Object.keys(__webpack_require__.hmrI).forEach(function (key) { +/******/ __webpack_require__.hmrI[key]( +/******/ moduleId, +/******/ currentUpdateApplyHandlers +/******/ ); +/******/ }); +/******/ break; +/******/ case "prepare": +/******/ case "check": +/******/ case "dispose": +/******/ case "apply": +/******/ (queuedInvalidatedModules = queuedInvalidatedModules || []).push( +/******/ moduleId +/******/ ); +/******/ break; +/******/ default: +/******/ // ignore requests in error states +/******/ break; +/******/ } +/******/ }, +/******/ +/******/ // Management API +/******/ check: hotCheck, +/******/ apply: hotApply, +/******/ status: function (l) { +/******/ if (!l) return currentStatus; +/******/ registeredStatusHandlers.push(l); +/******/ }, +/******/ addStatusHandler: function (l) { +/******/ registeredStatusHandlers.push(l); +/******/ }, +/******/ removeStatusHandler: function (l) { +/******/ var idx = registeredStatusHandlers.indexOf(l); +/******/ if (idx >= 0) registeredStatusHandlers.splice(idx, 1); +/******/ }, +/******/ +/******/ // inherit from previous dispose call +/******/ data: currentModuleData[moduleId] +/******/ }; +/******/ currentChildModule = undefined; +/******/ return hot; +/******/ } +/******/ +/******/ function setStatus(newStatus) { +/******/ currentStatus = newStatus; +/******/ var results = []; +/******/ +/******/ for (var i = 0; i < registeredStatusHandlers.length; i++) +/******/ results[i] = registeredStatusHandlers[i].call(null, newStatus); +/******/ +/******/ return Promise.all(results).then(function () {}); +/******/ } +/******/ +/******/ function unblock() { +/******/ if (--blockingPromises === 0) { +/******/ setStatus("ready").then(function () { +/******/ if (blockingPromises === 0) { +/******/ var list = blockingPromisesWaiting; +/******/ blockingPromisesWaiting = []; +/******/ for (var i = 0; i < list.length; i++) { +/******/ list[i](); +/******/ } +/******/ } +/******/ }); +/******/ } +/******/ } +/******/ +/******/ function trackBlockingPromise(promise) { +/******/ switch (currentStatus) { +/******/ case "ready": +/******/ setStatus("prepare"); +/******/ /* fallthrough */ +/******/ case "prepare": +/******/ blockingPromises++; +/******/ promise.then(unblock, unblock); +/******/ return promise; +/******/ default: +/******/ return promise; +/******/ } +/******/ } +/******/ +/******/ function waitForBlockingPromises(fn) { +/******/ if (blockingPromises === 0) return fn(); +/******/ return new Promise(function (resolve) { +/******/ blockingPromisesWaiting.push(function () { +/******/ resolve(fn()); +/******/ }); +/******/ }); +/******/ } +/******/ +/******/ function hotCheck(applyOnUpdate) { +/******/ if (currentStatus !== "idle") { +/******/ throw new Error("check() is only allowed in idle status"); +/******/ } +/******/ return setStatus("check") +/******/ .then(__webpack_require__.hmrM) +/******/ .then(function (update) { +/******/ if (!update) { +/******/ return setStatus(applyInvalidatedModules() ? "ready" : "idle").then( +/******/ function () { +/******/ return null; +/******/ } +/******/ ); +/******/ } +/******/ +/******/ return setStatus("prepare").then(function () { +/******/ var updatedModules = []; +/******/ currentUpdateApplyHandlers = []; +/******/ +/******/ return Promise.all( +/******/ Object.keys(__webpack_require__.hmrC).reduce(function ( +/******/ promises, +/******/ key +/******/ ) { +/******/ __webpack_require__.hmrC[key]( +/******/ update.c, +/******/ update.r, +/******/ update.m, +/******/ promises, +/******/ currentUpdateApplyHandlers, +/******/ updatedModules +/******/ ); +/******/ return promises; +/******/ }, []) +/******/ ).then(function () { +/******/ return waitForBlockingPromises(function () { +/******/ if (applyOnUpdate) { +/******/ return internalApply(applyOnUpdate); +/******/ } +/******/ return setStatus("ready").then(function () { +/******/ return updatedModules; +/******/ }); +/******/ }); +/******/ }); +/******/ }); +/******/ }); +/******/ } +/******/ +/******/ function hotApply(options) { +/******/ if (currentStatus !== "ready") { +/******/ return Promise.resolve().then(function () { +/******/ throw new Error( +/******/ "apply() is only allowed in ready status (state: " + +/******/ currentStatus + +/******/ ")" +/******/ ); +/******/ }); +/******/ } +/******/ return internalApply(options); +/******/ } +/******/ +/******/ function internalApply(options) { +/******/ options = options || {}; +/******/ +/******/ applyInvalidatedModules(); +/******/ +/******/ var results = currentUpdateApplyHandlers.map(function (handler) { +/******/ return handler(options); +/******/ }); +/******/ currentUpdateApplyHandlers = undefined; +/******/ +/******/ var errors = results +/******/ .map(function (r) { +/******/ return r.error; +/******/ }) +/******/ .filter(Boolean); +/******/ +/******/ if (errors.length > 0) { +/******/ return setStatus("abort").then(function () { +/******/ throw errors[0]; +/******/ }); +/******/ } +/******/ +/******/ // Now in "dispose" phase +/******/ var disposePromise = setStatus("dispose"); +/******/ +/******/ results.forEach(function (result) { +/******/ if (result.dispose) result.dispose(); +/******/ }); +/******/ +/******/ // Now in "apply" phase +/******/ var applyPromise = setStatus("apply"); +/******/ +/******/ var error; +/******/ var reportError = function (err) { +/******/ if (!error) error = err; +/******/ }; +/******/ +/******/ var outdatedModules = []; +/******/ results.forEach(function (result) { +/******/ if (result.apply) { +/******/ var modules = result.apply(reportError); +/******/ if (modules) { +/******/ for (var i = 0; i < modules.length; i++) { +/******/ outdatedModules.push(modules[i]); +/******/ } +/******/ } +/******/ } +/******/ }); +/******/ +/******/ return Promise.all([disposePromise, applyPromise]).then(function () { +/******/ // handle errors in accept handlers and self accepted module load +/******/ if (error) { +/******/ return setStatus("fail").then(function () { +/******/ throw error; +/******/ }); +/******/ } +/******/ +/******/ if (queuedInvalidatedModules) { +/******/ return internalApply(options).then(function (list) { +/******/ outdatedModules.forEach(function (moduleId) { +/******/ if (list.indexOf(moduleId) < 0) list.push(moduleId); +/******/ }); +/******/ return list; +/******/ }); +/******/ } +/******/ +/******/ return setStatus("idle").then(function () { +/******/ return outdatedModules; +/******/ }); +/******/ }); +/******/ } +/******/ +/******/ function applyInvalidatedModules() { +/******/ if (queuedInvalidatedModules) { +/******/ if (!currentUpdateApplyHandlers) currentUpdateApplyHandlers = []; +/******/ Object.keys(__webpack_require__.hmrI).forEach(function (key) { +/******/ queuedInvalidatedModules.forEach(function (moduleId) { +/******/ __webpack_require__.hmrI[key]( +/******/ moduleId, +/******/ currentUpdateApplyHandlers +/******/ ); +/******/ }); +/******/ }); +/******/ queuedInvalidatedModules = undefined; +/******/ return true; +/******/ } +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/_next/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = __webpack_require__.hmrS_jsonp = __webpack_require__.hmrS_jsonp || { +/******/ "edge-runtime-webpack": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ var currentUpdatedModulesList; +/******/ var waitingUpdateResolves = {}; +/******/ function loadUpdateChunk(chunkId, updatedModulesList) { +/******/ currentUpdatedModulesList = updatedModulesList; +/******/ return new Promise((resolve, reject) => { +/******/ waitingUpdateResolves[chunkId] = resolve; +/******/ // start update chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.hu(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(waitingUpdateResolves[chunkId]) { +/******/ waitingUpdateResolves[chunkId] = undefined +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading hot update chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ reject(error); +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded); +/******/ }); +/******/ } +/******/ +/******/ self["webpackHotUpdate_N_E"] = (chunkId, moreModules, runtime) => { +/******/ for(var moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ currentUpdate[moduleId] = moreModules[moduleId]; +/******/ if(currentUpdatedModulesList) currentUpdatedModulesList.push(moduleId); +/******/ } +/******/ } +/******/ if(runtime) currentUpdateRuntime.push(runtime); +/******/ if(waitingUpdateResolves[chunkId]) { +/******/ waitingUpdateResolves[chunkId](); +/******/ waitingUpdateResolves[chunkId] = undefined; +/******/ } +/******/ }; +/******/ +/******/ var currentUpdateChunks; +/******/ var currentUpdate; +/******/ var currentUpdateRemovedChunks; +/******/ var currentUpdateRuntime; +/******/ function applyHandler(options) { +/******/ if (__webpack_require__.f) delete __webpack_require__.f.jsonpHmr; +/******/ currentUpdateChunks = undefined; +/******/ function getAffectedModuleEffects(updateModuleId) { +/******/ var outdatedModules = [updateModuleId]; +/******/ var outdatedDependencies = {}; +/******/ +/******/ var queue = outdatedModules.map(function (id) { +/******/ return { +/******/ chain: [id], +/******/ id: id +/******/ }; +/******/ }); +/******/ while (queue.length > 0) { +/******/ var queueItem = queue.pop(); +/******/ var moduleId = queueItem.id; +/******/ var chain = queueItem.chain; +/******/ var module = __webpack_require__.c[moduleId]; +/******/ if ( +/******/ !module || +/******/ (module.hot._selfAccepted && !module.hot._selfInvalidated) +/******/ ) +/******/ continue; +/******/ if (module.hot._selfDeclined) { +/******/ return { +/******/ type: "self-declined", +/******/ chain: chain, +/******/ moduleId: moduleId +/******/ }; +/******/ } +/******/ if (module.hot._main) { +/******/ return { +/******/ type: "unaccepted", +/******/ chain: chain, +/******/ moduleId: moduleId +/******/ }; +/******/ } +/******/ for (var i = 0; i < module.parents.length; i++) { +/******/ var parentId = module.parents[i]; +/******/ var parent = __webpack_require__.c[parentId]; +/******/ if (!parent) continue; +/******/ if (parent.hot._declinedDependencies[moduleId]) { +/******/ return { +/******/ type: "declined", +/******/ chain: chain.concat([parentId]), +/******/ moduleId: moduleId, +/******/ parentId: parentId +/******/ }; +/******/ } +/******/ if (outdatedModules.indexOf(parentId) !== -1) continue; +/******/ if (parent.hot._acceptedDependencies[moduleId]) { +/******/ if (!outdatedDependencies[parentId]) +/******/ outdatedDependencies[parentId] = []; +/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]); +/******/ continue; +/******/ } +/******/ delete outdatedDependencies[parentId]; +/******/ outdatedModules.push(parentId); +/******/ queue.push({ +/******/ chain: chain.concat([parentId]), +/******/ id: parentId +/******/ }); +/******/ } +/******/ } +/******/ +/******/ return { +/******/ type: "accepted", +/******/ moduleId: updateModuleId, +/******/ outdatedModules: outdatedModules, +/******/ outdatedDependencies: outdatedDependencies +/******/ }; +/******/ } +/******/ +/******/ function addAllToSet(a, b) { +/******/ for (var i = 0; i < b.length; i++) { +/******/ var item = b[i]; +/******/ if (a.indexOf(item) === -1) a.push(item); +/******/ } +/******/ } +/******/ +/******/ // at begin all updates modules are outdated +/******/ // the "outdated" status can propagate to parents if they don't accept the children +/******/ var outdatedDependencies = {}; +/******/ var outdatedModules = []; +/******/ var appliedUpdate = {}; +/******/ +/******/ var warnUnexpectedRequire = function warnUnexpectedRequire(module) { +/******/ console.warn( +/******/ "[HMR] unexpected require(" + module.id + ") to disposed module" +/******/ ); +/******/ }; +/******/ +/******/ for (var moduleId in currentUpdate) { +/******/ if (__webpack_require__.o(currentUpdate, moduleId)) { +/******/ var newModuleFactory = currentUpdate[moduleId]; +/******/ /** @type {TODO} */ +/******/ var result = newModuleFactory +/******/ ? getAffectedModuleEffects(moduleId) +/******/ : { +/******/ type: "disposed", +/******/ moduleId: moduleId +/******/ }; +/******/ /** @type {Error|false} */ +/******/ var abortError = false; +/******/ var doApply = false; +/******/ var doDispose = false; +/******/ var chainInfo = ""; +/******/ if (result.chain) { +/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> "); +/******/ } +/******/ switch (result.type) { +/******/ case "self-declined": +/******/ if (options.onDeclined) options.onDeclined(result); +/******/ if (!options.ignoreDeclined) +/******/ abortError = new Error( +/******/ "Aborted because of self decline: " + +/******/ result.moduleId + +/******/ chainInfo +/******/ ); +/******/ break; +/******/ case "declined": +/******/ if (options.onDeclined) options.onDeclined(result); +/******/ if (!options.ignoreDeclined) +/******/ abortError = new Error( +/******/ "Aborted because of declined dependency: " + +/******/ result.moduleId + +/******/ " in " + +/******/ result.parentId + +/******/ chainInfo +/******/ ); +/******/ break; +/******/ case "unaccepted": +/******/ if (options.onUnaccepted) options.onUnaccepted(result); +/******/ if (!options.ignoreUnaccepted) +/******/ abortError = new Error( +/******/ "Aborted because " + moduleId + " is not accepted" + chainInfo +/******/ ); +/******/ break; +/******/ case "accepted": +/******/ if (options.onAccepted) options.onAccepted(result); +/******/ doApply = true; +/******/ break; +/******/ case "disposed": +/******/ if (options.onDisposed) options.onDisposed(result); +/******/ doDispose = true; +/******/ break; +/******/ default: +/******/ throw new Error("Unexception type " + result.type); +/******/ } +/******/ if (abortError) { +/******/ return { +/******/ error: abortError +/******/ }; +/******/ } +/******/ if (doApply) { +/******/ appliedUpdate[moduleId] = newModuleFactory; +/******/ addAllToSet(outdatedModules, result.outdatedModules); +/******/ for (moduleId in result.outdatedDependencies) { +/******/ if (__webpack_require__.o(result.outdatedDependencies, moduleId)) { +/******/ if (!outdatedDependencies[moduleId]) +/******/ outdatedDependencies[moduleId] = []; +/******/ addAllToSet( +/******/ outdatedDependencies[moduleId], +/******/ result.outdatedDependencies[moduleId] +/******/ ); +/******/ } +/******/ } +/******/ } +/******/ if (doDispose) { +/******/ addAllToSet(outdatedModules, [result.moduleId]); +/******/ appliedUpdate[moduleId] = warnUnexpectedRequire; +/******/ } +/******/ } +/******/ } +/******/ currentUpdate = undefined; +/******/ +/******/ // Store self accepted outdated modules to require them later by the module system +/******/ var outdatedSelfAcceptedModules = []; +/******/ for (var j = 0; j < outdatedModules.length; j++) { +/******/ var outdatedModuleId = outdatedModules[j]; +/******/ var module = __webpack_require__.c[outdatedModuleId]; +/******/ if ( +/******/ module && +/******/ (module.hot._selfAccepted || module.hot._main) && +/******/ // removed self-accepted modules should not be required +/******/ appliedUpdate[outdatedModuleId] !== warnUnexpectedRequire && +/******/ // when called invalidate self-accepting is not possible +/******/ !module.hot._selfInvalidated +/******/ ) { +/******/ outdatedSelfAcceptedModules.push({ +/******/ module: outdatedModuleId, +/******/ require: module.hot._requireSelf, +/******/ errorHandler: module.hot._selfAccepted +/******/ }); +/******/ } +/******/ } +/******/ +/******/ var moduleOutdatedDependencies; +/******/ +/******/ return { +/******/ dispose: function () { +/******/ currentUpdateRemovedChunks.forEach(function (chunkId) { +/******/ delete installedChunks[chunkId]; +/******/ }); +/******/ currentUpdateRemovedChunks = undefined; +/******/ +/******/ var idx; +/******/ var queue = outdatedModules.slice(); +/******/ while (queue.length > 0) { +/******/ var moduleId = queue.pop(); +/******/ var module = __webpack_require__.c[moduleId]; +/******/ if (!module) continue; +/******/ +/******/ var data = {}; +/******/ +/******/ // Call dispose handlers +/******/ var disposeHandlers = module.hot._disposeHandlers; +/******/ for (j = 0; j < disposeHandlers.length; j++) { +/******/ disposeHandlers[j].call(null, data); +/******/ } +/******/ __webpack_require__.hmrD[moduleId] = data; +/******/ +/******/ // disable module (this disables requires from this module) +/******/ module.hot.active = false; +/******/ +/******/ // remove module from cache +/******/ delete __webpack_require__.c[moduleId]; +/******/ +/******/ // when disposing there is no need to call dispose handler +/******/ delete outdatedDependencies[moduleId]; +/******/ +/******/ // remove "parents" references from all children +/******/ for (j = 0; j < module.children.length; j++) { +/******/ var child = __webpack_require__.c[module.children[j]]; +/******/ if (!child) continue; +/******/ idx = child.parents.indexOf(moduleId); +/******/ if (idx >= 0) { +/******/ child.parents.splice(idx, 1); +/******/ } +/******/ } +/******/ } +/******/ +/******/ // remove outdated dependency from module children +/******/ var dependency; +/******/ for (var outdatedModuleId in outdatedDependencies) { +/******/ if (__webpack_require__.o(outdatedDependencies, outdatedModuleId)) { +/******/ module = __webpack_require__.c[outdatedModuleId]; +/******/ if (module) { +/******/ moduleOutdatedDependencies = +/******/ outdatedDependencies[outdatedModuleId]; +/******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) { +/******/ dependency = moduleOutdatedDependencies[j]; +/******/ idx = module.children.indexOf(dependency); +/******/ if (idx >= 0) module.children.splice(idx, 1); +/******/ } +/******/ } +/******/ } +/******/ } +/******/ }, +/******/ apply: function (reportError) { +/******/ // insert new code +/******/ for (var updateModuleId in appliedUpdate) { +/******/ if (__webpack_require__.o(appliedUpdate, updateModuleId)) { +/******/ __webpack_require__.m[updateModuleId] = appliedUpdate[updateModuleId]; +/******/ } +/******/ } +/******/ +/******/ // run new runtime modules +/******/ for (var i = 0; i < currentUpdateRuntime.length; i++) { +/******/ currentUpdateRuntime[i](__webpack_require__); +/******/ } +/******/ +/******/ // call accept handlers +/******/ for (var outdatedModuleId in outdatedDependencies) { +/******/ if (__webpack_require__.o(outdatedDependencies, outdatedModuleId)) { +/******/ var module = __webpack_require__.c[outdatedModuleId]; +/******/ if (module) { +/******/ moduleOutdatedDependencies = +/******/ outdatedDependencies[outdatedModuleId]; +/******/ var callbacks = []; +/******/ var errorHandlers = []; +/******/ var dependenciesForCallbacks = []; +/******/ for (var j = 0; j < moduleOutdatedDependencies.length; j++) { +/******/ var dependency = moduleOutdatedDependencies[j]; +/******/ var acceptCallback = +/******/ module.hot._acceptedDependencies[dependency]; +/******/ var errorHandler = +/******/ module.hot._acceptedErrorHandlers[dependency]; +/******/ if (acceptCallback) { +/******/ if (callbacks.indexOf(acceptCallback) !== -1) continue; +/******/ callbacks.push(acceptCallback); +/******/ errorHandlers.push(errorHandler); +/******/ dependenciesForCallbacks.push(dependency); +/******/ } +/******/ } +/******/ for (var k = 0; k < callbacks.length; k++) { +/******/ try { +/******/ callbacks[k].call(null, moduleOutdatedDependencies); +/******/ } catch (err) { +/******/ if (typeof errorHandlers[k] === "function") { +/******/ try { +/******/ errorHandlers[k](err, { +/******/ moduleId: outdatedModuleId, +/******/ dependencyId: dependenciesForCallbacks[k] +/******/ }); +/******/ } catch (err2) { +/******/ if (options.onErrored) { +/******/ options.onErrored({ +/******/ type: "accept-error-handler-errored", +/******/ moduleId: outdatedModuleId, +/******/ dependencyId: dependenciesForCallbacks[k], +/******/ error: err2, +/******/ originalError: err +/******/ }); +/******/ } +/******/ if (!options.ignoreErrored) { +/******/ reportError(err2); +/******/ reportError(err); +/******/ } +/******/ } +/******/ } else { +/******/ if (options.onErrored) { +/******/ options.onErrored({ +/******/ type: "accept-errored", +/******/ moduleId: outdatedModuleId, +/******/ dependencyId: dependenciesForCallbacks[k], +/******/ error: err +/******/ }); +/******/ } +/******/ if (!options.ignoreErrored) { +/******/ reportError(err); +/******/ } +/******/ } +/******/ } +/******/ } +/******/ } +/******/ } +/******/ } +/******/ +/******/ // Load self accepted modules +/******/ for (var o = 0; o < outdatedSelfAcceptedModules.length; o++) { +/******/ var item = outdatedSelfAcceptedModules[o]; +/******/ var moduleId = item.module; +/******/ try { +/******/ item.require(moduleId); +/******/ } catch (err) { +/******/ if (typeof item.errorHandler === "function") { +/******/ try { +/******/ item.errorHandler(err, { +/******/ moduleId: moduleId, +/******/ module: __webpack_require__.c[moduleId] +/******/ }); +/******/ } catch (err1) { +/******/ if (options.onErrored) { +/******/ options.onErrored({ +/******/ type: "self-accept-error-handler-errored", +/******/ moduleId: moduleId, +/******/ error: err1, +/******/ originalError: err +/******/ }); +/******/ } +/******/ if (!options.ignoreErrored) { +/******/ reportError(err1); +/******/ reportError(err); +/******/ } +/******/ } +/******/ } else { +/******/ if (options.onErrored) { +/******/ options.onErrored({ +/******/ type: "self-accept-errored", +/******/ moduleId: moduleId, +/******/ error: err +/******/ }); +/******/ } +/******/ if (!options.ignoreErrored) { +/******/ reportError(err); +/******/ } +/******/ } +/******/ } +/******/ } +/******/ +/******/ return outdatedModules; +/******/ } +/******/ }; +/******/ } +/******/ __webpack_require__.hmrI.jsonp = function (moduleId, applyHandlers) { +/******/ if (!currentUpdate) { +/******/ currentUpdate = {}; +/******/ currentUpdateRuntime = []; +/******/ currentUpdateRemovedChunks = []; +/******/ applyHandlers.push(applyHandler); +/******/ } +/******/ if (!__webpack_require__.o(currentUpdate, moduleId)) { +/******/ currentUpdate[moduleId] = __webpack_require__.m[moduleId]; +/******/ } +/******/ }; +/******/ __webpack_require__.hmrC.jsonp = function ( +/******/ chunkIds, +/******/ removedChunks, +/******/ removedModules, +/******/ promises, +/******/ applyHandlers, +/******/ updatedModulesList +/******/ ) { +/******/ applyHandlers.push(applyHandler); +/******/ currentUpdateChunks = {}; +/******/ currentUpdateRemovedChunks = removedChunks; +/******/ currentUpdate = removedModules.reduce(function (obj, key) { +/******/ obj[key] = false; +/******/ return obj; +/******/ }, {}); +/******/ currentUpdateRuntime = []; +/******/ chunkIds.forEach(function (chunkId) { +/******/ if ( +/******/ __webpack_require__.o(installedChunks, chunkId) && +/******/ installedChunks[chunkId] !== undefined +/******/ ) { +/******/ promises.push(loadUpdateChunk(chunkId, updatedModulesList)); +/******/ currentUpdateChunks[chunkId] = true; +/******/ } else { +/******/ currentUpdateChunks[chunkId] = false; +/******/ } +/******/ }); +/******/ if (__webpack_require__.f) { +/******/ __webpack_require__.f.jsonpHmr = function (chunkId, promises) { +/******/ if ( +/******/ currentUpdateChunks && +/******/ __webpack_require__.o(currentUpdateChunks, chunkId) && +/******/ !currentUpdateChunks[chunkId] +/******/ ) { +/******/ promises.push(loadUpdateChunk(chunkId)); +/******/ currentUpdateChunks[chunkId] = true; +/******/ } +/******/ }; +/******/ } +/******/ }; +/******/ +/******/ __webpack_require__.hmrM = () => { +/******/ if (typeof fetch === "undefined") throw new Error("No browser support: need fetch API"); +/******/ return fetch(__webpack_require__.p + __webpack_require__.hmrF()).then((response) => { +/******/ if(response.status === 404) return; // no update available +/******/ if(!response.ok) throw new Error("Failed to fetch update manifest " + response.statusText); +/******/ return response.json(); +/******/ }); +/******/ }; +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // module cache are used so entry inlining is disabled +/******/ +/******/ })() +; \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/instrumentation.js b/superlog/apps/sample/.next/server/instrumentation.js new file mode 100644 index 0000000000000000000000000000000000000000..30f1080d43e5db5d508688b824e0bb8c28695154 --- /dev/null +++ b/superlog/apps/sample/.next/server/instrumentation.js @@ -0,0 +1,66 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +(() => { +var exports = {}; +exports.id = "instrumentation"; +exports.ids = ["instrumentation"]; +exports.modules = { + +/***/ "(instrument)/./instrumentation.ts": +/*!****************************!*\ + !*** ./instrumentation.ts ***! + \****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ register: () => (/* binding */ register)\n/* harmony export */ });\n/* harmony import */ var _vercel_otel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @vercel/otel */ \"(instrument)/../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/node/index.js\");\n\nfunction register() {\n (0,_vercel_otel__WEBPACK_IMPORTED_MODULE_0__.registerOTel)({\n serviceName: \"superlog-sample-nextjs\"\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4vaW5zdHJ1bWVudGF0aW9uLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQTRDO0FBRXJDLFNBQVNDO0lBQ2RELDBEQUFZQSxDQUFDO1FBQUVFLGFBQWE7SUFBeUI7QUFDdkQiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9hcHBzL3NhbXBsZS9pbnN0cnVtZW50YXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVnaXN0ZXJPVGVsIH0gZnJvbSBcIkB2ZXJjZWwvb3RlbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIoKSB7XG4gIHJlZ2lzdGVyT1RlbCh7IHNlcnZpY2VOYW1lOiBcInN1cGVybG9nLXNhbXBsZS1uZXh0anNcIiB9KTtcbn1cbiJdLCJuYW1lcyI6WyJyZWdpc3Rlck9UZWwiLCJyZWdpc3RlciIsInNlcnZpY2VOYW1lIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/./instrumentation.ts\n"); + +/***/ }), + +/***/ "module": +/*!*************************!*\ + !*** external "module" ***! + \*************************/ +/***/ ((module) => { + +module.exports = require("module"); + +/***/ }), + +/***/ "path": +/*!***********************!*\ + !*** external "path" ***! + \***********************/ +/***/ ((module) => { + +module.exports = require("path"); + +/***/ }), + +/***/ "url": +/*!**********************!*\ + !*** external "url" ***! + \**********************/ +/***/ ((module) => { + +module.exports = require("url"); + +/***/ }) + +}; +; + +// load runtime +var __webpack_require__ = require("./webpack-runtime.js"); +__webpack_require__.C(exports); +var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/@opentelemetry+api@1.9.1","vendor-chunks/@opentelemetry+api-logs@0.215.0","vendor-chunks/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za"], () => (__webpack_exec__("(instrument)/./instrumentation.ts"))); +module.exports = __webpack_exports__; + +})(); \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/interception-route-rewrite-manifest.js b/superlog/apps/sample/.next/server/interception-route-rewrite-manifest.js new file mode 100644 index 0000000000000000000000000000000000000000..82d3ab17daf7f6666b3f77ca3f75cd45a04e181a --- /dev/null +++ b/superlog/apps/sample/.next/server/interception-route-rewrite-manifest.js @@ -0,0 +1 @@ +self.__INTERCEPTION_ROUTE_REWRITE_MANIFEST="[]" \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/middleware-build-manifest.js b/superlog/apps/sample/.next/server/middleware-build-manifest.js new file mode 100644 index 0000000000000000000000000000000000000000..161dbe3797af711adede8220c56c0dfc0da415a1 --- /dev/null +++ b/superlog/apps/sample/.next/server/middleware-build-manifest.js @@ -0,0 +1,19 @@ +globalThis.__BUILD_MANIFEST = { + "polyfillFiles": [ + "static/chunks/polyfills.js" + ], + "devFiles": [], + "ampDevFiles": [], + "lowPriorityFiles": [], + "rootMainFiles": [], + "rootMainFilesTree": {}, + "pages": { + "/_app": [] + }, + "ampFirstPages": [] +}; +globalThis.__BUILD_MANIFEST.lowPriorityFiles = [ +"/static/" + process.env.__NEXT_BUILD_ID + "/_buildManifest.js", +,"/static/" + process.env.__NEXT_BUILD_ID + "/_ssgManifest.js", + +]; \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/middleware-manifest.json b/superlog/apps/sample/.next/server/middleware-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..33872a3e667095ca6e3f28dd482a153f65066865 --- /dev/null +++ b/superlog/apps/sample/.next/server/middleware-manifest.json @@ -0,0 +1,6 @@ +{ + "version": 3, + "middleware": {}, + "functions": {}, + "sortedMiddleware": [] +} \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/middleware-react-loadable-manifest.js b/superlog/apps/sample/.next/server/middleware-react-loadable-manifest.js new file mode 100644 index 0000000000000000000000000000000000000000..ca34f09f9ec50f3ab9a86027b435939c17ea559d --- /dev/null +++ b/superlog/apps/sample/.next/server/middleware-react-loadable-manifest.js @@ -0,0 +1 @@ +self.__REACT_LOADABLE_MANIFEST="{}" \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/next-font-manifest.js b/superlog/apps/sample/.next/server/next-font-manifest.js new file mode 100644 index 0000000000000000000000000000000000000000..5cc97ebd00ab11950b6f8777c2fea2ec10afc494 --- /dev/null +++ b/superlog/apps/sample/.next/server/next-font-manifest.js @@ -0,0 +1 @@ +self.__NEXT_FONT_MANIFEST="{\"pages\":{},\"app\":{},\"appUsingSizeAdjust\":false,\"pagesUsingSizeAdjust\":false}" \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/next-font-manifest.json b/superlog/apps/sample/.next/server/next-font-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..25f78e72b334089404d8a0d1203a7443cd0f3f69 --- /dev/null +++ b/superlog/apps/sample/.next/server/next-font-manifest.json @@ -0,0 +1 @@ +{"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false} \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/pages-manifest.json b/superlog/apps/sample/.next/server/pages-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b --- /dev/null +++ b/superlog/apps/sample/.next/server/pages-manifest.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/server-reference-manifest.js b/superlog/apps/sample/.next/server/server-reference-manifest.js new file mode 100644 index 0000000000000000000000000000000000000000..cc0af96fe916fa086024e71098df83ba0bf0ac50 --- /dev/null +++ b/superlog/apps/sample/.next/server/server-reference-manifest.js @@ -0,0 +1 @@ +self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY\"\n}" \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/server-reference-manifest.json b/superlog/apps/sample/.next/server/server-reference-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..af1ed82aacdffd5f42618afb5011ff7927bcf2ae --- /dev/null +++ b/superlog/apps/sample/.next/server/server-reference-manifest.json @@ -0,0 +1,5 @@ +{ + "node": {}, + "edge": {}, + "encryptionKey": "x4jAwh4AtUSRTc+XtxlVM06dqLCYxr1KHipeaVfDQFo=" +} \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/static/webpack/633457081244afec._.hot-update.json b/superlog/apps/sample/.next/server/static/webpack/633457081244afec._.hot-update.json new file mode 100644 index 0000000000000000000000000000000000000000..5a523f2499501ce1d06bcafc61e6ca3402fb6bd2 --- /dev/null +++ b/superlog/apps/sample/.next/server/static/webpack/633457081244afec._.hot-update.json @@ -0,0 +1 @@ +{"c":[],"r":[],"m":[]} \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/vendor-chunks/@opentelemetry+api-logs@0.215.0.js b/superlog/apps/sample/.next/server/vendor-chunks/@opentelemetry+api-logs@0.215.0.js new file mode 100644 index 0000000000000000000000000000000000000000..b4318e21fdc45bff7fae6a14943a988e99575bab --- /dev/null +++ b/superlog/apps/sample/.next/server/vendor-chunks/@opentelemetry+api-logs@0.215.0.js @@ -0,0 +1,95 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +exports.id = "vendor-chunks/@opentelemetry+api-logs@0.215.0"; +exports.ids = ["vendor-chunks/@opentelemetry+api-logs@0.215.0"]; +exports.modules = { + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js": +/*!*****************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js ***! + \*****************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_LOGGER: () => (/* binding */ NOOP_LOGGER),\n/* harmony export */ NoopLogger: () => (/* binding */ NoopLogger)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nclass NoopLogger {\n emit(_logRecord) { }\n enabled() {\n return false;\n }\n}\nconst NOOP_LOGGER = new NoopLogger();\n//# sourceMappingURL=NoopLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vTm9vcExvZ2dlci5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vTm9vcExvZ2dlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wTG9nZ2VyIHtcbiAgICBlbWl0KF9sb2dSZWNvcmQpIHsgfVxuICAgIGVuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgTk9PUF9MT0dHRVIgPSBuZXcgTm9vcExvZ2dlcigpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcExvZ2dlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js": +/*!*************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js ***! + \*************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_LOGGER_PROVIDER: () => (/* binding */ NOOP_LOGGER_PROVIDER),\n/* harmony export */ NoopLoggerProvider: () => (/* binding */ NoopLoggerProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopLogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nclass NoopLoggerProvider {\n getLogger(_name, _version, _options) {\n return new _NoopLogger__WEBPACK_IMPORTED_MODULE_0__.NoopLogger();\n }\n}\nconst NOOP_LOGGER_PROVIDER = new NoopLoggerProvider();\n//# sourceMappingURL=NoopLoggerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vTm9vcExvZ2dlclByb3ZpZGVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQzBDO0FBQ25DO0FBQ1A7QUFDQSxtQkFBbUIsbURBQVU7QUFDN0I7QUFDQTtBQUNPO0FBQ1AiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpLWxvZ3NAMC4yMTUuMC9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpLWxvZ3MvYnVpbGQvZXNtL05vb3BMb2dnZXJQcm92aWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5vb3BMb2dnZXIgfSBmcm9tICcuL05vb3BMb2dnZXInO1xuZXhwb3J0IGNsYXNzIE5vb3BMb2dnZXJQcm92aWRlciB7XG4gICAgZ2V0TG9nZ2VyKF9uYW1lLCBfdmVyc2lvbiwgX29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wTG9nZ2VyKCk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IE5PT1BfTE9HR0VSX1BST1ZJREVSID0gbmV3IE5vb3BMb2dnZXJQcm92aWRlcigpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcExvZ2dlclByb3ZpZGVyLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyLogger: () => (/* binding */ ProxyLogger)\n/* harmony export */ });\n/* harmony import */ var _NoopLogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nclass ProxyLogger {\n constructor(provider, name, version, options) {\n this._provider = provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n /**\n * Emit a log record. This method should only be used by log appenders.\n *\n * @param logRecord\n */\n emit(logRecord) {\n this._getLogger().emit(logRecord);\n }\n enabled(options) {\n return this._getLogger().enabled(options);\n }\n /**\n * Try to get a logger from the proxy logger provider.\n * If the proxy logger provider has no delegate, return a noop logger.\n */\n _getLogger() {\n if (this._delegate) {\n return this._delegate;\n }\n const logger = this._provider._getDelegateLogger(this.name, this.version, this.options);\n if (!logger) {\n return _NoopLogger__WEBPACK_IMPORTED_MODULE_0__.NOOP_LOGGER;\n }\n this._delegate = logger;\n return this._delegate;\n }\n}\n//# sourceMappingURL=ProxyLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vUHJveHlMb2dnZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUMyQztBQUNwQztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvREFBVztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpLWxvZ3NAMC4yMTUuMC9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpLWxvZ3MvYnVpbGQvZXNtL1Byb3h5TG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgTk9PUF9MT0dHRVIgfSBmcm9tICcuL05vb3BMb2dnZXInO1xuZXhwb3J0IGNsYXNzIFByb3h5TG9nZ2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlciwgbmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGEgbG9nIHJlY29yZC4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBsb2cgYXBwZW5kZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvZ1JlY29yZFxuICAgICAqL1xuICAgIGVtaXQobG9nUmVjb3JkKSB7XG4gICAgICAgIHRoaXMuX2dldExvZ2dlcigpLmVtaXQobG9nUmVjb3JkKTtcbiAgICB9XG4gICAgZW5hYmxlZChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRMb2dnZXIoKS5lbmFibGVkKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gZ2V0IGEgbG9nZ2VyIGZyb20gdGhlIHByb3h5IGxvZ2dlciBwcm92aWRlci5cbiAgICAgKiBJZiB0aGUgcHJveHkgbG9nZ2VyIHByb3ZpZGVyIGhhcyBubyBkZWxlZ2F0ZSwgcmV0dXJuIGEgbm9vcCBsb2dnZXIuXG4gICAgICovXG4gICAgX2dldExvZ2dlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbG9nZ2VyID0gdGhpcy5fcHJvdmlkZXIuX2dldERlbGVnYXRlTG9nZ2VyKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAoIWxvZ2dlcikge1xuICAgICAgICAgICAgcmV0dXJuIE5PT1BfTE9HR0VSO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbG9nZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlMb2dnZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js": +/*!**************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js ***! + \**************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyLoggerProvider: () => (/* binding */ ProxyLoggerProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NoopLoggerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js\");\n/* harmony import */ var _ProxyLogger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ProxyLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLogger.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\nclass ProxyLoggerProvider {\n getLogger(name, version, options) {\n var _a;\n return ((_a = this._getDelegateLogger(name, version, options)) !== null && _a !== void 0 ? _a : new _ProxyLogger__WEBPACK_IMPORTED_MODULE_0__.ProxyLogger(this, name, version, options));\n }\n /**\n * Get the delegate logger provider.\n * Used by tests only.\n * @internal\n */\n _getDelegate() {\n var _a;\n return (_a = this._delegate) !== null && _a !== void 0 ? _a : _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_1__.NOOP_LOGGER_PROVIDER;\n }\n /**\n * Set the delegate logger provider\n * @internal\n */\n _setDelegate(delegate) {\n this._delegate = delegate;\n }\n /**\n * @internal\n */\n _getDelegateLogger(name, version, options) {\n var _a;\n return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getLogger(name, version, options);\n }\n}\n//# sourceMappingURL=ProxyLoggerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vUHJveHlMb2dnZXJQcm92aWRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUM0RDtBQUNoQjtBQUNyQztBQUNQO0FBQ0E7QUFDQSw0R0FBNEcscURBQVc7QUFDdkg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxxRUFBb0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vUHJveHlMb2dnZXJQcm92aWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5PT1BfTE9HR0VSX1BST1ZJREVSIH0gZnJvbSAnLi9Ob29wTG9nZ2VyUHJvdmlkZXInO1xuaW1wb3J0IHsgUHJveHlMb2dnZXIgfSBmcm9tICcuL1Byb3h5TG9nZ2VyJztcbmV4cG9ydCBjbGFzcyBQcm94eUxvZ2dlclByb3ZpZGVyIHtcbiAgICBnZXRMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5fZ2V0RGVsZWdhdGVMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBQcm94eUxvZ2dlcih0aGlzLCBuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVsZWdhdGUgbG9nZ2VyIHByb3ZpZGVyLlxuICAgICAqIFVzZWQgYnkgdGVzdHMgb25seS5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZ2V0RGVsZWdhdGUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMuX2RlbGVnYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBOT09QX0xPR0dFUl9QUk9WSURFUjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWxlZ2F0ZSBsb2dnZXIgcHJvdmlkZXJcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfc2V0RGVsZWdhdGUoZGVsZWdhdGUpIHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2dldERlbGVnYXRlTG9nZ2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlMb2dnZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ LogsAPI: () => (/* binding */ LogsAPI)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js\");\n/* harmony import */ var _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../NoopLoggerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLoggerProvider.js\");\n/* harmony import */ var _ProxyLoggerProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ProxyLoggerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/ProxyLoggerProvider.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nclass LogsAPI {\n constructor() {\n this._proxyLoggerProvider = new _ProxyLoggerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyLoggerProvider();\n }\n static getInstance() {\n if (!this._instance) {\n this._instance = new LogsAPI();\n }\n return this._instance;\n }\n setGlobalLoggerProvider(provider) {\n if (_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY]) {\n return this.getLoggerProvider();\n }\n _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY] = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.makeGetter)(_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.API_BACKWARDS_COMPATIBILITY_VERSION, provider, _NoopLoggerProvider__WEBPACK_IMPORTED_MODULE_2__.NOOP_LOGGER_PROVIDER);\n this._proxyLoggerProvider._setDelegate(provider);\n return provider;\n }\n /**\n * Returns the global logger provider.\n *\n * @returns LoggerProvider\n */\n getLoggerProvider() {\n var _a, _b;\n return ((_b = (_a = _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY]) === null || _a === void 0 ? void 0 : _a.call(_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global, _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.API_BACKWARDS_COMPATIBILITY_VERSION)) !== null && _b !== void 0 ? _b : this._proxyLoggerProvider);\n }\n /**\n * Returns a logger from the global logger provider.\n *\n * @returns Logger\n */\n getLogger(name, version, options) {\n return this.getLoggerProvider().getLogger(name, version, options);\n }\n /** Remove the global logger provider */\n disable() {\n delete _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__._global[_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.GLOBAL_LOGS_API_KEY];\n this._proxyLoggerProvider = new _ProxyLoggerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyLoggerProvider();\n }\n}\n//# sourceMappingURL=logs.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vYXBpL2xvZ3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQzBIO0FBQzdEO0FBQ0E7QUFDdEQ7QUFDUDtBQUNBLHdDQUF3QyxxRUFBbUI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMkRBQU8sQ0FBQyx1RUFBbUI7QUFDdkM7QUFDQTtBQUNBLFFBQVEsMkRBQU8sQ0FBQyx1RUFBbUIsSUFBSSxrRUFBVSxDQUFDLHVGQUFtQyxZQUFZLHFFQUFvQjtBQUNySDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiwyREFBTyxDQUFDLHVFQUFtQixnREFBZ0QsMkRBQU8sRUFBRSx1RkFBbUM7QUFDbko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMkRBQU8sQ0FBQyx1RUFBbUI7QUFDMUMsd0NBQXdDLHFFQUFtQjtBQUMzRDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpLWxvZ3NAMC4yMTUuMC9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpLWxvZ3MvYnVpbGQvZXNtL2FwaS9sb2dzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQVBJX0JBQ0tXQVJEU19DT01QQVRJQklMSVRZX1ZFUlNJT04sIEdMT0JBTF9MT0dTX0FQSV9LRVksIF9nbG9iYWwsIG1ha2VHZXR0ZXIsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbmltcG9ydCB7IE5PT1BfTE9HR0VSX1BST1ZJREVSIH0gZnJvbSAnLi4vTm9vcExvZ2dlclByb3ZpZGVyJztcbmltcG9ydCB7IFByb3h5TG9nZ2VyUHJvdmlkZXIgfSBmcm9tICcuLi9Qcm94eUxvZ2dlclByb3ZpZGVyJztcbmV4cG9ydCBjbGFzcyBMb2dzQVBJIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcHJveHlMb2dnZXJQcm92aWRlciA9IG5ldyBQcm94eUxvZ2dlclByb3ZpZGVyKCk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgTG9nc0FQSSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG4gICAgc2V0R2xvYmFsTG9nZ2VyUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgaWYgKF9nbG9iYWxbR0xPQkFMX0xPR1NfQVBJX0tFWV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExvZ2dlclByb3ZpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgX2dsb2JhbFtHTE9CQUxfTE9HU19BUElfS0VZXSA9IG1ha2VHZXR0ZXIoQVBJX0JBQ0tXQVJEU19DT01QQVRJQklMSVRZX1ZFUlNJT04sIHByb3ZpZGVyLCBOT09QX0xPR0dFUl9QUk9WSURFUik7XG4gICAgICAgIHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIuX3NldERlbGVnYXRlKHByb3ZpZGVyKTtcbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgbG9nZ2VyIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgTG9nZ2VyUHJvdmlkZXJcbiAgICAgKi9cbiAgICBnZXRMb2dnZXJQcm92aWRlcigpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuICgoX2IgPSAoX2EgPSBfZ2xvYmFsW0dMT0JBTF9MT0dTX0FQSV9LRVldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChfZ2xvYmFsLCBBUElfQkFDS1dBUkRTX0NPTVBBVElCSUxJVFlfVkVSU0lPTikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRoaXMuX3Byb3h5TG9nZ2VyUHJvdmlkZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbG9nZ2VyIGZyb20gdGhlIGdsb2JhbCBsb2dnZXIgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBMb2dnZXJcbiAgICAgKi9cbiAgICBnZXRMb2dnZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2dnZXJQcm92aWRlcigpLmdldExvZ2dlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqIFJlbW92ZSB0aGUgZ2xvYmFsIGxvZ2dlciBwcm92aWRlciAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGRlbGV0ZSBfZ2xvYmFsW0dMT0JBTF9MT0dTX0FQSV9LRVldO1xuICAgICAgICB0aGlzLl9wcm94eUxvZ2dlclByb3ZpZGVyID0gbmV3IFByb3h5TG9nZ2VyUHJvdmlkZXIoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_LOGGER: () => (/* reexport safe */ _NoopLogger__WEBPACK_IMPORTED_MODULE_1__.NOOP_LOGGER),\n/* harmony export */ NoopLogger: () => (/* reexport safe */ _NoopLogger__WEBPACK_IMPORTED_MODULE_1__.NoopLogger),\n/* harmony export */ SeverityNumber: () => (/* reexport safe */ _types_LogRecord__WEBPACK_IMPORTED_MODULE_0__.SeverityNumber),\n/* harmony export */ logs: () => (/* binding */ logs)\n/* harmony export */ });\n/* harmony import */ var _types_LogRecord__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./types/LogRecord */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js\");\n/* harmony import */ var _NoopLogger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NoopLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/NoopLogger.js\");\n/* harmony import */ var _api_logs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./api/logs */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/api/logs.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst logs = _api_logs__WEBPACK_IMPORTED_MODULE_2__.LogsAPI.getInstance();\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ21EO0FBQ0k7QUFDbEI7QUFDOUIsYUFBYSw4Q0FBTztBQUMzQiIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgeyBTZXZlcml0eU51bWJlciB9IGZyb20gJy4vdHlwZXMvTG9nUmVjb3JkJztcbmV4cG9ydCB7IE5PT1BfTE9HR0VSLCBOb29wTG9nZ2VyIH0gZnJvbSAnLi9Ob29wTG9nZ2VyJztcbmltcG9ydCB7IExvZ3NBUEkgfSBmcm9tICcuL2FwaS9sb2dzJztcbmV4cG9ydCBjb25zdCBsb2dzID0gTG9nc0FQSS5nZXRJbnN0YW5jZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js": +/*!****************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js ***! + \****************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ API_BACKWARDS_COMPATIBILITY_VERSION: () => (/* binding */ API_BACKWARDS_COMPATIBILITY_VERSION),\n/* harmony export */ GLOBAL_LOGS_API_KEY: () => (/* binding */ GLOBAL_LOGS_API_KEY),\n/* harmony export */ _global: () => (/* binding */ _global),\n/* harmony export */ makeGetter: () => (/* binding */ makeGetter)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nconst GLOBAL_LOGS_API_KEY = Symbol.for('io.opentelemetry.js.api.logs');\nconst _global = globalThis;\n/**\n * Make a function which accepts a version integer and returns the instance of an API if the version\n * is compatible, or a fallback version (usually NOOP) if it is not.\n *\n * @param requiredVersion Backwards compatibility version which is required to return the instance\n * @param instance Instance which should be returned if the required version is compatible\n * @param fallback Fallback instance, usually NOOP, which will be returned if the required version is not compatible\n */\nfunction makeGetter(requiredVersion, instance, fallback) {\n return (version) => version === requiredVersion ? instance : fallback;\n}\n/**\n * A number which should be incremented each time a backwards incompatible\n * change is made to the API. This number is used when an API package\n * attempts to access the global API to ensure it is getting a compatible\n * version. If the global API is not compatible with the API package\n * attempting to get it, a NOOP API implementation will be returned.\n */\nconst API_BACKWARDS_COMPATIBILITY_VERSION = 1;\n//# sourceMappingURL=global-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaS1sb2dzQDAuMjE1LjAvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzL2J1aWxkL2VzbS9pbnRlcm5hbC9nbG9iYWwtdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgY29uc3QgR0xPQkFMX0xPR1NfQVBJX0tFWSA9IFN5bWJvbC5mb3IoJ2lvLm9wZW50ZWxlbWV0cnkuanMuYXBpLmxvZ3MnKTtcbmV4cG9ydCBjb25zdCBfZ2xvYmFsID0gZ2xvYmFsVGhpcztcbi8qKlxuICogTWFrZSBhIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgYSB2ZXJzaW9uIGludGVnZXIgYW5kIHJldHVybnMgdGhlIGluc3RhbmNlIG9mIGFuIEFQSSBpZiB0aGUgdmVyc2lvblxuICogaXMgY29tcGF0aWJsZSwgb3IgYSBmYWxsYmFjayB2ZXJzaW9uICh1c3VhbGx5IE5PT1ApIGlmIGl0IGlzIG5vdC5cbiAqXG4gKiBAcGFyYW0gcmVxdWlyZWRWZXJzaW9uIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHZlcnNpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZSBpbnN0YW5jZVxuICogQHBhcmFtIGluc3RhbmNlIEluc3RhbmNlIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBpZiB0aGUgcmVxdWlyZWQgdmVyc2lvbiBpcyBjb21wYXRpYmxlXG4gKiBAcGFyYW0gZmFsbGJhY2sgRmFsbGJhY2sgaW5zdGFuY2UsIHVzdWFsbHkgTk9PUCwgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgcmVxdWlyZWQgdmVyc2lvbiBpcyBub3QgY29tcGF0aWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUdldHRlcihyZXF1aXJlZFZlcnNpb24sIGluc3RhbmNlLCBmYWxsYmFjaykge1xuICAgIHJldHVybiAodmVyc2lvbikgPT4gdmVyc2lvbiA9PT0gcmVxdWlyZWRWZXJzaW9uID8gaW5zdGFuY2UgOiBmYWxsYmFjaztcbn1cbi8qKlxuICogQSBudW1iZXIgd2hpY2ggc2hvdWxkIGJlIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIGJhY2t3YXJkcyBpbmNvbXBhdGlibGVcbiAqIGNoYW5nZSBpcyBtYWRlIHRvIHRoZSBBUEkuIFRoaXMgbnVtYmVyIGlzIHVzZWQgd2hlbiBhbiBBUEkgcGFja2FnZVxuICogYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQVBJIHRvIGVuc3VyZSBpdCBpcyBnZXR0aW5nIGEgY29tcGF0aWJsZVxuICogdmVyc2lvbi4gSWYgdGhlIGdsb2JhbCBBUEkgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgQVBJIHBhY2thZ2VcbiAqIGF0dGVtcHRpbmcgdG8gZ2V0IGl0LCBhIE5PT1AgQVBJIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBBUElfQkFDS1dBUkRTX0NPTVBBVElCSUxJVFlfVkVSU0lPTiA9IDE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nbG9iYWwtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/internal/global-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js": +/*!**********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js ***! + \**********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SeverityNumber: () => (/* binding */ SeverityNumber)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nvar SeverityNumber;\n(function (SeverityNumber) {\n SeverityNumber[SeverityNumber[\"UNSPECIFIED\"] = 0] = \"UNSPECIFIED\";\n SeverityNumber[SeverityNumber[\"TRACE\"] = 1] = \"TRACE\";\n SeverityNumber[SeverityNumber[\"TRACE2\"] = 2] = \"TRACE2\";\n SeverityNumber[SeverityNumber[\"TRACE3\"] = 3] = \"TRACE3\";\n SeverityNumber[SeverityNumber[\"TRACE4\"] = 4] = \"TRACE4\";\n SeverityNumber[SeverityNumber[\"DEBUG\"] = 5] = \"DEBUG\";\n SeverityNumber[SeverityNumber[\"DEBUG2\"] = 6] = \"DEBUG2\";\n SeverityNumber[SeverityNumber[\"DEBUG3\"] = 7] = \"DEBUG3\";\n SeverityNumber[SeverityNumber[\"DEBUG4\"] = 8] = \"DEBUG4\";\n SeverityNumber[SeverityNumber[\"INFO\"] = 9] = \"INFO\";\n SeverityNumber[SeverityNumber[\"INFO2\"] = 10] = \"INFO2\";\n SeverityNumber[SeverityNumber[\"INFO3\"] = 11] = \"INFO3\";\n SeverityNumber[SeverityNumber[\"INFO4\"] = 12] = \"INFO4\";\n SeverityNumber[SeverityNumber[\"WARN\"] = 13] = \"WARN\";\n SeverityNumber[SeverityNumber[\"WARN2\"] = 14] = \"WARN2\";\n SeverityNumber[SeverityNumber[\"WARN3\"] = 15] = \"WARN3\";\n SeverityNumber[SeverityNumber[\"WARN4\"] = 16] = \"WARN4\";\n SeverityNumber[SeverityNumber[\"ERROR\"] = 17] = \"ERROR\";\n SeverityNumber[SeverityNumber[\"ERROR2\"] = 18] = \"ERROR2\";\n SeverityNumber[SeverityNumber[\"ERROR3\"] = 19] = \"ERROR3\";\n SeverityNumber[SeverityNumber[\"ERROR4\"] = 20] = \"ERROR4\";\n SeverityNumber[SeverityNumber[\"FATAL\"] = 21] = \"FATAL\";\n SeverityNumber[SeverityNumber[\"FATAL2\"] = 22] = \"FATAL2\";\n SeverityNumber[SeverityNumber[\"FATAL3\"] = 23] = \"FATAL3\";\n SeverityNumber[SeverityNumber[\"FATAL4\"] = 24] = \"FATAL4\";\n})(SeverityNumber || (SeverityNumber = {}));\n//# sourceMappingURL=LogRecord.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGktbG9nc0AwLjIxNS4wL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGktbG9ncy9idWlsZC9lc20vdHlwZXMvTG9nUmVjb3JkLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsd0NBQXdDO0FBQ3pDIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaS1sb2dzQDAuMjE1LjAvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS1sb2dzL2J1aWxkL2VzbS90eXBlcy9Mb2dSZWNvcmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgdmFyIFNldmVyaXR5TnVtYmVyO1xuKGZ1bmN0aW9uIChTZXZlcml0eU51bWJlcikge1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiVU5TUEVDSUZJRURcIl0gPSAwXSA9IFwiVU5TUEVDSUZJRURcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIlRSQUNFXCJdID0gMV0gPSBcIlRSQUNFXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJUUkFDRTJcIl0gPSAyXSA9IFwiVFJBQ0UyXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJUUkFDRTNcIl0gPSAzXSA9IFwiVFJBQ0UzXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJUUkFDRTRcIl0gPSA0XSA9IFwiVFJBQ0U0XCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJERUJVR1wiXSA9IDVdID0gXCJERUJVR1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiREVCVUcyXCJdID0gNl0gPSBcIkRFQlVHMlwiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiREVCVUczXCJdID0gN10gPSBcIkRFQlVHM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiREVCVUc0XCJdID0gOF0gPSBcIkRFQlVHNFwiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiSU5GT1wiXSA9IDldID0gXCJJTkZPXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJJTkZPMlwiXSA9IDEwXSA9IFwiSU5GTzJcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIklORk8zXCJdID0gMTFdID0gXCJJTkZPM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiSU5GTzRcIl0gPSAxMl0gPSBcIklORk80XCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJXQVJOXCJdID0gMTNdID0gXCJXQVJOXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJXQVJOMlwiXSA9IDE0XSA9IFwiV0FSTjJcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIldBUk4zXCJdID0gMTVdID0gXCJXQVJOM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiV0FSTjRcIl0gPSAxNl0gPSBcIldBUk40XCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJFUlJPUlwiXSA9IDE3XSA9IFwiRVJST1JcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIkVSUk9SMlwiXSA9IDE4XSA9IFwiRVJST1IyXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJFUlJPUjNcIl0gPSAxOV0gPSBcIkVSUk9SM1wiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiRVJST1I0XCJdID0gMjBdID0gXCJFUlJPUjRcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIkZBVEFMXCJdID0gMjFdID0gXCJGQVRBTFwiO1xuICAgIFNldmVyaXR5TnVtYmVyW1NldmVyaXR5TnVtYmVyW1wiRkFUQUwyXCJdID0gMjJdID0gXCJGQVRBTDJcIjtcbiAgICBTZXZlcml0eU51bWJlcltTZXZlcml0eU51bWJlcltcIkZBVEFMM1wiXSA9IDIzXSA9IFwiRkFUQUwzXCI7XG4gICAgU2V2ZXJpdHlOdW1iZXJbU2V2ZXJpdHlOdW1iZXJbXCJGQVRBTDRcIl0gPSAyNF0gPSBcIkZBVEFMNFwiO1xufSkoU2V2ZXJpdHlOdW1iZXIgfHwgKFNldmVyaXR5TnVtYmVyID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxvZ1JlY29yZC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/types/LogRecord.js\n"); + +/***/ }) + +}; +; \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/vendor-chunks/@opentelemetry+api@1.9.1.js b/superlog/apps/sample/.next/server/vendor-chunks/@opentelemetry+api@1.9.1.js new file mode 100644 index 0000000000000000000000000000000000000000..24b20a2113b2c42fdafe3586b74ce0d7c4b7ce19 --- /dev/null +++ b/superlog/apps/sample/.next/server/vendor-chunks/@opentelemetry+api@1.9.1.js @@ -0,0 +1,455 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +exports.id = "vendor-chunks/@opentelemetry+api@1.9.1"; +exports.ids = ["vendor-chunks/@opentelemetry+api@1.9.1"]; +exports.modules = { + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ContextAPI: () => (/* binding */ ContextAPI)\n/* harmony export */ });\n/* harmony import */ var _context_NoopContextManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../context/NoopContextManager */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js\");\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst API_NAME = 'context';\nconst NOOP_CONTEXT_MANAGER = new _context_NoopContextManager__WEBPACK_IMPORTED_MODULE_0__.NoopContextManager();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Context API\n *\n * @since 1.0.0\n */\nclass ContextAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() { }\n /** Get the singleton instance of the Context API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new ContextAPI();\n }\n return this._instance;\n }\n /**\n * Set the current context manager.\n *\n * @returns true if the context manager was successfully registered, else false\n */\n setGlobalContextManager(contextManager) {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.registerGlobal)(API_NAME, contextManager, _diag__WEBPACK_IMPORTED_MODULE_2__.DiagAPI.instance());\n }\n /**\n * Get the currently active context\n */\n active() {\n return this._getContextManager().active();\n }\n /**\n * Execute a function with an active context\n *\n * @param context context to be active during function execution\n * @param fn function to execute in a context\n * @param thisArg optional receiver to be used for calling fn\n * @param args optional arguments forwarded to fn\n */\n with(context, fn, thisArg, ...args) {\n return this._getContextManager().with(context, fn, thisArg, ...args);\n }\n /**\n * Bind a context to a target function or event emitter\n *\n * @param context context to bind to the event emitter or function. Defaults to the currently active context\n * @param target function or event emitter to bind\n */\n bind(context, target) {\n return this._getContextManager().bind(context, target);\n }\n _getContextManager() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.getGlobal)(API_NAME) || NOOP_CONTEXT_MANAGER;\n }\n /** Disable and remove the global context manager */\n disable() {\n this._getContextManager().disable();\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_1__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_2__.DiagAPI.instance());\n }\n}\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL2NvbnRleHQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ21FO0FBQ3FCO0FBQ3ZEO0FBQ2pDO0FBQ0EsaUNBQWlDLDJFQUFrQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHNFQUFjLDJCQUEyQiwwQ0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUVBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHdFQUFnQixXQUFXLDBDQUFPO0FBQzFDO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBOb29wQ29udGV4dE1hbmFnZXIgfSBmcm9tICcuLi9jb250ZXh0L05vb3BDb250ZXh0TWFuYWdlcic7XG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5pbXBvcnQgeyBEaWFnQVBJIH0gZnJvbSAnLi9kaWFnJztcbmNvbnN0IEFQSV9OQU1FID0gJ2NvbnRleHQnO1xuY29uc3QgTk9PUF9DT05URVhUX01BTkFHRVIgPSBuZXcgTm9vcENvbnRleHRNYW5hZ2VyKCk7XG4vKipcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIE9wZW5UZWxlbWV0cnkgQ29udGV4dCBBUElcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRleHRBUEkge1xuICAgIC8qKiBFbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHByZXZlbnRzIGVuZCB1c2VycyBmcm9tIGNvbnN0cnVjdGluZyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQVBJICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKiogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENvbnRleHQgQVBJICovXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBDb250ZXh0QVBJKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGN1cnJlbnQgY29udGV4dCBtYW5hZ2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGV4dCBtYW5hZ2VyIHdhcyBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCwgZWxzZSBmYWxzZVxuICAgICAqL1xuICAgIHNldEdsb2JhbENvbnRleHRNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiByZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgY29udGV4dE1hbmFnZXIsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjb250ZXh0XG4gICAgICovXG4gICAgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29udGV4dE1hbmFnZXIoKS5hY3RpdmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGggYW4gYWN0aXZlIGNvbnRleHRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gYmUgYWN0aXZlIGR1cmluZyBmdW5jdGlvbiBleGVjdXRpb25cbiAgICAgKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gZXhlY3V0ZSBpbiBhIGNvbnRleHRcbiAgICAgKiBAcGFyYW0gdGhpc0FyZyBvcHRpb25hbCByZWNlaXZlciB0byBiZSB1c2VkIGZvciBjYWxsaW5nIGZuXG4gICAgICogQHBhcmFtIGFyZ3Mgb3B0aW9uYWwgYXJndW1lbnRzIGZvcndhcmRlZCB0byBmblxuICAgICAqL1xuICAgIHdpdGgoY29udGV4dCwgZm4sIHRoaXNBcmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRleHRNYW5hZ2VyKCkud2l0aChjb250ZXh0LCBmbiwgdGhpc0FyZywgLi4uYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJpbmQgYSBjb250ZXh0IHRvIGEgdGFyZ2V0IGZ1bmN0aW9uIG9yIGV2ZW50IGVtaXR0ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gYmluZCB0byB0aGUgZXZlbnQgZW1pdHRlciBvciBmdW5jdGlvbi4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgY29udGV4dFxuICAgICAqIEBwYXJhbSB0YXJnZXQgZnVuY3Rpb24gb3IgZXZlbnQgZW1pdHRlciB0byBiaW5kXG4gICAgICovXG4gICAgYmluZChjb250ZXh0LCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvbnRleHRNYW5hZ2VyKCkuYmluZChjb250ZXh0LCB0YXJnZXQpO1xuICAgIH1cbiAgICBfZ2V0Q29udGV4dE1hbmFnZXIoKSB7XG4gICAgICAgIHJldHVybiBnZXRHbG9iYWwoQVBJX05BTUUpIHx8IE5PT1BfQ09OVEVYVF9NQU5BR0VSO1xuICAgIH1cbiAgICAvKiogRGlzYWJsZSBhbmQgcmVtb3ZlIHRoZSBnbG9iYWwgY29udGV4dCBtYW5hZ2VyICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZ2V0Q29udGV4dE1hbmFnZXIoKS5kaXNhYmxlKCk7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js": +/*!***************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js ***! + \***************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagAPI: () => (/* binding */ DiagAPI)\n/* harmony export */ });\n/* harmony import */ var _diag_ComponentLogger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../diag/ComponentLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js\");\n/* harmony import */ var _diag_internal_logLevelLogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../diag/internal/logLevelLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js\");\n/* harmony import */ var _diag_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../diag/types */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\");\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\nconst API_NAME = 'diag';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry internal\n * diagnostic API\n *\n * @since 1.0.0\n */\nclass DiagAPI {\n /** Get the singleton instance of the DiagAPI API */\n static instance() {\n if (!this._instance) {\n this._instance = new DiagAPI();\n }\n return this._instance;\n }\n /**\n * Private internal constructor\n * @private\n */\n constructor() {\n function _logProxy(funcName) {\n return function (...args) {\n const logger = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)('diag');\n // shortcut if logger not set\n if (!logger)\n return;\n return logger[funcName](...args);\n };\n }\n // Using self local variable for minification purposes as 'this' cannot be minified\n const self = this;\n // DiagAPI specific functions\n const setLogger = (logger, optionsOrLogLevel = { logLevel: _diag_types__WEBPACK_IMPORTED_MODULE_1__.DiagLogLevel.INFO }) => {\n var _a, _b, _c;\n if (logger === self) {\n // There isn't much we can do here.\n // Logging to the console might break the user application.\n // Try to log to self. If a logger was previously registered it will receive the log.\n const err = new Error('Cannot use diag as the logger for itself. Please use a DiagLogger implementation like ConsoleDiagLogger or a custom implementation');\n self.error((_a = err.stack) !== null && _a !== void 0 ? _a : err.message);\n return false;\n }\n if (typeof optionsOrLogLevel === 'number') {\n optionsOrLogLevel = {\n logLevel: optionsOrLogLevel,\n };\n }\n const oldLogger = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)('diag');\n const newLogger = (0,_diag_internal_logLevelLogger__WEBPACK_IMPORTED_MODULE_2__.createLogLevelDiagLogger)((_b = optionsOrLogLevel.logLevel) !== null && _b !== void 0 ? _b : _diag_types__WEBPACK_IMPORTED_MODULE_1__.DiagLogLevel.INFO, logger);\n // There already is an logger registered. We'll let it know before overwriting it.\n if (oldLogger && !optionsOrLogLevel.suppressOverrideMessage) {\n const stack = (_c = new Error().stack) !== null && _c !== void 0 ? _c : '';\n oldLogger.warn(`Current logger will be overwritten from ${stack}`);\n newLogger.warn(`Current logger will overwrite one already registered from ${stack}`);\n }\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.registerGlobal)('diag', newLogger, self, true);\n };\n self.setLogger = setLogger;\n self.disable = () => {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.unregisterGlobal)(API_NAME, self);\n };\n self.createComponentLogger = (options) => {\n return new _diag_ComponentLogger__WEBPACK_IMPORTED_MODULE_3__.DiagComponentLogger(options);\n };\n self.verbose = _logProxy('verbose');\n self.debug = _logProxy('debug');\n self.info = _logProxy('info');\n self.warn = _logProxy('warn');\n self.error = _logProxy('error');\n }\n}\n//# sourceMappingURL=diag.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL2RpYWcuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUM4RDtBQUNhO0FBQzlCO0FBQzJDO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGlFQUFTO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxVQUFVLHFEQUFZLE9BQU87QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixpRUFBUztBQUN2Qyw4QkFBOEIsdUZBQXdCLG9FQUFvRSxxREFBWTtBQUN0STtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsTUFBTTtBQUNoRiw0RkFBNEYsTUFBTTtBQUNsRztBQUNBLG1CQUFtQixzRUFBYztBQUNqQztBQUNBO0FBQ0E7QUFDQSxZQUFZLHdFQUFnQjtBQUM1QjtBQUNBO0FBQ0EsdUJBQXVCLHNFQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS9kaWFnLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGlhZ0NvbXBvbmVudExvZ2dlciB9IGZyb20gJy4uL2RpYWcvQ29tcG9uZW50TG9nZ2VyJztcbmltcG9ydCB7IGNyZWF0ZUxvZ0xldmVsRGlhZ0xvZ2dlciB9IGZyb20gJy4uL2RpYWcvaW50ZXJuYWwvbG9nTGV2ZWxMb2dnZXInO1xuaW1wb3J0IHsgRGlhZ0xvZ0xldmVsIH0gZnJvbSAnLi4vZGlhZy90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5jb25zdCBBUElfTkFNRSA9ICdkaWFnJztcbi8qKlxuICogU2luZ2xldG9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgT3BlblRlbGVtZXRyeSBpbnRlcm5hbFxuICogZGlhZ25vc3RpYyBBUElcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNsYXNzIERpYWdBUEkge1xuICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRGlhZ0FQSSBBUEkgKi9cbiAgICBzdGF0aWMgaW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IERpYWdBUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByaXZhdGUgaW50ZXJuYWwgY29uc3RydWN0b3JcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBmdW5jdGlvbiBfbG9nUHJveHkoZnVuY05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ2dlciA9IGdldEdsb2JhbCgnZGlhZycpO1xuICAgICAgICAgICAgICAgIC8vIHNob3J0Y3V0IGlmIGxvZ2dlciBub3Qgc2V0XG4gICAgICAgICAgICAgICAgaWYgKCFsb2dnZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyW2Z1bmNOYW1lXSguLi5hcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNpbmcgc2VsZiBsb2NhbCB2YXJpYWJsZSBmb3IgbWluaWZpY2F0aW9uIHB1cnBvc2VzIGFzICd0aGlzJyBjYW5ub3QgYmUgbWluaWZpZWRcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIC8vIERpYWdBUEkgc3BlY2lmaWMgZnVuY3Rpb25zXG4gICAgICAgIGNvbnN0IHNldExvZ2dlciA9IChsb2dnZXIsIG9wdGlvbnNPckxvZ0xldmVsID0geyBsb2dMZXZlbDogRGlhZ0xvZ0xldmVsLklORk8gfSkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICBpZiAobG9nZ2VyID09PSBzZWxmKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXNuJ3QgbXVjaCB3ZSBjYW4gZG8gaGVyZS5cbiAgICAgICAgICAgICAgICAvLyBMb2dnaW5nIHRvIHRoZSBjb25zb2xlIG1pZ2h0IGJyZWFrIHRoZSB1c2VyIGFwcGxpY2F0aW9uLlxuICAgICAgICAgICAgICAgIC8vIFRyeSB0byBsb2cgdG8gc2VsZi4gSWYgYSBsb2dnZXIgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBpdCB3aWxsIHJlY2VpdmUgdGhlIGxvZy5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2UgZGlhZyBhcyB0aGUgbG9nZ2VyIGZvciBpdHNlbGYuIFBsZWFzZSB1c2UgYSBEaWFnTG9nZ2VyIGltcGxlbWVudGF0aW9uIGxpa2UgQ29uc29sZURpYWdMb2dnZXIgb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgICAgICAgICBzZWxmLmVycm9yKChfYSA9IGVyci5zdGFjaykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yTG9nTGV2ZWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc09yTG9nTGV2ZWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBvcHRpb25zT3JMb2dMZXZlbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2xkTG9nZ2VyID0gZ2V0R2xvYmFsKCdkaWFnJyk7XG4gICAgICAgICAgICBjb25zdCBuZXdMb2dnZXIgPSBjcmVhdGVMb2dMZXZlbERpYWdMb2dnZXIoKF9iID0gb3B0aW9uc09yTG9nTGV2ZWwubG9nTGV2ZWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IERpYWdMb2dMZXZlbC5JTkZPLCBsb2dnZXIpO1xuICAgICAgICAgICAgLy8gVGhlcmUgYWxyZWFkeSBpcyBhbiBsb2dnZXIgcmVnaXN0ZXJlZC4gV2UnbGwgbGV0IGl0IGtub3cgYmVmb3JlIG92ZXJ3cml0aW5nIGl0LlxuICAgICAgICAgICAgaWYgKG9sZExvZ2dlciAmJiAhb3B0aW9uc09yTG9nTGV2ZWwuc3VwcHJlc3NPdmVycmlkZU1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IChfYyA9IG5ldyBFcnJvcigpLnN0YWNrKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAnPGZhaWxlZCB0byBnZW5lcmF0ZSBzdGFja3RyYWNlPic7XG4gICAgICAgICAgICAgICAgb2xkTG9nZ2VyLndhcm4oYEN1cnJlbnQgbG9nZ2VyIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZnJvbSAke3N0YWNrfWApO1xuICAgICAgICAgICAgICAgIG5ld0xvZ2dlci53YXJuKGBDdXJyZW50IGxvZ2dlciB3aWxsIG92ZXJ3cml0ZSBvbmUgYWxyZWFkeSByZWdpc3RlcmVkIGZyb20gJHtzdGFja31gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZWdpc3Rlckdsb2JhbCgnZGlhZycsIG5ld0xvZ2dlciwgc2VsZiwgdHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYuc2V0TG9nZ2VyID0gc2V0TG9nZ2VyO1xuICAgICAgICBzZWxmLmRpc2FibGUgPSAoKSA9PiB7XG4gICAgICAgICAgICB1bnJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCBzZWxmKTtcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5jcmVhdGVDb21wb25lbnRMb2dnZXIgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEaWFnQ29tcG9uZW50TG9nZ2VyKG9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICBzZWxmLnZlcmJvc2UgPSBfbG9nUHJveHkoJ3ZlcmJvc2UnKTtcbiAgICAgICAgc2VsZi5kZWJ1ZyA9IF9sb2dQcm94eSgnZGVidWcnKTtcbiAgICAgICAgc2VsZi5pbmZvID0gX2xvZ1Byb3h5KCdpbmZvJyk7XG4gICAgICAgIHNlbGYud2FybiA9IF9sb2dQcm94eSgnd2FybicpO1xuICAgICAgICBzZWxmLmVycm9yID0gX2xvZ1Byb3h5KCdlcnJvcicpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpYWcuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MetricsAPI: () => (/* binding */ MetricsAPI)\n/* harmony export */ });\n/* harmony import */ var _metrics_NoopMeterProvider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../metrics/NoopMeterProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js\");\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst API_NAME = 'metrics';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Metrics API\n */\nclass MetricsAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() { }\n /** Get the singleton instance of the Metrics API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new MetricsAPI();\n }\n return this._instance;\n }\n /**\n * Set the current global meter provider.\n * Returns true if the meter provider was successfully registered, else false.\n */\n setGlobalMeterProvider(provider) {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.registerGlobal)(API_NAME, provider, _diag__WEBPACK_IMPORTED_MODULE_1__.DiagAPI.instance());\n }\n /**\n * Returns the global meter provider.\n */\n getMeterProvider() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)(API_NAME) || _metrics_NoopMeterProvider__WEBPACK_IMPORTED_MODULE_2__.NOOP_METER_PROVIDER;\n }\n /**\n * Returns a meter from the global meter provider.\n */\n getMeter(name, version, options) {\n return this.getMeterProvider().getMeter(name, version, options);\n }\n /** Remove the global meter provider */\n disable() {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_1__.DiagAPI.instance());\n }\n}\n//# sourceMappingURL=metrics.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL21ldHJpY3MuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ21FO0FBQ3FCO0FBQ3ZEO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzRUFBYyxxQkFBcUIsMENBQU87QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUVBQVMsY0FBYywyRUFBbUI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx3RUFBZ0IsV0FBVywwQ0FBTztBQUMxQztBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS9tZXRyaWNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgTk9PUF9NRVRFUl9QUk9WSURFUiB9IGZyb20gJy4uL21ldHJpY3MvTm9vcE1ldGVyUHJvdmlkZXInO1xuaW1wb3J0IHsgZ2V0R2xvYmFsLCByZWdpc3Rlckdsb2JhbCwgdW5yZWdpc3Rlckdsb2JhbCwgfSBmcm9tICcuLi9pbnRlcm5hbC9nbG9iYWwtdXRpbHMnO1xuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4vZGlhZyc7XG5jb25zdCBBUElfTkFNRSA9ICdtZXRyaWNzJztcbi8qKlxuICogU2luZ2xldG9uIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBlbnRyeSBwb2ludCB0byB0aGUgT3BlblRlbGVtZXRyeSBNZXRyaWNzIEFQSVxuICovXG5leHBvcnQgY2xhc3MgTWV0cmljc0FQSSB7XG4gICAgLyoqIEVtcHR5IHByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gY29uc3RydWN0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBUEkgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgTWV0cmljcyBBUEkgKi9cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbmV3IE1ldHJpY3NBUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBnbG9iYWwgbWV0ZXIgcHJvdmlkZXIuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRlciBwcm92aWRlciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQsIGVsc2UgZmFsc2UuXG4gICAgICovXG4gICAgc2V0R2xvYmFsTWV0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICByZXR1cm4gcmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIHByb3ZpZGVyLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnbG9iYWwgbWV0ZXIgcHJvdmlkZXIuXG4gICAgICovXG4gICAgZ2V0TWV0ZXJQcm92aWRlcigpIHtcbiAgICAgICAgcmV0dXJuIGdldEdsb2JhbChBUElfTkFNRSkgfHwgTk9PUF9NRVRFUl9QUk9WSURFUjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG1ldGVyIGZyb20gdGhlIGdsb2JhbCBtZXRlciBwcm92aWRlci5cbiAgICAgKi9cbiAgICBnZXRNZXRlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1ldGVyUHJvdmlkZXIoKS5nZXRNZXRlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqIFJlbW92ZSB0aGUgZ2xvYmFsIG1ldGVyIHByb3ZpZGVyICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdW5yZWdpc3Rlckdsb2JhbChBUElfTkFNRSwgRGlhZ0FQSS5pbnN0YW5jZSgpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXRyaWNzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ PropagationAPI: () => (/* binding */ PropagationAPI)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _propagation_NoopTextMapPropagator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../propagation/NoopTextMapPropagator */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js\");\n/* harmony import */ var _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../propagation/TextMapPropagator */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js\");\n/* harmony import */ var _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../baggage/context-helpers */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js\");\n/* harmony import */ var _baggage_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../baggage/utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\n\n\nconst API_NAME = 'propagation';\nconst NOOP_TEXT_MAP_PROPAGATOR = new _propagation_NoopTextMapPropagator__WEBPACK_IMPORTED_MODULE_0__.NoopTextMapPropagator();\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Propagation API\n *\n * @since 1.0.0\n */\nclass PropagationAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() {\n this.createBaggage = _baggage_utils__WEBPACK_IMPORTED_MODULE_1__.createBaggage;\n this.getBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.getBaggage;\n this.getActiveBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.getActiveBaggage;\n this.setBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.setBaggage;\n this.deleteBaggage = _baggage_context_helpers__WEBPACK_IMPORTED_MODULE_2__.deleteBaggage;\n }\n /** Get the singleton instance of the Propagator API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new PropagationAPI();\n }\n return this._instance;\n }\n /**\n * Set the current propagator.\n *\n * @returns true if the propagator was successfully registered, else false\n */\n setGlobalPropagator(propagator) {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.registerGlobal)(API_NAME, propagator, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n }\n /**\n * Inject context into a carrier to be propagated inter-process\n *\n * @param context Context carrying tracing data to inject\n * @param carrier carrier to inject context into\n * @param setter Function used to set values on the carrier\n */\n inject(context, carrier, setter = _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_5__.defaultTextMapSetter) {\n return this._getGlobalPropagator().inject(context, carrier, setter);\n }\n /**\n * Extract context from a carrier\n *\n * @param context Context which the newly created context will inherit from\n * @param carrier Carrier to extract context from\n * @param getter Function used to extract keys from a carrier\n */\n extract(context, carrier, getter = _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_5__.defaultTextMapGetter) {\n return this._getGlobalPropagator().extract(context, carrier, getter);\n }\n /**\n * Return a list of all fields which may be used by the propagator.\n */\n fields() {\n return this._getGlobalPropagator().fields();\n }\n /** Remove the global propagator */\n disable() {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n }\n _getGlobalPropagator() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.getGlobal)(API_NAME) || NOOP_TEXT_MAP_PROPAGATOR;\n }\n}\n//# sourceMappingURL=propagation.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL3Byb3BhZ2F0aW9uLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUN3RjtBQUNYO0FBQ2tCO0FBQ087QUFDckQ7QUFDaEI7QUFDakM7QUFDQSxxQ0FBcUMscUZBQXFCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSw2QkFBNkIseURBQWE7QUFDMUMsMEJBQTBCLGdFQUFVO0FBQ3BDLGdDQUFnQyxzRUFBZ0I7QUFDaEQsMEJBQTBCLGdFQUFVO0FBQ3BDLDZCQUE2QixtRUFBYTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzRUFBYyx1QkFBdUIsMENBQU87QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxnRkFBb0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGdGQUFvQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsd0VBQWdCLFdBQVcsMENBQU87QUFDMUM7QUFDQTtBQUNBLGVBQWUsaUVBQVM7QUFDeEI7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9hcGkvcHJvcGFnYXRpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBnZXRHbG9iYWwsIHJlZ2lzdGVyR2xvYmFsLCB1bnJlZ2lzdGVyR2xvYmFsLCB9IGZyb20gJy4uL2ludGVybmFsL2dsb2JhbC11dGlscyc7XG5pbXBvcnQgeyBOb29wVGV4dE1hcFByb3BhZ2F0b3IgfSBmcm9tICcuLi9wcm9wYWdhdGlvbi9Ob29wVGV4dE1hcFByb3BhZ2F0b3InO1xuaW1wb3J0IHsgZGVmYXVsdFRleHRNYXBHZXR0ZXIsIGRlZmF1bHRUZXh0TWFwU2V0dGVyLCB9IGZyb20gJy4uL3Byb3BhZ2F0aW9uL1RleHRNYXBQcm9wYWdhdG9yJztcbmltcG9ydCB7IGdldEJhZ2dhZ2UsIGdldEFjdGl2ZUJhZ2dhZ2UsIHNldEJhZ2dhZ2UsIGRlbGV0ZUJhZ2dhZ2UsIH0gZnJvbSAnLi4vYmFnZ2FnZS9jb250ZXh0LWhlbHBlcnMnO1xuaW1wb3J0IHsgY3JlYXRlQmFnZ2FnZSB9IGZyb20gJy4uL2JhZ2dhZ2UvdXRpbHMnO1xuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4vZGlhZyc7XG5jb25zdCBBUElfTkFNRSA9ICdwcm9wYWdhdGlvbic7XG5jb25zdCBOT09QX1RFWFRfTUFQX1BST1BBR0FUT1IgPSBuZXcgTm9vcFRleHRNYXBQcm9wYWdhdG9yKCk7XG4vKipcbiAqIFNpbmdsZXRvbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIE9wZW5UZWxlbWV0cnkgUHJvcGFnYXRpb24gQVBJXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9wYWdhdGlvbkFQSSB7XG4gICAgLyoqIEVtcHR5IHByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gY29uc3RydWN0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBUEkgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVCYWdnYWdlID0gY3JlYXRlQmFnZ2FnZTtcbiAgICAgICAgdGhpcy5nZXRCYWdnYWdlID0gZ2V0QmFnZ2FnZTtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVCYWdnYWdlID0gZ2V0QWN0aXZlQmFnZ2FnZTtcbiAgICAgICAgdGhpcy5zZXRCYWdnYWdlID0gc2V0QmFnZ2FnZTtcbiAgICAgICAgdGhpcy5kZWxldGVCYWdnYWdlID0gZGVsZXRlQmFnZ2FnZTtcbiAgICB9XG4gICAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBQcm9wYWdhdG9yIEFQSSAqL1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBuZXcgUHJvcGFnYXRpb25BUEkoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBwcm9wYWdhdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGFnYXRvciB3YXMgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQsIGVsc2UgZmFsc2VcbiAgICAgKi9cbiAgICBzZXRHbG9iYWxQcm9wYWdhdG9yKHByb3BhZ2F0b3IpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCBwcm9wYWdhdG9yLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmplY3QgY29udGV4dCBpbnRvIGEgY2FycmllciB0byBiZSBwcm9wYWdhdGVkIGludGVyLXByb2Nlc3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgY2FycnlpbmcgdHJhY2luZyBkYXRhIHRvIGluamVjdFxuICAgICAqIEBwYXJhbSBjYXJyaWVyIGNhcnJpZXIgdG8gaW5qZWN0IGNvbnRleHQgaW50b1xuICAgICAqIEBwYXJhbSBzZXR0ZXIgRnVuY3Rpb24gdXNlZCB0byBzZXQgdmFsdWVzIG9uIHRoZSBjYXJyaWVyXG4gICAgICovXG4gICAgaW5qZWN0KGNvbnRleHQsIGNhcnJpZXIsIHNldHRlciA9IGRlZmF1bHRUZXh0TWFwU2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRHbG9iYWxQcm9wYWdhdG9yKCkuaW5qZWN0KGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4dHJhY3QgY29udGV4dCBmcm9tIGEgY2FycmllclxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGljaCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0IHdpbGwgaW5oZXJpdCBmcm9tXG4gICAgICogQHBhcmFtIGNhcnJpZXIgQ2FycmllciB0byBleHRyYWN0IGNvbnRleHQgZnJvbVxuICAgICAqIEBwYXJhbSBnZXR0ZXIgRnVuY3Rpb24gdXNlZCB0byBleHRyYWN0IGtleXMgZnJvbSBhIGNhcnJpZXJcbiAgICAgKi9cbiAgICBleHRyYWN0KGNvbnRleHQsIGNhcnJpZXIsIGdldHRlciA9IGRlZmF1bHRUZXh0TWFwR2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRHbG9iYWxQcm9wYWdhdG9yKCkuZXh0cmFjdChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIGFsbCBmaWVsZHMgd2hpY2ggbWF5IGJlIHVzZWQgYnkgdGhlIHByb3BhZ2F0b3IuXG4gICAgICovXG4gICAgZmllbGRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0R2xvYmFsUHJvcGFnYXRvcigpLmZpZWxkcygpO1xuICAgIH1cbiAgICAvKiogUmVtb3ZlIHRoZSBnbG9iYWwgcHJvcGFnYXRvciAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgfVxuICAgIF9nZXRHbG9iYWxQcm9wYWdhdG9yKCkge1xuICAgICAgICByZXR1cm4gZ2V0R2xvYmFsKEFQSV9OQU1FKSB8fCBOT09QX1RFWFRfTUFQX1BST1BBR0FUT1I7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvcGFnYXRpb24uanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js": +/*!****************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js ***! + \****************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TraceAPI: () => (/* binding */ TraceAPI)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/* harmony import */ var _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../trace/ProxyTracerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\");\n/* harmony import */ var _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../trace/spancontext-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\");\n/* harmony import */ var _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../trace/context-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\");\n/* harmony import */ var _diag__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\n\nconst API_NAME = 'trace';\n/**\n * Singleton object which represents the entry point to the OpenTelemetry Tracing API\n *\n * @since 1.0.0\n */\nclass TraceAPI {\n /** Empty private constructor prevents end users from constructing a new instance of the API */\n constructor() {\n this._proxyTracerProvider = new _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyTracerProvider();\n this.wrapSpanContext = _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_1__.wrapSpanContext;\n this.isSpanContextValid = _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_1__.isSpanContextValid;\n this.deleteSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.deleteSpan;\n this.getSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getSpan;\n this.getActiveSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getActiveSpan;\n this.getSpanContext = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getSpanContext;\n this.setSpan = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.setSpan;\n this.setSpanContext = _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.setSpanContext;\n }\n /** Get the singleton instance of the Trace API */\n static getInstance() {\n if (!this._instance) {\n this._instance = new TraceAPI();\n }\n return this._instance;\n }\n /**\n * Set the current global tracer.\n *\n * @returns true if the tracer provider was successfully registered, else false\n */\n setGlobalTracerProvider(provider) {\n const success = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.registerGlobal)(API_NAME, this._proxyTracerProvider, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n if (success) {\n this._proxyTracerProvider.setDelegate(provider);\n }\n return success;\n }\n /**\n * Returns the global tracer provider.\n */\n getTracerProvider() {\n return (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.getGlobal)(API_NAME) || this._proxyTracerProvider;\n }\n /**\n * Returns a tracer from the global tracer provider.\n */\n getTracer(name, version) {\n return this.getTracerProvider().getTracer(name, version);\n }\n /** Remove the global tracer provider */\n disable() {\n (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_3__.unregisterGlobal)(API_NAME, _diag__WEBPACK_IMPORTED_MODULE_4__.DiagAPI.instance());\n this._proxyTracerProvider = new _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_0__.ProxyTracerProvider();\n }\n}\n//# sourceMappingURL=trace.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYXBpL3RyYWNlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dGO0FBQ3JCO0FBQ2U7QUFDb0M7QUFDckY7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esd0NBQXdDLDJFQUFtQjtBQUMzRCwrQkFBK0IscUVBQWU7QUFDOUMsa0NBQWtDLHdFQUFrQjtBQUNwRCwwQkFBMEIsNERBQVU7QUFDcEMsdUJBQXVCLHlEQUFPO0FBQzlCLDZCQUE2QiwrREFBYTtBQUMxQyw4QkFBOEIsZ0VBQWM7QUFDNUMsdUJBQXVCLHlEQUFPO0FBQzlCLDhCQUE4QixnRUFBYztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHNFQUFjLHNDQUFzQywwQ0FBTztBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGlFQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsd0VBQWdCLFdBQVcsMENBQU87QUFDMUMsd0NBQXdDLDJFQUFtQjtBQUMzRDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2FwaS90cmFjZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGdldEdsb2JhbCwgcmVnaXN0ZXJHbG9iYWwsIHVucmVnaXN0ZXJHbG9iYWwsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbmltcG9ydCB7IFByb3h5VHJhY2VyUHJvdmlkZXIgfSBmcm9tICcuLi90cmFjZS9Qcm94eVRyYWNlclByb3ZpZGVyJztcbmltcG9ydCB7IGlzU3BhbkNvbnRleHRWYWxpZCwgd3JhcFNwYW5Db250ZXh0LCB9IGZyb20gJy4uL3RyYWNlL3NwYW5jb250ZXh0LXV0aWxzJztcbmltcG9ydCB7IGRlbGV0ZVNwYW4sIGdldEFjdGl2ZVNwYW4sIGdldFNwYW4sIGdldFNwYW5Db250ZXh0LCBzZXRTcGFuLCBzZXRTcGFuQ29udGV4dCwgfSBmcm9tICcuLi90cmFjZS9jb250ZXh0LXV0aWxzJztcbmltcG9ydCB7IERpYWdBUEkgfSBmcm9tICcuL2RpYWcnO1xuY29uc3QgQVBJX05BTUUgPSAndHJhY2UnO1xuLyoqXG4gKiBTaW5nbGV0b24gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGVudHJ5IHBvaW50IHRvIHRoZSBPcGVuVGVsZW1ldHJ5IFRyYWNpbmcgQVBJXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFjZUFQSSB7XG4gICAgLyoqIEVtcHR5IHByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgZW5kIHVzZXJzIGZyb20gY29uc3RydWN0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBUEkgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlciA9IG5ldyBQcm94eVRyYWNlclByb3ZpZGVyKCk7XG4gICAgICAgIHRoaXMud3JhcFNwYW5Db250ZXh0ID0gd3JhcFNwYW5Db250ZXh0O1xuICAgICAgICB0aGlzLmlzU3BhbkNvbnRleHRWYWxpZCA9IGlzU3BhbkNvbnRleHRWYWxpZDtcbiAgICAgICAgdGhpcy5kZWxldGVTcGFuID0gZGVsZXRlU3BhbjtcbiAgICAgICAgdGhpcy5nZXRTcGFuID0gZ2V0U3BhbjtcbiAgICAgICAgdGhpcy5nZXRBY3RpdmVTcGFuID0gZ2V0QWN0aXZlU3BhbjtcbiAgICAgICAgdGhpcy5nZXRTcGFuQ29udGV4dCA9IGdldFNwYW5Db250ZXh0O1xuICAgICAgICB0aGlzLnNldFNwYW4gPSBzZXRTcGFuO1xuICAgICAgICB0aGlzLnNldFNwYW5Db250ZXh0ID0gc2V0U3BhbkNvbnRleHQ7XG4gICAgfVxuICAgIC8qKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgVHJhY2UgQVBJICovXG4gICAgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBUcmFjZUFQSSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBjdXJyZW50IGdsb2JhbCB0cmFjZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0cmFjZXIgcHJvdmlkZXIgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLCBlbHNlIGZhbHNlXG4gICAgICovXG4gICAgc2V0R2xvYmFsVHJhY2VyUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHJlZ2lzdGVyR2xvYmFsKEFQSV9OQU1FLCB0aGlzLl9wcm94eVRyYWNlclByb3ZpZGVyLCBEaWFnQVBJLmluc3RhbmNlKCkpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5fcHJveHlUcmFjZXJQcm92aWRlci5zZXREZWxlZ2F0ZShwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCB0cmFjZXIgcHJvdmlkZXIuXG4gICAgICovXG4gICAgZ2V0VHJhY2VyUHJvdmlkZXIoKSB7XG4gICAgICAgIHJldHVybiBnZXRHbG9iYWwoQVBJX05BTUUpIHx8IHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB0cmFjZXIgZnJvbSB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlci5cbiAgICAgKi9cbiAgICBnZXRUcmFjZXIobmFtZSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFjZXJQcm92aWRlcigpLmdldFRyYWNlcihuYW1lLCB2ZXJzaW9uKTtcbiAgICB9XG4gICAgLyoqIFJlbW92ZSB0aGUgZ2xvYmFsIHRyYWNlciBwcm92aWRlciAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHVucmVnaXN0ZXJHbG9iYWwoQVBJX05BTUUsIERpYWdBUEkuaW5zdGFuY2UoKSk7XG4gICAgICAgIHRoaXMuX3Byb3h5VHJhY2VyUHJvdmlkZXIgPSBuZXcgUHJveHlUcmFjZXJQcm92aWRlcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNlLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deleteBaggage: () => (/* binding */ deleteBaggage),\n/* harmony export */ getActiveBaggage: () => (/* binding */ getActiveBaggage),\n/* harmony export */ getBaggage: () => (/* binding */ getBaggage),\n/* harmony export */ setBaggage: () => (/* binding */ setBaggage)\n/* harmony export */ });\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/* harmony import */ var _context_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../context/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n/**\n * Baggage key\n */\nconst BAGGAGE_KEY = (0,_context_context__WEBPACK_IMPORTED_MODULE_0__.createContextKey)('OpenTelemetry Baggage Key');\n/**\n * Retrieve the current baggage from the given context\n *\n * @param {Context} Context that manage all context values\n * @returns {Baggage} Extracted baggage from the context\n */\nfunction getBaggage(context) {\n return context.getValue(BAGGAGE_KEY) || undefined;\n}\n/**\n * Retrieve the current baggage from the active/current context\n *\n * @returns {Baggage} Extracted baggage from the context\n */\nfunction getActiveBaggage() {\n return getBaggage(_api_context__WEBPACK_IMPORTED_MODULE_1__.ContextAPI.getInstance().active());\n}\n/**\n * Store a baggage in the given context\n *\n * @param {Context} Context that manage all context values\n * @param {Baggage} baggage that will be set in the actual context\n */\nfunction setBaggage(context, baggage) {\n return context.setValue(BAGGAGE_KEY, baggage);\n}\n/**\n * Delete the baggage stored in the given context\n *\n * @param {Context} Context that manage all context values\n */\nfunction deleteBaggage(context) {\n return context.deleteValue(BAGGAGE_KEY);\n}\n//# sourceMappingURL=context-helpers.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9jb250ZXh0LWhlbHBlcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDNEM7QUFDVTtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0VBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixhQUFhLFNBQVM7QUFDdEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDTztBQUNQLHNCQUFzQixvREFBVTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQixXQUFXLFNBQVM7QUFDcEI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDTztBQUNQO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9jb250ZXh0LWhlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dEtleSB9IGZyb20gJy4uL2NvbnRleHQvY29udGV4dCc7XG4vKipcbiAqIEJhZ2dhZ2Uga2V5XG4gKi9cbmNvbnN0IEJBR0dBR0VfS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBCYWdnYWdlIEtleScpO1xuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBiYWdnYWdlIGZyb20gdGhlIGdpdmVuIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0ge0NvbnRleHR9IENvbnRleHQgdGhhdCBtYW5hZ2UgYWxsIGNvbnRleHQgdmFsdWVzXG4gKiBAcmV0dXJucyB7QmFnZ2FnZX0gRXh0cmFjdGVkIGJhZ2dhZ2UgZnJvbSB0aGUgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFnZ2FnZShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFsdWUoQkFHR0FHRV9LRVkpIHx8IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogUmV0cmlldmUgdGhlIGN1cnJlbnQgYmFnZ2FnZSBmcm9tIHRoZSBhY3RpdmUvY3VycmVudCBjb250ZXh0XG4gKlxuICogQHJldHVybnMge0JhZ2dhZ2V9IEV4dHJhY3RlZCBiYWdnYWdlIGZyb20gdGhlIGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZUJhZ2dhZ2UoKSB7XG4gICAgcmV0dXJuIGdldEJhZ2dhZ2UoQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpLmFjdGl2ZSgpKTtcbn1cbi8qKlxuICogU3RvcmUgYSBiYWdnYWdlIGluIHRoZSBnaXZlbiBjb250ZXh0XG4gKlxuICogQHBhcmFtIHtDb250ZXh0fSBDb250ZXh0IHRoYXQgbWFuYWdlIGFsbCBjb250ZXh0IHZhbHVlc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlIHRoYXQgd2lsbCBiZSBzZXQgaW4gdGhlIGFjdHVhbCBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRCYWdnYWdlKGNvbnRleHQsIGJhZ2dhZ2UpIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShCQUdHQUdFX0tFWSwgYmFnZ2FnZSk7XG59XG4vKipcbiAqIERlbGV0ZSB0aGUgYmFnZ2FnZSBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0ge0NvbnRleHR9IENvbnRleHQgdGhhdCBtYW5hZ2UgYWxsIGNvbnRleHQgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVCYWdnYWdlKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5kZWxldGVWYWx1ZShCQUdHQUdFX0tFWSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LWhlbHBlcnMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js": +/*!************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js ***! + \************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BaggageImpl: () => (/* binding */ BaggageImpl)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nclass BaggageImpl {\n constructor(entries) {\n this._entries = entries ? new Map(entries) : new Map();\n }\n getEntry(key) {\n const entry = this._entries.get(key);\n if (!entry) {\n return undefined;\n }\n return Object.assign({}, entry);\n }\n getAllEntries() {\n return Array.from(this._entries.entries());\n }\n setEntry(key, entry) {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.set(key, entry);\n return newBaggage;\n }\n removeEntry(key) {\n const newBaggage = new BaggageImpl(this._entries);\n newBaggage._entries.delete(key);\n return newBaggage;\n }\n removeEntries(...keys) {\n const newBaggage = new BaggageImpl(this._entries);\n for (const key of keys) {\n newBaggage._entries.delete(key);\n }\n return newBaggage;\n }\n clear() {\n return new BaggageImpl();\n }\n}\n//# sourceMappingURL=baggage-impl.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9pbnRlcm5hbC9iYWdnYWdlLWltcGwuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2JhZ2dhZ2UvaW50ZXJuYWwvYmFnZ2FnZS1pbXBsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IGNsYXNzIEJhZ2dhZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlbnRyaWVzKSB7XG4gICAgICAgIHRoaXMuX2VudHJpZXMgPSBlbnRyaWVzID8gbmV3IE1hcChlbnRyaWVzKSA6IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgZ2V0RW50cnkoa2V5KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZW50cmllcy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZW50cnkpO1xuICAgIH1cbiAgICBnZXRBbGxFbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9lbnRyaWVzLmVudHJpZXMoKSk7XG4gICAgfVxuICAgIHNldEVudHJ5KGtleSwgZW50cnkpIHtcbiAgICAgICAgY29uc3QgbmV3QmFnZ2FnZSA9IG5ldyBCYWdnYWdlSW1wbCh0aGlzLl9lbnRyaWVzKTtcbiAgICAgICAgbmV3QmFnZ2FnZS5fZW50cmllcy5zZXQoa2V5LCBlbnRyeSk7XG4gICAgICAgIHJldHVybiBuZXdCYWdnYWdlO1xuICAgIH1cbiAgICByZW1vdmVFbnRyeShrZXkpIHtcbiAgICAgICAgY29uc3QgbmV3QmFnZ2FnZSA9IG5ldyBCYWdnYWdlSW1wbCh0aGlzLl9lbnRyaWVzKTtcbiAgICAgICAgbmV3QmFnZ2FnZS5fZW50cmllcy5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIG5ld0JhZ2dhZ2U7XG4gICAgfVxuICAgIHJlbW92ZUVudHJpZXMoLi4ua2V5cykge1xuICAgICAgICBjb25zdCBuZXdCYWdnYWdlID0gbmV3IEJhZ2dhZ2VJbXBsKHRoaXMuX2VudHJpZXMpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBuZXdCYWdnYWdlLl9lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdCYWdnYWdlO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYWdnYWdlSW1wbCgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhZ2dhZ2UtaW1wbC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ baggageEntryMetadataSymbol: () => (/* binding */ baggageEntryMetadataSymbol)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * Symbol used to make BaggageEntryMetadata an opaque type\n */\nconst baggageEntryMetadataSymbol = Symbol('BaggageEntryMetadata');\n//# sourceMappingURL=symbol.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9pbnRlcm5hbC9zeW1ib2wuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS9pbnRlcm5hbC9zeW1ib2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIFN5bWJvbCB1c2VkIHRvIG1ha2UgQmFnZ2FnZUVudHJ5TWV0YWRhdGEgYW4gb3BhcXVlIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGJhZ2dhZ2VFbnRyeU1ldGFkYXRhU3ltYm9sID0gU3ltYm9sKCdCYWdnYWdlRW50cnlNZXRhZGF0YScpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3ltYm9sLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js": +/*!********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js ***! + \********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ baggageEntryMetadataFromString: () => (/* binding */ baggageEntryMetadataFromString),\n/* harmony export */ createBaggage: () => (/* binding */ createBaggage)\n/* harmony export */ });\n/* harmony import */ var _api_diag__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api/diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/* harmony import */ var _internal_baggage_impl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/baggage-impl */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js\");\n/* harmony import */ var _internal_symbol__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/symbol */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/symbol.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\nconst diag = _api_diag__WEBPACK_IMPORTED_MODULE_0__.DiagAPI.instance();\n/**\n * Create a new Baggage with optional entries\n *\n * @param entries An array of baggage entries the new baggage should contain\n */\nfunction createBaggage(entries = {}) {\n return new _internal_baggage_impl__WEBPACK_IMPORTED_MODULE_1__.BaggageImpl(new Map(Object.entries(entries)));\n}\n/**\n * Create a serializable BaggageEntryMetadata object from a string.\n *\n * @param str string metadata. Format is currently not defined by the spec and has no special meaning.\n *\n * @since 1.0.0\n */\nfunction baggageEntryMetadataFromString(str) {\n if (typeof str !== 'string') {\n diag.error(`Cannot create baggage metadata from unknown type: ${typeof str}`);\n str = '';\n }\n return {\n __TYPE__: _internal_symbol__WEBPACK_IMPORTED_MODULE_2__.baggageEntryMetadataSymbol,\n toString() {\n return str;\n },\n };\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vYmFnZ2FnZS91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3NDO0FBQ2dCO0FBQ1M7QUFDL0QsYUFBYSw4Q0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sbUNBQW1DO0FBQzFDLGVBQWUsK0RBQVc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSx3RUFBd0UsV0FBVztBQUNuRjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isd0VBQTBCO0FBQzVDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9iYWdnYWdlL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4uL2FwaS9kaWFnJztcbmltcG9ydCB7IEJhZ2dhZ2VJbXBsIH0gZnJvbSAnLi9pbnRlcm5hbC9iYWdnYWdlLWltcGwnO1xuaW1wb3J0IHsgYmFnZ2FnZUVudHJ5TWV0YWRhdGFTeW1ib2wgfSBmcm9tICcuL2ludGVybmFsL3N5bWJvbCc7XG5jb25zdCBkaWFnID0gRGlhZ0FQSS5pbnN0YW5jZSgpO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgQmFnZ2FnZSB3aXRoIG9wdGlvbmFsIGVudHJpZXNcbiAqXG4gKiBAcGFyYW0gZW50cmllcyBBbiBhcnJheSBvZiBiYWdnYWdlIGVudHJpZXMgdGhlIG5ldyBiYWdnYWdlIHNob3VsZCBjb250YWluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYWdnYWdlKGVudHJpZXMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgQmFnZ2FnZUltcGwobmV3IE1hcChPYmplY3QuZW50cmllcyhlbnRyaWVzKSkpO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBzZXJpYWxpemFibGUgQmFnZ2FnZUVudHJ5TWV0YWRhdGEgb2JqZWN0IGZyb20gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHN0ciBzdHJpbmcgbWV0YWRhdGEuIEZvcm1hdCBpcyBjdXJyZW50bHkgbm90IGRlZmluZWQgYnkgdGhlIHNwZWMgYW5kIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcuXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWdnYWdlRW50cnlNZXRhZGF0YUZyb21TdHJpbmcoc3RyKSB7XG4gICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpYWcuZXJyb3IoYENhbm5vdCBjcmVhdGUgYmFnZ2FnZSBtZXRhZGF0YSBmcm9tIHVua25vd24gdHlwZTogJHt0eXBlb2Ygc3RyfWApO1xuICAgICAgICBzdHIgPSAnJztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgX19UWVBFX186IGJhZ2dhZ2VFbnRyeU1ldGFkYXRhU3ltYm9sLFxuICAgICAgICB0b1N0cmluZygpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ context: () => (/* binding */ context)\n/* harmony export */ });\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for context API\n * @since 1.0.0\n */\nconst context = _api_context__WEBPACK_IMPORTED_MODULE_0__.ContextAPI.getInstance();\n//# sourceMappingURL=context-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vY29udGV4dC1hcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDTyxnQkFBZ0Isb0RBQVU7QUFDakMiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2NvbnRleHQtYXBpLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLy8gU3BsaXQgbW9kdWxlLWxldmVsIHZhcmlhYmxlIGRlZmluaXRpb24gaW50byBzZXBhcmF0ZSBmaWxlcyB0byBhbGxvd1xuLy8gdHJlZS1zaGFraW5nIG9uIGVhY2ggYXBpIGluc3RhbmNlLlxuaW1wb3J0IHsgQ29udGV4dEFQSSB9IGZyb20gJy4vYXBpL2NvbnRleHQnO1xuLyoqXG4gKiBFbnRyeXBvaW50IGZvciBjb250ZXh0IEFQSVxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjb25zdCBjb250ZXh0ID0gQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC1hcGkuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js": +/*!*********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js ***! + \*********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopContextManager: () => (/* binding */ NoopContextManager)\n/* harmony export */ });\n/* harmony import */ var _context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nclass NoopContextManager {\n active() {\n return _context__WEBPACK_IMPORTED_MODULE_0__.ROOT_CONTEXT;\n }\n with(_context, fn, thisArg, ...args) {\n return fn.call(thisArg, ...args);\n }\n bind(_context, target) {\n return target;\n }\n enable() {\n return this;\n }\n disable() {\n return this;\n }\n}\n//# sourceMappingURL=NoopContextManager.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vY29udGV4dC9Ob29wQ29udGV4dE1hbmFnZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUN5QztBQUNsQztBQUNQO0FBQ0EsZUFBZSxrREFBWTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2NvbnRleHQvTm9vcENvbnRleHRNYW5hZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9jb250ZXh0JztcbmV4cG9ydCBjbGFzcyBOb29wQ29udGV4dE1hbmFnZXIge1xuICAgIGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIFJPT1RfQ09OVEVYVDtcbiAgICB9XG4gICAgd2l0aChfY29udGV4dCwgZm4sIHRoaXNBcmcsIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpc0FyZywgLi4uYXJncyk7XG4gICAgfVxuICAgIGJpbmQoX2NvbnRleHQsIHRhcmdldCkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob29wQ29udGV4dE1hbmFnZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ROOT_CONTEXT: () => (/* binding */ ROOT_CONTEXT),\n/* harmony export */ createContextKey: () => (/* binding */ createContextKey)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * Get a key to uniquely identify a context value\n *\n * @since 1.0.0\n */\nfunction createContextKey(description) {\n // The specification states that for the same input, multiple calls should\n // return different keys. Due to the nature of the JS dependency management\n // system, this creates problems where multiple versions of some package\n // could hold different keys for the same property.\n //\n // Therefore, we use Symbol.for which returns the same key for the same input.\n return Symbol.for(description);\n}\nclass BaseContext {\n /**\n * Construct a new context which inherits values from an optional parent context.\n *\n * @param parentContext a context from which to inherit values\n */\n constructor(parentContext) {\n // for minification\n const self = this;\n self._currentContext = parentContext ? new Map(parentContext) : new Map();\n self.getValue = (key) => self._currentContext.get(key);\n self.setValue = (key, value) => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.set(key, value);\n return context;\n };\n self.deleteValue = (key) => {\n const context = new BaseContext(self._currentContext);\n context._currentContext.delete(key);\n return context;\n };\n }\n}\n/**\n * The root context is used as the default parent context when there is no active context\n *\n * @since 1.0.0\n */\nconst ROOT_CONTEXT = new BaseContext();\n//# sourceMappingURL=context.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vY29udGV4dC9jb250ZXh0LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9jb250ZXh0L2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEdldCBhIGtleSB0byB1bmlxdWVseSBpZGVudGlmeSBhIGNvbnRleHQgdmFsdWVcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRLZXkoZGVzY3JpcHRpb24pIHtcbiAgICAvLyBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBmb3IgdGhlIHNhbWUgaW5wdXQsIG11bHRpcGxlIGNhbGxzIHNob3VsZFxuICAgIC8vIHJldHVybiBkaWZmZXJlbnQga2V5cy4gRHVlIHRvIHRoZSBuYXR1cmUgb2YgdGhlIEpTIGRlcGVuZGVuY3kgbWFuYWdlbWVudFxuICAgIC8vIHN5c3RlbSwgdGhpcyBjcmVhdGVzIHByb2JsZW1zIHdoZXJlIG11bHRpcGxlIHZlcnNpb25zIG9mIHNvbWUgcGFja2FnZVxuICAgIC8vIGNvdWxkIGhvbGQgZGlmZmVyZW50IGtleXMgZm9yIHRoZSBzYW1lIHByb3BlcnR5LlxuICAgIC8vXG4gICAgLy8gVGhlcmVmb3JlLCB3ZSB1c2UgU3ltYm9sLmZvciB3aGljaCByZXR1cm5zIHRoZSBzYW1lIGtleSBmb3IgdGhlIHNhbWUgaW5wdXQuXG4gICAgcmV0dXJuIFN5bWJvbC5mb3IoZGVzY3JpcHRpb24pO1xufVxuY2xhc3MgQmFzZUNvbnRleHQge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyBjb250ZXh0IHdoaWNoIGluaGVyaXRzIHZhbHVlcyBmcm9tIGFuIG9wdGlvbmFsIHBhcmVudCBjb250ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmVudENvbnRleHQgYSBjb250ZXh0IGZyb20gd2hpY2ggdG8gaW5oZXJpdCB2YWx1ZXNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIC8vIGZvciBtaW5pZmljYXRpb25cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuX2N1cnJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dCA/IG5ldyBNYXAocGFyZW50Q29udGV4dCkgOiBuZXcgTWFwKCk7XG4gICAgICAgIHNlbGYuZ2V0VmFsdWUgPSAoa2V5KSA9PiBzZWxmLl9jdXJyZW50Q29udGV4dC5nZXQoa2V5KTtcbiAgICAgICAgc2VsZi5zZXRWYWx1ZSA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEJhc2VDb250ZXh0KHNlbGYuX2N1cnJlbnRDb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRDb250ZXh0LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9O1xuICAgICAgICBzZWxmLmRlbGV0ZVZhbHVlID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBCYXNlQ29udGV4dChzZWxmLl9jdXJyZW50Q29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50Q29udGV4dC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogVGhlIHJvb3QgY29udGV4dCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhcmVudCBjb250ZXh0IHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbnRleHRcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IFJPT1RfQ09OVEVYVCA9IG5ldyBCYXNlQ29udGV4dCgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js": +/*!***************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js ***! + \***************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ diag: () => (/* binding */ diag)\n/* harmony export */ });\n/* harmony import */ var _api_diag__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/diag */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/diag.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for Diag API.\n * Defines Diagnostic handler used for internal diagnostic logging operations.\n * The default provides a Noop DiagLogger implementation which may be changed via the\n * diag.setLogger(logger: DiagLogger) function.\n *\n * @since 1.0.0\n */\nconst diag = _api_diag__WEBPACK_IMPORTED_MODULE_0__.DiagAPI.instance();\n//# sourceMappingURL=diag-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy1hcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGFBQWEsOENBQU87QUFDM0IiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2RpYWctYXBpLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLy8gU3BsaXQgbW9kdWxlLWxldmVsIHZhcmlhYmxlIGRlZmluaXRpb24gaW50byBzZXBhcmF0ZSBmaWxlcyB0byBhbGxvd1xuLy8gdHJlZS1zaGFraW5nIG9uIGVhY2ggYXBpIGluc3RhbmNlLlxuaW1wb3J0IHsgRGlhZ0FQSSB9IGZyb20gJy4vYXBpL2RpYWcnO1xuLyoqXG4gKiBFbnRyeXBvaW50IGZvciBEaWFnIEFQSS5cbiAqIERlZmluZXMgRGlhZ25vc3RpYyBoYW5kbGVyIHVzZWQgZm9yIGludGVybmFsIGRpYWdub3N0aWMgbG9nZ2luZyBvcGVyYXRpb25zLlxuICogVGhlIGRlZmF1bHQgcHJvdmlkZXMgYSBOb29wIERpYWdMb2dnZXIgaW1wbGVtZW50YXRpb24gd2hpY2ggbWF5IGJlIGNoYW5nZWQgdmlhIHRoZVxuICogZGlhZy5zZXRMb2dnZXIobG9nZ2VyOiBEaWFnTG9nZ2VyKSBmdW5jdGlvbi5cbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IGRpYWcgPSBEaWFnQVBJLmluc3RhbmNlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWFnLWFwaS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagComponentLogger: () => (/* binding */ DiagComponentLogger)\n/* harmony export */ });\n/* harmony import */ var _internal_global_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/global-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Component Logger which is meant to be used as part of any component which\n * will add automatically additional namespace in front of the log message.\n * It will then forward all message to global diag logger\n * @example\n * const cLogger = diag.createComponentLogger({ namespace: '@opentelemetry/instrumentation-http' });\n * cLogger.debug('test');\n * // @opentelemetry/instrumentation-http test\n */\nclass DiagComponentLogger {\n constructor(props) {\n this._namespace = props.namespace || 'DiagComponentLogger';\n }\n debug(...args) {\n return logProxy('debug', this._namespace, args);\n }\n error(...args) {\n return logProxy('error', this._namespace, args);\n }\n info(...args) {\n return logProxy('info', this._namespace, args);\n }\n warn(...args) {\n return logProxy('warn', this._namespace, args);\n }\n verbose(...args) {\n return logProxy('verbose', this._namespace, args);\n }\n}\nfunction logProxy(funcName, namespace, args) {\n const logger = (0,_internal_global_utils__WEBPACK_IMPORTED_MODULE_0__.getGlobal)('diag');\n // shortcut if logger not set\n if (!logger) {\n return;\n }\n return logger[funcName](namespace, ...args);\n}\n//# sourceMappingURL=ComponentLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9Db21wb25lbnRMb2dnZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGtEQUFrRDtBQUNsRztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUVBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2RpYWcvQ29tcG9uZW50TG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZ2V0R2xvYmFsIH0gZnJvbSAnLi4vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzJztcbi8qKlxuICogQ29tcG9uZW50IExvZ2dlciB3aGljaCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIHBhcnQgb2YgYW55IGNvbXBvbmVudCB3aGljaFxuICogd2lsbCBhZGQgYXV0b21hdGljYWxseSBhZGRpdGlvbmFsIG5hbWVzcGFjZSBpbiBmcm9udCBvZiB0aGUgbG9nIG1lc3NhZ2UuXG4gKiBJdCB3aWxsIHRoZW4gZm9yd2FyZCBhbGwgbWVzc2FnZSB0byBnbG9iYWwgZGlhZyBsb2dnZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjTG9nZ2VyID0gZGlhZy5jcmVhdGVDb21wb25lbnRMb2dnZXIoeyBuYW1lc3BhY2U6ICdAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cCcgfSk7XG4gKiBjTG9nZ2VyLmRlYnVnKCd0ZXN0Jyk7XG4gKiAvLyBAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cCB0ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBEaWFnQ29tcG9uZW50TG9nZ2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLl9uYW1lc3BhY2UgPSBwcm9wcy5uYW1lc3BhY2UgfHwgJ0RpYWdDb21wb25lbnRMb2dnZXInO1xuICAgIH1cbiAgICBkZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBsb2dQcm94eSgnZGVidWcnLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH1cbiAgICBlcnJvciguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBsb2dQcm94eSgnZXJyb3InLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH1cbiAgICBpbmZvKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGxvZ1Byb3h5KCdpbmZvJywgdGhpcy5fbmFtZXNwYWNlLCBhcmdzKTtcbiAgICB9XG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBsb2dQcm94eSgnd2FybicsIHRoaXMuX25hbWVzcGFjZSwgYXJncyk7XG4gICAgfVxuICAgIHZlcmJvc2UoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbG9nUHJveHkoJ3ZlcmJvc2UnLCB0aGlzLl9uYW1lc3BhY2UsIGFyZ3MpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxvZ1Byb3h5KGZ1bmNOYW1lLCBuYW1lc3BhY2UsIGFyZ3MpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRHbG9iYWwoJ2RpYWcnKTtcbiAgICAvLyBzaG9ydGN1dCBpZiBsb2dnZXIgbm90IHNldFxuICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlcltmdW5jTmFtZV0obmFtZXNwYWNlLCAuLi5hcmdzKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbXBvbmVudExvZ2dlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js": +/*!*************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js ***! + \*************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagConsoleLogger: () => (/* binding */ DiagConsoleLogger),\n/* harmony export */ _originalConsoleMethods: () => (/* binding */ _originalConsoleMethods)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nconst consoleMap = [\n { n: 'error', c: 'error' },\n { n: 'warn', c: 'warn' },\n { n: 'info', c: 'info' },\n { n: 'debug', c: 'debug' },\n { n: 'verbose', c: 'trace' },\n];\n// Save original console methods at module load time, before any instrumentation\n// can wrap them. This ensures DiagConsoleLogger calls the unwrapped originals.\n// Exported for testing only — not part of the public API.\nconst _originalConsoleMethods = {};\nif (typeof console !== 'undefined') {\n const keys = [\n 'error',\n 'warn',\n 'info',\n 'debug',\n 'trace',\n 'log',\n ];\n for (const key of keys) {\n // eslint-disable-next-line no-console\n if (typeof console[key] === 'function') {\n // eslint-disable-next-line no-console\n _originalConsoleMethods[key] = console[key];\n }\n }\n}\n/**\n * A simple Immutable Console based diagnostic logger which will output any messages to the Console.\n * If you want to limit the amount of logging to a specific level or lower use the\n * {@link createLogLevelDiagLogger}\n *\n * @since 1.0.0\n */\nclass DiagConsoleLogger {\n constructor() {\n function _consoleFunc(funcName) {\n return function (...args) {\n // Prefer original (pre-instrumentation) methods saved at module load time.\n let theFunc = _originalConsoleMethods[funcName];\n // Some environments only expose the console when the F12 developer console is open\n if (typeof theFunc !== 'function') {\n theFunc = _originalConsoleMethods['log'];\n }\n // Fall back in case console was not available at module load time but became available later.\n if (typeof theFunc !== 'function' && console) {\n // eslint-disable-next-line no-console\n theFunc = console[funcName];\n if (typeof theFunc !== 'function') {\n // eslint-disable-next-line no-console\n theFunc = console.log;\n }\n }\n if (typeof theFunc === 'function') {\n return theFunc.apply(console, args);\n }\n };\n }\n for (let i = 0; i < consoleMap.length; i++) {\n this[consoleMap[i].n] = _consoleFunc(consoleMap[i].c);\n }\n }\n}\n//# sourceMappingURL=consoleLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9jb25zb2xlTG9nZ2VyLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sMEJBQTBCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9jb25zb2xlTG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuY29uc3QgY29uc29sZU1hcCA9IFtcbiAgICB7IG46ICdlcnJvcicsIGM6ICdlcnJvcicgfSxcbiAgICB7IG46ICd3YXJuJywgYzogJ3dhcm4nIH0sXG4gICAgeyBuOiAnaW5mbycsIGM6ICdpbmZvJyB9LFxuICAgIHsgbjogJ2RlYnVnJywgYzogJ2RlYnVnJyB9LFxuICAgIHsgbjogJ3ZlcmJvc2UnLCBjOiAndHJhY2UnIH0sXG5dO1xuLy8gU2F2ZSBvcmlnaW5hbCBjb25zb2xlIG1ldGhvZHMgYXQgbW9kdWxlIGxvYWQgdGltZSwgYmVmb3JlIGFueSBpbnN0cnVtZW50YXRpb25cbi8vIGNhbiB3cmFwIHRoZW0uIFRoaXMgZW5zdXJlcyBEaWFnQ29uc29sZUxvZ2dlciBjYWxscyB0aGUgdW53cmFwcGVkIG9yaWdpbmFscy5cbi8vIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkg4oCUIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLlxuZXhwb3J0IGNvbnN0IF9vcmlnaW5hbENvbnNvbGVNZXRob2RzID0ge307XG5pZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgJ3dhcm4nLFxuICAgICAgICAnaW5mbycsXG4gICAgICAgICdkZWJ1ZycsXG4gICAgICAgICd0cmFjZScsXG4gICAgICAgICdsb2cnLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGVba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIF9vcmlnaW5hbENvbnNvbGVNZXRob2RzW2tleV0gPSBjb25zb2xlW2tleV07XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgc2ltcGxlIEltbXV0YWJsZSBDb25zb2xlIGJhc2VkIGRpYWdub3N0aWMgbG9nZ2VyIHdoaWNoIHdpbGwgb3V0cHV0IGFueSBtZXNzYWdlcyB0byB0aGUgQ29uc29sZS5cbiAqIElmIHlvdSB3YW50IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgbG9nZ2luZyB0byBhIHNwZWNpZmljIGxldmVsIG9yIGxvd2VyIHVzZSB0aGVcbiAqIHtAbGluayBjcmVhdGVMb2dMZXZlbERpYWdMb2dnZXJ9XG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjbGFzcyBEaWFnQ29uc29sZUxvZ2dlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGZ1bmN0aW9uIF9jb25zb2xlRnVuYyhmdW5jTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJlZmVyIG9yaWdpbmFsIChwcmUtaW5zdHJ1bWVudGF0aW9uKSBtZXRob2RzIHNhdmVkIGF0IG1vZHVsZSBsb2FkIHRpbWUuXG4gICAgICAgICAgICAgICAgbGV0IHRoZUZ1bmMgPSBfb3JpZ2luYWxDb25zb2xlTWV0aG9kc1tmdW5jTmFtZV07XG4gICAgICAgICAgICAgICAgLy8gU29tZSBlbnZpcm9ubWVudHMgb25seSBleHBvc2UgdGhlIGNvbnNvbGUgd2hlbiB0aGUgRjEyIGRldmVsb3BlciBjb25zb2xlIGlzIG9wZW5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoZUZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhlRnVuYyA9IF9vcmlnaW5hbENvbnNvbGVNZXRob2RzWydsb2cnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIGluIGNhc2UgY29uc29sZSB3YXMgbm90IGF2YWlsYWJsZSBhdCBtb2R1bGUgbG9hZCB0aW1lIGJ1dCBiZWNhbWUgYXZhaWxhYmxlIGxhdGVyLlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlRnVuYyAhPT0gJ2Z1bmN0aW9uJyAmJiBjb25zb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIHRoZUZ1bmMgPSBjb25zb2xlW2Z1bmNOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGVGdW5jICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhlRnVuYyA9IGNvbnNvbGUubG9nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlRnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlRnVuYy5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uc29sZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1tjb25zb2xlTWFwW2ldLm5dID0gX2NvbnNvbGVGdW5jKGNvbnNvbGVNYXBbaV0uYyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zb2xlTG9nZ2VyLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js": +/*!***********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js ***! + \***********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createLogLevelDiagLogger: () => (/* binding */ createLogLevelDiagLogger)\n/* harmony export */ });\n/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nfunction createLogLevelDiagLogger(maxLevel, logger) {\n if (maxLevel < _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.NONE) {\n maxLevel = _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.NONE;\n }\n else if (maxLevel > _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.ALL) {\n maxLevel = _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.ALL;\n }\n // In case the logger is null or undefined\n logger = logger || {};\n function _filterFunc(funcName, theLevel) {\n const theFunc = logger[funcName];\n if (typeof theFunc === 'function' && maxLevel >= theLevel) {\n return theFunc.bind(logger);\n }\n return function () { };\n }\n return {\n error: _filterFunc('error', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.ERROR),\n warn: _filterFunc('warn', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.WARN),\n info: _filterFunc('info', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.INFO),\n debug: _filterFunc('debug', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.DEBUG),\n verbose: _filterFunc('verbose', _types__WEBPACK_IMPORTED_MODULE_0__.DiagLogLevel.VERBOSE),\n };\n}\n//# sourceMappingURL=logLevelLogger.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy9pbnRlcm5hbC9sb2dMZXZlbExvZ2dlci5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dDO0FBQ2pDO0FBQ1AsbUJBQW1CLGdEQUFZO0FBQy9CLG1CQUFtQixnREFBWTtBQUMvQjtBQUNBLHdCQUF3QixnREFBWTtBQUNwQyxtQkFBbUIsZ0RBQVk7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxnREFBWTtBQUNoRCxrQ0FBa0MsZ0RBQVk7QUFDOUMsa0NBQWtDLGdEQUFZO0FBQzlDLG9DQUFvQyxnREFBWTtBQUNoRCx3Q0FBd0MsZ0RBQVk7QUFDcEQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9kaWFnL2ludGVybmFsL2xvZ0xldmVsTG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGlhZ0xvZ0xldmVsIH0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ0xldmVsRGlhZ0xvZ2dlcihtYXhMZXZlbCwgbG9nZ2VyKSB7XG4gICAgaWYgKG1heExldmVsIDwgRGlhZ0xvZ0xldmVsLk5PTkUpIHtcbiAgICAgICAgbWF4TGV2ZWwgPSBEaWFnTG9nTGV2ZWwuTk9ORTtcbiAgICB9XG4gICAgZWxzZSBpZiAobWF4TGV2ZWwgPiBEaWFnTG9nTGV2ZWwuQUxMKSB7XG4gICAgICAgIG1heExldmVsID0gRGlhZ0xvZ0xldmVsLkFMTDtcbiAgICB9XG4gICAgLy8gSW4gY2FzZSB0aGUgbG9nZ2VyIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgbG9nZ2VyID0gbG9nZ2VyIHx8IHt9O1xuICAgIGZ1bmN0aW9uIF9maWx0ZXJGdW5jKGZ1bmNOYW1lLCB0aGVMZXZlbCkge1xuICAgICAgICBjb25zdCB0aGVGdW5jID0gbG9nZ2VyW2Z1bmNOYW1lXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGVGdW5jID09PSAnZnVuY3Rpb24nICYmIG1heExldmVsID49IHRoZUxldmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlRnVuYy5iaW5kKGxvZ2dlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IF9maWx0ZXJGdW5jKCdlcnJvcicsIERpYWdMb2dMZXZlbC5FUlJPUiksXG4gICAgICAgIHdhcm46IF9maWx0ZXJGdW5jKCd3YXJuJywgRGlhZ0xvZ0xldmVsLldBUk4pLFxuICAgICAgICBpbmZvOiBfZmlsdGVyRnVuYygnaW5mbycsIERpYWdMb2dMZXZlbC5JTkZPKSxcbiAgICAgICAgZGVidWc6IF9maWx0ZXJGdW5jKCdkZWJ1ZycsIERpYWdMb2dMZXZlbC5ERUJVRyksXG4gICAgICAgIHZlcmJvc2U6IF9maWx0ZXJGdW5jKCd2ZXJib3NlJywgRGlhZ0xvZ0xldmVsLlZFUkJPU0UpLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dMZXZlbExvZ2dlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js": +/*!*****************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js ***! + \*****************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagLogLevel: () => (/* binding */ DiagLogLevel)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * Defines the available internal logging levels for the diagnostic logger, the numeric values\n * of the levels are defined to match the original values from the initial LogLevel to avoid\n * compatibility/migration issues for any implementation that assume the numeric ordering.\n */\nvar DiagLogLevel;\n(function (DiagLogLevel) {\n /** Diagnostic Logging level setting to disable all logging (except and forced logs) */\n DiagLogLevel[DiagLogLevel[\"NONE\"] = 0] = \"NONE\";\n /** Identifies an error scenario */\n DiagLogLevel[DiagLogLevel[\"ERROR\"] = 30] = \"ERROR\";\n /** Identifies a warning scenario */\n DiagLogLevel[DiagLogLevel[\"WARN\"] = 50] = \"WARN\";\n /** General informational log message */\n DiagLogLevel[DiagLogLevel[\"INFO\"] = 60] = \"INFO\";\n /** General debug log message */\n DiagLogLevel[DiagLogLevel[\"DEBUG\"] = 70] = \"DEBUG\";\n /**\n * Detailed trace level logging should only be used for development, should only be set\n * in a development environment.\n */\n DiagLogLevel[DiagLogLevel[\"VERBOSE\"] = 80] = \"VERBOSE\";\n /** Used to set the logging level to include all logging */\n DiagLogLevel[DiagLogLevel[\"ALL\"] = 9999] = \"ALL\";\n})(DiagLogLevel || (DiagLogLevel = {}));\n//# sourceMappingURL=types.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy90eXBlcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG9DQUFvQztBQUNyQyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vZGlhZy90eXBlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogRGVmaW5lcyB0aGUgYXZhaWxhYmxlIGludGVybmFsIGxvZ2dpbmcgbGV2ZWxzIGZvciB0aGUgZGlhZ25vc3RpYyBsb2dnZXIsIHRoZSBudW1lcmljIHZhbHVlc1xuICogb2YgdGhlIGxldmVscyBhcmUgZGVmaW5lZCB0byBtYXRjaCB0aGUgb3JpZ2luYWwgdmFsdWVzIGZyb20gdGhlIGluaXRpYWwgTG9nTGV2ZWwgdG8gYXZvaWRcbiAqIGNvbXBhdGliaWxpdHkvbWlncmF0aW9uIGlzc3VlcyBmb3IgYW55IGltcGxlbWVudGF0aW9uIHRoYXQgYXNzdW1lIHRoZSBudW1lcmljIG9yZGVyaW5nLlxuICovXG5leHBvcnQgdmFyIERpYWdMb2dMZXZlbDtcbihmdW5jdGlvbiAoRGlhZ0xvZ0xldmVsKSB7XG4gICAgLyoqIERpYWdub3N0aWMgTG9nZ2luZyBsZXZlbCBzZXR0aW5nIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcgKGV4Y2VwdCBhbmQgZm9yY2VkIGxvZ3MpICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIC8qKiBJZGVudGlmaWVzIGFuIGVycm9yIHNjZW5hcmlvICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIkVSUk9SXCJdID0gMzBdID0gXCJFUlJPUlwiO1xuICAgIC8qKiBJZGVudGlmaWVzIGEgd2FybmluZyBzY2VuYXJpbyAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJXQVJOXCJdID0gNTBdID0gXCJXQVJOXCI7XG4gICAgLyoqIEdlbmVyYWwgaW5mb3JtYXRpb25hbCBsb2cgbWVzc2FnZSAqL1xuICAgIERpYWdMb2dMZXZlbFtEaWFnTG9nTGV2ZWxbXCJJTkZPXCJdID0gNjBdID0gXCJJTkZPXCI7XG4gICAgLyoqIEdlbmVyYWwgZGVidWcgbG9nIG1lc3NhZ2UgKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiREVCVUdcIl0gPSA3MF0gPSBcIkRFQlVHXCI7XG4gICAgLyoqXG4gICAgICogRGV0YWlsZWQgdHJhY2UgbGV2ZWwgbG9nZ2luZyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCwgc2hvdWxkIG9ubHkgYmUgc2V0XG4gICAgICogaW4gYSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC5cbiAgICAgKi9cbiAgICBEaWFnTG9nTGV2ZWxbRGlhZ0xvZ0xldmVsW1wiVkVSQk9TRVwiXSA9IDgwXSA9IFwiVkVSQk9TRVwiO1xuICAgIC8qKiBVc2VkIHRvIHNldCB0aGUgbG9nZ2luZyBsZXZlbCB0byBpbmNsdWRlIGFsbCBsb2dnaW5nICovXG4gICAgRGlhZ0xvZ0xldmVsW0RpYWdMb2dMZXZlbFtcIkFMTFwiXSA9IDk5OTldID0gXCJBTExcIjtcbn0pKERpYWdMb2dMZXZlbCB8fCAoRGlhZ0xvZ0xldmVsID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js": +/*!************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js ***! + \************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ DiagConsoleLogger: () => (/* reexport safe */ _diag_consoleLogger__WEBPACK_IMPORTED_MODULE_2__.DiagConsoleLogger),\n/* harmony export */ DiagLogLevel: () => (/* reexport safe */ _diag_types__WEBPACK_IMPORTED_MODULE_3__.DiagLogLevel),\n/* harmony export */ INVALID_SPANID: () => (/* reexport safe */ _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__.INVALID_SPANID),\n/* harmony export */ INVALID_SPAN_CONTEXT: () => (/* reexport safe */ _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__.INVALID_SPAN_CONTEXT),\n/* harmony export */ INVALID_TRACEID: () => (/* reexport safe */ _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__.INVALID_TRACEID),\n/* harmony export */ ProxyTracer: () => (/* reexport safe */ _trace_ProxyTracer__WEBPACK_IMPORTED_MODULE_7__.ProxyTracer),\n/* harmony export */ ProxyTracerProvider: () => (/* reexport safe */ _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_8__.ProxyTracerProvider),\n/* harmony export */ ROOT_CONTEXT: () => (/* reexport safe */ _context_context__WEBPACK_IMPORTED_MODULE_1__.ROOT_CONTEXT),\n/* harmony export */ SamplingDecision: () => (/* reexport safe */ _trace_SamplingResult__WEBPACK_IMPORTED_MODULE_9__.SamplingDecision),\n/* harmony export */ SpanKind: () => (/* reexport safe */ _trace_span_kind__WEBPACK_IMPORTED_MODULE_10__.SpanKind),\n/* harmony export */ SpanStatusCode: () => (/* reexport safe */ _trace_status__WEBPACK_IMPORTED_MODULE_11__.SpanStatusCode),\n/* harmony export */ TraceFlags: () => (/* reexport safe */ _trace_trace_flags__WEBPACK_IMPORTED_MODULE_12__.TraceFlags),\n/* harmony export */ ValueType: () => (/* reexport safe */ _metrics_Metric__WEBPACK_IMPORTED_MODULE_5__.ValueType),\n/* harmony export */ baggageEntryMetadataFromString: () => (/* reexport safe */ _baggage_utils__WEBPACK_IMPORTED_MODULE_0__.baggageEntryMetadataFromString),\n/* harmony export */ context: () => (/* reexport safe */ _context_api__WEBPACK_IMPORTED_MODULE_16__.context),\n/* harmony export */ createContextKey: () => (/* reexport safe */ _context_context__WEBPACK_IMPORTED_MODULE_1__.createContextKey),\n/* harmony export */ createNoopMeter: () => (/* reexport safe */ _metrics_NoopMeter__WEBPACK_IMPORTED_MODULE_4__.createNoopMeter),\n/* harmony export */ createTraceState: () => (/* reexport safe */ _trace_internal_utils__WEBPACK_IMPORTED_MODULE_13__.createTraceState),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ defaultTextMapGetter: () => (/* reexport safe */ _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_6__.defaultTextMapGetter),\n/* harmony export */ defaultTextMapSetter: () => (/* reexport safe */ _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_6__.defaultTextMapSetter),\n/* harmony export */ diag: () => (/* reexport safe */ _diag_api__WEBPACK_IMPORTED_MODULE_17__.diag),\n/* harmony export */ isSpanContextValid: () => (/* reexport safe */ _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__.isSpanContextValid),\n/* harmony export */ isValidSpanId: () => (/* reexport safe */ _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__.isValidSpanId),\n/* harmony export */ isValidTraceId: () => (/* reexport safe */ _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__.isValidTraceId),\n/* harmony export */ metrics: () => (/* reexport safe */ _metrics_api__WEBPACK_IMPORTED_MODULE_18__.metrics),\n/* harmony export */ propagation: () => (/* reexport safe */ _propagation_api__WEBPACK_IMPORTED_MODULE_19__.propagation),\n/* harmony export */ trace: () => (/* reexport safe */ _trace_api__WEBPACK_IMPORTED_MODULE_20__.trace)\n/* harmony export */ });\n/* harmony import */ var _baggage_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./baggage/utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/utils.js\");\n/* harmony import */ var _context_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./context/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/* harmony import */ var _diag_consoleLogger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./diag/consoleLogger */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/consoleLogger.js\");\n/* harmony import */ var _diag_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./diag/types */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag/types.js\");\n/* harmony import */ var _metrics_NoopMeter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./metrics/NoopMeter */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js\");\n/* harmony import */ var _metrics_Metric__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./metrics/Metric */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js\");\n/* harmony import */ var _propagation_TextMapPropagator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./propagation/TextMapPropagator */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js\");\n/* harmony import */ var _trace_ProxyTracer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./trace/ProxyTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\");\n/* harmony import */ var _trace_ProxyTracerProvider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./trace/ProxyTracerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\");\n/* harmony import */ var _trace_SamplingResult__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./trace/SamplingResult */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js\");\n/* harmony import */ var _trace_span_kind__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./trace/span_kind */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js\");\n/* harmony import */ var _trace_status__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./trace/status */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js\");\n/* harmony import */ var _trace_trace_flags__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./trace/trace_flags */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\");\n/* harmony import */ var _trace_internal_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./trace/internal/utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js\");\n/* harmony import */ var _trace_spancontext_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./trace/spancontext-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\");\n/* harmony import */ var _trace_invalid_span_constants__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./trace/invalid-span-constants */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\");\n/* harmony import */ var _context_api__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./context-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context-api.js\");\n/* harmony import */ var _diag_api__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./diag-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/diag-api.js\");\n/* harmony import */ var _metrics_api__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./metrics-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js\");\n/* harmony import */ var _propagation_api__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./propagation-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js\");\n/* harmony import */ var _trace_api__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./trace-api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Context APIs\n\n// Diag APIs\n\n\n// Metrics APIs\n\n\n// Propagation APIs\n\n\n// TODO: Remove ProxyTracerProvider export in the next major version.\n\n\n\n\n\n\n\n\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n\n\n\n\n// Named export.\n\n// Default export.\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n context: _context_api__WEBPACK_IMPORTED_MODULE_16__.context,\n diag: _diag_api__WEBPACK_IMPORTED_MODULE_17__.diag,\n metrics: _metrics_api__WEBPACK_IMPORTED_MODULE_18__.metrics,\n propagation: _propagation_api__WEBPACK_IMPORTED_MODULE_19__.propagation,\n trace: _trace_api__WEBPACK_IMPORTED_MODULE_20__.trace,\n});\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ2lFO0FBQ2pFO0FBQ21FO0FBQ25FO0FBQ3lEO0FBQ2I7QUFDNUM7QUFDc0Q7QUFDVDtBQUM3QztBQUM4RjtBQUM1QztBQUNsRDtBQUNrRTtBQUNSO0FBQ2I7QUFDRztBQUNDO0FBQ1M7QUFDcUM7QUFDUztBQUN4RztBQUNBO0FBQ3dDO0FBQ047QUFDTTtBQUNRO0FBQ1o7QUFDcEM7QUFDc0Q7QUFDdEQ7QUFDQSxpRUFBZTtBQUNmLFdBQVc7QUFDWCxRQUFRO0FBQ1IsV0FBVztBQUNYLGVBQWU7QUFDZixTQUFTO0FBQ1QsQ0FBQyxFQUFDO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHsgYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nIH0gZnJvbSAnLi9iYWdnYWdlL3V0aWxzJztcbi8vIENvbnRleHQgQVBJc1xuZXhwb3J0IHsgY3JlYXRlQ29udGV4dEtleSwgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9jb250ZXh0L2NvbnRleHQnO1xuLy8gRGlhZyBBUElzXG5leHBvcnQgeyBEaWFnQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vZGlhZy9jb25zb2xlTG9nZ2VyJztcbmV4cG9ydCB7IERpYWdMb2dMZXZlbCB9IGZyb20gJy4vZGlhZy90eXBlcyc7XG4vLyBNZXRyaWNzIEFQSXNcbmV4cG9ydCB7IGNyZWF0ZU5vb3BNZXRlciB9IGZyb20gJy4vbWV0cmljcy9Ob29wTWV0ZXInO1xuZXhwb3J0IHsgVmFsdWVUeXBlIH0gZnJvbSAnLi9tZXRyaWNzL01ldHJpYyc7XG4vLyBQcm9wYWdhdGlvbiBBUElzXG5leHBvcnQgeyBkZWZhdWx0VGV4dE1hcEdldHRlciwgZGVmYXVsdFRleHRNYXBTZXR0ZXIsIH0gZnJvbSAnLi9wcm9wYWdhdGlvbi9UZXh0TWFwUHJvcGFnYXRvcic7XG5leHBvcnQgeyBQcm94eVRyYWNlciB9IGZyb20gJy4vdHJhY2UvUHJveHlUcmFjZXInO1xuLy8gVE9ETzogUmVtb3ZlIFByb3h5VHJhY2VyUHJvdmlkZXIgZXhwb3J0IGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG5leHBvcnQgeyBQcm94eVRyYWNlclByb3ZpZGVyIH0gZnJvbSAnLi90cmFjZS9Qcm94eVRyYWNlclByb3ZpZGVyJztcbmV4cG9ydCB7IFNhbXBsaW5nRGVjaXNpb24gfSBmcm9tICcuL3RyYWNlL1NhbXBsaW5nUmVzdWx0JztcbmV4cG9ydCB7IFNwYW5LaW5kIH0gZnJvbSAnLi90cmFjZS9zcGFuX2tpbmQnO1xuZXhwb3J0IHsgU3BhblN0YXR1c0NvZGUgfSBmcm9tICcuL3RyYWNlL3N0YXR1cyc7XG5leHBvcnQgeyBUcmFjZUZsYWdzIH0gZnJvbSAnLi90cmFjZS90cmFjZV9mbGFncyc7XG5leHBvcnQgeyBjcmVhdGVUcmFjZVN0YXRlIH0gZnJvbSAnLi90cmFjZS9pbnRlcm5hbC91dGlscyc7XG5leHBvcnQgeyBpc1NwYW5Db250ZXh0VmFsaWQsIGlzVmFsaWRUcmFjZUlkLCBpc1ZhbGlkU3BhbklkLCB9IGZyb20gJy4vdHJhY2Uvc3BhbmNvbnRleHQtdXRpbHMnO1xuZXhwb3J0IHsgSU5WQUxJRF9TUEFOSUQsIElOVkFMSURfVFJBQ0VJRCwgSU5WQUxJRF9TUEFOX0NPTlRFWFQsIH0gZnJvbSAnLi90cmFjZS9pbnZhbGlkLXNwYW4tY29uc3RhbnRzJztcbi8vIFNwbGl0IG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBkZWZpbml0aW9uIGludG8gc2VwYXJhdGUgZmlsZXMgdG8gYWxsb3dcbi8vIHRyZWUtc2hha2luZyBvbiBlYWNoIGFwaSBpbnN0YW5jZS5cbmltcG9ydCB7IGNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQtYXBpJztcbmltcG9ydCB7IGRpYWcgfSBmcm9tICcuL2RpYWctYXBpJztcbmltcG9ydCB7IG1ldHJpY3MgfSBmcm9tICcuL21ldHJpY3MtYXBpJztcbmltcG9ydCB7IHByb3BhZ2F0aW9uIH0gZnJvbSAnLi9wcm9wYWdhdGlvbi1hcGknO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tICcuL3RyYWNlLWFwaSc7XG4vLyBOYW1lZCBleHBvcnQuXG5leHBvcnQgeyBjb250ZXh0LCBkaWFnLCBtZXRyaWNzLCBwcm9wYWdhdGlvbiwgdHJhY2UgfTtcbi8vIERlZmF1bHQgZXhwb3J0LlxuZXhwb3J0IGRlZmF1bHQge1xuICAgIGNvbnRleHQsXG4gICAgZGlhZyxcbiAgICBtZXRyaWNzLFxuICAgIHByb3BhZ2F0aW9uLFxuICAgIHRyYWNlLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js": +/*!****************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js ***! + \****************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getGlobal: () => (/* binding */ getGlobal),\n/* harmony export */ registerGlobal: () => (/* binding */ registerGlobal),\n/* harmony export */ unregisterGlobal: () => (/* binding */ unregisterGlobal)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../version */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js\");\n/* harmony import */ var _semver__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./semver */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\nconst major = _version__WEBPACK_IMPORTED_MODULE_0__.VERSION.split('.')[0];\nconst GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for(`opentelemetry.js.api.${major}`);\nconst _global = (typeof globalThis === 'object'\n ? globalThis\n : typeof self === 'object'\n ? self\n : typeof window === 'object'\n ? window\n : typeof global === 'object'\n ? global\n : {});\nfunction registerGlobal(type, instance, diag, allowOverride = false) {\n var _a;\n const api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) !== null && _a !== void 0 ? _a : {\n version: _version__WEBPACK_IMPORTED_MODULE_0__.VERSION,\n });\n if (!allowOverride && api[type]) {\n // already registered an API of this type\n const err = new Error(`@opentelemetry/api: Attempted duplicate registration of API: ${type}`);\n diag.error(err.stack || err.message);\n return false;\n }\n if (api.version !== _version__WEBPACK_IMPORTED_MODULE_0__.VERSION) {\n // All registered APIs must be of the same version exactly\n const err = new Error(`@opentelemetry/api: Registration of version v${api.version} for ${type} does not match previously registered API v${_version__WEBPACK_IMPORTED_MODULE_0__.VERSION}`);\n diag.error(err.stack || err.message);\n return false;\n }\n api[type] = instance;\n diag.debug(`@opentelemetry/api: Registered a global for ${type} v${_version__WEBPACK_IMPORTED_MODULE_0__.VERSION}.`);\n return true;\n}\nfunction getGlobal(type) {\n var _a, _b;\n const globalVersion = (_a = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _a === void 0 ? void 0 : _a.version;\n if (!globalVersion || !(0,_semver__WEBPACK_IMPORTED_MODULE_1__.isCompatible)(globalVersion)) {\n return;\n }\n return (_b = _global[GLOBAL_OPENTELEMETRY_API_KEY]) === null || _b === void 0 ? void 0 : _b[type];\n}\nfunction unregisterGlobal(type, diag) {\n diag.debug(`@opentelemetry/api: Unregistering a global for ${type} v${_version__WEBPACK_IMPORTED_MODULE_0__.VERSION}.`);\n const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n if (api) {\n delete api[type];\n }\n}\n//# sourceMappingURL=global-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDcUM7QUFDRztBQUN4QyxjQUFjLDZDQUFPO0FBQ3JCLHdFQUF3RSxNQUFNO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDYjtBQUNQO0FBQ0E7QUFDQSxpQkFBaUIsNkNBQU87QUFDeEIsS0FBSztBQUNMO0FBQ0E7QUFDQSw4RkFBOEYsS0FBSztBQUNuRztBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNkNBQU87QUFDL0I7QUFDQSw4RUFBOEUsYUFBYSxNQUFNLE1BQU0sNENBQTRDLDZDQUFPLENBQUM7QUFDM0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsTUFBTSxHQUFHLDZDQUFPLENBQUM7QUFDL0U7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLDJCQUEyQixxREFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsaUVBQWlFLE1BQU0sR0FBRyw2Q0FBTyxDQUFDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW50ZXJuYWwvZ2xvYmFsLXV0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuaW1wb3J0IHsgaXNDb21wYXRpYmxlIH0gZnJvbSAnLi9zZW12ZXInO1xuY29uc3QgbWFqb3IgPSBWRVJTSU9OLnNwbGl0KCcuJylbMF07XG5jb25zdCBHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZID0gU3ltYm9sLmZvcihgb3BlbnRlbGVtZXRyeS5qcy5hcGkuJHttYWpvcn1gKTtcbmNvbnN0IF9nbG9iYWwgPSAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnXG4gICAgPyBnbG9iYWxUaGlzXG4gICAgOiB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBzZWxmXG4gICAgICAgIDogdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgID8gd2luZG93XG4gICAgICAgICAgICA6IHR5cGVvZiBnbG9iYWwgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyBnbG9iYWxcbiAgICAgICAgICAgICAgICA6IHt9KTtcbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlckdsb2JhbCh0eXBlLCBpbnN0YW5jZSwgZGlhZywgYWxsb3dPdmVycmlkZSA9IGZhbHNlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGFwaSA9IChfZ2xvYmFsW0dMT0JBTF9PUEVOVEVMRU1FVFJZX0FQSV9LRVldID0gKF9hID0gX2dsb2JhbFtHTE9CQUxfT1BFTlRFTEVNRVRSWV9BUElfS0VZXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge1xuICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgIH0pO1xuICAgIGlmICghYWxsb3dPdmVycmlkZSAmJiBhcGlbdHlwZV0pIHtcbiAgICAgICAgLy8gYWxyZWFkeSByZWdpc3RlcmVkIGFuIEFQSSBvZiB0aGlzIHR5cGVcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBAb3BlbnRlbGVtZXRyeS9hcGk6IEF0dGVtcHRlZCBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uIG9mIEFQSTogJHt0eXBlfWApO1xuICAgICAgICBkaWFnLmVycm9yKGVyci5zdGFjayB8fCBlcnIubWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFwaS52ZXJzaW9uICE9PSBWRVJTSU9OKSB7XG4gICAgICAgIC8vIEFsbCByZWdpc3RlcmVkIEFQSXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB2ZXJzaW9uIGV4YWN0bHlcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBAb3BlbnRlbGVtZXRyeS9hcGk6IFJlZ2lzdHJhdGlvbiBvZiB2ZXJzaW9uIHYke2FwaS52ZXJzaW9ufSBmb3IgJHt0eXBlfSBkb2VzIG5vdCBtYXRjaCBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgQVBJIHYke1ZFUlNJT059YCk7XG4gICAgICAgIGRpYWcuZXJyb3IoZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhcGlbdHlwZV0gPSBpbnN0YW5jZTtcbiAgICBkaWFnLmRlYnVnKGBAb3BlbnRlbGVtZXRyeS9hcGk6IFJlZ2lzdGVyZWQgYSBnbG9iYWwgZm9yICR7dHlwZX0gdiR7VkVSU0lPTn0uYCk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsKHR5cGUpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IGdsb2JhbFZlcnNpb24gPSAoX2EgPSBfZ2xvYmFsW0dMT0JBTF9PUEVOVEVMRU1FVFJZX0FQSV9LRVldKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudmVyc2lvbjtcbiAgICBpZiAoIWdsb2JhbFZlcnNpb24gfHwgIWlzQ29tcGF0aWJsZShnbG9iYWxWZXJzaW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiAoX2IgPSBfZ2xvYmFsW0dMT0JBTF9PUEVOVEVMRU1FVFJZX0FQSV9LRVldKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2JbdHlwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3Rlckdsb2JhbCh0eXBlLCBkaWFnKSB7XG4gICAgZGlhZy5kZWJ1ZyhgQG9wZW50ZWxlbWV0cnkvYXBpOiBVbnJlZ2lzdGVyaW5nIGEgZ2xvYmFsIGZvciAke3R5cGV9IHYke1ZFUlNJT059LmApO1xuICAgIGNvbnN0IGFwaSA9IF9nbG9iYWxbR0xPQkFMX09QRU5URUxFTUVUUllfQVBJX0tFWV07XG4gICAgaWYgKGFwaSkge1xuICAgICAgICBkZWxldGUgYXBpW3R5cGVdO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2JhbC11dGlscy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ _makeCompatibilityCheck: () => (/* binding */ _makeCompatibilityCheck),\n/* harmony export */ isCompatible: () => (/* binding */ isCompatible)\n/* harmony export */ });\n/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../version */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nconst re = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(.+))?$/;\n/**\n * Create a function to test an API version to see if it is compatible with the provided ownVersion.\n *\n * The returned function has the following semantics:\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param ownVersion version which should be checked against\n */\nfunction _makeCompatibilityCheck(ownVersion) {\n const acceptedVersions = new Set([ownVersion]);\n const rejectedVersions = new Set();\n const myVersionMatch = ownVersion.match(re);\n if (!myVersionMatch) {\n // we cannot guarantee compatibility so we always return noop\n return () => false;\n }\n const ownVersionParsed = {\n major: +myVersionMatch[1],\n minor: +myVersionMatch[2],\n patch: +myVersionMatch[3],\n prerelease: myVersionMatch[4],\n };\n // if ownVersion has a prerelease tag, versions must match exactly\n if (ownVersionParsed.prerelease != null) {\n return function isExactmatch(globalVersion) {\n return globalVersion === ownVersion;\n };\n }\n function _reject(v) {\n rejectedVersions.add(v);\n return false;\n }\n function _accept(v) {\n acceptedVersions.add(v);\n return true;\n }\n return function isCompatible(globalVersion) {\n if (acceptedVersions.has(globalVersion)) {\n return true;\n }\n if (rejectedVersions.has(globalVersion)) {\n return false;\n }\n const globalVersionMatch = globalVersion.match(re);\n if (!globalVersionMatch) {\n // cannot parse other version\n // we cannot guarantee compatibility so we always noop\n return _reject(globalVersion);\n }\n const globalVersionParsed = {\n major: +globalVersionMatch[1],\n minor: +globalVersionMatch[2],\n patch: +globalVersionMatch[3],\n prerelease: globalVersionMatch[4],\n };\n // if globalVersion has a prerelease tag, versions must match exactly\n if (globalVersionParsed.prerelease != null) {\n return _reject(globalVersion);\n }\n // major versions must match\n if (ownVersionParsed.major !== globalVersionParsed.major) {\n return _reject(globalVersion);\n }\n if (ownVersionParsed.major === 0) {\n if (ownVersionParsed.minor === globalVersionParsed.minor &&\n ownVersionParsed.patch <= globalVersionParsed.patch) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n }\n if (ownVersionParsed.minor <= globalVersionParsed.minor) {\n return _accept(globalVersion);\n }\n return _reject(globalVersion);\n };\n}\n/**\n * Test an API version to see if it is compatible with this API.\n *\n * - Exact match is always compatible\n * - Major versions must match exactly\n * - 1.x package cannot use global 2.x package\n * - 2.x package cannot use global 1.x package\n * - The minor version of the API module requesting access to the global API must be less than or equal to the minor version of this API\n * - 1.3 package may use 1.4 global because the later global contains all functions 1.3 expects\n * - 1.4 package may NOT use 1.3 global because it may try to call functions which don't exist on 1.3\n * - If the major version is 0, the minor version is treated as the major and the patch is treated as the minor\n * - Patch and build tag differences are not considered at this time\n *\n * @param version version of the API requesting an instance of the global API\n */\nconst isCompatible = _makeCompatibilityCheck(_version__WEBPACK_IMPORTED_MODULE_0__.VERSION);\n//# sourceMappingURL=semver.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vaW50ZXJuYWwvc2VtdmVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ3FDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sNkNBQTZDLDZDQUFPO0FBQzNEIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9pbnRlcm5hbC9zZW12ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBWRVJTSU9OIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5jb25zdCByZSA9IC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKC0oLispKT8kLztcbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gdG8gdGVzdCBhbiBBUEkgdmVyc2lvbiB0byBzZWUgaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm92aWRlZCBvd25WZXJzaW9uLlxuICpcbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzZW1hbnRpY3M6XG4gKiAtIEV4YWN0IG1hdGNoIGlzIGFsd2F5cyBjb21wYXRpYmxlXG4gKiAtIE1ham9yIHZlcnNpb25zIG11c3QgbWF0Y2ggZXhhY3RseVxuICogICAgLSAxLnggcGFja2FnZSBjYW5ub3QgdXNlIGdsb2JhbCAyLnggcGFja2FnZVxuICogICAgLSAyLnggcGFja2FnZSBjYW5ub3QgdXNlIGdsb2JhbCAxLnggcGFja2FnZVxuICogLSBUaGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgQVBJIG1vZHVsZSByZXF1ZXN0aW5nIGFjY2VzcyB0byB0aGUgZ2xvYmFsIEFQSSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGlzIEFQSVxuICogICAgLSAxLjMgcGFja2FnZSBtYXkgdXNlIDEuNCBnbG9iYWwgYmVjYXVzZSB0aGUgbGF0ZXIgZ2xvYmFsIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgMS4zIGV4cGVjdHNcbiAqICAgIC0gMS40IHBhY2thZ2UgbWF5IE5PVCB1c2UgMS4zIGdsb2JhbCBiZWNhdXNlIGl0IG1heSB0cnkgdG8gY2FsbCBmdW5jdGlvbnMgd2hpY2ggZG9uJ3QgZXhpc3Qgb24gMS4zXG4gKiAtIElmIHRoZSBtYWpvciB2ZXJzaW9uIGlzIDAsIHRoZSBtaW5vciB2ZXJzaW9uIGlzIHRyZWF0ZWQgYXMgdGhlIG1ham9yIGFuZCB0aGUgcGF0Y2ggaXMgdHJlYXRlZCBhcyB0aGUgbWlub3JcbiAqIC0gUGF0Y2ggYW5kIGJ1aWxkIHRhZyBkaWZmZXJlbmNlcyBhcmUgbm90IGNvbnNpZGVyZWQgYXQgdGhpcyB0aW1lXG4gKlxuICogQHBhcmFtIG93blZlcnNpb24gdmVyc2lvbiB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbnN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbWFrZUNvbXBhdGliaWxpdHlDaGVjayhvd25WZXJzaW9uKSB7XG4gICAgY29uc3QgYWNjZXB0ZWRWZXJzaW9ucyA9IG5ldyBTZXQoW293blZlcnNpb25dKTtcbiAgICBjb25zdCByZWplY3RlZFZlcnNpb25zID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IG15VmVyc2lvbk1hdGNoID0gb3duVmVyc2lvbi5tYXRjaChyZSk7XG4gICAgaWYgKCFteVZlcnNpb25NYXRjaCkge1xuICAgICAgICAvLyB3ZSBjYW5ub3QgZ3VhcmFudGVlIGNvbXBhdGliaWxpdHkgc28gd2UgYWx3YXlzIHJldHVybiBub29wXG4gICAgICAgIHJldHVybiAoKSA9PiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3duVmVyc2lvblBhcnNlZCA9IHtcbiAgICAgICAgbWFqb3I6ICtteVZlcnNpb25NYXRjaFsxXSxcbiAgICAgICAgbWlub3I6ICtteVZlcnNpb25NYXRjaFsyXSxcbiAgICAgICAgcGF0Y2g6ICtteVZlcnNpb25NYXRjaFszXSxcbiAgICAgICAgcHJlcmVsZWFzZTogbXlWZXJzaW9uTWF0Y2hbNF0sXG4gICAgfTtcbiAgICAvLyBpZiBvd25WZXJzaW9uIGhhcyBhIHByZXJlbGVhc2UgdGFnLCB2ZXJzaW9ucyBtdXN0IG1hdGNoIGV4YWN0bHlcbiAgICBpZiAob3duVmVyc2lvblBhcnNlZC5wcmVyZWxlYXNlICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzRXhhY3RtYXRjaChnbG9iYWxWZXJzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsVmVyc2lvbiA9PT0gb3duVmVyc2lvbjtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gX3JlamVjdCh2KSB7XG4gICAgICAgIHJlamVjdGVkVmVyc2lvbnMuYWRkKHYpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIF9hY2NlcHQodikge1xuICAgICAgICBhY2NlcHRlZFZlcnNpb25zLmFkZCh2KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiBpc0NvbXBhdGlibGUoZ2xvYmFsVmVyc2lvbikge1xuICAgICAgICBpZiAoYWNjZXB0ZWRWZXJzaW9ucy5oYXMoZ2xvYmFsVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWplY3RlZFZlcnNpb25zLmhhcyhnbG9iYWxWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdsb2JhbFZlcnNpb25NYXRjaCA9IGdsb2JhbFZlcnNpb24ubWF0Y2gocmUpO1xuICAgICAgICBpZiAoIWdsb2JhbFZlcnNpb25NYXRjaCkge1xuICAgICAgICAgICAgLy8gY2Fubm90IHBhcnNlIG90aGVyIHZlcnNpb25cbiAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBndWFyYW50ZWUgY29tcGF0aWJpbGl0eSBzbyB3ZSBhbHdheXMgbm9vcFxuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2xvYmFsVmVyc2lvblBhcnNlZCA9IHtcbiAgICAgICAgICAgIG1ham9yOiArZ2xvYmFsVmVyc2lvbk1hdGNoWzFdLFxuICAgICAgICAgICAgbWlub3I6ICtnbG9iYWxWZXJzaW9uTWF0Y2hbMl0sXG4gICAgICAgICAgICBwYXRjaDogK2dsb2JhbFZlcnNpb25NYXRjaFszXSxcbiAgICAgICAgICAgIHByZXJlbGVhc2U6IGdsb2JhbFZlcnNpb25NYXRjaFs0XSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gaWYgZ2xvYmFsVmVyc2lvbiBoYXMgYSBwcmVyZWxlYXNlIHRhZywgdmVyc2lvbnMgbXVzdCBtYXRjaCBleGFjdGx5XG4gICAgICAgIGlmIChnbG9iYWxWZXJzaW9uUGFyc2VkLnByZXJlbGVhc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFqb3IgdmVyc2lvbnMgbXVzdCBtYXRjaFxuICAgICAgICBpZiAob3duVmVyc2lvblBhcnNlZC5tYWpvciAhPT0gZ2xvYmFsVmVyc2lvblBhcnNlZC5tYWpvcikge1xuICAgICAgICAgICAgcmV0dXJuIF9yZWplY3QoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG93blZlcnNpb25QYXJzZWQubWFqb3IgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChvd25WZXJzaW9uUGFyc2VkLm1pbm9yID09PSBnbG9iYWxWZXJzaW9uUGFyc2VkLm1pbm9yICYmXG4gICAgICAgICAgICAgICAgb3duVmVyc2lvblBhcnNlZC5wYXRjaCA8PSBnbG9iYWxWZXJzaW9uUGFyc2VkLnBhdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9hY2NlcHQoZ2xvYmFsVmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3JlamVjdChnbG9iYWxWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3duVmVyc2lvblBhcnNlZC5taW5vciA8PSBnbG9iYWxWZXJzaW9uUGFyc2VkLm1pbm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gX2FjY2VwdChnbG9iYWxWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JlamVjdChnbG9iYWxWZXJzaW9uKTtcbiAgICB9O1xufVxuLyoqXG4gKiBUZXN0IGFuIEFQSSB2ZXJzaW9uIHRvIHNlZSBpZiBpdCBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyBBUEkuXG4gKlxuICogLSBFeGFjdCBtYXRjaCBpcyBhbHdheXMgY29tcGF0aWJsZVxuICogLSBNYWpvciB2ZXJzaW9ucyBtdXN0IG1hdGNoIGV4YWN0bHlcbiAqICAgIC0gMS54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMi54IHBhY2thZ2VcbiAqICAgIC0gMi54IHBhY2thZ2UgY2Fubm90IHVzZSBnbG9iYWwgMS54IHBhY2thZ2VcbiAqIC0gVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIEFQSSBtb2R1bGUgcmVxdWVzdGluZyBhY2Nlc3MgdG8gdGhlIGdsb2JhbCBBUEkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1pbm9yIHZlcnNpb24gb2YgdGhpcyBBUElcbiAqICAgIC0gMS4zIHBhY2thZ2UgbWF5IHVzZSAxLjQgZ2xvYmFsIGJlY2F1c2UgdGhlIGxhdGVyIGdsb2JhbCBjb250YWlucyBhbGwgZnVuY3Rpb25zIDEuMyBleHBlY3RzXG4gKiAgICAtIDEuNCBwYWNrYWdlIG1heSBOT1QgdXNlIDEuMyBnbG9iYWwgYmVjYXVzZSBpdCBtYXkgdHJ5IHRvIGNhbGwgZnVuY3Rpb25zIHdoaWNoIGRvbid0IGV4aXN0IG9uIDEuM1xuICogLSBJZiB0aGUgbWFqb3IgdmVyc2lvbiBpcyAwLCB0aGUgbWlub3IgdmVyc2lvbiBpcyB0cmVhdGVkIGFzIHRoZSBtYWpvciBhbmQgdGhlIHBhdGNoIGlzIHRyZWF0ZWQgYXMgdGhlIG1pbm9yXG4gKiAtIFBhdGNoIGFuZCBidWlsZCB0YWcgZGlmZmVyZW5jZXMgYXJlIG5vdCBjb25zaWRlcmVkIGF0IHRoaXMgdGltZVxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIHZlcnNpb24gb2YgdGhlIEFQSSByZXF1ZXN0aW5nIGFuIGluc3RhbmNlIG9mIHRoZSBnbG9iYWwgQVBJXG4gKi9cbmV4cG9ydCBjb25zdCBpc0NvbXBhdGlibGUgPSBfbWFrZUNvbXBhdGliaWxpdHlDaGVjayhWRVJTSU9OKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlbXZlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/internal/semver.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js": +/*!******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js ***! + \******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ metrics: () => (/* binding */ metrics)\n/* harmony export */ });\n/* harmony import */ var _api_metrics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/metrics */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/metrics.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for metrics API\n *\n * @since 1.3.0\n */\nconst metrics = _api_metrics__WEBPACK_IMPORTED_MODULE_0__.MetricsAPI.getInstance();\n//# sourceMappingURL=metrics-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy1hcGkuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGdCQUFnQixvREFBVTtBQUNqQyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy1hcGkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vLyBTcGxpdCBtb2R1bGUtbGV2ZWwgdmFyaWFibGUgZGVmaW5pdGlvbiBpbnRvIHNlcGFyYXRlIGZpbGVzIHRvIGFsbG93XG4vLyB0cmVlLXNoYWtpbmcgb24gZWFjaCBhcGkgaW5zdGFuY2UuXG5pbXBvcnQgeyBNZXRyaWNzQVBJIH0gZnJvbSAnLi9hcGkvbWV0cmljcyc7XG4vKipcbiAqIEVudHJ5cG9pbnQgZm9yIG1ldHJpY3MgQVBJXG4gKlxuICogQHNpbmNlIDEuMy4wXG4gKi9cbmV4cG9ydCBjb25zdCBtZXRyaWNzID0gTWV0cmljc0FQSS5nZXRJbnN0YW5jZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWV0cmljcy1hcGkuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js": +/*!*********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js ***! + \*********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ValueType: () => (/* binding */ ValueType)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * The Type of value. It describes how the data is reported.\n *\n * @since 1.3.0\n */\nvar ValueType;\n(function (ValueType) {\n ValueType[ValueType[\"INT\"] = 0] = \"INT\";\n ValueType[ValueType[\"DOUBLE\"] = 1] = \"DOUBLE\";\n})(ValueType || (ValueType = {}));\n//# sourceMappingURL=Metric.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy9NZXRyaWMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4QkFBOEI7QUFDL0IiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL21ldHJpY3MvTWV0cmljLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgVHlwZSBvZiB2YWx1ZS4gSXQgZGVzY3JpYmVzIGhvdyB0aGUgZGF0YSBpcyByZXBvcnRlZC5cbiAqXG4gKiBAc2luY2UgMS4zLjBcbiAqL1xuZXhwb3J0IHZhciBWYWx1ZVR5cGU7XG4oZnVuY3Rpb24gKFZhbHVlVHlwZSkge1xuICAgIFZhbHVlVHlwZVtWYWx1ZVR5cGVbXCJJTlRcIl0gPSAwXSA9IFwiSU5UXCI7XG4gICAgVmFsdWVUeXBlW1ZhbHVlVHlwZVtcIkRPVUJMRVwiXSA9IDFdID0gXCJET1VCTEVcIjtcbn0pKFZhbHVlVHlwZSB8fCAoVmFsdWVUeXBlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1ldHJpYy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/Metric.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_COUNTER_METRIC: () => (/* binding */ NOOP_COUNTER_METRIC),\n/* harmony export */ NOOP_GAUGE_METRIC: () => (/* binding */ NOOP_GAUGE_METRIC),\n/* harmony export */ NOOP_HISTOGRAM_METRIC: () => (/* binding */ NOOP_HISTOGRAM_METRIC),\n/* harmony export */ NOOP_METER: () => (/* binding */ NOOP_METER),\n/* harmony export */ NOOP_OBSERVABLE_COUNTER_METRIC: () => (/* binding */ NOOP_OBSERVABLE_COUNTER_METRIC),\n/* harmony export */ NOOP_OBSERVABLE_GAUGE_METRIC: () => (/* binding */ NOOP_OBSERVABLE_GAUGE_METRIC),\n/* harmony export */ NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC: () => (/* binding */ NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC),\n/* harmony export */ NOOP_UP_DOWN_COUNTER_METRIC: () => (/* binding */ NOOP_UP_DOWN_COUNTER_METRIC),\n/* harmony export */ NoopCounterMetric: () => (/* binding */ NoopCounterMetric),\n/* harmony export */ NoopGaugeMetric: () => (/* binding */ NoopGaugeMetric),\n/* harmony export */ NoopHistogramMetric: () => (/* binding */ NoopHistogramMetric),\n/* harmony export */ NoopMeter: () => (/* binding */ NoopMeter),\n/* harmony export */ NoopMetric: () => (/* binding */ NoopMetric),\n/* harmony export */ NoopObservableCounterMetric: () => (/* binding */ NoopObservableCounterMetric),\n/* harmony export */ NoopObservableGaugeMetric: () => (/* binding */ NoopObservableGaugeMetric),\n/* harmony export */ NoopObservableMetric: () => (/* binding */ NoopObservableMetric),\n/* harmony export */ NoopObservableUpDownCounterMetric: () => (/* binding */ NoopObservableUpDownCounterMetric),\n/* harmony export */ NoopUpDownCounterMetric: () => (/* binding */ NoopUpDownCounterMetric),\n/* harmony export */ createNoopMeter: () => (/* binding */ createNoopMeter)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * NoopMeter is a noop implementation of the {@link Meter} interface. It reuses\n * constant NoopMetrics for all of its methods.\n */\nclass NoopMeter {\n constructor() { }\n /**\n * @see {@link Meter.createGauge}\n */\n createGauge(_name, _options) {\n return NOOP_GAUGE_METRIC;\n }\n /**\n * @see {@link Meter.createHistogram}\n */\n createHistogram(_name, _options) {\n return NOOP_HISTOGRAM_METRIC;\n }\n /**\n * @see {@link Meter.createCounter}\n */\n createCounter(_name, _options) {\n return NOOP_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createUpDownCounter}\n */\n createUpDownCounter(_name, _options) {\n return NOOP_UP_DOWN_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createObservableGauge}\n */\n createObservableGauge(_name, _options) {\n return NOOP_OBSERVABLE_GAUGE_METRIC;\n }\n /**\n * @see {@link Meter.createObservableCounter}\n */\n createObservableCounter(_name, _options) {\n return NOOP_OBSERVABLE_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.createObservableUpDownCounter}\n */\n createObservableUpDownCounter(_name, _options) {\n return NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC;\n }\n /**\n * @see {@link Meter.addBatchObservableCallback}\n */\n addBatchObservableCallback(_callback, _observables) { }\n /**\n * @see {@link Meter.removeBatchObservableCallback}\n */\n removeBatchObservableCallback(_callback) { }\n}\nclass NoopMetric {\n}\nclass NoopCounterMetric extends NoopMetric {\n add(_value, _attributes) { }\n}\nclass NoopUpDownCounterMetric extends NoopMetric {\n add(_value, _attributes) { }\n}\nclass NoopGaugeMetric extends NoopMetric {\n record(_value, _attributes) { }\n}\nclass NoopHistogramMetric extends NoopMetric {\n record(_value, _attributes) { }\n}\nclass NoopObservableMetric {\n addCallback(_callback) { }\n removeCallback(_callback) { }\n}\nclass NoopObservableCounterMetric extends NoopObservableMetric {\n}\nclass NoopObservableGaugeMetric extends NoopObservableMetric {\n}\nclass NoopObservableUpDownCounterMetric extends NoopObservableMetric {\n}\nconst NOOP_METER = new NoopMeter();\n// Synchronous instruments\nconst NOOP_COUNTER_METRIC = new NoopCounterMetric();\nconst NOOP_GAUGE_METRIC = new NoopGaugeMetric();\nconst NOOP_HISTOGRAM_METRIC = new NoopHistogramMetric();\nconst NOOP_UP_DOWN_COUNTER_METRIC = new NoopUpDownCounterMetric();\n// Asynchronous instruments\nconst NOOP_OBSERVABLE_COUNTER_METRIC = new NoopObservableCounterMetric();\nconst NOOP_OBSERVABLE_GAUGE_METRIC = new NoopObservableGaugeMetric();\nconst NOOP_OBSERVABLE_UP_DOWN_COUNTER_METRIC = new NoopObservableUpDownCounterMetric();\n/**\n * Create a no-op Meter\n *\n * @since 1.3.0\n */\nfunction createNoopMeter() {\n return NOOP_METER;\n}\n//# sourceMappingURL=NoopMeter.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy9Ob29wTWV0ZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsYUFBYTtBQUMzRDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDTztBQUNBO0FBQ0E7QUFDQTtBQUNQO0FBQ087QUFDQTtBQUNBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9tZXRyaWNzL05vb3BNZXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogTm9vcE1ldGVyIGlzIGEgbm9vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1ldGVyfSBpbnRlcmZhY2UuIEl0IHJldXNlc1xuICogY29uc3RhbnQgTm9vcE1ldHJpY3MgZm9yIGFsbCBvZiBpdHMgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BNZXRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVHYXVnZX1cbiAgICAgKi9cbiAgICBjcmVhdGVHYXVnZShfbmFtZSwgX29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIE5PT1BfR0FVR0VfTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVIaXN0b2dyYW19XG4gICAgICovXG4gICAgY3JlYXRlSGlzdG9ncmFtKF9uYW1lLCBfb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gTk9PUF9ISVNUT0dSQU1fTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVDb3VudGVyfVxuICAgICAqL1xuICAgIGNyZWF0ZUNvdW50ZXIoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX0NPVU5URVJfTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVVcERvd25Db3VudGVyfVxuICAgICAqL1xuICAgIGNyZWF0ZVVwRG93bkNvdW50ZXIoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX1VQX0RPV05fQ09VTlRFUl9NRVRSSUM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBzZWUge0BsaW5rIE1ldGVyLmNyZWF0ZU9ic2VydmFibGVHYXVnZX1cbiAgICAgKi9cbiAgICBjcmVhdGVPYnNlcnZhYmxlR2F1Z2UoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX09CU0VSVkFCTEVfR0FVR0VfTUVUUklDO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAc2VlIHtAbGluayBNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcn1cbiAgICAgKi9cbiAgICBjcmVhdGVPYnNlcnZhYmxlQ291bnRlcihfbmFtZSwgX29wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIE5PT1BfT0JTRVJWQUJMRV9DT1VOVEVSX01FVFJJQztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSB7QGxpbmsgTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZVVwRG93bkNvdW50ZXJ9XG4gICAgICovXG4gICAgY3JlYXRlT2JzZXJ2YWJsZVVwRG93bkNvdW50ZXIoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX09CU0VSVkFCTEVfVVBfRE9XTl9DT1VOVEVSX01FVFJJQztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSB7QGxpbmsgTWV0ZXIuYWRkQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2t9XG4gICAgICovXG4gICAgYWRkQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2soX2NhbGxiYWNrLCBfb2JzZXJ2YWJsZXMpIHsgfVxuICAgIC8qKlxuICAgICAqIEBzZWUge0BsaW5rIE1ldGVyLnJlbW92ZUJhdGNoT2JzZXJ2YWJsZUNhbGxiYWNrfVxuICAgICAqL1xuICAgIHJlbW92ZUJhdGNoT2JzZXJ2YWJsZUNhbGxiYWNrKF9jYWxsYmFjaykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcE1ldHJpYyB7XG59XG5leHBvcnQgY2xhc3MgTm9vcENvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wTWV0cmljIHtcbiAgICBhZGQoX3ZhbHVlLCBfYXR0cmlidXRlcykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcFVwRG93bkNvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wTWV0cmljIHtcbiAgICBhZGQoX3ZhbHVlLCBfYXR0cmlidXRlcykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcEdhdWdlTWV0cmljIGV4dGVuZHMgTm9vcE1ldHJpYyB7XG4gICAgcmVjb3JkKF92YWx1ZSwgX2F0dHJpYnV0ZXMpIHsgfVxufVxuZXhwb3J0IGNsYXNzIE5vb3BIaXN0b2dyYW1NZXRyaWMgZXh0ZW5kcyBOb29wTWV0cmljIHtcbiAgICByZWNvcmQoX3ZhbHVlLCBfYXR0cmlidXRlcykgeyB9XG59XG5leHBvcnQgY2xhc3MgTm9vcE9ic2VydmFibGVNZXRyaWMge1xuICAgIGFkZENhbGxiYWNrKF9jYWxsYmFjaykgeyB9XG4gICAgcmVtb3ZlQ2FsbGJhY2soX2NhbGxiYWNrKSB7IH1cbn1cbmV4cG9ydCBjbGFzcyBOb29wT2JzZXJ2YWJsZUNvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wT2JzZXJ2YWJsZU1ldHJpYyB7XG59XG5leHBvcnQgY2xhc3MgTm9vcE9ic2VydmFibGVHYXVnZU1ldHJpYyBleHRlbmRzIE5vb3BPYnNlcnZhYmxlTWV0cmljIHtcbn1cbmV4cG9ydCBjbGFzcyBOb29wT2JzZXJ2YWJsZVVwRG93bkNvdW50ZXJNZXRyaWMgZXh0ZW5kcyBOb29wT2JzZXJ2YWJsZU1ldHJpYyB7XG59XG5leHBvcnQgY29uc3QgTk9PUF9NRVRFUiA9IG5ldyBOb29wTWV0ZXIoKTtcbi8vIFN5bmNocm9ub3VzIGluc3RydW1lbnRzXG5leHBvcnQgY29uc3QgTk9PUF9DT1VOVEVSX01FVFJJQyA9IG5ldyBOb29wQ291bnRlck1ldHJpYygpO1xuZXhwb3J0IGNvbnN0IE5PT1BfR0FVR0VfTUVUUklDID0gbmV3IE5vb3BHYXVnZU1ldHJpYygpO1xuZXhwb3J0IGNvbnN0IE5PT1BfSElTVE9HUkFNX01FVFJJQyA9IG5ldyBOb29wSGlzdG9ncmFtTWV0cmljKCk7XG5leHBvcnQgY29uc3QgTk9PUF9VUF9ET1dOX0NPVU5URVJfTUVUUklDID0gbmV3IE5vb3BVcERvd25Db3VudGVyTWV0cmljKCk7XG4vLyBBc3luY2hyb25vdXMgaW5zdHJ1bWVudHNcbmV4cG9ydCBjb25zdCBOT09QX09CU0VSVkFCTEVfQ09VTlRFUl9NRVRSSUMgPSBuZXcgTm9vcE9ic2VydmFibGVDb3VudGVyTWV0cmljKCk7XG5leHBvcnQgY29uc3QgTk9PUF9PQlNFUlZBQkxFX0dBVUdFX01FVFJJQyA9IG5ldyBOb29wT2JzZXJ2YWJsZUdhdWdlTWV0cmljKCk7XG5leHBvcnQgY29uc3QgTk9PUF9PQlNFUlZBQkxFX1VQX0RPV05fQ09VTlRFUl9NRVRSSUMgPSBuZXcgTm9vcE9ic2VydmFibGVVcERvd25Db3VudGVyTWV0cmljKCk7XG4vKipcbiAqIENyZWF0ZSBhIG5vLW9wIE1ldGVyXG4gKlxuICogQHNpbmNlIDEuMy4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb29wTWV0ZXIoKSB7XG4gICAgcmV0dXJuIE5PT1BfTUVURVI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob29wTWV0ZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js": +/*!********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js ***! + \********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NOOP_METER_PROVIDER: () => (/* binding */ NOOP_METER_PROVIDER),\n/* harmony export */ NoopMeterProvider: () => (/* binding */ NoopMeterProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopMeter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopMeter */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * An implementation of the {@link MeterProvider} which returns an impotent Meter\n * for all calls to `getMeter`\n */\nclass NoopMeterProvider {\n getMeter(_name, _version, _options) {\n return _NoopMeter__WEBPACK_IMPORTED_MODULE_0__.NOOP_METER;\n }\n}\nconst NOOP_METER_PROVIDER = new NoopMeterProvider();\n//# sourceMappingURL=NoopMeterProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vbWV0cmljcy9Ob29wTWV0ZXJQcm92aWRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUN5QztBQUN6QztBQUNBLDZCQUE2QixxQkFBcUI7QUFDbEQ7QUFDQTtBQUNPO0FBQ1A7QUFDQSxlQUFlLGtEQUFVO0FBQ3pCO0FBQ0E7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS9tZXRyaWNzL05vb3BNZXRlclByb3ZpZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgTk9PUF9NRVRFUiB9IGZyb20gJy4vTm9vcE1ldGVyJztcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNZXRlclByb3ZpZGVyfSB3aGljaCByZXR1cm5zIGFuIGltcG90ZW50IE1ldGVyXG4gKiBmb3IgYWxsIGNhbGxzIHRvIGBnZXRNZXRlcmBcbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BNZXRlclByb3ZpZGVyIHtcbiAgICBnZXRNZXRlcihfbmFtZSwgX3ZlcnNpb24sIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBOT09QX01FVEVSO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBOT09QX01FVEVSX1BST1ZJREVSID0gbmV3IE5vb3BNZXRlclByb3ZpZGVyKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob29wTWV0ZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ propagation: () => (/* binding */ propagation)\n/* harmony export */ });\n/* harmony import */ var _api_propagation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/propagation */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/propagation.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for propagation API\n *\n * @since 1.0.0\n */\nconst propagation = _api_propagation__WEBPACK_IMPORTED_MODULE_0__.PropagationAPI.getInstance();\n//# sourceMappingURL=propagation-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24tYXBpLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ21EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxvQkFBb0IsNERBQWM7QUFDekMiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3Byb3BhZ2F0aW9uLWFwaS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8vIFNwbGl0IG1vZHVsZS1sZXZlbCB2YXJpYWJsZSBkZWZpbml0aW9uIGludG8gc2VwYXJhdGUgZmlsZXMgdG8gYWxsb3dcbi8vIHRyZWUtc2hha2luZyBvbiBlYWNoIGFwaSBpbnN0YW5jZS5cbmltcG9ydCB7IFByb3BhZ2F0aW9uQVBJIH0gZnJvbSAnLi9hcGkvcHJvcGFnYXRpb24nO1xuLyoqXG4gKiBFbnRyeXBvaW50IGZvciBwcm9wYWdhdGlvbiBBUElcbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3BhZ2F0aW9uID0gUHJvcGFnYXRpb25BUEkuZ2V0SW5zdGFuY2UoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3BhZ2F0aW9uLWFwaS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js": +/*!****************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js ***! + \****************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopTextMapPropagator: () => (/* binding */ NoopTextMapPropagator)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * No-op implementations of {@link TextMapPropagator}.\n */\nclass NoopTextMapPropagator {\n /** Noop inject function does nothing */\n inject(_context, _carrier) { }\n /** Noop extract function does nothing and returns the input context */\n extract(context, _carrier) {\n return context;\n }\n fields() {\n return [];\n }\n}\n//# sourceMappingURL=NoopTextMapPropagator.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24vTm9vcFRleHRNYXBQcm9wYWdhdG9yLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHdCQUF3QjtBQUNyRDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24vTm9vcFRleHRNYXBQcm9wYWdhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBOby1vcCBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIFRleHRNYXBQcm9wYWdhdG9yfS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vb3BUZXh0TWFwUHJvcGFnYXRvciB7XG4gICAgLyoqIE5vb3AgaW5qZWN0IGZ1bmN0aW9uIGRvZXMgbm90aGluZyAqL1xuICAgIGluamVjdChfY29udGV4dCwgX2NhcnJpZXIpIHsgfVxuICAgIC8qKiBOb29wIGV4dHJhY3QgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIHRoZSBpbnB1dCBjb250ZXh0ICovXG4gICAgZXh0cmFjdChjb250ZXh0LCBfY2Fycmllcikge1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgZmllbGRzKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcFRleHRNYXBQcm9wYWdhdG9yLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js": +/*!************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js ***! + \************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ defaultTextMapGetter: () => (/* binding */ defaultTextMapGetter),\n/* harmony export */ defaultTextMapSetter: () => (/* binding */ defaultTextMapSetter)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @since 1.0.0\n */\nconst defaultTextMapGetter = {\n get(carrier, key) {\n if (carrier == null) {\n return undefined;\n }\n return carrier[key];\n },\n keys(carrier) {\n if (carrier == null) {\n return [];\n }\n return Object.keys(carrier);\n },\n};\n/**\n * @since 1.0.0\n */\nconst defaultTextMapSetter = {\n set(carrier, key, value) {\n if (carrier == null) {\n return;\n }\n carrier[key] = value;\n },\n};\n//# sourceMappingURL=TextMapPropagator.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vcHJvcGFnYXRpb24vVGV4dE1hcFByb3BhZ2F0b3IuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3Byb3BhZ2F0aW9uL1RleHRNYXBQcm9wYWdhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRUZXh0TWFwR2V0dGVyID0ge1xuICAgIGdldChjYXJyaWVyLCBrZXkpIHtcbiAgICAgICAgaWYgKGNhcnJpZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FycmllcltrZXldO1xuICAgIH0sXG4gICAga2V5cyhjYXJyaWVyKSB7XG4gICAgICAgIGlmIChjYXJyaWVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY2Fycmllcik7XG4gICAgfSxcbn07XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdFRleHRNYXBTZXR0ZXIgPSB7XG4gICAgc2V0KGNhcnJpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGNhcnJpZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhcnJpZXJba2V5XSA9IHZhbHVlO1xuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGV4dE1hcFByb3BhZ2F0b3IuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js": +/*!****************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js ***! + \****************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ trace: () => (/* binding */ trace)\n/* harmony export */ });\n/* harmony import */ var _api_trace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./api/trace */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/trace.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// Split module-level variable definition into separate files to allow\n// tree-shaking on each api instance.\n\n/**\n * Entrypoint for trace API\n *\n * @since 1.0.0\n */\nconst trace = _api_trace__WEBPACK_IMPORTED_MODULE_0__.TraceAPI.getInstance();\n//# sourceMappingURL=trace-api.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UtYXBpLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3VDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxjQUFjLGdEQUFRO0FBQzdCIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS1hcGkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vLyBTcGxpdCBtb2R1bGUtbGV2ZWwgdmFyaWFibGUgZGVmaW5pdGlvbiBpbnRvIHNlcGFyYXRlIGZpbGVzIHRvIGFsbG93XG4vLyB0cmVlLXNoYWtpbmcgb24gZWFjaCBhcGkgaW5zdGFuY2UuXG5pbXBvcnQgeyBUcmFjZUFQSSB9IGZyb20gJy4vYXBpL3RyYWNlJztcbi8qKlxuICogRW50cnlwb2ludCBmb3IgdHJhY2UgQVBJXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFjZSA9IFRyYWNlQVBJLmdldEluc3RhbmNlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZS1hcGkuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace-api.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js": +/*!*****************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js ***! + \*****************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NonRecordingSpan: () => (/* binding */ NonRecordingSpan)\n/* harmony export */ });\n/* harmony import */ var _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invalid-span-constants */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * The NonRecordingSpan is the default {@link Span} that is used when no Span\n * implementation is available. All operations are no-op including context\n * propagation.\n */\nclass NonRecordingSpan {\n constructor(spanContext = _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__.INVALID_SPAN_CONTEXT) {\n this._spanContext = spanContext;\n }\n // Returns a SpanContext.\n spanContext() {\n return this._spanContext;\n }\n // By default does nothing\n setAttribute(_key, _value) {\n return this;\n }\n // By default does nothing\n setAttributes(_attributes) {\n return this;\n }\n // By default does nothing\n addEvent(_name, _attributes) {\n return this;\n }\n addLink(_link) {\n return this;\n }\n addLinks(_links) {\n return this;\n }\n // By default does nothing\n setStatus(_status) {\n return this;\n }\n // By default does nothing\n updateName(_name) {\n return this;\n }\n // By default does nothing\n end(_endTime) { }\n // isRecording always returns false for NonRecordingSpan.\n isRecording() {\n return false;\n }\n // By default does nothing\n recordException(_exception, _time) { }\n}\n//# sourceMappingURL=NonRecordingSpan.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9uUmVjb3JkaW5nU3Bhbi5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ2dFO0FBQ2hFO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ087QUFDUCw4QkFBOEIseUVBQW9CO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9uUmVjb3JkaW5nU3Bhbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IElOVkFMSURfU1BBTl9DT05URVhUIH0gZnJvbSAnLi9pbnZhbGlkLXNwYW4tY29uc3RhbnRzJztcbi8qKlxuICogVGhlIE5vblJlY29yZGluZ1NwYW4gaXMgdGhlIGRlZmF1bHQge0BsaW5rIFNwYW59IHRoYXQgaXMgdXNlZCB3aGVuIG5vIFNwYW5cbiAqIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZS4gQWxsIG9wZXJhdGlvbnMgYXJlIG5vLW9wIGluY2x1ZGluZyBjb250ZXh0XG4gKiBwcm9wYWdhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vblJlY29yZGluZ1NwYW4ge1xuICAgIGNvbnN0cnVjdG9yKHNwYW5Db250ZXh0ID0gSU5WQUxJRF9TUEFOX0NPTlRFWFQpIHtcbiAgICAgICAgdGhpcy5fc3BhbkNvbnRleHQgPSBzcGFuQ29udGV4dDtcbiAgICB9XG4gICAgLy8gUmV0dXJucyBhIFNwYW5Db250ZXh0LlxuICAgIHNwYW5Db250ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3BhbkNvbnRleHQ7XG4gICAgfVxuICAgIC8vIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nXG4gICAgc2V0QXR0cmlidXRlKF9rZXksIF92YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBzZXRBdHRyaWJ1dGVzKF9hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIGFkZEV2ZW50KF9uYW1lLCBfYXR0cmlidXRlcykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkTGluayhfbGluaykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYWRkTGlua3MoX2xpbmtzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIHNldFN0YXR1cyhfc3RhdHVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIHVwZGF0ZU5hbWUoX25hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nXG4gICAgZW5kKF9lbmRUaW1lKSB7IH1cbiAgICAvLyBpc1JlY29yZGluZyBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgTm9uUmVjb3JkaW5nU3Bhbi5cbiAgICBpc1JlY29yZGluZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIHJlY29yZEV4Y2VwdGlvbihfZXhjZXB0aW9uLCBfdGltZSkgeyB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ob25SZWNvcmRpbmdTcGFuLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js": +/*!***********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js ***! + \***********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopTracer: () => (/* binding */ NoopTracer)\n/* harmony export */ });\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/* harmony import */ var _trace_context_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../trace/context-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\");\n/* harmony import */ var _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NonRecordingSpan */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\");\n/* harmony import */ var _spancontext_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./spancontext-utils */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n\nconst contextApi = _api_context__WEBPACK_IMPORTED_MODULE_0__.ContextAPI.getInstance();\n/**\n * No-op implementations of {@link Tracer}.\n */\nclass NoopTracer {\n // startSpan starts a noop span.\n startSpan(name, options, context = contextApi.active()) {\n const root = Boolean(options === null || options === void 0 ? void 0 : options.root);\n if (root) {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan();\n }\n const parentFromContext = context && (0,_trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.getSpanContext)(context);\n if (isSpanContext(parentFromContext) &&\n (0,_spancontext_utils__WEBPACK_IMPORTED_MODULE_3__.isSpanContextValid)(parentFromContext)) {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan(parentFromContext);\n }\n else {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan();\n }\n }\n startActiveSpan(name, arg2, arg3, arg4) {\n let opts;\n let ctx;\n let fn;\n if (arguments.length < 2) {\n return;\n }\n else if (arguments.length === 2) {\n fn = arg2;\n }\n else if (arguments.length === 3) {\n opts = arg2;\n fn = arg3;\n }\n else {\n opts = arg2;\n ctx = arg3;\n fn = arg4;\n }\n const parentContext = ctx !== null && ctx !== void 0 ? ctx : contextApi.active();\n const span = this.startSpan(name, opts, parentContext);\n const contextWithSpanSet = (0,_trace_context_utils__WEBPACK_IMPORTED_MODULE_2__.setSpan)(parentContext, span);\n return contextApi.with(contextWithSpanSet, fn, undefined, span);\n }\n}\nfunction isSpanContext(spanContext) {\n return (spanContext !== null &&\n typeof spanContext === 'object' &&\n 'spanId' in spanContext &&\n typeof spanContext['spanId'] === 'string' &&\n 'traceId' in spanContext &&\n typeof spanContext['traceId'] === 'string' &&\n 'traceFlags' in spanContext &&\n typeof spanContext['traceFlags'] === 'number');\n}\n//# sourceMappingURL=NoopTracer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9vcFRyYWNlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQzRDO0FBQ3FCO0FBQ1g7QUFDRztBQUN6RCxtQkFBbUIsb0RBQVU7QUFDN0I7QUFDQSw2QkFBNkIsYUFBYTtBQUMxQztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsK0RBQWdCO0FBQ3ZDO0FBQ0EsNkNBQTZDLG9FQUFjO0FBQzNEO0FBQ0EsWUFBWSxzRUFBa0I7QUFDOUIsdUJBQXVCLCtEQUFnQjtBQUN2QztBQUNBO0FBQ0EsdUJBQXVCLCtEQUFnQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDZEQUFPO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL05vb3BUcmFjZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgZ2V0U3BhbkNvbnRleHQsIHNldFNwYW4gfSBmcm9tICcuLi90cmFjZS9jb250ZXh0LXV0aWxzJztcbmltcG9ydCB7IE5vblJlY29yZGluZ1NwYW4gfSBmcm9tICcuL05vblJlY29yZGluZ1NwYW4nO1xuaW1wb3J0IHsgaXNTcGFuQ29udGV4dFZhbGlkIH0gZnJvbSAnLi9zcGFuY29udGV4dC11dGlscyc7XG5jb25zdCBjb250ZXh0QXBpID0gQ29udGV4dEFQSS5nZXRJbnN0YW5jZSgpO1xuLyoqXG4gKiBOby1vcCBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIFRyYWNlcn0uXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wVHJhY2VyIHtcbiAgICAvLyBzdGFydFNwYW4gc3RhcnRzIGEgbm9vcCBzcGFuLlxuICAgIHN0YXJ0U3BhbihuYW1lLCBvcHRpb25zLCBjb250ZXh0ID0gY29udGV4dEFwaS5hY3RpdmUoKSkge1xuICAgICAgICBjb25zdCByb290ID0gQm9vbGVhbihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucm9vdCk7XG4gICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE5vblJlY29yZGluZ1NwYW4oKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRGcm9tQ29udGV4dCA9IGNvbnRleHQgJiYgZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmIChpc1NwYW5Db250ZXh0KHBhcmVudEZyb21Db250ZXh0KSAmJlxuICAgICAgICAgICAgaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudEZyb21Db250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKHBhcmVudEZyb21Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm9uUmVjb3JkaW5nU3BhbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXJ0QWN0aXZlU3BhbihuYW1lLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICAgIGxldCBvcHRzO1xuICAgICAgICBsZXQgY3R4O1xuICAgICAgICBsZXQgZm47XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGZuID0gYXJnMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGZuID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdHMgPSBhcmcyO1xuICAgICAgICAgICAgY3R4ID0gYXJnMztcbiAgICAgICAgICAgIGZuID0gYXJnNDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gY3R4ICE9PSBudWxsICYmIGN0eCAhPT0gdm9pZCAwID8gY3R4IDogY29udGV4dEFwaS5hY3RpdmUoKTtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuc3RhcnRTcGFuKG5hbWUsIG9wdHMsIHBhcmVudENvbnRleHQpO1xuICAgICAgICBjb25zdCBjb250ZXh0V2l0aFNwYW5TZXQgPSBzZXRTcGFuKHBhcmVudENvbnRleHQsIHNwYW4pO1xuICAgICAgICByZXR1cm4gY29udGV4dEFwaS53aXRoKGNvbnRleHRXaXRoU3BhblNldCwgZm4sIHVuZGVmaW5lZCwgc3Bhbik7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTcGFuQ29udGV4dChzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiAoc3BhbkNvbnRleHQgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNwYW5Db250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAnc3BhbklkJyBpbiBzcGFuQ29udGV4dCAmJlxuICAgICAgICB0eXBlb2Ygc3BhbkNvbnRleHRbJ3NwYW5JZCddID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAndHJhY2VJZCcgaW4gc3BhbkNvbnRleHQgJiZcbiAgICAgICAgdHlwZW9mIHNwYW5Db250ZXh0Wyd0cmFjZUlkJ10gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICd0cmFjZUZsYWdzJyBpbiBzcGFuQ29udGV4dCAmJlxuICAgICAgICB0eXBlb2Ygc3BhbkNvbnRleHRbJ3RyYWNlRmxhZ3MnXSA9PT0gJ251bWJlcicpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Tm9vcFRyYWNlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js": +/*!*******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js ***! + \*******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ NoopTracerProvider: () => (/* binding */ NoopTracerProvider)\n/* harmony export */ });\n/* harmony import */ var _NoopTracer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * An implementation of the {@link TracerProvider} which returns an impotent\n * Tracer for all calls to `getTracer`.\n *\n * All operations are no-op.\n */\nclass NoopTracerProvider {\n getTracer(_name, _version, _options) {\n return new _NoopTracer__WEBPACK_IMPORTED_MODULE_0__.NoopTracer();\n }\n}\n//# sourceMappingURL=NoopTracerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvTm9vcFRyYWNlclByb3ZpZGVyLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDMEM7QUFDMUM7QUFDQSw2QkFBNkIsc0JBQXNCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLG1CQUFtQixtREFBVTtBQUM3QjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL05vb3BUcmFjZXJQcm92aWRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5vb3BUcmFjZXIgfSBmcm9tICcuL05vb3BUcmFjZXInO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFRyYWNlclByb3ZpZGVyfSB3aGljaCByZXR1cm5zIGFuIGltcG90ZW50XG4gKiBUcmFjZXIgZm9yIGFsbCBjYWxscyB0byBgZ2V0VHJhY2VyYC5cbiAqXG4gKiBBbGwgb3BlcmF0aW9ucyBhcmUgbm8tb3AuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wVHJhY2VyUHJvdmlkZXIge1xuICAgIGdldFRyYWNlcihfbmFtZSwgX3ZlcnNpb24sIF9vcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFRyYWNlcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vb3BUcmFjZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyTracer: () => (/* binding */ ProxyTracer)\n/* harmony export */ });\n/* harmony import */ var _NoopTracer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nconst NOOP_TRACER = new _NoopTracer__WEBPACK_IMPORTED_MODULE_0__.NoopTracer();\n/**\n * Proxy tracer provided by the proxy tracer provider\n *\n * @since 1.0.0\n */\nclass ProxyTracer {\n constructor(provider, name, version, options) {\n this._provider = provider;\n this.name = name;\n this.version = version;\n this.options = options;\n }\n startSpan(name, options, context) {\n return this._getTracer().startSpan(name, options, context);\n }\n startActiveSpan(_name, _options, _context, _fn) {\n const tracer = this._getTracer();\n return Reflect.apply(tracer.startActiveSpan, tracer, arguments);\n }\n /**\n * Try to get a tracer from the proxy tracer provider.\n * If the proxy tracer provider has no delegate, return a noop tracer.\n */\n _getTracer() {\n if (this._delegate) {\n return this._delegate;\n }\n const tracer = this._provider.getDelegateTracer(this.name, this.version, this.options);\n if (!tracer) {\n return NOOP_TRACER;\n }\n this._delegate = tracer;\n return this._delegate;\n }\n}\n//# sourceMappingURL=ProxyTracer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvUHJveHlUcmFjZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUMwQztBQUMxQyx3QkFBd0IsbURBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9Qcm94eVRyYWNlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IE5vb3BUcmFjZXIgfSBmcm9tICcuL05vb3BUcmFjZXInO1xuY29uc3QgTk9PUF9UUkFDRVIgPSBuZXcgTm9vcFRyYWNlcigpO1xuLyoqXG4gKiBQcm94eSB0cmFjZXIgcHJvdmlkZWQgYnkgdGhlIHByb3h5IHRyYWNlciBwcm92aWRlclxuICpcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY2xhc3MgUHJveHlUcmFjZXIge1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVyLCBuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX3Byb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIHN0YXJ0U3BhbihuYW1lLCBvcHRpb25zLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRUcmFjZXIoKS5zdGFydFNwYW4obmFtZSwgb3B0aW9ucywgY29udGV4dCk7XG4gICAgfVxuICAgIHN0YXJ0QWN0aXZlU3BhbihfbmFtZSwgX29wdGlvbnMsIF9jb250ZXh0LCBfZm4pIHtcbiAgICAgICAgY29uc3QgdHJhY2VyID0gdGhpcy5fZ2V0VHJhY2VyKCk7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHRyYWNlci5zdGFydEFjdGl2ZVNwYW4sIHRyYWNlciwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGdldCBhIHRyYWNlciBmcm9tIHRoZSBwcm94eSB0cmFjZXIgcHJvdmlkZXIuXG4gICAgICogSWYgdGhlIHByb3h5IHRyYWNlciBwcm92aWRlciBoYXMgbm8gZGVsZWdhdGUsIHJldHVybiBhIG5vb3AgdHJhY2VyLlxuICAgICAqL1xuICAgIF9nZXRUcmFjZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyYWNlciA9IHRoaXMuX3Byb3ZpZGVyLmdldERlbGVnYXRlVHJhY2VyKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBpZiAoIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuIE5PT1BfVFJBQ0VSO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gdHJhY2VyO1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlUcmFjZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js": +/*!********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js ***! + \********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ProxyTracerProvider: () => (/* binding */ ProxyTracerProvider)\n/* harmony export */ });\n/* harmony import */ var _ProxyTracer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ProxyTracer */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js\");\n/* harmony import */ var _NoopTracerProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NoopTracerProvider */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\nconst NOOP_TRACER_PROVIDER = new _NoopTracerProvider__WEBPACK_IMPORTED_MODULE_0__.NoopTracerProvider();\n/**\n * Tracer provider which provides {@link ProxyTracer}s.\n *\n * Before a delegate is set, tracers provided are NoOp.\n * When a delegate is set, traces are provided from the delegate.\n * When a delegate is set after tracers have already been provided,\n * all tracers already provided will use the provided delegate implementation.\n *\n * @deprecated This will be removed in the next major version.\n * @since 1.0.0\n */\nclass ProxyTracerProvider {\n /**\n * Get a {@link ProxyTracer}\n */\n getTracer(name, version, options) {\n var _a;\n return ((_a = this.getDelegateTracer(name, version, options)) !== null && _a !== void 0 ? _a : new _ProxyTracer__WEBPACK_IMPORTED_MODULE_1__.ProxyTracer(this, name, version, options));\n }\n getDelegate() {\n var _a;\n return (_a = this._delegate) !== null && _a !== void 0 ? _a : NOOP_TRACER_PROVIDER;\n }\n /**\n * Set the delegate tracer provider\n */\n setDelegate(delegate) {\n this._delegate = delegate;\n }\n getDelegateTracer(name, version, options) {\n var _a;\n return (_a = this._delegate) === null || _a === void 0 ? void 0 : _a.getTracer(name, version, options);\n }\n}\n//# sourceMappingURL=ProxyTracerProvider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvUHJveHlUcmFjZXJQcm92aWRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUM0QztBQUNjO0FBQzFELGlDQUFpQyxtRUFBa0I7QUFDbkQ7QUFDQSxtQ0FBbUMsa0JBQWtCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsMkdBQTJHLHFEQUFXO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL1Byb3h5VHJhY2VyUHJvdmlkZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBQcm94eVRyYWNlciB9IGZyb20gJy4vUHJveHlUcmFjZXInO1xuaW1wb3J0IHsgTm9vcFRyYWNlclByb3ZpZGVyIH0gZnJvbSAnLi9Ob29wVHJhY2VyUHJvdmlkZXInO1xuY29uc3QgTk9PUF9UUkFDRVJfUFJPVklERVIgPSBuZXcgTm9vcFRyYWNlclByb3ZpZGVyKCk7XG4vKipcbiAqIFRyYWNlciBwcm92aWRlciB3aGljaCBwcm92aWRlcyB7QGxpbmsgUHJveHlUcmFjZXJ9cy5cbiAqXG4gKiBCZWZvcmUgYSBkZWxlZ2F0ZSBpcyBzZXQsIHRyYWNlcnMgcHJvdmlkZWQgYXJlIE5vT3AuXG4gKiAgIFdoZW4gYSBkZWxlZ2F0ZSBpcyBzZXQsIHRyYWNlcyBhcmUgcHJvdmlkZWQgZnJvbSB0aGUgZGVsZWdhdGUuXG4gKiAgIFdoZW4gYSBkZWxlZ2F0ZSBpcyBzZXQgYWZ0ZXIgdHJhY2VycyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZCxcbiAqICAgYWxsIHRyYWNlcnMgYWxyZWFkeSBwcm92aWRlZCB3aWxsIHVzZSB0aGUgcHJvdmlkZWQgZGVsZWdhdGUgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY2xhc3MgUHJveHlUcmFjZXJQcm92aWRlciB7XG4gICAgLyoqXG4gICAgICogR2V0IGEge0BsaW5rIFByb3h5VHJhY2VyfVxuICAgICAqL1xuICAgIGdldFRyYWNlcihuYW1lLCB2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuICgoX2EgPSB0aGlzLmdldERlbGVnYXRlVHJhY2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgUHJveHlUcmFjZXIodGhpcywgbmFtZSwgdmVyc2lvbiwgb3B0aW9ucykpO1xuICAgIH1cbiAgICBnZXREZWxlZ2F0ZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IE5PT1BfVFJBQ0VSX1BST1ZJREVSO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlbGVnYXRlIHRyYWNlciBwcm92aWRlclxuICAgICAqL1xuICAgIHNldERlbGVnYXRlKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgfVxuICAgIGdldERlbGVnYXRlVHJhY2VyKG5hbWUsIHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5fZGVsZWdhdGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUcmFjZXIobmFtZSwgdmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJveHlUcmFjZXJQcm92aWRlci5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SamplingDecision: () => (/* binding */ SamplingDecision)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @deprecated use the one declared in @opentelemetry/sdk-trace-base instead.\n * A sampling decision that determines how a {@link Span} will be recorded\n * and collected.\n *\n * @since 1.0.0\n */\nvar SamplingDecision;\n(function (SamplingDecision) {\n /**\n * `Span.isRecording() === false`, span will not be recorded and all events\n * and attributes will be dropped.\n */\n SamplingDecision[SamplingDecision[\"NOT_RECORD\"] = 0] = \"NOT_RECORD\";\n /**\n * `Span.isRecording() === true`, but `Sampled` flag in {@link TraceFlags}\n * MUST NOT be set.\n */\n SamplingDecision[SamplingDecision[\"RECORD\"] = 1] = \"RECORD\";\n /**\n * `Span.isRecording() === true` AND `Sampled` flag in {@link TraceFlags}\n * MUST be set.\n */\n SamplingDecision[SamplingDecision[\"RECORD_AND_SAMPLED\"] = 2] = \"RECORD_AND_SAMPLED\";\n})(SamplingDecision || (SamplingDecision = {}));\n//# sourceMappingURL=SamplingResult.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvU2FtcGxpbmdSZXN1bHQuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxZQUFZO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRDQUE0QztBQUM3QyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvU2FtcGxpbmdSZXN1bHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSB0aGUgb25lIGRlY2xhcmVkIGluIEBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlIGluc3RlYWQuXG4gKiBBIHNhbXBsaW5nIGRlY2lzaW9uIHRoYXQgZGV0ZXJtaW5lcyBob3cgYSB7QGxpbmsgU3Bhbn0gd2lsbCBiZSByZWNvcmRlZFxuICogYW5kIGNvbGxlY3RlZC5cbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IHZhciBTYW1wbGluZ0RlY2lzaW9uO1xuKGZ1bmN0aW9uIChTYW1wbGluZ0RlY2lzaW9uKSB7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gZmFsc2VgLCBzcGFuIHdpbGwgbm90IGJlIHJlY29yZGVkIGFuZCBhbGwgZXZlbnRzXG4gICAgICogYW5kIGF0dHJpYnV0ZXMgd2lsbCBiZSBkcm9wcGVkLlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIk5PVF9SRUNPUkRcIl0gPSAwXSA9IFwiTk9UX1JFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgLCBidXQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBOT1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRFwiXSA9IDFdID0gXCJSRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCBBTkQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEX0FORF9TQU1QTEVEXCJdID0gMl0gPSBcIlJFQ09SRF9BTkRfU0FNUExFRFwiO1xufSkoU2FtcGxpbmdEZWNpc2lvbiB8fCAoU2FtcGxpbmdEZWNpc2lvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TYW1wbGluZ1Jlc3VsdC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/SamplingResult.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js": +/*!**************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js ***! + \**************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ deleteSpan: () => (/* binding */ deleteSpan),\n/* harmony export */ getActiveSpan: () => (/* binding */ getActiveSpan),\n/* harmony export */ getSpan: () => (/* binding */ getSpan),\n/* harmony export */ getSpanContext: () => (/* binding */ getSpanContext),\n/* harmony export */ setSpan: () => (/* binding */ setSpan),\n/* harmony export */ setSpanContext: () => (/* binding */ setSpanContext)\n/* harmony export */ });\n/* harmony import */ var _context_context__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../context/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/context/context.js\");\n/* harmony import */ var _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./NonRecordingSpan */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\");\n/* harmony import */ var _api_context__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../api/context */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/api/context.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n\n/**\n * span key\n */\nconst SPAN_KEY = (0,_context_context__WEBPACK_IMPORTED_MODULE_0__.createContextKey)('OpenTelemetry Context Key SPAN');\n/**\n * Return the span if one exists\n *\n * @param context context to get span from\n */\nfunction getSpan(context) {\n return context.getValue(SPAN_KEY) || undefined;\n}\n/**\n * Gets the span from the current context, if one exists.\n */\nfunction getActiveSpan() {\n return getSpan(_api_context__WEBPACK_IMPORTED_MODULE_1__.ContextAPI.getInstance().active());\n}\n/**\n * Set the span on a context\n *\n * @param context context to use as parent\n * @param span span to set active\n */\nfunction setSpan(context, span) {\n return context.setValue(SPAN_KEY, span);\n}\n/**\n * Remove current span stored in the context\n *\n * @param context context to delete span from\n */\nfunction deleteSpan(context) {\n return context.deleteValue(SPAN_KEY);\n}\n/**\n * Wrap span context in a NoopSpan and set as span in a new\n * context\n *\n * @param context context to set active span on\n * @param spanContext span context to be wrapped\n */\nfunction setSpanContext(context, spanContext) {\n return setSpan(context, new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_2__.NonRecordingSpan(spanContext));\n}\n/**\n * Get the span context of the span if it exists.\n *\n * @param context context to get values from\n */\nfunction getSpanContext(context) {\n var _a;\n return (_a = getSpan(context)) === null || _a === void 0 ? void 0 : _a.spanContext();\n}\n//# sourceMappingURL=context-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvY29udGV4dC11dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNzRDtBQUNBO0FBQ1Y7QUFDNUM7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtFQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxtQkFBbUIsb0RBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGdDQUFnQywrREFBZ0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvY29udGV4dC11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRLZXkgfSBmcm9tICcuLi9jb250ZXh0L2NvbnRleHQnO1xuaW1wb3J0IHsgTm9uUmVjb3JkaW5nU3BhbiB9IGZyb20gJy4vTm9uUmVjb3JkaW5nU3Bhbic7XG5pbXBvcnQgeyBDb250ZXh0QVBJIH0gZnJvbSAnLi4vYXBpL2NvbnRleHQnO1xuLyoqXG4gKiBzcGFuIGtleVxuICovXG5jb25zdCBTUEFOX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoJ09wZW5UZWxlbWV0cnkgQ29udGV4dCBLZXkgU1BBTicpO1xuLyoqXG4gKiBSZXR1cm4gdGhlIHNwYW4gaWYgb25lIGV4aXN0c1xuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gZ2V0IHNwYW4gZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhbihjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFsdWUoU1BBTl9LRVkpIHx8IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogR2V0cyB0aGUgc3BhbiBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQsIGlmIG9uZSBleGlzdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVTcGFuKCkge1xuICAgIHJldHVybiBnZXRTcGFuKENvbnRleHRBUEkuZ2V0SW5zdGFuY2UoKS5hY3RpdmUoKSk7XG59XG4vKipcbiAqIFNldCB0aGUgc3BhbiBvbiBhIGNvbnRleHRcbiAqXG4gKiBAcGFyYW0gY29udGV4dCBjb250ZXh0IHRvIHVzZSBhcyBwYXJlbnRcbiAqIEBwYXJhbSBzcGFuIHNwYW4gdG8gc2V0IGFjdGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0U3Bhbihjb250ZXh0LCBzcGFuKSB7XG4gICAgcmV0dXJuIGNvbnRleHQuc2V0VmFsdWUoU1BBTl9LRVksIHNwYW4pO1xufVxuLyoqXG4gKiBSZW1vdmUgY3VycmVudCBzcGFuIHN0b3JlZCBpbiB0aGUgY29udGV4dFxuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gZGVsZXRlIHNwYW4gZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlU3Bhbihjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZGVsZXRlVmFsdWUoU1BBTl9LRVkpO1xufVxuLyoqXG4gKiBXcmFwIHNwYW4gY29udGV4dCBpbiBhIE5vb3BTcGFuIGFuZCBzZXQgYXMgc3BhbiBpbiBhIG5ld1xuICogY29udGV4dFxuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gc2V0IGFjdGl2ZSBzcGFuIG9uXG4gKiBAcGFyYW0gc3BhbkNvbnRleHQgc3BhbiBjb250ZXh0IHRvIGJlIHdyYXBwZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFNwYW5Db250ZXh0KGNvbnRleHQsIHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIHNldFNwYW4oY29udGV4dCwgbmV3IE5vblJlY29yZGluZ1NwYW4oc3BhbkNvbnRleHQpKTtcbn1cbi8qKlxuICogR2V0IHRoZSBzcGFuIGNvbnRleHQgb2YgdGhlIHNwYW4gaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgdG8gZ2V0IHZhbHVlcyBmcm9tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFuQ29udGV4dChjb250ZXh0KSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBnZXRTcGFuKGNvbnRleHQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3BhbkNvbnRleHQoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQtdXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js": +/*!*************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js ***! + \*************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TraceStateImpl: () => (/* binding */ TraceStateImpl)\n/* harmony export */ });\n/* harmony import */ var _tracestate_validators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tracestate-validators */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nconst MAX_TRACE_STATE_ITEMS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\nconst LIST_MEMBERS_SEPARATOR = ',';\nconst LIST_MEMBER_KEY_VALUE_SPLITTER = '=';\n/**\n * TraceState must be a class and not a simple object type because of the spec\n * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).\n *\n * Here is the list of allowed mutations:\n * - New key-value pair should be added into the beginning of the list\n * - The value of any key can be updated. Modified keys MUST be moved to the\n * beginning of the list.\n */\nclass TraceStateImpl {\n constructor(rawTraceState) {\n this._internalState = new Map();\n if (rawTraceState)\n this._parse(rawTraceState);\n }\n set(key, value) {\n // TODO: Benchmark the different approaches(map vs list) and\n // use the faster one.\n const traceState = this._clone();\n if (traceState._internalState.has(key)) {\n traceState._internalState.delete(key);\n }\n traceState._internalState.set(key, value);\n return traceState;\n }\n unset(key) {\n const traceState = this._clone();\n traceState._internalState.delete(key);\n return traceState;\n }\n get(key) {\n return this._internalState.get(key);\n }\n serialize() {\n return (Array.from(this._internalState.keys())\n // Use reduceRight() because keys are stored in reverse insertion order.\n .reduceRight((agg, key) => {\n agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + this.get(key));\n return agg;\n }, [])\n .join(LIST_MEMBERS_SEPARATOR));\n }\n _parse(rawTraceState) {\n if (rawTraceState.length > MAX_TRACE_STATE_LEN)\n return;\n this._internalState = rawTraceState\n .split(LIST_MEMBERS_SEPARATOR)\n // Use reduceRight() so new keys (.set(...)) will be placed at the beginning\n .reduceRight((agg, part) => {\n const listMember = part.trim(); // Optional Whitespace (OWS) handling\n const i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);\n if (i !== -1) {\n const key = listMember.slice(0, i);\n const value = listMember.slice(i + 1, part.length);\n if ((0,_tracestate_validators__WEBPACK_IMPORTED_MODULE_0__.validateKey)(key) && (0,_tracestate_validators__WEBPACK_IMPORTED_MODULE_0__.validateValue)(value)) {\n agg.set(key, value);\n }\n else {\n // TODO: Consider to add warning log\n }\n }\n return agg;\n }, new Map());\n // Because of the reverse() requirement, trunc must be done after map is created\n if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {\n this._internalState = new Map(Array.from(this._internalState.entries())\n .reverse() // Use reverse same as original tracestate parse chain\n .slice(0, MAX_TRACE_STATE_ITEMS));\n }\n }\n // @ts-expect-error TS6133 Accessed in tests only.\n _keys() {\n return Array.from(this._internalState.keys()).reverse();\n }\n _clone() {\n const traceState = new TraceStateImpl();\n traceState._internalState = new Map(this._internalState);\n return traceState;\n }\n}\n//# sourceMappingURL=tracestate-impl.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdHJhY2VzdGF0ZS1pbXBsLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1FQUFXLFNBQVMscUVBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9pbnRlcm5hbC90cmFjZXN0YXRlLWltcGwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyB2YWxpZGF0ZUtleSwgdmFsaWRhdGVWYWx1ZSB9IGZyb20gJy4vdHJhY2VzdGF0ZS12YWxpZGF0b3JzJztcbmNvbnN0IE1BWF9UUkFDRV9TVEFURV9JVEVNUyA9IDMyO1xuY29uc3QgTUFYX1RSQUNFX1NUQVRFX0xFTiA9IDUxMjtcbmNvbnN0IExJU1RfTUVNQkVSU19TRVBBUkFUT1IgPSAnLCc7XG5jb25zdCBMSVNUX01FTUJFUl9LRVlfVkFMVUVfU1BMSVRURVIgPSAnPSc7XG4vKipcbiAqIFRyYWNlU3RhdGUgbXVzdCBiZSBhIGNsYXNzIGFuZCBub3QgYSBzaW1wbGUgb2JqZWN0IHR5cGUgYmVjYXVzZSBvZiB0aGUgc3BlY1xuICogcmVxdWlyZW1lbnQgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0LyN0cmFjZXN0YXRlLWZpZWxkKS5cbiAqXG4gKiBIZXJlIGlzIHRoZSBsaXN0IG9mIGFsbG93ZWQgbXV0YXRpb25zOlxuICogLSBOZXcga2V5LXZhbHVlIHBhaXIgc2hvdWxkIGJlIGFkZGVkIGludG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdFxuICogLSBUaGUgdmFsdWUgb2YgYW55IGtleSBjYW4gYmUgdXBkYXRlZC4gTW9kaWZpZWQga2V5cyBNVVNUIGJlIG1vdmVkIHRvIHRoZVxuICogYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICovXG5leHBvcnQgY2xhc3MgVHJhY2VTdGF0ZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKHJhd1RyYWNlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxTdGF0ZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKHJhd1RyYWNlU3RhdGUpXG4gICAgICAgICAgICB0aGlzLl9wYXJzZShyYXdUcmFjZVN0YXRlKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gVE9ETzogQmVuY2htYXJrIHRoZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyhtYXAgdnMgbGlzdCkgYW5kXG4gICAgICAgIC8vIHVzZSB0aGUgZmFzdGVyIG9uZS5cbiAgICAgICAgY29uc3QgdHJhY2VTdGF0ZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGlmICh0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJhY2VTdGF0ZTtcbiAgICB9XG4gICAgdW5zZXQoa2V5KSB7XG4gICAgICAgIGNvbnN0IHRyYWNlU3RhdGUgPSB0aGlzLl9jbG9uZSgpO1xuICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmRlbGV0ZShrZXkpO1xuICAgICAgICByZXR1cm4gdHJhY2VTdGF0ZTtcbiAgICB9XG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxTdGF0ZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gKEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpXG4gICAgICAgICAgICAvLyBVc2UgcmVkdWNlUmlnaHQoKSBiZWNhdXNlIGtleXMgYXJlIHN0b3JlZCBpbiByZXZlcnNlIGluc2VydGlvbiBvcmRlci5cbiAgICAgICAgICAgIC5yZWR1Y2VSaWdodCgoYWdnLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGFnZy5wdXNoKGtleSArIExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUiArIHRoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIGFnZztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuam9pbihMSVNUX01FTUJFUlNfU0VQQVJBVE9SKSk7XG4gICAgfVxuICAgIF9wYXJzZShyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlLmxlbmd0aCA+IE1BWF9UUkFDRV9TVEFURV9MRU4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSByYXdUcmFjZVN0YXRlXG4gICAgICAgICAgICAuc3BsaXQoTElTVF9NRU1CRVJTX1NFUEFSQVRPUilcbiAgICAgICAgICAgIC8vIFVzZSByZWR1Y2VSaWdodCgpIHNvIG5ldyBrZXlzICguc2V0KC4uLikpIHdpbGwgYmUgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgICAgICAgIC5yZWR1Y2VSaWdodCgoYWdnLCBwYXJ0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0TWVtYmVyID0gcGFydC50cmltKCk7IC8vIE9wdGlvbmFsIFdoaXRlc3BhY2UgKE9XUykgaGFuZGxpbmdcbiAgICAgICAgICAgIGNvbnN0IGkgPSBsaXN0TWVtYmVyLmluZGV4T2YoTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSKTtcbiAgICAgICAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGxpc3RNZW1iZXIuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsaXN0TWVtYmVyLnNsaWNlKGkgKyAxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlS2V5KGtleSkgJiYgdmFsaWRhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdnLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIHRvIGFkZCB3YXJuaW5nIGxvZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhZ2c7XG4gICAgICAgIH0sIG5ldyBNYXAoKSk7XG4gICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIHJldmVyc2UoKSByZXF1aXJlbWVudCwgdHJ1bmMgbXVzdCBiZSBkb25lIGFmdGVyIG1hcCBpcyBjcmVhdGVkXG4gICAgICAgIGlmICh0aGlzLl9pbnRlcm5hbFN0YXRlLnNpemUgPiBNQVhfVFJBQ0VfU1RBVEVfSVRFTVMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5lbnRyaWVzKCkpXG4gICAgICAgICAgICAgICAgLnJldmVyc2UoKSAvLyBVc2UgcmV2ZXJzZSBzYW1lIGFzIG9yaWdpbmFsIHRyYWNlc3RhdGUgcGFyc2UgY2hhaW5cbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgTUFYX1RSQUNFX1NUQVRFX0lURU1TKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUUzYxMzMgQWNjZXNzZWQgaW4gdGVzdHMgb25seS5cbiAgICBfa2V5cygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgX2Nsb25lKCkge1xuICAgICAgICBjb25zdCB0cmFjZVN0YXRlID0gbmV3IFRyYWNlU3RhdGVJbXBsKCk7XG4gICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKHRoaXMuX2ludGVybmFsU3RhdGUpO1xuICAgICAgICByZXR1cm4gdHJhY2VTdGF0ZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZXN0YXRlLWltcGwuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js": +/*!*******************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js ***! + \*******************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ validateKey: () => (/* binding */ validateKey),\n/* harmony export */ validateValue: () => (/* binding */ validateValue)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nconst VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';\nconst VALID_KEY = `[a-z]${VALID_KEY_CHAR_RANGE}{0,255}`;\nconst VALID_VENDOR_KEY = `[a-z0-9]${VALID_KEY_CHAR_RANGE}{0,240}@[a-z]${VALID_KEY_CHAR_RANGE}{0,13}`;\nconst VALID_KEY_REGEX = new RegExp(`^(?:${VALID_KEY}|${VALID_VENDOR_KEY})$`);\nconst VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;\nconst INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;\n/**\n * Key is opaque string up to 256 characters printable. It MUST begin with a\n * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,\n * underscores _, dashes -, asterisks *, and forward slashes /.\n * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the\n * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.\n * see https://www.w3.org/TR/trace-context/#key\n */\nfunction validateKey(key) {\n return VALID_KEY_REGEX.test(key);\n}\n/**\n * Value is opaque string up to 256 characters printable ASCII RFC0020\n * characters (i.e., the range 0x20 to 0x7E) except comma , and =.\n */\nfunction validateValue(value) {\n return (VALID_VALUE_BASE_REGEX.test(value) &&\n !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value));\n}\n//# sourceMappingURL=tracestate-validators.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdHJhY2VzdGF0ZS12YWxpZGF0b3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixzQkFBc0IsTUFBTTtBQUN0RCxvQ0FBb0Msc0JBQXNCLE1BQU0sUUFBUSxzQkFBc0IsS0FBSztBQUNuRywwQ0FBMEMsVUFBVSxHQUFHLGlCQUFpQjtBQUN4RSx1Q0FBdUMsTUFBTTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL2ludGVybmFsL3RyYWNlc3RhdGUtdmFsaWRhdG9ycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IFZBTElEX0tFWV9DSEFSX1JBTkdFID0gJ1tfMC05YS16LSovXSc7XG5jb25zdCBWQUxJRF9LRVkgPSBgW2Etel0ke1ZBTElEX0tFWV9DSEFSX1JBTkdFfXswLDI1NX1gO1xuY29uc3QgVkFMSURfVkVORE9SX0tFWSA9IGBbYS16MC05XSR7VkFMSURfS0VZX0NIQVJfUkFOR0V9ezAsMjQwfUBbYS16XSR7VkFMSURfS0VZX0NIQVJfUkFOR0V9ezAsMTN9YDtcbmNvbnN0IFZBTElEX0tFWV9SRUdFWCA9IG5ldyBSZWdFeHAoYF4oPzoke1ZBTElEX0tFWX18JHtWQUxJRF9WRU5ET1JfS0VZfSkkYCk7XG5jb25zdCBWQUxJRF9WQUxVRV9CQVNFX1JFR0VYID0gL15bIC1+XXswLDI1NX1bIS1+XSQvO1xuY29uc3QgSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWCA9IC8sfD0vO1xuLyoqXG4gKiBLZXkgaXMgb3BhcXVlIHN0cmluZyB1cCB0byAyNTYgY2hhcmFjdGVycyBwcmludGFibGUuIEl0IE1VU1QgYmVnaW4gd2l0aCBhXG4gKiBsb3dlcmNhc2UgbGV0dGVyLCBhbmQgY2FuIG9ubHkgY29udGFpbiBsb3dlcmNhc2UgbGV0dGVycyBhLXosIGRpZ2l0cyAwLTksXG4gKiB1bmRlcnNjb3JlcyBfLCBkYXNoZXMgLSwgYXN0ZXJpc2tzICosIGFuZCBmb3J3YXJkIHNsYXNoZXMgLy5cbiAqIEZvciBtdWx0aS10ZW5hbnQgdmVuZG9yIHNjZW5hcmlvcywgYW4gYXQgc2lnbiAoQCkgY2FuIGJlIHVzZWQgdG8gcHJlZml4IHRoZVxuICogdmVuZG9yIG5hbWUuIFZlbmRvcnMgU0hPVUxEIHNldCB0aGUgdGVuYW50IElEIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleS5cbiAqIHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8ja2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUtleShrZXkpIHtcbiAgICByZXR1cm4gVkFMSURfS0VZX1JFR0VYLnRlc3Qoa2V5KTtcbn1cbi8qKlxuICogVmFsdWUgaXMgb3BhcXVlIHN0cmluZyB1cCB0byAyNTYgY2hhcmFjdGVycyBwcmludGFibGUgQVNDSUkgUkZDMDAyMFxuICogY2hhcmFjdGVycyAoaS5lLiwgdGhlIHJhbmdlIDB4MjAgdG8gMHg3RSkgZXhjZXB0IGNvbW1hICwgYW5kID0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChWQUxJRF9WQUxVRV9CQVNFX1JFR0VYLnRlc3QodmFsdWUpICYmXG4gICAgICAgICFJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYLnRlc3QodmFsdWUpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNlc3RhdGUtdmFsaWRhdG9ycy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-validators.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js": +/*!***************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js ***! + \***************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ createTraceState: () => (/* binding */ createTraceState)\n/* harmony export */ });\n/* harmony import */ var _tracestate_impl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tracestate-impl */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/tracestate-impl.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @since 1.1.0\n */\nfunction createTraceState(rawTraceState) {\n return new _tracestate_impl__WEBPACK_IMPORTED_MODULE_0__.TraceStateImpl(rawTraceState);\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdXRpbHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDTztBQUNQLGVBQWUsNERBQWM7QUFDN0I7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW50ZXJuYWwvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBUcmFjZVN0YXRlSW1wbCB9IGZyb20gJy4vdHJhY2VzdGF0ZS1pbXBsJztcbi8qKlxuICogQHNpbmNlIDEuMS4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUcmFjZVN0YXRlKHJhd1RyYWNlU3RhdGUpIHtcbiAgICByZXR1cm4gbmV3IFRyYWNlU3RhdGVJbXBsKHJhd1RyYWNlU3RhdGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/internal/utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js": +/*!***********************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js ***! + \***********************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ INVALID_SPANID: () => (/* binding */ INVALID_SPANID),\n/* harmony export */ INVALID_SPAN_CONTEXT: () => (/* binding */ INVALID_SPAN_CONTEXT),\n/* harmony export */ INVALID_TRACEID: () => (/* binding */ INVALID_TRACEID)\n/* harmony export */ });\n/* harmony import */ var _trace_flags__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./trace_flags */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @since 1.0.0\n */\nconst INVALID_SPANID = '0000000000000000';\n/**\n * @since 1.0.0\n */\nconst INVALID_TRACEID = '00000000000000000000000000000000';\n/**\n * @since 1.0.0\n */\nconst INVALID_SPAN_CONTEXT = {\n traceId: INVALID_TRACEID,\n spanId: INVALID_SPANID,\n traceFlags: _trace_flags__WEBPACK_IMPORTED_MODULE_0__.TraceFlags.NONE,\n};\n//# sourceMappingURL=invalid-span-constants.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvaW52YWxpZC1zcGFuLWNvbnN0YW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLGdCQUFnQixvREFBVTtBQUMxQjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9pbnZhbGlkLXNwYW4tY29uc3RhbnRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVHJhY2VGbGFncyB9IGZyb20gJy4vdHJhY2VfZmxhZ3MnO1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IElOVkFMSURfU1BBTklEID0gJzAwMDAwMDAwMDAwMDAwMDAnO1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IElOVkFMSURfVFJBQ0VJRCA9ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgY29uc3QgSU5WQUxJRF9TUEFOX0NPTlRFWFQgPSB7XG4gICAgdHJhY2VJZDogSU5WQUxJRF9UUkFDRUlELFxuICAgIHNwYW5JZDogSU5WQUxJRF9TUEFOSUQsXG4gICAgdHJhY2VGbGFnczogVHJhY2VGbGFncy5OT05FLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWludmFsaWQtc3Bhbi1jb25zdGFudHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js": +/*!**********************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js ***! + \**********************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpanKind: () => (/* binding */ SpanKind)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @since 1.0.0\n */\nvar SpanKind;\n(function (SpanKind) {\n /** Default value. Indicates that the span is used internally. */\n SpanKind[SpanKind[\"INTERNAL\"] = 0] = \"INTERNAL\";\n /**\n * Indicates that the span covers server-side handling of an RPC or other\n * remote request.\n */\n SpanKind[SpanKind[\"SERVER\"] = 1] = \"SERVER\";\n /**\n * Indicates that the span covers the client-side wrapper around an RPC or\n * other remote request.\n */\n SpanKind[SpanKind[\"CLIENT\"] = 2] = \"CLIENT\";\n /**\n * Indicates that the span describes producer sending a message to a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind[\"PRODUCER\"] = 3] = \"PRODUCER\";\n /**\n * Indicates that the span describes consumer receiving a message from a\n * broker. Unlike client and server, there is no direct critical path latency\n * relationship between producer and consumer spans.\n */\n SpanKind[SpanKind[\"CONSUMER\"] = 4] = \"CONSUMER\";\n})(SpanKind || (SpanKind = {}));\n//# sourceMappingURL=span_kind.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3Bhbl9raW5kLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRCQUE0QjtBQUM3QiIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3Bhbl9raW5kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IHZhciBTcGFuS2luZDtcbihmdW5jdGlvbiAoU3BhbktpbmQpIHtcbiAgICAvKiogRGVmYXVsdCB2YWx1ZS4gSW5kaWNhdGVzIHRoYXQgdGhlIHNwYW4gaXMgdXNlZCBpbnRlcm5hbGx5LiAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiSU5URVJOQUxcIl0gPSAwXSA9IFwiSU5URVJOQUxcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBjb3ZlcnMgc2VydmVyLXNpZGUgaGFuZGxpbmcgb2YgYW4gUlBDIG9yIG90aGVyXG4gICAgICogcmVtb3RlIHJlcXVlc3QuXG4gICAgICovXG4gICAgU3BhbktpbmRbU3BhbktpbmRbXCJTRVJWRVJcIl0gPSAxXSA9IFwiU0VSVkVSXCI7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNwYW4gY292ZXJzIHRoZSBjbGllbnQtc2lkZSB3cmFwcGVyIGFyb3VuZCBhbiBSUEMgb3JcbiAgICAgKiBvdGhlciByZW1vdGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBTcGFuS2luZFtTcGFuS2luZFtcIkNMSUVOVFwiXSA9IDJdID0gXCJDTElFTlRcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBkZXNjcmliZXMgcHJvZHVjZXIgc2VuZGluZyBhIG1lc3NhZ2UgdG8gYVxuICAgICAqIGJyb2tlci4gVW5saWtlIGNsaWVudCBhbmQgc2VydmVyLCB0aGVyZSBpcyBubyBkaXJlY3QgY3JpdGljYWwgcGF0aCBsYXRlbmN5XG4gICAgICogcmVsYXRpb25zaGlwIGJldHdlZW4gcHJvZHVjZXIgYW5kIGNvbnN1bWVyIHNwYW5zLlxuICAgICAqL1xuICAgIFNwYW5LaW5kW1NwYW5LaW5kW1wiUFJPRFVDRVJcIl0gPSAzXSA9IFwiUFJPRFVDRVJcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3BhbiBkZXNjcmliZXMgY29uc3VtZXIgcmVjZWl2aW5nIGEgbWVzc2FnZSBmcm9tIGFcbiAgICAgKiBicm9rZXIuIFVubGlrZSBjbGllbnQgYW5kIHNlcnZlciwgdGhlcmUgaXMgbm8gZGlyZWN0IGNyaXRpY2FsIHBhdGggbGF0ZW5jeVxuICAgICAqIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHByb2R1Y2VyIGFuZCBjb25zdW1lciBzcGFucy5cbiAgICAgKi9cbiAgICBTcGFuS2luZFtTcGFuS2luZFtcIkNPTlNVTUVSXCJdID0gNF0gPSBcIkNPTlNVTUVSXCI7XG59KShTcGFuS2luZCB8fCAoU3BhbktpbmQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3Bhbl9raW5kLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/span_kind.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js": +/*!******************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js ***! + \******************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ isSpanContextValid: () => (/* binding */ isSpanContextValid),\n/* harmony export */ isValidSpanId: () => (/* binding */ isValidSpanId),\n/* harmony export */ isValidTraceId: () => (/* binding */ isValidTraceId),\n/* harmony export */ wrapSpanContext: () => (/* binding */ wrapSpanContext)\n/* harmony export */ });\n/* harmony import */ var _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./invalid-span-constants */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js\");\n/* harmony import */ var _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NonRecordingSpan */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js\");\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\n// Valid characters (0-9, a-f, A-F) are marked as 1.\nconst isHex = new Uint8Array([\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,\n 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,\n]);\nfunction isValidHex(id, length) {\n // As of 1.9.0 the id was allowed to be a non-string value,\n // even though it was not possible in the types.\n if (typeof id !== 'string' || id.length !== length)\n return false;\n let r = 0;\n for (let i = 0; i < id.length; i += 4) {\n r +=\n (isHex[id.charCodeAt(i)] | 0) +\n (isHex[id.charCodeAt(i + 1)] | 0) +\n (isHex[id.charCodeAt(i + 2)] | 0) +\n (isHex[id.charCodeAt(i + 3)] | 0);\n }\n return r === length;\n}\n/**\n * @since 1.0.0\n */\nfunction isValidTraceId(traceId) {\n return isValidHex(traceId, 32) && traceId !== _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__.INVALID_TRACEID;\n}\n/**\n * @since 1.0.0\n */\nfunction isValidSpanId(spanId) {\n return isValidHex(spanId, 16) && spanId !== _invalid_span_constants__WEBPACK_IMPORTED_MODULE_0__.INVALID_SPANID;\n}\n/**\n * Returns true if this {@link SpanContext} is valid.\n * @return true if this {@link SpanContext} is valid.\n *\n * @since 1.0.0\n */\nfunction isSpanContextValid(spanContext) {\n return (isValidTraceId(spanContext.traceId) && isValidSpanId(spanContext.spanId));\n}\n/**\n * Wrap the given {@link SpanContext} in a new non-recording {@link Span}\n *\n * @param spanContext span context to be wrapped\n * @returns a new non-recording {@link Span} with the provided context\n */\nfunction wrapSpanContext(spanContext) {\n return new _NonRecordingSpan__WEBPACK_IMPORTED_MODULE_1__.NonRecordingSpan(spanContext);\n}\n//# sourceMappingURL=spancontext-utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3BhbmNvbnRleHQtdXRpbHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDMkU7QUFDckI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZTtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxrREFBa0Qsb0VBQWU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGdEQUFnRCxtRUFBYztBQUM5RDtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1Qyx5QkFBeUIsbUJBQW1CO0FBQzVDO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQix3QkFBd0I7QUFDOUQ7QUFDQTtBQUNBLGlDQUFpQyxZQUFZO0FBQzdDO0FBQ087QUFDUCxlQUFlLCtEQUFnQjtBQUMvQjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9zbWxmbGcvUHJvamVrdGUvRXhwZXJpbWVudGUvc3VwZXJsb2cvbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMS9ub2RlX21vZHVsZXMvQG9wZW50ZWxlbWV0cnkvYXBpL2J1aWxkL2VzbS90cmFjZS9zcGFuY29udGV4dC11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IElOVkFMSURfU1BBTklELCBJTlZBTElEX1RSQUNFSUQgfSBmcm9tICcuL2ludmFsaWQtc3Bhbi1jb25zdGFudHMnO1xuaW1wb3J0IHsgTm9uUmVjb3JkaW5nU3BhbiB9IGZyb20gJy4vTm9uUmVjb3JkaW5nU3Bhbic7XG4vLyBWYWxpZCBjaGFyYWN0ZXJzICgwLTksIGEtZiwgQS1GKSBhcmUgbWFya2VkIGFzIDEuXG5jb25zdCBpc0hleCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsXG4gICAgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLFxuXSk7XG5mdW5jdGlvbiBpc1ZhbGlkSGV4KGlkLCBsZW5ndGgpIHtcbiAgICAvLyBBcyBvZiAxLjkuMCB0aGUgaWQgd2FzIGFsbG93ZWQgdG8gYmUgYSBub24tc3RyaW5nIHZhbHVlLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0IHdhcyBub3QgcG9zc2libGUgaW4gdGhlIHR5cGVzLlxuICAgIGlmICh0eXBlb2YgaWQgIT09ICdzdHJpbmcnIHx8IGlkLmxlbmd0aCAhPT0gbGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHIgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgciArPVxuICAgICAgICAgICAgKGlzSGV4W2lkLmNoYXJDb2RlQXQoaSldIHwgMCkgK1xuICAgICAgICAgICAgICAgIChpc0hleFtpZC5jaGFyQ29kZUF0KGkgKyAxKV0gfCAwKSArXG4gICAgICAgICAgICAgICAgKGlzSGV4W2lkLmNoYXJDb2RlQXQoaSArIDIpXSB8IDApICtcbiAgICAgICAgICAgICAgICAoaXNIZXhbaWQuY2hhckNvZGVBdChpICsgMyldIHwgMCk7XG4gICAgfVxuICAgIHJldHVybiByID09PSBsZW5ndGg7XG59XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYWNlSWQodHJhY2VJZCkge1xuICAgIHJldHVybiBpc1ZhbGlkSGV4KHRyYWNlSWQsIDMyKSAmJiB0cmFjZUlkICE9PSBJTlZBTElEX1RSQUNFSUQ7XG59XG4vKipcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFNwYW5JZChzcGFuSWQpIHtcbiAgICByZXR1cm4gaXNWYWxpZEhleChzcGFuSWQsIDE2KSAmJiBzcGFuSWQgIT09IElOVkFMSURfU1BBTklEO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB7QGxpbmsgU3BhbkNvbnRleHR9IGlzIHZhbGlkLlxuICogQHJldHVybiB0cnVlIGlmIHRoaXMge0BsaW5rIFNwYW5Db250ZXh0fSBpcyB2YWxpZC5cbiAqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3BhbkNvbnRleHRWYWxpZChzcGFuQ29udGV4dCkge1xuICAgIHJldHVybiAoaXNWYWxpZFRyYWNlSWQoc3BhbkNvbnRleHQudHJhY2VJZCkgJiYgaXNWYWxpZFNwYW5JZChzcGFuQ29udGV4dC5zcGFuSWQpKTtcbn1cbi8qKlxuICogV3JhcCB0aGUgZ2l2ZW4ge0BsaW5rIFNwYW5Db250ZXh0fSBpbiBhIG5ldyBub24tcmVjb3JkaW5nIHtAbGluayBTcGFufVxuICpcbiAqIEBwYXJhbSBzcGFuQ29udGV4dCBzcGFuIGNvbnRleHQgdG8gYmUgd3JhcHBlZFxuICogQHJldHVybnMgYSBuZXcgbm9uLXJlY29yZGluZyB7QGxpbmsgU3Bhbn0gd2l0aCB0aGUgcHJvdmlkZWQgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcFNwYW5Db250ZXh0KHNwYW5Db250ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBOb25SZWNvcmRpbmdTcGFuKHNwYW5Db250ZXh0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNwYW5jb250ZXh0LXV0aWxzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js": +/*!*******************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js ***! + \*******************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SpanStatusCode: () => (/* binding */ SpanStatusCode)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * An enumeration of status codes.\n *\n * @since 1.0.0\n */\nvar SpanStatusCode;\n(function (SpanStatusCode) {\n /**\n * The default status.\n */\n SpanStatusCode[SpanStatusCode[\"UNSET\"] = 0] = \"UNSET\";\n /**\n * The operation has been validated by an Application developer or\n * Operator to have completed successfully.\n */\n SpanStatusCode[SpanStatusCode[\"OK\"] = 1] = \"OK\";\n /**\n * The operation contains an error.\n */\n SpanStatusCode[SpanStatusCode[\"ERROR\"] = 2] = \"ERROR\";\n})(SpanStatusCode || (SpanStatusCode = {}));\n//# sourceMappingURL=status.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3RhdHVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHdDQUF3QztBQUN6QyIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2Uvc3RhdHVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiBzdGF0dXMgY29kZXMuXG4gKlxuICogQHNpbmNlIDEuMC4wXG4gKi9cbmV4cG9ydCB2YXIgU3BhblN0YXR1c0NvZGU7XG4oZnVuY3Rpb24gKFNwYW5TdGF0dXNDb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgc3RhdHVzLlxuICAgICAqL1xuICAgIFNwYW5TdGF0dXNDb2RlW1NwYW5TdGF0dXNDb2RlW1wiVU5TRVRcIl0gPSAwXSA9IFwiVU5TRVRcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIHZhbGlkYXRlZCBieSBhbiBBcHBsaWNhdGlvbiBkZXZlbG9wZXIgb3JcbiAgICAgKiBPcGVyYXRvciB0byBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAgICovXG4gICAgU3BhblN0YXR1c0NvZGVbU3BhblN0YXR1c0NvZGVbXCJPS1wiXSA9IDFdID0gXCJPS1wiO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcGVyYXRpb24gY29udGFpbnMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgU3BhblN0YXR1c0NvZGVbU3BhblN0YXR1c0NvZGVbXCJFUlJPUlwiXSA9IDJdID0gXCJFUlJPUlwiO1xufSkoU3BhblN0YXR1c0NvZGUgfHwgKFNwYW5TdGF0dXNDb2RlID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0YXR1cy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/status.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js": +/*!************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js ***! + \************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ TraceFlags: () => (/* binding */ TraceFlags)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n/**\n * @since 1.0.0\n */\nvar TraceFlags;\n(function (TraceFlags) {\n /** Represents no flag set. */\n TraceFlags[TraceFlags[\"NONE\"] = 0] = \"NONE\";\n /** Bit to represent whether trace is sampled in trace flags. */\n TraceFlags[TraceFlags[\"SAMPLED\"] = 1] = \"SAMPLED\";\n})(TraceFlags || (TraceFlags = {}));\n//# sourceMappingURL=trace_flags.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdHJhY2UvdHJhY2VfZmxhZ3MuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxnQ0FBZ0M7QUFDakMiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3RyYWNlL3RyYWNlX2ZsYWdzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqL1xuZXhwb3J0IHZhciBUcmFjZUZsYWdzO1xuKGZ1bmN0aW9uIChUcmFjZUZsYWdzKSB7XG4gICAgLyoqIFJlcHJlc2VudHMgbm8gZmxhZyBzZXQuICovXG4gICAgVHJhY2VGbGFnc1tUcmFjZUZsYWdzW1wiTk9ORVwiXSA9IDBdID0gXCJOT05FXCI7XG4gICAgLyoqIEJpdCB0byByZXByZXNlbnQgd2hldGhlciB0cmFjZSBpcyBzYW1wbGVkIGluIHRyYWNlIGZsYWdzLiAqL1xuICAgIFRyYWNlRmxhZ3NbVHJhY2VGbGFnc1tcIlNBTVBMRURcIl0gPSAxXSA9IFwiU0FNUExFRFwiO1xufSkoVHJhY2VGbGFncyB8fCAoVHJhY2VGbGFncyA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjZV9mbGFncy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js\n"); + +/***/ }), + +/***/ "(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js": +/*!**************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js ***! + \**************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VERSION: () => (/* binding */ VERSION)\n/* harmony export */ });\n/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n// this is autogenerated file, see scripts/version-update.js\nconst VERSION = '1.9.1';\n//# sourceMappingURL=version.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjEvbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5L2FwaS9idWlsZC9lc20vdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AiLCJzb3VyY2VzIjpbIi9ob21lL3NtbGZsZy9Qcm9qZWt0ZS9FeHBlcmltZW50ZS9zdXBlcmxvZy9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xL25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS9hcGkvYnVpbGQvZXNtL3ZlcnNpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vLyB0aGlzIGlzIGF1dG9nZW5lcmF0ZWQgZmlsZSwgc2VlIHNjcmlwdHMvdmVyc2lvbi11cGRhdGUuanNcbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzEuOS4xJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/version.js\n"); + +/***/ }) + +}; +; \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/vendor-chunks/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za.js b/superlog/apps/sample/.next/server/vendor-chunks/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za.js new file mode 100644 index 0000000000000000000000000000000000000000..8d79f410808c38a196f35ae17b6f5c3a3c0d76fd --- /dev/null +++ b/superlog/apps/sample/.next/server/vendor-chunks/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za.js @@ -0,0 +1,25 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +exports.id = "vendor-chunks/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za"; +exports.ids = ["vendor-chunks/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za"]; +exports.modules = { + +/***/ "(instrument)/../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/node/index.js": +/*!******************************************************************************************************************************************************************************************************!*\ + !*** ../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/node/index.js ***! + \******************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FetchInstrumentation: () => (/* binding */ sr),\n/* harmony export */ OTLPHttpJsonTraceExporter: () => (/* binding */ rr),\n/* harmony export */ OTLPHttpProtoTraceExporter: () => (/* binding */ dt),\n/* harmony export */ registerOTel: () => (/* binding */ Jv)\n/* harmony export */ });\n/* harmony import */ var url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! url */ \"url\");\n/* harmony import */ var module__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! module */ \"module\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var _opentelemetry_api__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @opentelemetry/api */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/index.js\");\n/* harmony import */ var _opentelemetry_api_logs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @opentelemetry/api-logs */ \"(instrument)/../../node_modules/.pnpm/@opentelemetry+api-logs@0.215.0/node_modules/@opentelemetry/api-logs/build/esm/index.js\");\n\n\n\nconst require = (0,module__WEBPACK_IMPORTED_MODULE_1__.createRequire)(\"file:///home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/node/index.js\");\nconst __filename = (0,url__WEBPACK_IMPORTED_MODULE_0__.fileURLToPath)(\"file:///home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/node/index.js\");\nconst __dirname = path__WEBPACK_IMPORTED_MODULE_2__.dirname(__filename);\nvar bf=Object.create;var js=Object.defineProperty;var Pf=Object.getOwnPropertyDescriptor;var yf=Object.getOwnPropertyNames;var vf=Object.getPrototypeOf,If=Object.prototype.hasOwnProperty;var z=(r=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(r,{get:(e,t)=>(typeof require<\"u\"?require:e)[t]}):r)(function(r){if(typeof require<\"u\")return require.apply(this,arguments);throw Error('Dynamic require of \"'+r+'\" is not supported')});var _c=(r,e)=>()=>(r&&(e=r(r=0)),e);var l=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports);var Xr=(r,e,t,n)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let i of yf(e))!If.call(r,i)&&i!==t&&js(r,i,{get:()=>e[i],enumerable:!(n=Pf(e,i))||n.enumerable});return r},ht=(r,e,t)=>(Xr(r,e,\"default\"),t&&Xr(t,e,\"default\")),Y=(r,e,t)=>(t=r!=null?bf(vf(r)):{},Xr(e||!r||!r.__esModule?js(t,\"default\",{value:r,enumerable:!0}):t,r)),m=r=>Xr(js({},\"__esModule\",{value:!0}),r);var d={};var h=_c(()=>{ht(d,_opentelemetry_api__WEBPACK_IMPORTED_MODULE_3__)});var dr=l(ye=>{\"use strict\";Object.defineProperty(ye,\"__esModule\",{value:!0});ye.isTracingSuppressed=ye.unsuppressTracing=ye.suppressTracing=void 0;var Mf=(h(),m(d)),Fs=(0,Mf.createContextKey)(\"OpenTelemetry SDK Context Key SUPPRESS_TRACING\");function Lf(r){return r.setValue(Fs,!0)}ye.suppressTracing=Lf;function Nf(r){return r.deleteValue(Fs)}ye.unsuppressTracing=Nf;function Cf(r){return r.getValue(Fs)===!0}ye.isTracingSuppressed=Cf});var ks=l(F=>{\"use strict\";Object.defineProperty(F,\"__esModule\",{value:!0});F.BAGGAGE_MAX_TOTAL_LENGTH=F.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS=F.BAGGAGE_MAX_NAME_VALUE_PAIRS=F.BAGGAGE_HEADER=F.BAGGAGE_ITEMS_SEPARATOR=F.BAGGAGE_PROPERTIES_SEPARATOR=F.BAGGAGE_KEY_PAIR_SEPARATOR=void 0;F.BAGGAGE_KEY_PAIR_SEPARATOR=\"=\";F.BAGGAGE_PROPERTIES_SEPARATOR=\";\";F.BAGGAGE_ITEMS_SEPARATOR=\",\";F.BAGGAGE_HEADER=\"baggage\";F.BAGGAGE_MAX_NAME_VALUE_PAIRS=180;F.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS=4096;F.BAGGAGE_MAX_TOTAL_LENGTH=8192});var $s=l(pe=>{\"use strict\";Object.defineProperty(pe,\"__esModule\",{value:!0});pe.parseKeyPairsIntoRecord=pe.parsePairKeyValue=pe.getKeyPairs=pe.serializeKeyPairs=void 0;var wf=(h(),m(d)),je=ks();function xf(r){return r.reduce((e,t)=>{let n=`${e}${e!==\"\"?je.BAGGAGE_ITEMS_SEPARATOR:\"\"}${t}`;return n.length>je.BAGGAGE_MAX_TOTAL_LENGTH?e:n},\"\")}pe.serializeKeyPairs=xf;function Df(r){return r.getAllEntries().map(([e,t])=>{let n=`${encodeURIComponent(e)}=${encodeURIComponent(t.value)}`;return t.metadata!==void 0&&(n+=je.BAGGAGE_PROPERTIES_SEPARATOR+t.metadata.toString()),n})}pe.getKeyPairs=Df;function pc(r){let e=r.split(je.BAGGAGE_PROPERTIES_SEPARATOR);if(e.length<=0)return;let t=e.shift();if(!t)return;let n=t.indexOf(je.BAGGAGE_KEY_PAIR_SEPARATOR);if(n<=0)return;let i=decodeURIComponent(t.substring(0,n).trim()),s=decodeURIComponent(t.substring(n+1).trim()),o;return e.length>0&&(o=(0,wf.baggageEntryMetadataFromString)(e.join(je.BAGGAGE_PROPERTIES_SEPARATOR))),{key:i,value:s,metadata:o}}pe.parsePairKeyValue=pc;function Uf(r){return typeof r!=\"string\"||r.length===0?{}:r.split(je.BAGGAGE_ITEMS_SEPARATOR).map(e=>pc(e)).filter(e=>e!==void 0&&e.value.length>0).reduce((e,t)=>(e[t.key]=t.value,e),{})}pe.parseKeyPairsIntoRecord=Uf});var hc=l(Wr=>{\"use strict\";Object.defineProperty(Wr,\"__esModule\",{value:!0});Wr.W3CBaggagePropagator=void 0;var Xs=(h(),m(d)),Bf=dr(),Fe=ks(),Ws=$s(),Ks=class{inject(e,t,n){let i=Xs.propagation.getBaggage(e);if(!i||(0,Bf.isTracingSuppressed)(e))return;let s=(0,Ws.getKeyPairs)(i).filter(a=>a.length<=Fe.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS).slice(0,Fe.BAGGAGE_MAX_NAME_VALUE_PAIRS),o=(0,Ws.serializeKeyPairs)(s);o.length>0&&n.set(t,Fe.BAGGAGE_HEADER,o)}extract(e,t,n){let i=n.get(t,Fe.BAGGAGE_HEADER),s=Array.isArray(i)?i.join(Fe.BAGGAGE_ITEMS_SEPARATOR):i;if(!s)return e;let o={};return s.length===0||(s.split(Fe.BAGGAGE_ITEMS_SEPARATOR).forEach(u=>{let c=(0,Ws.parsePairKeyValue)(u);if(c){let _={value:c.value};c.metadata&&(_.metadata=c.metadata),o[c.key]=_}}),Object.entries(o).length===0)?e:Xs.propagation.setBaggage(e,Xs.propagation.createBaggage(o))}fields(){return[Fe.BAGGAGE_HEADER]}};Wr.W3CBaggagePropagator=Ks});var fc=l(Kr=>{\"use strict\";Object.defineProperty(Kr,\"__esModule\",{value:!0});Kr.AnchoredClock=void 0;var zs=class{constructor(e,t){this._monotonicClock=t,this._epochMillis=e.now(),this._performanceMillis=t.now()}now(){let e=this._monotonicClock.now()-this._performanceMillis;return this._epochMillis+e}};Kr.AnchoredClock=zs});var Sc=l(ve=>{\"use strict\";Object.defineProperty(ve,\"__esModule\",{value:!0});ve.isAttributeValue=ve.isAttributeKey=ve.sanitizeAttributes=void 0;var Ec=(h(),m(d));function qf(r){let e={};if(typeof r!=\"object\"||r==null)return e;for(let[t,n]of Object.entries(r)){if(!mc(t)){Ec.diag.warn(`Invalid attribute key: ${t}`);continue}if(!gc(n)){Ec.diag.warn(`Invalid attribute value set for key: ${t}`);continue}Array.isArray(n)?e[t]=n.slice():e[t]=n}return e}ve.sanitizeAttributes=qf;function mc(r){return typeof r==\"string\"&&r.length>0}ve.isAttributeKey=mc;function gc(r){return r==null?!0:Array.isArray(r)?Vf(r):Tc(r)}ve.isAttributeValue=gc;function Vf(r){let e;for(let t of r)if(t!=null){if(!e){if(Tc(t)){e=typeof t;continue}return!1}if(typeof t!==e)return!1}return!0}function Tc(r){switch(typeof r){case\"number\":case\"boolean\":case\"string\":return!0}return!1}});var Ys=l(zr=>{\"use strict\";Object.defineProperty(zr,\"__esModule\",{value:!0});zr.loggingErrorHandler=void 0;var Gf=(h(),m(d));function Hf(){return r=>{Gf.diag.error(jf(r))}}zr.loggingErrorHandler=Hf;function jf(r){return typeof r==\"string\"?r:JSON.stringify(Ff(r))}function Ff(r){let e={},t=r;for(;t!==null;)Object.getOwnPropertyNames(t).forEach(n=>{if(e[n])return;let i=t[n];i&&(e[n]=String(i))}),t=Object.getPrototypeOf(t);return e}});var Qs=l(ft=>{\"use strict\";Object.defineProperty(ft,\"__esModule\",{value:!0});ft.globalErrorHandler=ft.setGlobalErrorHandler=void 0;var kf=Ys(),Ac=(0,kf.loggingErrorHandler)();function $f(r){Ac=r}ft.setGlobalErrorHandler=$f;function Xf(r){try{Ac(r)}catch{}}ft.globalErrorHandler=Xf});var Zs=l(_r=>{\"use strict\";Object.defineProperty(_r,\"__esModule\",{value:!0});_r.TracesSamplerValues=void 0;var Wf;(function(r){r.AlwaysOff=\"always_off\",r.AlwaysOn=\"always_on\",r.ParentBasedAlwaysOff=\"parentbased_always_off\",r.ParentBasedAlwaysOn=\"parentbased_always_on\",r.ParentBasedTraceIdRatio=\"parentbased_traceidratio\",r.TraceIdRatio=\"traceidratio\"})(Wf=_r.TracesSamplerValues||(_r.TracesSamplerValues={}))});var Oc=l(Yr=>{\"use strict\";Object.defineProperty(Yr,\"__esModule\",{value:!0});Yr._globalThis=void 0;Yr._globalThis=typeof globalThis==\"object\"?globalThis:typeof self==\"object\"?self:typeof window==\"object\"?window:typeof global==\"object\"?global:{}});var Qr=l(v=>{\"use strict\";Object.defineProperty(v,\"__esModule\",{value:!0});v.getEnvWithoutDefaults=v.parseEnvironment=v.DEFAULT_ENVIRONMENT=v.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT=v.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT=v.DEFAULT_ATTRIBUTE_COUNT_LIMIT=v.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT=void 0;var Ie=(h(),m(d)),Kf=Zs(),zf=Oc(),Yf=\",\",Qf=[\"OTEL_SDK_DISABLED\"];function Zf(r){return Qf.indexOf(r)>-1}var Jf=[\"OTEL_BSP_EXPORT_TIMEOUT\",\"OTEL_BSP_MAX_EXPORT_BATCH_SIZE\",\"OTEL_BSP_MAX_QUEUE_SIZE\",\"OTEL_BSP_SCHEDULE_DELAY\",\"OTEL_BLRP_EXPORT_TIMEOUT\",\"OTEL_BLRP_MAX_EXPORT_BATCH_SIZE\",\"OTEL_BLRP_MAX_QUEUE_SIZE\",\"OTEL_BLRP_SCHEDULE_DELAY\",\"OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT\",\"OTEL_ATTRIBUTE_COUNT_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT\",\"OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT\",\"OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT\",\"OTEL_SPAN_EVENT_COUNT_LIMIT\",\"OTEL_SPAN_LINK_COUNT_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT\",\"OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT\",\"OTEL_EXPORTER_OTLP_TIMEOUT\",\"OTEL_EXPORTER_OTLP_TRACES_TIMEOUT\",\"OTEL_EXPORTER_OTLP_METRICS_TIMEOUT\",\"OTEL_EXPORTER_OTLP_LOGS_TIMEOUT\",\"OTEL_EXPORTER_JAEGER_AGENT_PORT\"];function eE(r){return Jf.indexOf(r)>-1}var tE=[\"OTEL_NO_PATCH_MODULES\",\"OTEL_PROPAGATORS\"];function rE(r){return tE.indexOf(r)>-1}v.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT=1/0;v.DEFAULT_ATTRIBUTE_COUNT_LIMIT=128;v.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT=128;v.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT=128;v.DEFAULT_ENVIRONMENT={OTEL_SDK_DISABLED:!1,CONTAINER_NAME:\"\",ECS_CONTAINER_METADATA_URI_V4:\"\",ECS_CONTAINER_METADATA_URI:\"\",HOSTNAME:\"\",KUBERNETES_SERVICE_HOST:\"\",NAMESPACE:\"\",OTEL_BSP_EXPORT_TIMEOUT:3e4,OTEL_BSP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BSP_MAX_QUEUE_SIZE:2048,OTEL_BSP_SCHEDULE_DELAY:5e3,OTEL_BLRP_EXPORT_TIMEOUT:3e4,OTEL_BLRP_MAX_EXPORT_BATCH_SIZE:512,OTEL_BLRP_MAX_QUEUE_SIZE:2048,OTEL_BLRP_SCHEDULE_DELAY:5e3,OTEL_EXPORTER_JAEGER_AGENT_HOST:\"\",OTEL_EXPORTER_JAEGER_AGENT_PORT:6832,OTEL_EXPORTER_JAEGER_ENDPOINT:\"\",OTEL_EXPORTER_JAEGER_PASSWORD:\"\",OTEL_EXPORTER_JAEGER_USER:\"\",OTEL_EXPORTER_OTLP_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_METRICS_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_LOGS_ENDPOINT:\"\",OTEL_EXPORTER_OTLP_HEADERS:\"\",OTEL_EXPORTER_OTLP_TRACES_HEADERS:\"\",OTEL_EXPORTER_OTLP_METRICS_HEADERS:\"\",OTEL_EXPORTER_OTLP_LOGS_HEADERS:\"\",OTEL_EXPORTER_OTLP_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_TRACES_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_METRICS_TIMEOUT:1e4,OTEL_EXPORTER_OTLP_LOGS_TIMEOUT:1e4,OTEL_EXPORTER_ZIPKIN_ENDPOINT:\"http://localhost:9411/api/v2/spans\",OTEL_LOG_LEVEL:Ie.DiagLogLevel.INFO,OTEL_NO_PATCH_MODULES:[],OTEL_PROPAGATORS:[\"tracecontext\",\"baggage\"],OTEL_RESOURCE_ATTRIBUTES:\"\",OTEL_SERVICE_NAME:\"\",OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT:v.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,OTEL_ATTRIBUTE_COUNT_LIMIT:v.DEFAULT_ATTRIBUTE_COUNT_LIMIT,OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT:v.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT:v.DEFAULT_ATTRIBUTE_COUNT_LIMIT,OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:v.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:v.DEFAULT_ATTRIBUTE_COUNT_LIMIT,OTEL_SPAN_EVENT_COUNT_LIMIT:128,OTEL_SPAN_LINK_COUNT_LIMIT:128,OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT:v.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT:v.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT,OTEL_TRACES_EXPORTER:\"\",OTEL_TRACES_SAMPLER:Kf.TracesSamplerValues.ParentBasedAlwaysOn,OTEL_TRACES_SAMPLER_ARG:\"\",OTEL_LOGS_EXPORTER:\"\",OTEL_EXPORTER_OTLP_INSECURE:\"\",OTEL_EXPORTER_OTLP_TRACES_INSECURE:\"\",OTEL_EXPORTER_OTLP_METRICS_INSECURE:\"\",OTEL_EXPORTER_OTLP_LOGS_INSECURE:\"\",OTEL_EXPORTER_OTLP_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_TRACES_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_METRICS_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_LOGS_COMPRESSION:\"\",OTEL_EXPORTER_OTLP_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY:\"\",OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE:\"\",OTEL_EXPORTER_OTLP_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_TRACES_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_METRICS_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_LOGS_PROTOCOL:\"http/protobuf\",OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE:\"cumulative\"};function nE(r,e,t){if(typeof t[r]>\"u\")return;let n=String(t[r]);e[r]=n.toLowerCase()===\"true\"}function iE(r,e,t,n=-1/0,i=1/0){if(typeof t[r]<\"u\"){let s=Number(t[r]);isNaN(s)||(si?e[r]=i:e[r]=s)}}function sE(r,e,t,n=Yf){let i=t[r];typeof i==\"string\"&&(e[r]=i.split(n).map(s=>s.trim()))}var oE={ALL:Ie.DiagLogLevel.ALL,VERBOSE:Ie.DiagLogLevel.VERBOSE,DEBUG:Ie.DiagLogLevel.DEBUG,INFO:Ie.DiagLogLevel.INFO,WARN:Ie.DiagLogLevel.WARN,ERROR:Ie.DiagLogLevel.ERROR,NONE:Ie.DiagLogLevel.NONE};function aE(r,e,t){let n=t[r];if(typeof n==\"string\"){let i=oE[n.toUpperCase()];i!=null&&(e[r]=i)}}function Js(r){let e={};for(let t in v.DEFAULT_ENVIRONMENT){let n=t;switch(n){case\"OTEL_LOG_LEVEL\":aE(n,e,r);break;default:if(Zf(n))nE(n,e,r);else if(eE(n))iE(n,e,r);else if(rE(n))sE(n,e,r);else{let i=r[n];typeof i<\"u\"&&i!==null&&(e[n]=String(i))}}}return e}v.parseEnvironment=Js;function uE(){return typeof process<\"u\"&&process&&process.env?Js(process.env):Js(zf._globalThis)}v.getEnvWithoutDefaults=uE});var bc=l(Zr=>{\"use strict\";Object.defineProperty(Zr,\"__esModule\",{value:!0});Zr.getEnv=void 0;var cE=z(\"os\"),Rc=Qr();function lE(){let r=(0,Rc.parseEnvironment)(process.env);return Object.assign({HOSTNAME:cE.hostname()},Rc.DEFAULT_ENVIRONMENT,r)}Zr.getEnv=lE});var Pc=l(Jr=>{\"use strict\";Object.defineProperty(Jr,\"__esModule\",{value:!0});Jr._globalThis=void 0;Jr._globalThis=typeof globalThis==\"object\"?globalThis:global});var vc=l(en=>{\"use strict\";Object.defineProperty(en,\"__esModule\",{value:!0});en.hexToBase64=void 0;function yc(r){return r>=48&&r<=57?r-48:r>=97&&r<=102?r-87:r-55}var dE=Buffer.alloc(8),_E=Buffer.alloc(16);function pE(r){let e;r.length===16?e=dE:r.length===32?e=_E:e=Buffer.alloc(r.length/2);let t=0;for(let n=0;n{\"use strict\";Object.defineProperty(rn,\"__esModule\",{value:!0});rn.RandomIdGenerator=void 0;var hE=8,Mc=16,eo=class{constructor(){this.generateTraceId=Ic(Mc),this.generateSpanId=Ic(hE)}};rn.RandomIdGenerator=eo;var tn=Buffer.allocUnsafe(Mc);function Ic(r){return function(){for(let t=0;t>>0,t*4);for(let t=0;t0);t++)t===r-1&&(tn[r-1]=1);return tn.toString(\"hex\",0,r)}}});var Nc=l(nn=>{\"use strict\";Object.defineProperty(nn,\"__esModule\",{value:!0});nn.otperformance=void 0;var fE=z(\"perf_hooks\");nn.otperformance=fE.performance});var to=l(sn=>{\"use strict\";Object.defineProperty(sn,\"__esModule\",{value:!0});sn.VERSION=void 0;sn.VERSION=\"1.19.0\"});var Cc=l(b=>{\"use strict\";Object.defineProperty(b,\"__esModule\",{value:!0});b.MessageTypeValues=b.RpcGrpcStatusCodeValues=b.MessagingOperationValues=b.MessagingDestinationKindValues=b.HttpFlavorValues=b.NetHostConnectionSubtypeValues=b.NetHostConnectionTypeValues=b.NetTransportValues=b.FaasInvokedProviderValues=b.FaasDocumentOperationValues=b.FaasTriggerValues=b.DbCassandraConsistencyLevelValues=b.DbSystemValues=b.SemanticAttributes=void 0;b.SemanticAttributes={AWS_LAMBDA_INVOKED_ARN:\"aws.lambda.invoked_arn\",DB_SYSTEM:\"db.system\",DB_CONNECTION_STRING:\"db.connection_string\",DB_USER:\"db.user\",DB_JDBC_DRIVER_CLASSNAME:\"db.jdbc.driver_classname\",DB_NAME:\"db.name\",DB_STATEMENT:\"db.statement\",DB_OPERATION:\"db.operation\",DB_MSSQL_INSTANCE_NAME:\"db.mssql.instance_name\",DB_CASSANDRA_KEYSPACE:\"db.cassandra.keyspace\",DB_CASSANDRA_PAGE_SIZE:\"db.cassandra.page_size\",DB_CASSANDRA_CONSISTENCY_LEVEL:\"db.cassandra.consistency_level\",DB_CASSANDRA_TABLE:\"db.cassandra.table\",DB_CASSANDRA_IDEMPOTENCE:\"db.cassandra.idempotence\",DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT:\"db.cassandra.speculative_execution_count\",DB_CASSANDRA_COORDINATOR_ID:\"db.cassandra.coordinator.id\",DB_CASSANDRA_COORDINATOR_DC:\"db.cassandra.coordinator.dc\",DB_HBASE_NAMESPACE:\"db.hbase.namespace\",DB_REDIS_DATABASE_INDEX:\"db.redis.database_index\",DB_MONGODB_COLLECTION:\"db.mongodb.collection\",DB_SQL_TABLE:\"db.sql.table\",EXCEPTION_TYPE:\"exception.type\",EXCEPTION_MESSAGE:\"exception.message\",EXCEPTION_STACKTRACE:\"exception.stacktrace\",EXCEPTION_ESCAPED:\"exception.escaped\",FAAS_TRIGGER:\"faas.trigger\",FAAS_EXECUTION:\"faas.execution\",FAAS_DOCUMENT_COLLECTION:\"faas.document.collection\",FAAS_DOCUMENT_OPERATION:\"faas.document.operation\",FAAS_DOCUMENT_TIME:\"faas.document.time\",FAAS_DOCUMENT_NAME:\"faas.document.name\",FAAS_TIME:\"faas.time\",FAAS_CRON:\"faas.cron\",FAAS_COLDSTART:\"faas.coldstart\",FAAS_INVOKED_NAME:\"faas.invoked_name\",FAAS_INVOKED_PROVIDER:\"faas.invoked_provider\",FAAS_INVOKED_REGION:\"faas.invoked_region\",NET_TRANSPORT:\"net.transport\",NET_PEER_IP:\"net.peer.ip\",NET_PEER_PORT:\"net.peer.port\",NET_PEER_NAME:\"net.peer.name\",NET_HOST_IP:\"net.host.ip\",NET_HOST_PORT:\"net.host.port\",NET_HOST_NAME:\"net.host.name\",NET_HOST_CONNECTION_TYPE:\"net.host.connection.type\",NET_HOST_CONNECTION_SUBTYPE:\"net.host.connection.subtype\",NET_HOST_CARRIER_NAME:\"net.host.carrier.name\",NET_HOST_CARRIER_MCC:\"net.host.carrier.mcc\",NET_HOST_CARRIER_MNC:\"net.host.carrier.mnc\",NET_HOST_CARRIER_ICC:\"net.host.carrier.icc\",PEER_SERVICE:\"peer.service\",ENDUSER_ID:\"enduser.id\",ENDUSER_ROLE:\"enduser.role\",ENDUSER_SCOPE:\"enduser.scope\",THREAD_ID:\"thread.id\",THREAD_NAME:\"thread.name\",CODE_FUNCTION:\"code.function\",CODE_NAMESPACE:\"code.namespace\",CODE_FILEPATH:\"code.filepath\",CODE_LINENO:\"code.lineno\",HTTP_METHOD:\"http.method\",HTTP_URL:\"http.url\",HTTP_TARGET:\"http.target\",HTTP_HOST:\"http.host\",HTTP_SCHEME:\"http.scheme\",HTTP_STATUS_CODE:\"http.status_code\",HTTP_FLAVOR:\"http.flavor\",HTTP_USER_AGENT:\"http.user_agent\",HTTP_REQUEST_CONTENT_LENGTH:\"http.request_content_length\",HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED:\"http.request_content_length_uncompressed\",HTTP_RESPONSE_CONTENT_LENGTH:\"http.response_content_length\",HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED:\"http.response_content_length_uncompressed\",HTTP_SERVER_NAME:\"http.server_name\",HTTP_ROUTE:\"http.route\",HTTP_CLIENT_IP:\"http.client_ip\",AWS_DYNAMODB_TABLE_NAMES:\"aws.dynamodb.table_names\",AWS_DYNAMODB_CONSUMED_CAPACITY:\"aws.dynamodb.consumed_capacity\",AWS_DYNAMODB_ITEM_COLLECTION_METRICS:\"aws.dynamodb.item_collection_metrics\",AWS_DYNAMODB_PROVISIONED_READ_CAPACITY:\"aws.dynamodb.provisioned_read_capacity\",AWS_DYNAMODB_PROVISIONED_WRITE_CAPACITY:\"aws.dynamodb.provisioned_write_capacity\",AWS_DYNAMODB_CONSISTENT_READ:\"aws.dynamodb.consistent_read\",AWS_DYNAMODB_PROJECTION:\"aws.dynamodb.projection\",AWS_DYNAMODB_LIMIT:\"aws.dynamodb.limit\",AWS_DYNAMODB_ATTRIBUTES_TO_GET:\"aws.dynamodb.attributes_to_get\",AWS_DYNAMODB_INDEX_NAME:\"aws.dynamodb.index_name\",AWS_DYNAMODB_SELECT:\"aws.dynamodb.select\",AWS_DYNAMODB_GLOBAL_SECONDARY_INDEXES:\"aws.dynamodb.global_secondary_indexes\",AWS_DYNAMODB_LOCAL_SECONDARY_INDEXES:\"aws.dynamodb.local_secondary_indexes\",AWS_DYNAMODB_EXCLUSIVE_START_TABLE:\"aws.dynamodb.exclusive_start_table\",AWS_DYNAMODB_TABLE_COUNT:\"aws.dynamodb.table_count\",AWS_DYNAMODB_SCAN_FORWARD:\"aws.dynamodb.scan_forward\",AWS_DYNAMODB_SEGMENT:\"aws.dynamodb.segment\",AWS_DYNAMODB_TOTAL_SEGMENTS:\"aws.dynamodb.total_segments\",AWS_DYNAMODB_COUNT:\"aws.dynamodb.count\",AWS_DYNAMODB_SCANNED_COUNT:\"aws.dynamodb.scanned_count\",AWS_DYNAMODB_ATTRIBUTE_DEFINITIONS:\"aws.dynamodb.attribute_definitions\",AWS_DYNAMODB_GLOBAL_SECONDARY_INDEX_UPDATES:\"aws.dynamodb.global_secondary_index_updates\",MESSAGING_SYSTEM:\"messaging.system\",MESSAGING_DESTINATION:\"messaging.destination\",MESSAGING_DESTINATION_KIND:\"messaging.destination_kind\",MESSAGING_TEMP_DESTINATION:\"messaging.temp_destination\",MESSAGING_PROTOCOL:\"messaging.protocol\",MESSAGING_PROTOCOL_VERSION:\"messaging.protocol_version\",MESSAGING_URL:\"messaging.url\",MESSAGING_MESSAGE_ID:\"messaging.message_id\",MESSAGING_CONVERSATION_ID:\"messaging.conversation_id\",MESSAGING_MESSAGE_PAYLOAD_SIZE_BYTES:\"messaging.message_payload_size_bytes\",MESSAGING_MESSAGE_PAYLOAD_COMPRESSED_SIZE_BYTES:\"messaging.message_payload_compressed_size_bytes\",MESSAGING_OPERATION:\"messaging.operation\",MESSAGING_CONSUMER_ID:\"messaging.consumer_id\",MESSAGING_RABBITMQ_ROUTING_KEY:\"messaging.rabbitmq.routing_key\",MESSAGING_KAFKA_MESSAGE_KEY:\"messaging.kafka.message_key\",MESSAGING_KAFKA_CONSUMER_GROUP:\"messaging.kafka.consumer_group\",MESSAGING_KAFKA_CLIENT_ID:\"messaging.kafka.client_id\",MESSAGING_KAFKA_PARTITION:\"messaging.kafka.partition\",MESSAGING_KAFKA_TOMBSTONE:\"messaging.kafka.tombstone\",RPC_SYSTEM:\"rpc.system\",RPC_SERVICE:\"rpc.service\",RPC_METHOD:\"rpc.method\",RPC_GRPC_STATUS_CODE:\"rpc.grpc.status_code\",RPC_JSONRPC_VERSION:\"rpc.jsonrpc.version\",RPC_JSONRPC_REQUEST_ID:\"rpc.jsonrpc.request_id\",RPC_JSONRPC_ERROR_CODE:\"rpc.jsonrpc.error_code\",RPC_JSONRPC_ERROR_MESSAGE:\"rpc.jsonrpc.error_message\",MESSAGE_TYPE:\"message.type\",MESSAGE_ID:\"message.id\",MESSAGE_COMPRESSED_SIZE:\"message.compressed_size\",MESSAGE_UNCOMPRESSED_SIZE:\"message.uncompressed_size\"};b.DbSystemValues={OTHER_SQL:\"other_sql\",MSSQL:\"mssql\",MYSQL:\"mysql\",ORACLE:\"oracle\",DB2:\"db2\",POSTGRESQL:\"postgresql\",REDSHIFT:\"redshift\",HIVE:\"hive\",CLOUDSCAPE:\"cloudscape\",HSQLDB:\"hsqldb\",PROGRESS:\"progress\",MAXDB:\"maxdb\",HANADB:\"hanadb\",INGRES:\"ingres\",FIRSTSQL:\"firstsql\",EDB:\"edb\",CACHE:\"cache\",ADABAS:\"adabas\",FIREBIRD:\"firebird\",DERBY:\"derby\",FILEMAKER:\"filemaker\",INFORMIX:\"informix\",INSTANTDB:\"instantdb\",INTERBASE:\"interbase\",MARIADB:\"mariadb\",NETEZZA:\"netezza\",PERVASIVE:\"pervasive\",POINTBASE:\"pointbase\",SQLITE:\"sqlite\",SYBASE:\"sybase\",TERADATA:\"teradata\",VERTICA:\"vertica\",H2:\"h2\",COLDFUSION:\"coldfusion\",CASSANDRA:\"cassandra\",HBASE:\"hbase\",MONGODB:\"mongodb\",REDIS:\"redis\",COUCHBASE:\"couchbase\",COUCHDB:\"couchdb\",COSMOSDB:\"cosmosdb\",DYNAMODB:\"dynamodb\",NEO4J:\"neo4j\",GEODE:\"geode\",ELASTICSEARCH:\"elasticsearch\",MEMCACHED:\"memcached\",COCKROACHDB:\"cockroachdb\"};b.DbCassandraConsistencyLevelValues={ALL:\"all\",EACH_QUORUM:\"each_quorum\",QUORUM:\"quorum\",LOCAL_QUORUM:\"local_quorum\",ONE:\"one\",TWO:\"two\",THREE:\"three\",LOCAL_ONE:\"local_one\",ANY:\"any\",SERIAL:\"serial\",LOCAL_SERIAL:\"local_serial\"};b.FaasTriggerValues={DATASOURCE:\"datasource\",HTTP:\"http\",PUBSUB:\"pubsub\",TIMER:\"timer\",OTHER:\"other\"};b.FaasDocumentOperationValues={INSERT:\"insert\",EDIT:\"edit\",DELETE:\"delete\"};b.FaasInvokedProviderValues={ALIBABA_CLOUD:\"alibaba_cloud\",AWS:\"aws\",AZURE:\"azure\",GCP:\"gcp\"};b.NetTransportValues={IP_TCP:\"ip_tcp\",IP_UDP:\"ip_udp\",IP:\"ip\",UNIX:\"unix\",PIPE:\"pipe\",INPROC:\"inproc\",OTHER:\"other\"};b.NetHostConnectionTypeValues={WIFI:\"wifi\",WIRED:\"wired\",CELL:\"cell\",UNAVAILABLE:\"unavailable\",UNKNOWN:\"unknown\"};b.NetHostConnectionSubtypeValues={GPRS:\"gprs\",EDGE:\"edge\",UMTS:\"umts\",CDMA:\"cdma\",EVDO_0:\"evdo_0\",EVDO_A:\"evdo_a\",CDMA2000_1XRTT:\"cdma2000_1xrtt\",HSDPA:\"hsdpa\",HSUPA:\"hsupa\",HSPA:\"hspa\",IDEN:\"iden\",EVDO_B:\"evdo_b\",LTE:\"lte\",EHRPD:\"ehrpd\",HSPAP:\"hspap\",GSM:\"gsm\",TD_SCDMA:\"td_scdma\",IWLAN:\"iwlan\",NR:\"nr\",NRNSA:\"nrnsa\",LTE_CA:\"lte_ca\"};b.HttpFlavorValues={HTTP_1_0:\"1.0\",HTTP_1_1:\"1.1\",HTTP_2_0:\"2.0\",SPDY:\"SPDY\",QUIC:\"QUIC\"};b.MessagingDestinationKindValues={QUEUE:\"queue\",TOPIC:\"topic\"};b.MessagingOperationValues={RECEIVE:\"receive\",PROCESS:\"process\"};b.RpcGrpcStatusCodeValues={OK:0,CANCELLED:1,UNKNOWN:2,INVALID_ARGUMENT:3,DEADLINE_EXCEEDED:4,NOT_FOUND:5,ALREADY_EXISTS:6,PERMISSION_DENIED:7,RESOURCE_EXHAUSTED:8,FAILED_PRECONDITION:9,ABORTED:10,OUT_OF_RANGE:11,UNIMPLEMENTED:12,INTERNAL:13,UNAVAILABLE:14,DATA_LOSS:15,UNAUTHENTICATED:16};b.MessageTypeValues={SENT:\"SENT\",RECEIVED:\"RECEIVED\"}});var wc=l(ke=>{\"use strict\";var EE=ke&&ke.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),mE=ke&&ke.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&EE(e,r,t)};Object.defineProperty(ke,\"__esModule\",{value:!0});mE(Cc(),ke)});var xc=l(k=>{\"use strict\";Object.defineProperty(k,\"__esModule\",{value:!0});k.TelemetrySdkLanguageValues=k.OsTypeValues=k.HostArchValues=k.AwsEcsLaunchtypeValues=k.CloudPlatformValues=k.CloudProviderValues=k.SemanticResourceAttributes=void 0;k.SemanticResourceAttributes={CLOUD_PROVIDER:\"cloud.provider\",CLOUD_ACCOUNT_ID:\"cloud.account.id\",CLOUD_REGION:\"cloud.region\",CLOUD_AVAILABILITY_ZONE:\"cloud.availability_zone\",CLOUD_PLATFORM:\"cloud.platform\",AWS_ECS_CONTAINER_ARN:\"aws.ecs.container.arn\",AWS_ECS_CLUSTER_ARN:\"aws.ecs.cluster.arn\",AWS_ECS_LAUNCHTYPE:\"aws.ecs.launchtype\",AWS_ECS_TASK_ARN:\"aws.ecs.task.arn\",AWS_ECS_TASK_FAMILY:\"aws.ecs.task.family\",AWS_ECS_TASK_REVISION:\"aws.ecs.task.revision\",AWS_EKS_CLUSTER_ARN:\"aws.eks.cluster.arn\",AWS_LOG_GROUP_NAMES:\"aws.log.group.names\",AWS_LOG_GROUP_ARNS:\"aws.log.group.arns\",AWS_LOG_STREAM_NAMES:\"aws.log.stream.names\",AWS_LOG_STREAM_ARNS:\"aws.log.stream.arns\",CONTAINER_NAME:\"container.name\",CONTAINER_ID:\"container.id\",CONTAINER_RUNTIME:\"container.runtime\",CONTAINER_IMAGE_NAME:\"container.image.name\",CONTAINER_IMAGE_TAG:\"container.image.tag\",DEPLOYMENT_ENVIRONMENT:\"deployment.environment\",DEVICE_ID:\"device.id\",DEVICE_MODEL_IDENTIFIER:\"device.model.identifier\",DEVICE_MODEL_NAME:\"device.model.name\",FAAS_NAME:\"faas.name\",FAAS_ID:\"faas.id\",FAAS_VERSION:\"faas.version\",FAAS_INSTANCE:\"faas.instance\",FAAS_MAX_MEMORY:\"faas.max_memory\",HOST_ID:\"host.id\",HOST_NAME:\"host.name\",HOST_TYPE:\"host.type\",HOST_ARCH:\"host.arch\",HOST_IMAGE_NAME:\"host.image.name\",HOST_IMAGE_ID:\"host.image.id\",HOST_IMAGE_VERSION:\"host.image.version\",K8S_CLUSTER_NAME:\"k8s.cluster.name\",K8S_NODE_NAME:\"k8s.node.name\",K8S_NODE_UID:\"k8s.node.uid\",K8S_NAMESPACE_NAME:\"k8s.namespace.name\",K8S_POD_UID:\"k8s.pod.uid\",K8S_POD_NAME:\"k8s.pod.name\",K8S_CONTAINER_NAME:\"k8s.container.name\",K8S_REPLICASET_UID:\"k8s.replicaset.uid\",K8S_REPLICASET_NAME:\"k8s.replicaset.name\",K8S_DEPLOYMENT_UID:\"k8s.deployment.uid\",K8S_DEPLOYMENT_NAME:\"k8s.deployment.name\",K8S_STATEFULSET_UID:\"k8s.statefulset.uid\",K8S_STATEFULSET_NAME:\"k8s.statefulset.name\",K8S_DAEMONSET_UID:\"k8s.daemonset.uid\",K8S_DAEMONSET_NAME:\"k8s.daemonset.name\",K8S_JOB_UID:\"k8s.job.uid\",K8S_JOB_NAME:\"k8s.job.name\",K8S_CRONJOB_UID:\"k8s.cronjob.uid\",K8S_CRONJOB_NAME:\"k8s.cronjob.name\",OS_TYPE:\"os.type\",OS_DESCRIPTION:\"os.description\",OS_NAME:\"os.name\",OS_VERSION:\"os.version\",PROCESS_PID:\"process.pid\",PROCESS_EXECUTABLE_NAME:\"process.executable.name\",PROCESS_EXECUTABLE_PATH:\"process.executable.path\",PROCESS_COMMAND:\"process.command\",PROCESS_COMMAND_LINE:\"process.command_line\",PROCESS_COMMAND_ARGS:\"process.command_args\",PROCESS_OWNER:\"process.owner\",PROCESS_RUNTIME_NAME:\"process.runtime.name\",PROCESS_RUNTIME_VERSION:\"process.runtime.version\",PROCESS_RUNTIME_DESCRIPTION:\"process.runtime.description\",SERVICE_NAME:\"service.name\",SERVICE_NAMESPACE:\"service.namespace\",SERVICE_INSTANCE_ID:\"service.instance.id\",SERVICE_VERSION:\"service.version\",TELEMETRY_SDK_NAME:\"telemetry.sdk.name\",TELEMETRY_SDK_LANGUAGE:\"telemetry.sdk.language\",TELEMETRY_SDK_VERSION:\"telemetry.sdk.version\",TELEMETRY_AUTO_VERSION:\"telemetry.auto.version\",WEBENGINE_NAME:\"webengine.name\",WEBENGINE_VERSION:\"webengine.version\",WEBENGINE_DESCRIPTION:\"webengine.description\"};k.CloudProviderValues={ALIBABA_CLOUD:\"alibaba_cloud\",AWS:\"aws\",AZURE:\"azure\",GCP:\"gcp\"};k.CloudPlatformValues={ALIBABA_CLOUD_ECS:\"alibaba_cloud_ecs\",ALIBABA_CLOUD_FC:\"alibaba_cloud_fc\",AWS_EC2:\"aws_ec2\",AWS_ECS:\"aws_ecs\",AWS_EKS:\"aws_eks\",AWS_LAMBDA:\"aws_lambda\",AWS_ELASTIC_BEANSTALK:\"aws_elastic_beanstalk\",AZURE_VM:\"azure_vm\",AZURE_CONTAINER_INSTANCES:\"azure_container_instances\",AZURE_AKS:\"azure_aks\",AZURE_FUNCTIONS:\"azure_functions\",AZURE_APP_SERVICE:\"azure_app_service\",GCP_COMPUTE_ENGINE:\"gcp_compute_engine\",GCP_CLOUD_RUN:\"gcp_cloud_run\",GCP_KUBERNETES_ENGINE:\"gcp_kubernetes_engine\",GCP_CLOUD_FUNCTIONS:\"gcp_cloud_functions\",GCP_APP_ENGINE:\"gcp_app_engine\"};k.AwsEcsLaunchtypeValues={EC2:\"ec2\",FARGATE:\"fargate\"};k.HostArchValues={AMD64:\"amd64\",ARM32:\"arm32\",ARM64:\"arm64\",IA64:\"ia64\",PPC32:\"ppc32\",PPC64:\"ppc64\",X86:\"x86\"};k.OsTypeValues={WINDOWS:\"windows\",LINUX:\"linux\",DARWIN:\"darwin\",FREEBSD:\"freebsd\",NETBSD:\"netbsd\",OPENBSD:\"openbsd\",DRAGONFLYBSD:\"dragonflybsd\",HPUX:\"hpux\",AIX:\"aix\",SOLARIS:\"solaris\",Z_OS:\"z_os\"};k.TelemetrySdkLanguageValues={CPP:\"cpp\",DOTNET:\"dotnet\",ERLANG:\"erlang\",GO:\"go\",JAVA:\"java\",NODEJS:\"nodejs\",PHP:\"php\",PYTHON:\"python\",RUBY:\"ruby\",WEBJS:\"webjs\"}});var Dc=l($e=>{\"use strict\";var gE=$e&&$e.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),TE=$e&&$e.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&gE(e,r,t)};Object.defineProperty($e,\"__esModule\",{value:!0});TE(xc(),$e)});var Ae=l(Me=>{\"use strict\";var SE=Me&&Me.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),Uc=Me&&Me.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&SE(e,r,t)};Object.defineProperty(Me,\"__esModule\",{value:!0});Uc(wc(),Me);Uc(Dc(),Me)});var Bc=l(on=>{\"use strict\";Object.defineProperty(on,\"__esModule\",{value:!0});on.SDK_INFO=void 0;var AE=to(),pr=Ae();on.SDK_INFO={[pr.SemanticResourceAttributes.TELEMETRY_SDK_NAME]:\"opentelemetry\",[pr.SemanticResourceAttributes.PROCESS_RUNTIME_NAME]:\"node\",[pr.SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE]:pr.TelemetrySdkLanguageValues.NODEJS,[pr.SemanticResourceAttributes.TELEMETRY_SDK_VERSION]:AE.VERSION}});var qc=l(an=>{\"use strict\";Object.defineProperty(an,\"__esModule\",{value:!0});an.unrefTimer=void 0;function OE(r){r.unref()}an.unrefTimer=OE});var Vc=l(ee=>{\"use strict\";var RE=ee&&ee.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),Xe=ee&&ee.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&RE(e,r,t)};Object.defineProperty(ee,\"__esModule\",{value:!0});Xe(bc(),ee);Xe(Pc(),ee);Xe(vc(),ee);Xe(Lc(),ee);Xe(Nc(),ee);Xe(Bc(),ee);Xe(qc(),ee)});var ro=l(We=>{\"use strict\";var bE=We&&We.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),PE=We&&We.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&bE(e,r,t)};Object.defineProperty(We,\"__esModule\",{value:!0});PE(Vc(),We)});var Fc=l(y=>{\"use strict\";Object.defineProperty(y,\"__esModule\",{value:!0});y.addHrTimes=y.isTimeInput=y.isTimeInputHrTime=y.hrTimeToMicroseconds=y.hrTimeToMilliseconds=y.hrTimeToNanoseconds=y.hrTimeToTimeStamp=y.hrTimeDuration=y.timeInputToHrTime=y.hrTime=y.getTimeOrigin=y.millisToHrTime=void 0;var no=ro(),Gc=9,yE=6,vE=Math.pow(10,yE),un=Math.pow(10,Gc);function hr(r){let e=r/1e3,t=Math.trunc(e),n=Math.round(r%1e3*vE);return[t,n]}y.millisToHrTime=hr;function io(){let r=no.otperformance.timeOrigin;if(typeof r!=\"number\"){let e=no.otperformance;r=e.timing&&e.timing.fetchStart}return r}y.getTimeOrigin=io;function Hc(r){let e=hr(io()),t=hr(typeof r==\"number\"?r:no.otperformance.now());return jc(e,t)}y.hrTime=Hc;function IE(r){if(so(r))return r;if(typeof r==\"number\")return r=un&&(t[1]-=un,t[0]+=1),t}y.addHrTimes=jc});var $c=l(kc=>{\"use strict\";Object.defineProperty(kc,\"__esModule\",{value:!0})});var Xc=l(fr=>{\"use strict\";Object.defineProperty(fr,\"__esModule\",{value:!0});fr.ExportResultCode=void 0;var DE;(function(r){r[r.SUCCESS=0]=\"SUCCESS\",r[r.FAILED=1]=\"FAILED\"})(DE=fr.ExportResultCode||(fr.ExportResultCode={}))});var Kc=l(cn=>{\"use strict\";Object.defineProperty(cn,\"__esModule\",{value:!0});cn.CompositePropagator=void 0;var Wc=(h(),m(d)),oo=class{constructor(e={}){var t;this._propagators=(t=e.propagators)!==null&&t!==void 0?t:[],this._fields=Array.from(new Set(this._propagators.map(n=>typeof n.fields==\"function\"?n.fields():[]).reduce((n,i)=>n.concat(i),[])))}inject(e,t,n){for(let i of this._propagators)try{i.inject(e,t,n)}catch(s){Wc.diag.warn(`Failed to inject with ${i.constructor.name}. Err: ${s.message}`)}}extract(e,t,n){return this._propagators.reduce((i,s)=>{try{return s.extract(i,t,n)}catch(o){Wc.diag.warn(`Failed to inject with ${s.constructor.name}. Err: ${o.message}`)}return i},e)}fields(){return this._fields.slice()}};cn.CompositePropagator=oo});var zc=l(Et=>{\"use strict\";Object.defineProperty(Et,\"__esModule\",{value:!0});Et.validateValue=Et.validateKey=void 0;var ao=\"[_0-9a-z-*/]\",UE=`[a-z]${ao}{0,255}`,BE=`[a-z0-9]${ao}{0,240}@[a-z]${ao}{0,13}`,qE=new RegExp(`^(?:${UE}|${BE})$`),VE=/^[ -~]{0,255}[!-~]$/,GE=/,|=/;function HE(r){return qE.test(r)}Et.validateKey=HE;function jE(r){return VE.test(r)&&!GE.test(r)}Et.validateValue=jE});var co=l(ln=>{\"use strict\";Object.defineProperty(ln,\"__esModule\",{value:!0});ln.TraceState=void 0;var Yc=zc(),Qc=32,FE=512,Zc=\",\",Jc=\"=\",uo=class r{constructor(e){this._internalState=new Map,e&&this._parse(e)}set(e,t){let n=this._clone();return n._internalState.has(e)&&n._internalState.delete(e),n._internalState.set(e,t),n}unset(e){let t=this._clone();return t._internalState.delete(e),t}get(e){return this._internalState.get(e)}serialize(){return this._keys().reduce((e,t)=>(e.push(t+Jc+this.get(t)),e),[]).join(Zc)}_parse(e){e.length>FE||(this._internalState=e.split(Zc).reverse().reduce((t,n)=>{let i=n.trim(),s=i.indexOf(Jc);if(s!==-1){let o=i.slice(0,s),a=i.slice(s+1,n.length);(0,Yc.validateKey)(o)&&(0,Yc.validateValue)(a)&&t.set(o,a)}return t},new Map),this._internalState.size>Qc&&(this._internalState=new Map(Array.from(this._internalState.entries()).reverse().slice(0,Qc))))}_keys(){return Array.from(this._internalState.keys()).reverse()}_clone(){let e=new r;return e._internalState=new Map(this._internalState),e}};ln.TraceState=uo});var tl=l($=>{\"use strict\";Object.defineProperty($,\"__esModule\",{value:!0});$.W3CTraceContextPropagator=$.parseTraceParent=$.TRACE_STATE_HEADER=$.TRACE_PARENT_HEADER=void 0;var dn=(h(),m(d)),kE=dr(),$E=co();$.TRACE_PARENT_HEADER=\"traceparent\";$.TRACE_STATE_HEADER=\"tracestate\";var XE=\"00\",WE=\"(?!ff)[\\\\da-f]{2}\",KE=\"(?![0]{32})[\\\\da-f]{32}\",zE=\"(?![0]{16})[\\\\da-f]{16}\",YE=\"[\\\\da-f]{2}\",QE=new RegExp(`^\\\\s?(${WE})-(${KE})-(${zE})-(${YE})(-.*)?\\\\s?$`);function el(r){let e=QE.exec(r);return!e||e[1]===\"00\"&&e[5]?null:{traceId:e[2],spanId:e[3],traceFlags:parseInt(e[4],16)}}$.parseTraceParent=el;var lo=class{inject(e,t,n){let i=dn.trace.getSpanContext(e);if(!i||(0,kE.isTracingSuppressed)(e)||!(0,dn.isSpanContextValid)(i))return;let s=`${XE}-${i.traceId}-${i.spanId}-0${Number(i.traceFlags||dn.TraceFlags.NONE).toString(16)}`;n.set(t,$.TRACE_PARENT_HEADER,s),i.traceState&&n.set(t,$.TRACE_STATE_HEADER,i.traceState.serialize())}extract(e,t,n){let i=n.get(t,$.TRACE_PARENT_HEADER);if(!i)return e;let s=Array.isArray(i)?i[0]:i;if(typeof s!=\"string\")return e;let o=el(s);if(!o)return e;o.isRemote=!0;let a=n.get(t,$.TRACE_STATE_HEADER);if(a){let u=Array.isArray(a)?a.join(\",\"):a;o.traceState=new $E.TraceState(typeof u==\"string\"?u:void 0)}return dn.trace.setSpanContext(e,o)}fields(){return[$.TRACE_PARENT_HEADER,$.TRACE_STATE_HEADER]}};$.W3CTraceContextPropagator=lo});var nl=l(rl=>{\"use strict\";Object.defineProperty(rl,\"__esModule\",{value:!0})});var il=l(ue=>{\"use strict\";Object.defineProperty(ue,\"__esModule\",{value:!0});ue.getRPCMetadata=ue.deleteRPCMetadata=ue.setRPCMetadata=ue.RPCType=void 0;var ZE=(h(),m(d)),_o=(0,ZE.createContextKey)(\"OpenTelemetry SDK Context Key RPC_METADATA\"),JE;(function(r){r.HTTP=\"http\"})(JE=ue.RPCType||(ue.RPCType={}));function em(r,e){return r.setValue(_o,e)}ue.setRPCMetadata=em;function tm(r){return r.deleteValue(_o)}ue.deleteRPCMetadata=tm;function rm(r){return r.getValue(_o)}ue.getRPCMetadata=rm});var ho=l(_n=>{\"use strict\";Object.defineProperty(_n,\"__esModule\",{value:!0});_n.AlwaysOffSampler=void 0;var nm=(h(),m(d)),po=class{shouldSample(){return{decision:nm.SamplingDecision.NOT_RECORD}}toString(){return\"AlwaysOffSampler\"}};_n.AlwaysOffSampler=po});var Eo=l(pn=>{\"use strict\";Object.defineProperty(pn,\"__esModule\",{value:!0});pn.AlwaysOnSampler=void 0;var im=(h(),m(d)),fo=class{shouldSample(){return{decision:im.SamplingDecision.RECORD_AND_SAMPLED}}toString(){return\"AlwaysOnSampler\"}};pn.AlwaysOnSampler=fo});var ol=l(fn=>{\"use strict\";Object.defineProperty(fn,\"__esModule\",{value:!0});fn.ParentBasedSampler=void 0;var hn=(h(),m(d)),sm=Qs(),sl=ho(),mo=Eo(),go=class{constructor(e){var t,n,i,s;this._root=e.root,this._root||((0,sm.globalErrorHandler)(new Error(\"ParentBasedSampler must have a root sampler configured\")),this._root=new mo.AlwaysOnSampler),this._remoteParentSampled=(t=e.remoteParentSampled)!==null&&t!==void 0?t:new mo.AlwaysOnSampler,this._remoteParentNotSampled=(n=e.remoteParentNotSampled)!==null&&n!==void 0?n:new sl.AlwaysOffSampler,this._localParentSampled=(i=e.localParentSampled)!==null&&i!==void 0?i:new mo.AlwaysOnSampler,this._localParentNotSampled=(s=e.localParentNotSampled)!==null&&s!==void 0?s:new sl.AlwaysOffSampler}shouldSample(e,t,n,i,s,o){let a=hn.trace.getSpanContext(e);return!a||!(0,hn.isSpanContextValid)(a)?this._root.shouldSample(e,t,n,i,s,o):a.isRemote?a.traceFlags&hn.TraceFlags.SAMPLED?this._remoteParentSampled.shouldSample(e,t,n,i,s,o):this._remoteParentNotSampled.shouldSample(e,t,n,i,s,o):a.traceFlags&hn.TraceFlags.SAMPLED?this._localParentSampled.shouldSample(e,t,n,i,s,o):this._localParentNotSampled.shouldSample(e,t,n,i,s,o)}toString(){return`ParentBased{root=${this._root.toString()}, remoteParentSampled=${this._remoteParentSampled.toString()}, remoteParentNotSampled=${this._remoteParentNotSampled.toString()}, localParentSampled=${this._localParentSampled.toString()}, localParentNotSampled=${this._localParentNotSampled.toString()}}`}};fn.ParentBasedSampler=go});var al=l(En=>{\"use strict\";Object.defineProperty(En,\"__esModule\",{value:!0});En.TraceIdRatioBasedSampler=void 0;var To=(h(),m(d)),So=class{constructor(e=0){this._ratio=e,this._ratio=this._normalize(e),this._upperBound=Math.floor(this._ratio*4294967295)}shouldSample(e,t){return{decision:(0,To.isValidTraceId)(t)&&this._accumulate(t)=1?1:e<=0?0:e}_accumulate(e){let t=0;for(let n=0;n>>0}return t}};En.TraceIdRatioBasedSampler=So});var _l=l(mn=>{\"use strict\";Object.defineProperty(mn,\"__esModule\",{value:!0});mn.isPlainObject=void 0;var om=\"[object Object]\",am=\"[object Null]\",um=\"[object Undefined]\",cm=Function.prototype,ul=cm.toString,lm=ul.call(Object),dm=_m(Object.getPrototypeOf,Object),cl=Object.prototype,ll=cl.hasOwnProperty,Ke=Symbol?Symbol.toStringTag:void 0,dl=cl.toString;function _m(r,e){return function(t){return r(e(t))}}function pm(r){if(!hm(r)||fm(r)!==om)return!1;let e=dm(r);if(e===null)return!0;let t=ll.call(e,\"constructor\")&&e.constructor;return typeof t==\"function\"&&t instanceof t&&ul.call(t)===lm}mn.isPlainObject=pm;function hm(r){return r!=null&&typeof r==\"object\"}function fm(r){return r==null?r===void 0?um:am:Ke&&Ke in Object(r)?Em(r):mm(r)}function Em(r){let e=ll.call(r,Ke),t=r[Ke],n=!1;try{r[Ke]=void 0,n=!0}catch{}let i=dl.call(r);return n&&(e?r[Ke]=t:delete r[Ke]),i}function mm(r){return dl.call(r)}});var ml=l(Sn=>{\"use strict\";Object.defineProperty(Sn,\"__esModule\",{value:!0});Sn.merge=void 0;var pl=_l(),gm=20;function Tm(...r){let e=r.shift(),t=new WeakMap;for(;r.length>0;)e=fl(e,r.shift(),0,t);return e}Sn.merge=Tm;function Ao(r){return Tn(r)?r.slice():r}function fl(r,e,t=0,n){let i;if(!(t>gm)){if(t++,gn(r)||gn(e)||El(e))i=Ao(e);else if(Tn(r)){if(i=r.slice(),Tn(e))for(let s=0,o=e.length;s\"u\"?delete i[u]:i[u]=c;else{let _=i[u],p=c;if(hl(r,u,n)||hl(e,u,n))delete i[u];else{if(Er(_)&&Er(p)){let f=n.get(_)||[],M=n.get(p)||[];f.push({obj:r,key:u}),M.push({obj:e,key:u}),n.set(_,f),n.set(p,M)}i[u]=fl(i[u],c,t,n)}}}}else i=e;return i}}function hl(r,e,t){let n=t.get(r[e])||[];for(let i=0,s=n.length;i\"u\"||r instanceof Date||r instanceof RegExp||r===null}function Sm(r,e){return!(!(0,pl.isPlainObject)(r)||!(0,pl.isPlainObject)(e))}});var gl=l(mt=>{\"use strict\";Object.defineProperty(mt,\"__esModule\",{value:!0});mt.callWithTimeout=mt.TimeoutError=void 0;var An=class r extends Error{constructor(e){super(e),Object.setPrototypeOf(this,r.prototype)}};mt.TimeoutError=An;function Am(r,e){let t,n=new Promise(function(s,o){t=setTimeout(function(){o(new An(\"Operation timed out.\"))},e)});return Promise.race([r,n]).then(i=>(clearTimeout(t),i),i=>{throw clearTimeout(t),i})}mt.callWithTimeout=Am});var Sl=l(gt=>{\"use strict\";Object.defineProperty(gt,\"__esModule\",{value:!0});gt.isUrlIgnored=gt.urlMatches=void 0;function Tl(r,e){return typeof e==\"string\"?r===e:!!r.match(e)}gt.urlMatches=Tl;function Om(r,e){if(!e)return!1;for(let t of e)if(Tl(r,t))return!0;return!1}gt.isUrlIgnored=Om});var Al=l(On=>{\"use strict\";Object.defineProperty(On,\"__esModule\",{value:!0});On.isWrapped=void 0;function Rm(r){return typeof r==\"function\"&&typeof r.__original==\"function\"&&typeof r.__unwrap==\"function\"&&r.__wrapped===!0}On.isWrapped=Rm});var Ol=l(Rn=>{\"use strict\";Object.defineProperty(Rn,\"__esModule\",{value:!0});Rn.Deferred=void 0;var Oo=class{constructor(){this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}get promise(){return this._promise}resolve(e){this._resolve(e)}reject(e){this._reject(e)}};Rn.Deferred=Oo});var Rl=l(bn=>{\"use strict\";Object.defineProperty(bn,\"__esModule\",{value:!0});bn.BindOnceFuture=void 0;var bm=Ol(),Ro=class{constructor(e,t){this._callback=e,this._that=t,this._isCalled=!1,this._deferred=new bm.Deferred}get isCalled(){return this._isCalled}get promise(){return this._deferred.promise}call(...e){if(!this._isCalled){this._isCalled=!0;try{Promise.resolve(this._callback.call(this._that,...e)).then(t=>this._deferred.resolve(t),t=>this._deferred.reject(t))}catch(t){this._deferred.reject(t)}}return this._deferred.promise}};bn.BindOnceFuture=Ro});var Pl=l(Pn=>{\"use strict\";Object.defineProperty(Pn,\"__esModule\",{value:!0});Pn._export=void 0;var bl=(h(),m(d)),Pm=dr();function ym(r,e){return new Promise(t=>{bl.context.with((0,Pm.suppressTracing)(bl.context.active()),()=>{r.export(e,n=>{t(n)})})})}Pn._export=ym});var A=l(T=>{\"use strict\";var vm=T&&T.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),P=T&&T.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&vm(e,r,t)};Object.defineProperty(T,\"__esModule\",{value:!0});T.internal=T.baggageUtils=void 0;P(hc(),T);P(fc(),T);P(Sc(),T);P(Qs(),T);P(Ys(),T);P(Fc(),T);P($c(),T);P(Xc(),T);T.baggageUtils=$s();P(ro(),T);P(Kc(),T);P(tl(),T);P(nl(),T);P(il(),T);P(ho(),T);P(Eo(),T);P(ol(),T);P(al(),T);P(dr(),T);P(co(),T);P(Qr(),T);P(ml(),T);P(Zs(),T);P(gl(),T);P(Sl(),T);P(Al(),T);P(Rl(),T);P(to(),T);var Im=Pl();T.internal={_export:Im._export}});var yl=l(yn=>{\"use strict\";Object.defineProperty(yn,\"__esModule\",{value:!0});yn.ExceptionEventName=void 0;yn.ExceptionEventName=\"exception\"});var Po=l(vn=>{\"use strict\";Object.defineProperty(vn,\"__esModule\",{value:!0});vn.Span=void 0;var he=(h(),m(d)),X=A(),ze=Ae(),Mm=yl(),bo=class{constructor(e,t,n,i,s,o,a=[],u,c,_){this.attributes={},this.links=[],this.events=[],this._droppedAttributesCount=0,this._droppedEventsCount=0,this._droppedLinksCount=0,this.status={code:he.SpanStatusCode.UNSET},this.endTime=[0,0],this._ended=!1,this._duration=[-1,-1],this.name=n,this._spanContext=i,this.parentSpanId=o,this.kind=s,this.links=a;let p=Date.now();this._performanceStartTime=X.otperformance.now(),this._performanceOffset=p-(this._performanceStartTime+(0,X.getTimeOrigin)()),this._startTimeProvided=u!=null,this.startTime=this._getTime(u??p),this.resource=e.resource,this.instrumentationLibrary=e.instrumentationLibrary,this._spanLimits=e.getSpanLimits(),_!=null&&this.setAttributes(_),this._spanProcessor=e.getActiveSpanProcessor(),this._spanProcessor.onStart(this,t),this._attributeValueLengthLimit=this._spanLimits.attributeValueLengthLimit||0}spanContext(){return this._spanContext}setAttribute(e,t){return t==null||this._isSpanEnded()?this:e.length===0?(he.diag.warn(`Invalid attribute key: ${e}`),this):(0,X.isAttributeValue)(t)?Object.keys(this.attributes).length>=this._spanLimits.attributeCountLimit&&!Object.prototype.hasOwnProperty.call(this.attributes,e)?(this._droppedAttributesCount++,this):(this.attributes[e]=this._truncateToSize(t),this):(he.diag.warn(`Invalid attribute value set for key: ${e}`),this)}setAttributes(e){for(let[t,n]of Object.entries(e))this.setAttribute(t,n);return this}addEvent(e,t,n){if(this._isSpanEnded())return this;if(this._spanLimits.eventCountLimit===0)return he.diag.warn(\"No events allowed.\"),this._droppedEventsCount++,this;this.events.length>=this._spanLimits.eventCountLimit&&(he.diag.warn(\"Dropping extra events.\"),this.events.shift(),this._droppedEventsCount++),(0,X.isTimeInput)(t)&&((0,X.isTimeInput)(n)||(n=t),t=void 0);let i=(0,X.sanitizeAttributes)(t);return this.events.push({name:e,attributes:i,time:this._getTime(n),droppedAttributesCount:0}),this}setStatus(e){return this._isSpanEnded()?this:(this.status=e,this)}updateName(e){return this._isSpanEnded()?this:(this.name=e,this)}end(e){if(this._isSpanEnded()){he.diag.error(`${this.name} ${this._spanContext.traceId}-${this._spanContext.spanId} - You can only call end() on a span once.`);return}this._ended=!0,this.endTime=this._getTime(e),this._duration=(0,X.hrTimeDuration)(this.startTime,this.endTime),this._duration[0]<0&&(he.diag.warn(\"Inconsistent start and end time, startTime > endTime. Setting span duration to 0ms.\",this.startTime,this.endTime),this.endTime=this.startTime.slice(),this._duration=[0,0]),this._spanProcessor.onEnd(this)}_getTime(e){if(typeof e==\"number\"&&etypeof n==\"string\"?this._truncateToLimitUtil(n,t):n):e}};vn.Span=bo});var gr=l(mr=>{\"use strict\";Object.defineProperty(mr,\"__esModule\",{value:!0});mr.SamplingDecision=void 0;var Lm;(function(r){r[r.NOT_RECORD=0]=\"NOT_RECORD\",r[r.RECORD=1]=\"RECORD\",r[r.RECORD_AND_SAMPLED=2]=\"RECORD_AND_SAMPLED\"})(Lm=mr.SamplingDecision||(mr.SamplingDecision={}))});var Mn=l(In=>{\"use strict\";Object.defineProperty(In,\"__esModule\",{value:!0});In.AlwaysOffSampler=void 0;var Nm=gr(),yo=class{shouldSample(){return{decision:Nm.SamplingDecision.NOT_RECORD}}toString(){return\"AlwaysOffSampler\"}};In.AlwaysOffSampler=yo});var Nn=l(Ln=>{\"use strict\";Object.defineProperty(Ln,\"__esModule\",{value:!0});Ln.AlwaysOnSampler=void 0;var Cm=gr(),vo=class{shouldSample(){return{decision:Cm.SamplingDecision.RECORD_AND_SAMPLED}}toString(){return\"AlwaysOnSampler\"}};Ln.AlwaysOnSampler=vo});var Lo=l(wn=>{\"use strict\";Object.defineProperty(wn,\"__esModule\",{value:!0});wn.ParentBasedSampler=void 0;var Cn=(h(),m(d)),wm=A(),vl=Mn(),Io=Nn(),Mo=class{constructor(e){var t,n,i,s;this._root=e.root,this._root||((0,wm.globalErrorHandler)(new Error(\"ParentBasedSampler must have a root sampler configured\")),this._root=new Io.AlwaysOnSampler),this._remoteParentSampled=(t=e.remoteParentSampled)!==null&&t!==void 0?t:new Io.AlwaysOnSampler,this._remoteParentNotSampled=(n=e.remoteParentNotSampled)!==null&&n!==void 0?n:new vl.AlwaysOffSampler,this._localParentSampled=(i=e.localParentSampled)!==null&&i!==void 0?i:new Io.AlwaysOnSampler,this._localParentNotSampled=(s=e.localParentNotSampled)!==null&&s!==void 0?s:new vl.AlwaysOffSampler}shouldSample(e,t,n,i,s,o){let a=Cn.trace.getSpanContext(e);return!a||!(0,Cn.isSpanContextValid)(a)?this._root.shouldSample(e,t,n,i,s,o):a.isRemote?a.traceFlags&Cn.TraceFlags.SAMPLED?this._remoteParentSampled.shouldSample(e,t,n,i,s,o):this._remoteParentNotSampled.shouldSample(e,t,n,i,s,o):a.traceFlags&Cn.TraceFlags.SAMPLED?this._localParentSampled.shouldSample(e,t,n,i,s,o):this._localParentNotSampled.shouldSample(e,t,n,i,s,o)}toString(){return`ParentBased{root=${this._root.toString()}, remoteParentSampled=${this._remoteParentSampled.toString()}, remoteParentNotSampled=${this._remoteParentNotSampled.toString()}, localParentSampled=${this._localParentSampled.toString()}, localParentNotSampled=${this._localParentNotSampled.toString()}}`}};wn.ParentBasedSampler=Mo});var Co=l(xn=>{\"use strict\";Object.defineProperty(xn,\"__esModule\",{value:!0});xn.TraceIdRatioBasedSampler=void 0;var xm=(h(),m(d)),Il=gr(),No=class{constructor(e=0){this._ratio=e,this._ratio=this._normalize(e),this._upperBound=Math.floor(this._ratio*4294967295)}shouldSample(e,t){return{decision:(0,xm.isValidTraceId)(t)&&this._accumulate(t)=1?1:e<=0?0:e}_accumulate(e){let t=0;for(let n=0;n>>0}return t}};xn.TraceIdRatioBasedSampler=No});var Do=l(St=>{\"use strict\";Object.defineProperty(St,\"__esModule\",{value:!0});St.buildSamplerFromEnv=St.loadDefaultConfig=void 0;var Dn=(h(),m(d)),H=A(),Ml=Mn(),wo=Nn(),xo=Lo(),Ll=Co(),Dm=(0,H.getEnv)(),Um=H.TracesSamplerValues.AlwaysOn,Tt=1;function Bm(){return{sampler:Cl(Dm),forceFlushTimeoutMillis:3e4,generalLimits:{attributeValueLengthLimit:(0,H.getEnv)().OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT,attributeCountLimit:(0,H.getEnv)().OTEL_ATTRIBUTE_COUNT_LIMIT},spanLimits:{attributeValueLengthLimit:(0,H.getEnv)().OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,attributeCountLimit:(0,H.getEnv)().OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,linkCountLimit:(0,H.getEnv)().OTEL_SPAN_LINK_COUNT_LIMIT,eventCountLimit:(0,H.getEnv)().OTEL_SPAN_EVENT_COUNT_LIMIT,attributePerEventCountLimit:(0,H.getEnv)().OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,attributePerLinkCountLimit:(0,H.getEnv)().OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT}}}St.loadDefaultConfig=Bm;function Cl(r=(0,H.getEnv)()){switch(r.OTEL_TRACES_SAMPLER){case H.TracesSamplerValues.AlwaysOn:return new wo.AlwaysOnSampler;case H.TracesSamplerValues.AlwaysOff:return new Ml.AlwaysOffSampler;case H.TracesSamplerValues.ParentBasedAlwaysOn:return new xo.ParentBasedSampler({root:new wo.AlwaysOnSampler});case H.TracesSamplerValues.ParentBasedAlwaysOff:return new xo.ParentBasedSampler({root:new Ml.AlwaysOffSampler});case H.TracesSamplerValues.TraceIdRatio:return new Ll.TraceIdRatioBasedSampler(Nl(r));case H.TracesSamplerValues.ParentBasedTraceIdRatio:return new xo.ParentBasedSampler({root:new Ll.TraceIdRatioBasedSampler(Nl(r))});default:return Dn.diag.error(`OTEL_TRACES_SAMPLER value \"${r.OTEL_TRACES_SAMPLER} invalid, defaulting to ${Um}\".`),new wo.AlwaysOnSampler}}St.buildSamplerFromEnv=Cl;function Nl(r){if(r.OTEL_TRACES_SAMPLER_ARG===void 0||r.OTEL_TRACES_SAMPLER_ARG===\"\")return Dn.diag.error(`OTEL_TRACES_SAMPLER_ARG is blank, defaulting to ${Tt}.`),Tt;let e=Number(r.OTEL_TRACES_SAMPLER_ARG);return isNaN(e)?(Dn.diag.error(`OTEL_TRACES_SAMPLER_ARG=${r.OTEL_TRACES_SAMPLER_ARG} was given, but it is invalid, defaulting to ${Tt}.`),Tt):e<0||e>1?(Dn.diag.error(`OTEL_TRACES_SAMPLER_ARG=${r.OTEL_TRACES_SAMPLER_ARG} was given, but it is out of range ([0..1]), defaulting to ${Tt}.`),Tt):e}});var Bo=l(At=>{\"use strict\";Object.defineProperty(At,\"__esModule\",{value:!0});At.reconfigureLimits=At.mergeConfig=void 0;var wl=Do(),Uo=A();function qm(r){let e={sampler:(0,wl.buildSamplerFromEnv)()},t=(0,wl.loadDefaultConfig)(),n=Object.assign({},t,e,r);return n.generalLimits=Object.assign({},t.generalLimits,r.generalLimits||{}),n.spanLimits=Object.assign({},t.spanLimits,r.spanLimits||{}),n}At.mergeConfig=qm;function Vm(r){var e,t,n,i,s,o,a,u,c,_,p,f;let M=Object.assign({},r.spanLimits),R=(0,Uo.getEnvWithoutDefaults)();return M.attributeCountLimit=(o=(s=(i=(t=(e=r.spanLimits)===null||e===void 0?void 0:e.attributeCountLimit)!==null&&t!==void 0?t:(n=r.generalLimits)===null||n===void 0?void 0:n.attributeCountLimit)!==null&&i!==void 0?i:R.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT)!==null&&s!==void 0?s:R.OTEL_ATTRIBUTE_COUNT_LIMIT)!==null&&o!==void 0?o:Uo.DEFAULT_ATTRIBUTE_COUNT_LIMIT,M.attributeValueLengthLimit=(f=(p=(_=(u=(a=r.spanLimits)===null||a===void 0?void 0:a.attributeValueLengthLimit)!==null&&u!==void 0?u:(c=r.generalLimits)===null||c===void 0?void 0:c.attributeValueLengthLimit)!==null&&_!==void 0?_:R.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT)!==null&&p!==void 0?p:R.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT)!==null&&f!==void 0?f:Uo.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,Object.assign({},r,{spanLimits:M})}At.reconfigureLimits=Vm});var xl=l(Un=>{\"use strict\";Object.defineProperty(Un,\"__esModule\",{value:!0});Un.BatchSpanProcessorBase=void 0;var Ot=(h(),m(d)),Ye=A(),qo=class{constructor(e,t){this._exporter=e,this._isExporting=!1,this._finishedSpans=[],this._droppedSpansCount=0;let n=(0,Ye.getEnv)();this._maxExportBatchSize=typeof t?.maxExportBatchSize==\"number\"?t.maxExportBatchSize:n.OTEL_BSP_MAX_EXPORT_BATCH_SIZE,this._maxQueueSize=typeof t?.maxQueueSize==\"number\"?t.maxQueueSize:n.OTEL_BSP_MAX_QUEUE_SIZE,this._scheduledDelayMillis=typeof t?.scheduledDelayMillis==\"number\"?t.scheduledDelayMillis:n.OTEL_BSP_SCHEDULE_DELAY,this._exportTimeoutMillis=typeof t?.exportTimeoutMillis==\"number\"?t.exportTimeoutMillis:n.OTEL_BSP_EXPORT_TIMEOUT,this._shutdownOnce=new Ye.BindOnceFuture(this._shutdown,this),this._maxExportBatchSize>this._maxQueueSize&&(Ot.diag.warn(\"BatchSpanProcessor: maxExportBatchSize must be smaller or equal to maxQueueSize, setting maxExportBatchSize to match maxQueueSize\"),this._maxExportBatchSize=this._maxQueueSize)}forceFlush(){return this._shutdownOnce.isCalled?this._shutdownOnce.promise:this._flushAll()}onStart(e,t){}onEnd(e){this._shutdownOnce.isCalled||e.spanContext().traceFlags&Ot.TraceFlags.SAMPLED&&this._addToBuffer(e)}shutdown(){return this._shutdownOnce.call()}_shutdown(){return Promise.resolve().then(()=>this.onShutdown()).then(()=>this._flushAll()).then(()=>this._exporter.shutdown())}_addToBuffer(e){if(this._finishedSpans.length>=this._maxQueueSize){this._droppedSpansCount===0&&Ot.diag.debug(\"maxQueueSize reached, dropping spans\"),this._droppedSpansCount++;return}this._droppedSpansCount>0&&(Ot.diag.warn(`Dropped ${this._droppedSpansCount} spans because maxQueueSize reached`),this._droppedSpansCount=0),this._finishedSpans.push(e),this._maybeStartTimer()}_flushAll(){return new Promise((e,t)=>{let n=[],i=Math.ceil(this._finishedSpans.length/this._maxExportBatchSize);for(let s=0,o=i;s{e()}).catch(t)})}_flushOneBatch(){return this._clearTimer(),this._finishedSpans.length===0?Promise.resolve():new Promise((e,t)=>{let n=setTimeout(()=>{t(new Error(\"Timeout\"))},this._exportTimeoutMillis);Ot.context.with((0,Ye.suppressTracing)(Ot.context.active()),()=>{let i=this._finishedSpans.splice(0,this._maxExportBatchSize),s=()=>this._exporter.export(i,a=>{var u;clearTimeout(n),a.code===Ye.ExportResultCode.SUCCESS?e():t((u=a.error)!==null&&u!==void 0?u:new Error(\"BatchSpanProcessor: span export failed\"))}),o=i.map(a=>a.resource).filter(a=>a.asyncAttributesPending);o.length===0?s():Promise.all(o.map(a=>{var u;return(u=a.waitForAsyncAttributes)===null||u===void 0?void 0:u.call(a)})).then(s,a=>{(0,Ye.globalErrorHandler)(a),t(a)})})})}_maybeStartTimer(){if(this._isExporting)return;let e=()=>{this._isExporting=!0,this._flushOneBatch().then(()=>{this._isExporting=!1,this._finishedSpans.length>0&&(this._clearTimer(),this._maybeStartTimer())}).catch(t=>{this._isExporting=!1,(0,Ye.globalErrorHandler)(t)})};if(this._finishedSpans.length>=this._maxExportBatchSize)return e();this._timer===void 0&&(this._timer=setTimeout(()=>e(),this._scheduledDelayMillis),(0,Ye.unrefTimer)(this._timer))}_clearTimer(){this._timer!==void 0&&(clearTimeout(this._timer),this._timer=void 0)}};Un.BatchSpanProcessorBase=qo});var Dl=l(Bn=>{\"use strict\";Object.defineProperty(Bn,\"__esModule\",{value:!0});Bn.BatchSpanProcessor=void 0;var Gm=xl(),Vo=class extends Gm.BatchSpanProcessorBase{onShutdown(){}};Bn.BatchSpanProcessor=Vo});var ql=l(Vn=>{\"use strict\";Object.defineProperty(Vn,\"__esModule\",{value:!0});Vn.RandomIdGenerator=void 0;var Hm=8,Bl=16,Go=class{constructor(){this.generateTraceId=Ul(Bl),this.generateSpanId=Ul(Hm)}};Vn.RandomIdGenerator=Go;var qn=Buffer.allocUnsafe(Bl);function Ul(r){return function(){for(let t=0;t>>0,t*4);for(let t=0;t0);t++)t===r-1&&(qn[r-1]=1);return qn.toString(\"hex\",0,r)}}});var Gl=l(Le=>{\"use strict\";var jm=Le&&Le.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),Vl=Le&&Le.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&jm(e,r,t)};Object.defineProperty(Le,\"__esModule\",{value:!0});Vl(Dl(),Le);Vl(ql(),Le)});var Gn=l(Qe=>{\"use strict\";var Fm=Qe&&Qe.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),km=Qe&&Qe.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&Fm(e,r,t)};Object.defineProperty(Qe,\"__esModule\",{value:!0});km(Gl(),Qe)});var Hl=l(jn=>{\"use strict\";Object.defineProperty(jn,\"__esModule\",{value:!0});jn.Tracer=void 0;var j=(h(),m(d)),Hn=A(),$m=Po(),Xm=Bo(),Wm=Gn(),Ho=class{constructor(e,t,n){this._tracerProvider=n;let i=(0,Xm.mergeConfig)(t);this._sampler=i.sampler,this._generalLimits=i.generalLimits,this._spanLimits=i.spanLimits,this._idGenerator=t.idGenerator||new Wm.RandomIdGenerator,this.resource=n.resource,this.instrumentationLibrary=e}startSpan(e,t={},n=j.context.active()){var i,s,o;t.root&&(n=j.trace.deleteSpan(n));let a=j.trace.getSpan(n);if((0,Hn.isTracingSuppressed)(n))return j.diag.debug(\"Instrumentation suppressed, returning Noop Span\"),j.trace.wrapSpanContext(j.INVALID_SPAN_CONTEXT);let u=a?.spanContext(),c=this._idGenerator.generateSpanId(),_,p,f;!u||!j.trace.isSpanContextValid(u)?_=this._idGenerator.generateTraceId():(_=u.traceId,p=u.traceState,f=u.spanId);let M=(i=t.kind)!==null&&i!==void 0?i:j.SpanKind.INTERNAL,R=((s=t.links)!==null&&s!==void 0?s:[]).map(pt=>({context:pt.context,attributes:(0,Hn.sanitizeAttributes)(pt.attributes)})),w=(0,Hn.sanitizeAttributes)(t.attributes),U=this._sampler.shouldSample(n,_,e,M,w,R);p=(o=U.traceState)!==null&&o!==void 0?o:p;let S=U.decision===j.SamplingDecision.RECORD_AND_SAMPLED?j.TraceFlags.SAMPLED:j.TraceFlags.NONE,Te={traceId:_,spanId:c,traceFlags:S,traceState:p};if(U.decision===j.SamplingDecision.NOT_RECORD)return j.diag.debug(\"Recording is off, propagating context in a non-recording span\"),j.trace.wrapSpanContext(Te);let Se=(0,Hn.sanitizeAttributes)(Object.assign(w,U.attributes));return new $m.Span(this,n,e,Te,M,f,R,t.startTime,void 0,Se)}startActiveSpan(e,t,n,i){let s,o,a;if(arguments.length<2)return;arguments.length===2?a=t:arguments.length===3?(s=t,a=n):(s=t,o=n,a=i);let u=o??j.context.active(),c=this.startSpan(e,s,u),_=j.trace.setSpan(u,c);return j.context.with(_,a,void 0,c)}getGeneralLimits(){return this._generalLimits}getSpanLimits(){return this._spanLimits}getActiveSpanProcessor(){return this._tracerProvider.getActiveSpanProcessor()}};jn.Tracer=Ho});var jl=l(Fn=>{\"use strict\";Object.defineProperty(Fn,\"__esModule\",{value:!0});Fn.defaultServiceName=void 0;function Km(){return`unknown_service:${process.argv0}`}Fn.defaultServiceName=Km});var jo=l(Rt=>{\"use strict\";Object.defineProperty(Rt,\"__esModule\",{value:!0});Rt.normalizeType=Rt.normalizeArch=void 0;var zm=r=>{switch(r){case\"arm\":return\"arm32\";case\"ppc\":return\"ppc32\";case\"x64\":return\"amd64\";default:return r}};Rt.normalizeArch=zm;var Ym=r=>{switch(r){case\"sunos\":return\"solaris\";case\"win32\":return\"windows\";default:return r}};Rt.normalizeType=Ym});var $n=l(kn=>{\"use strict\";Object.defineProperty(kn,\"__esModule\",{value:!0});kn.execAsync=void 0;var Qm=z(\"child_process\"),Zm=z(\"util\");kn.execAsync=Zm.promisify(Qm.exec)});var Fl=l(Xn=>{\"use strict\";Object.defineProperty(Xn,\"__esModule\",{value:!0});Xn.getMachineId=void 0;var Jm=$n(),eg=(h(),m(d));async function tg(){try{let e=(await(0,Jm.execAsync)('ioreg -rd1 -c \"IOPlatformExpertDevice\"')).stdout.split(`\n`).find(n=>n.includes(\"IOPlatformUUID\"));if(!e)return\"\";let t=e.split('\" = \"');if(t.length===2)return t[1].slice(0,-1)}catch(r){eg.diag.debug(`error reading machine id: ${r}`)}return\"\"}Xn.getMachineId=tg});var kl=l(Wn=>{\"use strict\";Object.defineProperty(Wn,\"__esModule\",{value:!0});Wn.getMachineId=void 0;var rg=z(\"fs\"),ng=(h(),m(d));async function ig(){let r=[\"/etc/machine-id\",\"/var/lib/dbus/machine-id\"];for(let e of r)try{return(await rg.promises.readFile(e,{encoding:\"utf8\"})).trim()}catch(t){ng.diag.debug(`error reading machine id: ${t}`)}return\"\"}Wn.getMachineId=ig});var Xl=l(Kn=>{\"use strict\";Object.defineProperty(Kn,\"__esModule\",{value:!0});Kn.getMachineId=void 0;var sg=z(\"fs\"),og=$n(),$l=(h(),m(d));async function ag(){try{return(await sg.promises.readFile(\"/etc/hostid\",{encoding:\"utf8\"})).trim()}catch(r){$l.diag.debug(`error reading machine id: ${r}`)}try{return(await(0,og.execAsync)(\"kenv -q smbios.system.uuid\")).stdout.trim()}catch(r){$l.diag.debug(`error reading machine id: ${r}`)}return\"\"}Kn.getMachineId=ag});var Kl=l(zn=>{\"use strict\";Object.defineProperty(zn,\"__esModule\",{value:!0});zn.getMachineId=void 0;var Wl=z(\"process\"),ug=$n(),cg=(h(),m(d));async function lg(){let r=\"QUERY HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography /v MachineGuid\",e=\"%windir%\\\\System32\\\\REG.exe\";Wl.arch===\"ia32\"&&\"PROCESSOR_ARCHITEW6432\"in Wl.env&&(e=\"%windir%\\\\sysnative\\\\cmd.exe /c \"+e);try{let n=(await(0,ug.execAsync)(`${e} ${r}`)).stdout.split(\"REG_SZ\");if(n.length===2)return n[1].trim()}catch(t){cg.diag.debug(`error reading machine id: ${t}`)}return\"\"}zn.getMachineId=lg});var zl=l(Yn=>{\"use strict\";Object.defineProperty(Yn,\"__esModule\",{value:!0});Yn.getMachineId=void 0;var dg=(h(),m(d));async function _g(){return dg.diag.debug(\"could not read machine-id: unsupported platform\"),\"\"}Yn.getMachineId=_g});var Yl=l(Oe=>{\"use strict\";Object.defineProperty(Oe,\"__esModule\",{value:!0});Oe.getMachineId=void 0;var pg=z(\"process\"),bt;Oe.getMachineId=bt;switch(pg.platform){case\"darwin\":Oe.getMachineId=bt=Fl().getMachineId;break;case\"linux\":Oe.getMachineId=bt=kl().getMachineId;break;case\"freebsd\":Oe.getMachineId=bt=Xl().getMachineId;break;case\"win32\":Oe.getMachineId=bt=Kl().getMachineId;break;default:Oe.getMachineId=bt=zl().getMachineId}});var $o=l(Qn=>{\"use strict\";Object.defineProperty(Qn,\"__esModule\",{value:!0});Qn.hostDetectorSync=void 0;var Fo=Ae(),hg=Ze(),Ql=z(\"os\"),fg=jo(),Eg=Yl(),ko=class{detect(e){let t={[Fo.SemanticResourceAttributes.HOST_NAME]:(0,Ql.hostname)(),[Fo.SemanticResourceAttributes.HOST_ARCH]:(0,fg.normalizeArch)((0,Ql.arch)())};return new hg.Resource(t,this._getAsyncAttributes())}_getAsyncAttributes(){return(0,Eg.getMachineId)().then(e=>{let t={};return e&&(t[Fo.SemanticResourceAttributes.HOST_ID]=e),t})}};Qn.hostDetectorSync=new ko});var Zl=l(Zn=>{\"use strict\";Object.defineProperty(Zn,\"__esModule\",{value:!0});Zn.hostDetector=void 0;var mg=$o(),Xo=class{detect(e){return Promise.resolve(mg.hostDetectorSync.detect(e))}};Zn.hostDetector=new Xo});var Ko=l(Jn=>{\"use strict\";Object.defineProperty(Jn,\"__esModule\",{value:!0});Jn.osDetectorSync=void 0;var Jl=Ae(),gg=Ze(),ed=z(\"os\"),Tg=jo(),Wo=class{detect(e){let t={[Jl.SemanticResourceAttributes.OS_TYPE]:(0,Tg.normalizeType)((0,ed.platform)()),[Jl.SemanticResourceAttributes.OS_VERSION]:(0,ed.release)()};return new gg.Resource(t)}};Jn.osDetectorSync=new Wo});var td=l(ei=>{\"use strict\";Object.defineProperty(ei,\"__esModule\",{value:!0});ei.osDetector=void 0;var Sg=Ko(),zo=class{detect(e){return Promise.resolve(Sg.osDetectorSync.detect(e))}};ei.osDetector=new zo});var Qo=l(ti=>{\"use strict\";Object.defineProperty(ti,\"__esModule\",{value:!0});ti.processDetectorSync=void 0;var Ag=(h(),m(d)),Re=Ae(),Og=Ze(),Rg=z(\"os\"),Yo=class{detect(e){let t={[Re.SemanticResourceAttributes.PROCESS_PID]:process.pid,[Re.SemanticResourceAttributes.PROCESS_EXECUTABLE_NAME]:process.title,[Re.SemanticResourceAttributes.PROCESS_EXECUTABLE_PATH]:process.execPath,[Re.SemanticResourceAttributes.PROCESS_COMMAND_ARGS]:[process.argv[0],...process.execArgv,...process.argv.slice(1)],[Re.SemanticResourceAttributes.PROCESS_RUNTIME_VERSION]:process.versions.node,[Re.SemanticResourceAttributes.PROCESS_RUNTIME_NAME]:\"nodejs\",[Re.SemanticResourceAttributes.PROCESS_RUNTIME_DESCRIPTION]:\"Node.js\"};process.argv.length>1&&(t[Re.SemanticResourceAttributes.PROCESS_COMMAND]=process.argv[1]);try{let n=Rg.userInfo();t[Re.SemanticResourceAttributes.PROCESS_OWNER]=n.username}catch(n){Ag.diag.debug(`error obtaining process owner: ${n}`)}return new Og.Resource(t)}};ti.processDetectorSync=new Yo});var rd=l(ri=>{\"use strict\";Object.defineProperty(ri,\"__esModule\",{value:!0});ri.processDetector=void 0;var bg=Qo(),Zo=class{detect(e){return Promise.resolve(bg.processDetectorSync.detect(e))}};ri.processDetector=new Zo});var nd=l(te=>{\"use strict\";var Pg=te&&te.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),Je=te&&te.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&Pg(e,r,t)};Object.defineProperty(te,\"__esModule\",{value:!0});Je(jl(),te);Je(Zl(),te);Je(td(),te);Je($o(),te);Je(Ko(),te);Je(rd(),te);Je(Qo(),te)});var Jo=l(et=>{\"use strict\";var yg=et&&et.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),vg=et&&et.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&yg(e,r,t)};Object.defineProperty(et,\"__esModule\",{value:!0});vg(nd(),et)});var Ze=l(ni=>{\"use strict\";Object.defineProperty(ni,\"__esModule\",{value:!0});ni.Resource=void 0;var id=(h(),m(d)),tt=Ae(),ea=A(),Ig=Jo(),Tr=class r{constructor(e,t){var n;this._attributes=e,this.asyncAttributesPending=t!=null,this._syncAttributes=(n=this._attributes)!==null&&n!==void 0?n:{},this._asyncAttributesPromise=t?.then(i=>(this._attributes=Object.assign({},this._attributes,i),this.asyncAttributesPending=!1,i),i=>(id.diag.debug(\"a resource's async attributes promise rejected: %s\",i),this.asyncAttributesPending=!1,{}))}static empty(){return r.EMPTY}static default(){return new r({[tt.SemanticResourceAttributes.SERVICE_NAME]:(0,Ig.defaultServiceName)(),[tt.SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE]:ea.SDK_INFO[tt.SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE],[tt.SemanticResourceAttributes.TELEMETRY_SDK_NAME]:ea.SDK_INFO[tt.SemanticResourceAttributes.TELEMETRY_SDK_NAME],[tt.SemanticResourceAttributes.TELEMETRY_SDK_VERSION]:ea.SDK_INFO[tt.SemanticResourceAttributes.TELEMETRY_SDK_VERSION]})}get attributes(){var e;return this.asyncAttributesPending&&id.diag.error(\"Accessing resource attributes before async attributes settled\"),(e=this._attributes)!==null&&e!==void 0?e:{}}async waitForAsyncAttributes(){this.asyncAttributesPending&&await this._asyncAttributesPromise}merge(e){var t;if(!e)return this;let n=Object.assign(Object.assign({},this._syncAttributes),(t=e._syncAttributes)!==null&&t!==void 0?t:e.attributes);if(!this._asyncAttributesPromise&&!e._asyncAttributesPromise)return new r(n);let i=Promise.all([this._asyncAttributesPromise,e._asyncAttributesPromise]).then(([s,o])=>{var a;return Object.assign(Object.assign(Object.assign(Object.assign({},this._syncAttributes),s),(a=e._syncAttributes)!==null&&a!==void 0?a:e.attributes),o)});return new r(n,i)}};ni.Resource=Tr;Tr.EMPTY=new Tr({})});var od=l(sd=>{\"use strict\";Object.defineProperty(sd,\"__esModule\",{value:!0})});var ud=l(ad=>{\"use strict\";Object.defineProperty(ad,\"__esModule\",{value:!0})});var ld=l(cd=>{\"use strict\";Object.defineProperty(cd,\"__esModule\",{value:!0})});var dd=l(ii=>{\"use strict\";Object.defineProperty(ii,\"__esModule\",{value:!0});ii.browserDetector=void 0;var Mg=rt(),ta=class{detect(e){return Promise.resolve(Mg.browserDetectorSync.detect(e))}};ii.browserDetector=new ta});var na=l(si=>{\"use strict\";Object.defineProperty(si,\"__esModule\",{value:!0});si.envDetectorSync=void 0;var Lg=(h(),m(d)),Ng=A(),Cg=Ae(),wg=Ze(),ra=class{constructor(){this._MAX_LENGTH=255,this._COMMA_SEPARATOR=\",\",this._LABEL_KEY_VALUE_SPLITTER=\"=\",this._ERROR_MESSAGE_INVALID_CHARS=\"should be a ASCII string with a length greater than 0 and not exceed \"+this._MAX_LENGTH+\" characters.\",this._ERROR_MESSAGE_INVALID_VALUE=\"should be a ASCII string with a length not exceed \"+this._MAX_LENGTH+\" characters.\"}detect(e){let t={},n=(0,Ng.getEnv)(),i=n.OTEL_RESOURCE_ATTRIBUTES,s=n.OTEL_SERVICE_NAME;if(i)try{let o=this._parseResourceAttributes(i);Object.assign(t,o)}catch(o){Lg.diag.debug(`EnvDetector failed: ${o.message}`)}return s&&(t[Cg.SemanticResourceAttributes.SERVICE_NAME]=s),new wg.Resource(t)}_parseResourceAttributes(e){if(!e)return{};let t={},n=e.split(this._COMMA_SEPARATOR,-1);for(let i of n){let s=i.split(this._LABEL_KEY_VALUE_SPLITTER,-1);if(s.length!==2)continue;let[o,a]=s;if(o=o.trim(),a=a.trim().split(/^\"|\"$/).join(\"\"),!this._isValidAndNotEmpty(o))throw new Error(`Attribute key ${this._ERROR_MESSAGE_INVALID_CHARS}`);if(!this._isValid(a))throw new Error(`Attribute value ${this._ERROR_MESSAGE_INVALID_VALUE}`);t[o]=decodeURIComponent(a)}return t}_isValid(e){return e.length<=this._MAX_LENGTH&&this._isBaggageOctetString(e)}_isBaggageOctetString(e){for(let t=0;t126)return!1}return!0}_isValidAndNotEmpty(e){return e.length>0&&this._isValid(e)}};si.envDetectorSync=new ra});var _d=l(oi=>{\"use strict\";Object.defineProperty(oi,\"__esModule\",{value:!0});oi.envDetector=void 0;var xg=na(),ia=class{detect(e){return Promise.resolve(xg.envDetectorSync.detect(e))}};oi.envDetector=new ia});var pd=l(ui=>{\"use strict\";Object.defineProperty(ui,\"__esModule\",{value:!0});ui.browserDetectorSync=void 0;var ai=Ae(),sa=rt(),Dg=(h(),m(d)),oa=class{detect(e){if(!(typeof navigator<\"u\"))return sa.Resource.empty();let n={[ai.SemanticResourceAttributes.PROCESS_RUNTIME_NAME]:\"browser\",[ai.SemanticResourceAttributes.PROCESS_RUNTIME_DESCRIPTION]:\"Web Browser\",[ai.SemanticResourceAttributes.PROCESS_RUNTIME_VERSION]:navigator.userAgent};return this._getResourceAttributes(n,e)}_getResourceAttributes(e,t){return e[ai.SemanticResourceAttributes.PROCESS_RUNTIME_VERSION]===\"\"?(Dg.diag.debug(\"BrowserDetector failed: Unable to find required browser resources. \"),sa.Resource.empty()):new sa.Resource(Object.assign({},e))}};ui.browserDetectorSync=new oa});var hd=l(fe=>{\"use strict\";var Ug=fe&&fe.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),ci=fe&&fe.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&Ug(e,r,t)};Object.defineProperty(fe,\"__esModule\",{value:!0});ci(dd(),fe);ci(_d(),fe);ci(pd(),fe);ci(na(),fe)});var fd=l(li=>{\"use strict\";Object.defineProperty(li,\"__esModule\",{value:!0});li.isPromiseLike=void 0;var Bg=r=>r!==null&&typeof r==\"object\"&&typeof r.then==\"function\";li.isPromiseLike=Bg});var md=l(yt=>{\"use strict\";Object.defineProperty(yt,\"__esModule\",{value:!0});yt.detectResourcesSync=yt.detectResources=void 0;var Sr=Ze(),Pt=(h(),m(d)),qg=fd(),Vg=async(r={})=>{let e=await Promise.all((r.detectors||[]).map(async t=>{try{let n=await t.detect(r);return Pt.diag.debug(`${t.constructor.name} found resource.`,n),n}catch(n){return Pt.diag.debug(`${t.constructor.name} failed: ${n.message}`),Sr.Resource.empty()}}));return Ed(e),e.reduce((t,n)=>t.merge(n),Sr.Resource.empty())};yt.detectResources=Vg;var Gg=(r={})=>{var e;let t=((e=r.detectors)!==null&&e!==void 0?e:[]).map(i=>{try{let s=i.detect(r),o;if((0,qg.isPromiseLike)(s)){let a=async()=>(await s).attributes;o=new Sr.Resource({},a())}else o=s;return o.waitForAsyncAttributes?o.waitForAsyncAttributes().then(()=>Pt.diag.debug(`${i.constructor.name} found resource.`,o)):Pt.diag.debug(`${i.constructor.name} found resource.`,o),o}catch(s){return Pt.diag.error(`${i.constructor.name} failed: ${s.message}`),Sr.Resource.empty()}}),n=t.reduce((i,s)=>i.merge(s),Sr.Resource.empty());return n.waitForAsyncAttributes&&n.waitForAsyncAttributes().then(()=>{Ed(t)}),n};yt.detectResourcesSync=Gg;var Ed=r=>{r.forEach(e=>{if(Object.keys(e.attributes).length>0){let t=JSON.stringify(e.attributes,null,4);Pt.diag.verbose(t)}})}});var rt=l(re=>{\"use strict\";var Hg=re&&re.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),nt=re&&re.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&Hg(e,r,t)};Object.defineProperty(re,\"__esModule\",{value:!0});nt(Ze(),re);nt(od(),re);nt(Jo(),re);nt(ud(),re);nt(ld(),re);nt(hd(),re);nt(md(),re)});var gd=l(di=>{\"use strict\";Object.defineProperty(di,\"__esModule\",{value:!0});di.MultiSpanProcessor=void 0;var jg=A(),aa=class{constructor(e){this._spanProcessors=e}forceFlush(){let e=[];for(let t of this._spanProcessors)e.push(t.forceFlush());return new Promise(t=>{Promise.all(e).then(()=>{t()}).catch(n=>{(0,jg.globalErrorHandler)(n||new Error(\"MultiSpanProcessor: forceFlush failed\")),t()})})}onStart(e,t){for(let n of this._spanProcessors)n.onStart(e,t)}onEnd(e){for(let t of this._spanProcessors)t.onEnd(e)}shutdown(){let e=[];for(let t of this._spanProcessors)e.push(t.shutdown());return new Promise((t,n)=>{Promise.all(e).then(()=>{t()},n)})}};di.MultiSpanProcessor=aa});var ca=l(_i=>{\"use strict\";Object.defineProperty(_i,\"__esModule\",{value:!0});_i.NoopSpanProcessor=void 0;var ua=class{onStart(e,t){}onEnd(e){}shutdown(){return Promise.resolve()}forceFlush(){return Promise.resolve()}};_i.NoopSpanProcessor=ua});var Sd=l(it=>{\"use strict\";Object.defineProperty(it,\"__esModule\",{value:!0});it.BasicTracerProvider=it.ForceFlushState=void 0;var vt=(h(),m(d)),Mt=A(),Td=rt(),Fg=la(),kg=Do(),$g=gd(),Xg=ca(),Wg=Gn(),Kg=Bo(),It;(function(r){r[r.resolved=0]=\"resolved\",r[r.timeout=1]=\"timeout\",r[r.error=2]=\"error\",r[r.unresolved=3]=\"unresolved\"})(It=it.ForceFlushState||(it.ForceFlushState={}));var Ar=class{constructor(e={}){var t;this._registeredSpanProcessors=[],this._tracers=new Map;let n=(0,Mt.merge)({},(0,kg.loadDefaultConfig)(),(0,Kg.reconfigureLimits)(e));this.resource=(t=n.resource)!==null&&t!==void 0?t:Td.Resource.empty(),this.resource=Td.Resource.default().merge(this.resource),this._config=Object.assign({},n,{resource:this.resource});let i=this._buildExporterFromEnv();if(i!==void 0){let s=new Wg.BatchSpanProcessor(i);this.activeSpanProcessor=s}else this.activeSpanProcessor=new Xg.NoopSpanProcessor}getTracer(e,t,n){let i=`${e}@${t||\"\"}:${n?.schemaUrl||\"\"}`;return this._tracers.has(i)||this._tracers.set(i,new Fg.Tracer({name:e,version:t,schemaUrl:n?.schemaUrl},this._config,this)),this._tracers.get(i)}addSpanProcessor(e){this._registeredSpanProcessors.length===0&&this.activeSpanProcessor.shutdown().catch(t=>vt.diag.error(\"Error while trying to shutdown current span processor\",t)),this._registeredSpanProcessors.push(e),this.activeSpanProcessor=new $g.MultiSpanProcessor(this._registeredSpanProcessors)}getActiveSpanProcessor(){return this.activeSpanProcessor}register(e={}){vt.trace.setGlobalTracerProvider(this),e.propagator===void 0&&(e.propagator=this._buildPropagatorFromEnv()),e.contextManager&&vt.context.setGlobalContextManager(e.contextManager),e.propagator&&vt.propagation.setGlobalPropagator(e.propagator)}forceFlush(){let e=this._config.forceFlushTimeoutMillis,t=this._registeredSpanProcessors.map(n=>new Promise(i=>{let s,o=setTimeout(()=>{i(new Error(`Span processor did not completed within timeout period of ${e} ms`)),s=It.timeout},e);n.forceFlush().then(()=>{clearTimeout(o),s!==It.timeout&&(s=It.resolved,i(s))}).catch(a=>{clearTimeout(o),s=It.error,i(a)})}));return new Promise((n,i)=>{Promise.all(t).then(s=>{let o=s.filter(a=>a!==It.resolved);o.length>0?i(o):n()}).catch(s=>i([s]))})}shutdown(){return this.activeSpanProcessor.shutdown()}_getPropagator(e){var t;return(t=this.constructor._registeredPropagators.get(e))===null||t===void 0?void 0:t()}_getSpanExporter(e){var t;return(t=this.constructor._registeredExporters.get(e))===null||t===void 0?void 0:t()}_buildPropagatorFromEnv(){let e=Array.from(new Set((0,Mt.getEnv)().OTEL_PROPAGATORS)),n=e.map(i=>{let s=this._getPropagator(i);return s||vt.diag.warn(`Propagator \"${i}\" requested through environment variable is unavailable.`),s}).reduce((i,s)=>(s&&i.push(s),i),[]);if(n.length!==0)return e.length===1?n[0]:new Mt.CompositePropagator({propagators:n})}_buildExporterFromEnv(){let e=(0,Mt.getEnv)().OTEL_TRACES_EXPORTER;if(e===\"none\"||e===\"\")return;let t=this._getSpanExporter(e);return t||vt.diag.error(`Exporter \"${e}\" requested through environment variable is unavailable.`),t}};it.BasicTracerProvider=Ar;Ar._registeredPropagators=new Map([[\"tracecontext\",()=>new Mt.W3CTraceContextPropagator],[\"baggage\",()=>new Mt.W3CBaggagePropagator]]);Ar._registeredExporters=new Map});var Ad=l(pi=>{\"use strict\";Object.defineProperty(pi,\"__esModule\",{value:!0});pi.ConsoleSpanExporter=void 0;var da=A(),_a=class{export(e,t){return this._sendSpans(e,t)}shutdown(){return this._sendSpans([]),this.forceFlush()}forceFlush(){return Promise.resolve()}_exportInfo(e){var t;return{traceId:e.spanContext().traceId,parentId:e.parentSpanId,traceState:(t=e.spanContext().traceState)===null||t===void 0?void 0:t.serialize(),name:e.name,id:e.spanContext().spanId,kind:e.kind,timestamp:(0,da.hrTimeToMicroseconds)(e.startTime),duration:(0,da.hrTimeToMicroseconds)(e.duration),attributes:e.attributes,status:e.status,events:e.events,links:e.links}}_sendSpans(e,t){for(let n of e)console.dir(this._exportInfo(n),{depth:3});if(t)return t({code:da.ExportResultCode.SUCCESS})}};pi.ConsoleSpanExporter=_a});var Rd=l(hi=>{\"use strict\";Object.defineProperty(hi,\"__esModule\",{value:!0});hi.InMemorySpanExporter=void 0;var Od=A(),pa=class{constructor(){this._finishedSpans=[],this._stopped=!1}export(e,t){if(this._stopped)return t({code:Od.ExportResultCode.FAILED,error:new Error(\"Exporter has been stopped\")});this._finishedSpans.push(...e),setTimeout(()=>t({code:Od.ExportResultCode.SUCCESS}),0)}shutdown(){return this._stopped=!0,this._finishedSpans=[],this.forceFlush()}forceFlush(){return Promise.resolve()}reset(){this._finishedSpans=[]}getFinishedSpans(){return this._finishedSpans}};hi.InMemorySpanExporter=pa});var Pd=l(bd=>{\"use strict\";Object.defineProperty(bd,\"__esModule\",{value:!0})});var yd=l(fi=>{\"use strict\";Object.defineProperty(fi,\"__esModule\",{value:!0});fi.SimpleSpanProcessor=void 0;var zg=(h(),m(d)),Lt=A(),ha=class{constructor(e){this._exporter=e,this._shutdownOnce=new Lt.BindOnceFuture(this._shutdown,this),this._unresolvedExports=new Set}async forceFlush(){await Promise.all(Array.from(this._unresolvedExports)),this._exporter.forceFlush&&await this._exporter.forceFlush()}onStart(e,t){}onEnd(e){var t,n;if(this._shutdownOnce.isCalled||!(e.spanContext().traceFlags&zg.TraceFlags.SAMPLED))return;let i=()=>Lt.internal._export(this._exporter,[e]).then(s=>{var o;s.code!==Lt.ExportResultCode.SUCCESS&&(0,Lt.globalErrorHandler)((o=s.error)!==null&&o!==void 0?o:new Error(`SimpleSpanProcessor: span export failed (status ${s})`))}).catch(s=>{(0,Lt.globalErrorHandler)(s)});if(e.resource.asyncAttributesPending){let s=(n=(t=e.resource).waitForAsyncAttributes)===null||n===void 0?void 0:n.call(t).then(()=>(s!=null&&this._unresolvedExports.delete(s),i()),o=>(0,Lt.globalErrorHandler)(o));s!=null&&this._unresolvedExports.add(s)}else i()}shutdown(){return this._shutdownOnce.call()}_shutdown(){return this._exporter.shutdown()}};fi.SimpleSpanProcessor=ha});var Id=l(vd=>{\"use strict\";Object.defineProperty(vd,\"__esModule\",{value:!0})});var Ld=l(Md=>{\"use strict\";Object.defineProperty(Md,\"__esModule\",{value:!0})});var Cd=l(Nd=>{\"use strict\";Object.defineProperty(Nd,\"__esModule\",{value:!0})});var xd=l(wd=>{\"use strict\";Object.defineProperty(wd,\"__esModule\",{value:!0})});var Ud=l(Dd=>{\"use strict\";Object.defineProperty(Dd,\"__esModule\",{value:!0})});var la=l(I=>{\"use strict\";var Yg=I&&I.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),B=I&&I.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&Yg(e,r,t)};Object.defineProperty(I,\"__esModule\",{value:!0});B(Hl(),I);B(Sd(),I);B(Gn(),I);B(Ad(),I);B(Rd(),I);B(Pd(),I);B(yd(),I);B(Id(),I);B(ca(),I);B(Mn(),I);B(Nn(),I);B(Lo(),I);B(Co(),I);B(gr(),I);B(Po(),I);B(Ld(),I);B(Cd(),I);B(xd(),I);B(Ud(),I)});var st={};var fa=_c(()=>{ht(st,_opentelemetry_api_logs__WEBPACK_IMPORTED_MODULE_4__)});var qd=l(Ne=>{\"use strict\";Object.defineProperty(Ne,\"__esModule\",{value:!0});Ne.disableInstrumentations=Ne.enableInstrumentations=Ne.parseInstrumentationOptions=void 0;function Bd(r=[]){let e=[];for(let t=0,n=r.length;te.disable())}Ne.disableInstrumentations=Zg});var Gd=l(Ei=>{\"use strict\";Object.defineProperty(Ei,\"__esModule\",{value:!0});Ei.registerInstrumentations=void 0;var Vd=(h(),m(d)),Ea=qd();function Jg(r){let{instrumentations:e}=(0,Ea.parseInstrumentationOptions)(r.instrumentations),t=r.tracerProvider||Vd.trace.getTracerProvider(),n=r.meterProvider||Vd.metrics.getMeterProvider();return(0,Ea.enableInstrumentations)(e,t,n),()=>{(0,Ea.disableInstrumentations)(e)}}Ei.registerInstrumentations=Jg});var ga=l(gi=>{\"use strict\";Object.defineProperty(gi,\"__esModule\",{value:!0});gi.LogRecord=void 0;var eT=(h(),m(d)),Or=(h(),m(d)),mi=A(),ma=class{constructor(e,t,n){this.attributes={},this.totalAttributesCount=0,this._isReadonly=!1;let{timestamp:i,observedTimestamp:s,severityNumber:o,severityText:a,body:u,attributes:c={},context:_}=n,p=Date.now();if(this.hrTime=(0,mi.timeInputToHrTime)(i??p),this.hrTimeObserved=(0,mi.timeInputToHrTime)(s??p),_){let f=Or.trace.getSpanContext(_);f&&Or.isSpanContextValid(f)&&(this.spanContext=f)}this.severityNumber=o,this.severityText=a,this.body=u,this.resource=e.resource,this.instrumentationScope=t,this._logRecordLimits=e.logRecordLimits,this.setAttributes(c)}set severityText(e){this._isLogRecordReadonly()||(this._severityText=e)}get severityText(){return this._severityText}set severityNumber(e){this._isLogRecordReadonly()||(this._severityNumber=e)}get severityNumber(){return this._severityNumber}set body(e){this._isLogRecordReadonly()||(this._body=e)}get body(){return this._body}get droppedAttributesCount(){return this.totalAttributesCount-Object.keys(this.attributes).length}setAttribute(e,t){return this._isLogRecordReadonly()?this:t===null?this:e.length===0?(Or.diag.warn(`Invalid attribute key: ${e}`),this):!(0,mi.isAttributeValue)(t)&&!(typeof t==\"object\"&&!Array.isArray(t)&&Object.keys(t).length>0)?(Or.diag.warn(`Invalid attribute value set for key: ${e}`),this):(this.totalAttributesCount+=1,Object.keys(this.attributes).length>=this._logRecordLimits.attributeCountLimit&&!Object.prototype.hasOwnProperty.call(this.attributes,e)?this:((0,mi.isAttributeValue)(t)?this.attributes[e]=this._truncateToSize(t):this.attributes[e]=t,this))}setAttributes(e){for(let[t,n]of Object.entries(e))this.setAttribute(t,n);return this}setBody(e){return this.body=e,this}setSeverityNumber(e){return this.severityNumber=e,this}setSeverityText(e){return this.severityText=e,this}_makeReadonly(){this._isReadonly=!0}_truncateToSize(e){let t=this._logRecordLimits.attributeValueLengthLimit;return t<=0?(Or.diag.warn(`Attribute value limit must be positive, got ${t}`),e):typeof e==\"string\"?this._truncateToLimitUtil(e,t):Array.isArray(e)?e.map(n=>typeof n==\"string\"?this._truncateToLimitUtil(n,t):n):e}_truncateToLimitUtil(e,t){return e.length<=t?e:e.substring(0,t)}_isLogRecordReadonly(){return this._isReadonly&&eT.diag.warn(\"Can not execute the operation on emitted log record\"),this._isReadonly}};gi.LogRecord=ma});var Hd=l(Ti=>{\"use strict\";Object.defineProperty(Ti,\"__esModule\",{value:!0});Ti.Logger=void 0;var tT=(h(),m(d)),rT=ga(),Ta=class{constructor(e,t){this.instrumentationScope=e,this._sharedState=t}emit(e){let t=e.context||tT.context.active(),n=new rT.LogRecord(this._sharedState,this.instrumentationScope,Object.assign({context:t},e));this._sharedState.activeProcessor.onEmit(n,t),n._makeReadonly()}};Ti.Logger=Ta});var jd=l(Nt=>{\"use strict\";Object.defineProperty(Nt,\"__esModule\",{value:!0});Nt.reconfigureLimits=Nt.loadDefaultConfig=void 0;var Rr=A();function nT(){return{forceFlushTimeoutMillis:3e4,logRecordLimits:{attributeValueLengthLimit:(0,Rr.getEnv)().OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT,attributeCountLimit:(0,Rr.getEnv)().OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT},includeTraceContext:!0}}Nt.loadDefaultConfig=nT;function iT(r){var e,t,n,i,s,o;let a=(0,Rr.getEnvWithoutDefaults)();return{attributeCountLimit:(n=(t=(e=r.attributeCountLimit)!==null&&e!==void 0?e:a.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT)!==null&&t!==void 0?t:a.OTEL_ATTRIBUTE_COUNT_LIMIT)!==null&&n!==void 0?n:Rr.DEFAULT_ATTRIBUTE_COUNT_LIMIT,attributeValueLengthLimit:(o=(s=(i=r.attributeValueLengthLimit)!==null&&i!==void 0?i:a.OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT)!==null&&s!==void 0?s:a.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT)!==null&&o!==void 0?o:Rr.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT}}Nt.reconfigureLimits=iT});var Fd=l(Si=>{\"use strict\";Object.defineProperty(Si,\"__esModule\",{value:!0});Si.MultiLogRecordProcessor=void 0;var sT=A(),Sa=class{constructor(e,t){this.processors=e,this.forceFlushTimeoutMillis=t}async forceFlush(){let e=this.forceFlushTimeoutMillis;await Promise.all(this.processors.map(t=>(0,sT.callWithTimeout)(t.forceFlush(),e)))}onEmit(e,t){this.processors.forEach(n=>n.onEmit(e,t))}async shutdown(){await Promise.all(this.processors.map(e=>e.shutdown()))}};Si.MultiLogRecordProcessor=Sa});var Oa=l(Ai=>{\"use strict\";Object.defineProperty(Ai,\"__esModule\",{value:!0});Ai.NoopLogRecordProcessor=void 0;var Aa=class{forceFlush(){return Promise.resolve()}onEmit(e,t){}shutdown(){return Promise.resolve()}};Ai.NoopLogRecordProcessor=Aa});var kd=l(Oi=>{\"use strict\";Object.defineProperty(Oi,\"__esModule\",{value:!0});Oi.LoggerProviderSharedState=void 0;var oT=Oa(),Ra=class{constructor(e,t,n){this.resource=e,this.forceFlushTimeoutMillis=t,this.logRecordLimits=n,this.loggers=new Map,this.registeredLogRecordProcessors=[],this.activeProcessor=new oT.NoopLogRecordProcessor}};Oi.LoggerProviderSharedState=Ra});var Wd=l(ot=>{\"use strict\";Object.defineProperty(ot,\"__esModule\",{value:!0});ot.LoggerProvider=ot.DEFAULT_LOGGER_NAME=void 0;var br=(h(),m(d)),aT=(fa(),m(st)),uT=rt(),$d=A(),cT=Hd(),Xd=jd(),lT=Fd(),dT=kd();ot.DEFAULT_LOGGER_NAME=\"unknown\";var ba=class{constructor(e={}){let{resource:t=uT.Resource.default(),logRecordLimits:n,forceFlushTimeoutMillis:i}=(0,$d.merge)({},(0,Xd.loadDefaultConfig)(),e);this._sharedState=new dT.LoggerProviderSharedState(t,i,(0,Xd.reconfigureLimits)(n)),this._shutdownOnce=new $d.BindOnceFuture(this._shutdown,this)}getLogger(e,t,n){if(this._shutdownOnce.isCalled)return br.diag.warn(\"A shutdown LoggerProvider cannot provide a Logger\"),aT.NOOP_LOGGER;e||br.diag.warn(\"Logger requested without instrumentation scope name.\");let i=e||ot.DEFAULT_LOGGER_NAME,s=`${i}@${t||\"\"}:${n?.schemaUrl||\"\"}`;return this._sharedState.loggers.has(s)||this._sharedState.loggers.set(s,new cT.Logger({name:i,version:t,schemaUrl:n?.schemaUrl},this._sharedState)),this._sharedState.loggers.get(s)}addLogRecordProcessor(e){this._sharedState.registeredLogRecordProcessors.length===0&&this._sharedState.activeProcessor.shutdown().catch(t=>br.diag.error(\"Error while trying to shutdown current log record processor\",t)),this._sharedState.registeredLogRecordProcessors.push(e),this._sharedState.activeProcessor=new lT.MultiLogRecordProcessor(this._sharedState.registeredLogRecordProcessors,this._sharedState.forceFlushTimeoutMillis)}forceFlush(){return this._shutdownOnce.isCalled?(br.diag.warn(\"invalid attempt to force flush after LoggerProvider shutdown\"),this._shutdownOnce.promise):this._sharedState.activeProcessor.forceFlush()}shutdown(){return this._shutdownOnce.isCalled?(br.diag.warn(\"shutdown may only be called once per LoggerProvider\"),this._shutdownOnce.promise):this._shutdownOnce.call()}_shutdown(){return this._sharedState.activeProcessor.shutdown()}};ot.LoggerProvider=ba});var Kd=l(Ri=>{\"use strict\";Object.defineProperty(Ri,\"__esModule\",{value:!0});Ri.ConsoleLogRecordExporter=void 0;var _T=A(),pT=A(),Pa=class{export(e,t){this._sendLogRecords(e,t)}shutdown(){return Promise.resolve()}_exportInfo(e){var t,n,i;return{timestamp:(0,_T.hrTimeToMicroseconds)(e.hrTime),traceId:(t=e.spanContext)===null||t===void 0?void 0:t.traceId,spanId:(n=e.spanContext)===null||n===void 0?void 0:n.spanId,traceFlags:(i=e.spanContext)===null||i===void 0?void 0:i.traceFlags,severityText:e.severityText,severityNumber:e.severityNumber,body:e.body,attributes:e.attributes}}_sendLogRecords(e,t){for(let n of e)console.dir(this._exportInfo(n),{depth:3});t?.({code:pT.ExportResultCode.SUCCESS})}};Ri.ConsoleLogRecordExporter=Pa});var zd=l(bi=>{\"use strict\";Object.defineProperty(bi,\"__esModule\",{value:!0});bi.SimpleLogRecordProcessor=void 0;var ya=A(),va=class{constructor(e){this._exporter=e,this._shutdownOnce=new ya.BindOnceFuture(this._shutdown,this)}onEmit(e){this._shutdownOnce.isCalled||this._exporter.export([e],t=>{var n;if(t.code!==ya.ExportResultCode.SUCCESS){(0,ya.globalErrorHandler)((n=t.error)!==null&&n!==void 0?n:new Error(`SimpleLogRecordProcessor: log record export failed (status ${t})`));return}})}forceFlush(){return Promise.resolve()}shutdown(){return this._shutdownOnce.call()}_shutdown(){return this._exporter.shutdown()}};bi.SimpleLogRecordProcessor=va});var Qd=l(Pi=>{\"use strict\";Object.defineProperty(Pi,\"__esModule\",{value:!0});Pi.InMemoryLogRecordExporter=void 0;var Yd=A(),Ia=class{constructor(){this._finishedLogRecords=[],this._stopped=!1}export(e,t){if(this._stopped)return t({code:Yd.ExportResultCode.FAILED,error:new Error(\"Exporter has been stopped\")});this._finishedLogRecords.push(...e),t({code:Yd.ExportResultCode.SUCCESS})}shutdown(){return this._stopped=!0,this.reset(),Promise.resolve()}getFinishedLogRecords(){return this._finishedLogRecords}reset(){this._finishedLogRecords=[]}};Pi.InMemoryLogRecordExporter=Ia});var Zd=l(yi=>{\"use strict\";Object.defineProperty(yi,\"__esModule\",{value:!0});yi.BatchLogRecordProcessorBase=void 0;var hT=(h(),m(d)),Ct=A(),Ma=class{constructor(e,t){var n,i,s,o;this._exporter=e,this._finishedLogRecords=[];let a=(0,Ct.getEnv)();this._maxExportBatchSize=(n=t?.maxExportBatchSize)!==null&&n!==void 0?n:a.OTEL_BLRP_MAX_EXPORT_BATCH_SIZE,this._maxQueueSize=(i=t?.maxQueueSize)!==null&&i!==void 0?i:a.OTEL_BLRP_MAX_QUEUE_SIZE,this._scheduledDelayMillis=(s=t?.scheduledDelayMillis)!==null&&s!==void 0?s:a.OTEL_BLRP_SCHEDULE_DELAY,this._exportTimeoutMillis=(o=t?.exportTimeoutMillis)!==null&&o!==void 0?o:a.OTEL_BLRP_EXPORT_TIMEOUT,this._shutdownOnce=new Ct.BindOnceFuture(this._shutdown,this),this._maxExportBatchSize>this._maxQueueSize&&(hT.diag.warn(\"BatchLogRecordProcessor: maxExportBatchSize must be smaller or equal to maxQueueSize, setting maxExportBatchSize to match maxQueueSize\"),this._maxExportBatchSize=this._maxQueueSize)}onEmit(e){this._shutdownOnce.isCalled||this._addToBuffer(e)}forceFlush(){return this._shutdownOnce.isCalled?this._shutdownOnce.promise:this._flushAll()}shutdown(){return this._shutdownOnce.call()}async _shutdown(){this.onShutdown(),await this._flushAll(),await this._exporter.shutdown()}_addToBuffer(e){this._finishedLogRecords.length>=this._maxQueueSize||(this._finishedLogRecords.push(e),this._maybeStartTimer())}_flushAll(){return new Promise((e,t)=>{let n=[],i=Math.ceil(this._finishedLogRecords.length/this._maxExportBatchSize);for(let s=0;s{e()}).catch(t)})}_flushOneBatch(){return this._clearTimer(),this._finishedLogRecords.length===0?Promise.resolve():new Promise((e,t)=>{(0,Ct.callWithTimeout)(this._export(this._finishedLogRecords.splice(0,this._maxExportBatchSize)),this._exportTimeoutMillis).then(()=>e()).catch(t)})}_maybeStartTimer(){this._timer===void 0&&(this._timer=setTimeout(()=>{this._flushOneBatch().then(()=>{this._finishedLogRecords.length>0&&(this._clearTimer(),this._maybeStartTimer())}).catch(e=>{(0,Ct.globalErrorHandler)(e)})},this._scheduledDelayMillis),(0,Ct.unrefTimer)(this._timer))}_clearTimer(){this._timer!==void 0&&(clearTimeout(this._timer),this._timer=void 0)}_export(e){return new Promise((t,n)=>{this._exporter.export(e,i=>{var s;if(i.code!==Ct.ExportResultCode.SUCCESS){n((s=i.error)!==null&&s!==void 0?s:new Error(`BatchLogRecordProcessorBase: log record export failed (status ${i})`));return}t(i)})})}};yi.BatchLogRecordProcessorBase=Ma});var Jd=l(vi=>{\"use strict\";Object.defineProperty(vi,\"__esModule\",{value:!0});vi.BatchLogRecordProcessor=void 0;var fT=Zd(),La=class extends fT.BatchLogRecordProcessorBase{onShutdown(){}};vi.BatchLogRecordProcessor=La});var e_=l(Ii=>{\"use strict\";Object.defineProperty(Ii,\"__esModule\",{value:!0});Ii.BatchLogRecordProcessor=void 0;var ET=Jd();Object.defineProperty(Ii,\"BatchLogRecordProcessor\",{enumerable:!0,get:function(){return ET.BatchLogRecordProcessor}})});var t_=l(Mi=>{\"use strict\";Object.defineProperty(Mi,\"__esModule\",{value:!0});Mi.BatchLogRecordProcessor=void 0;var mT=e_();Object.defineProperty(Mi,\"BatchLogRecordProcessor\",{enumerable:!0,get:function(){return mT.BatchLogRecordProcessor}})});var r_=l(W=>{\"use strict\";Object.defineProperty(W,\"__esModule\",{value:!0});W.BatchLogRecordProcessor=W.InMemoryLogRecordExporter=W.SimpleLogRecordProcessor=W.ConsoleLogRecordExporter=W.NoopLogRecordProcessor=W.LogRecord=W.LoggerProvider=void 0;var gT=Wd();Object.defineProperty(W,\"LoggerProvider\",{enumerable:!0,get:function(){return gT.LoggerProvider}});var TT=ga();Object.defineProperty(W,\"LogRecord\",{enumerable:!0,get:function(){return TT.LogRecord}});var ST=Oa();Object.defineProperty(W,\"NoopLogRecordProcessor\",{enumerable:!0,get:function(){return ST.NoopLogRecordProcessor}});var AT=Kd();Object.defineProperty(W,\"ConsoleLogRecordExporter\",{enumerable:!0,get:function(){return AT.ConsoleLogRecordExporter}});var OT=zd();Object.defineProperty(W,\"SimpleLogRecordProcessor\",{enumerable:!0,get:function(){return OT.SimpleLogRecordProcessor}});var RT=Qd();Object.defineProperty(W,\"InMemoryLogRecordExporter\",{enumerable:!0,get:function(){return RT.InMemoryLogRecordExporter}});var bT=t_();Object.defineProperty(W,\"BatchLogRecordProcessor\",{enumerable:!0,get:function(){return bT.BatchLogRecordProcessor}})});var Li=l(Pr=>{\"use strict\";Object.defineProperty(Pr,\"__esModule\",{value:!0});Pr.AggregationTemporality=void 0;var PT;(function(r){r[r.DELTA=0]=\"DELTA\",r[r.CUMULATIVE=1]=\"CUMULATIVE\"})(PT=Pr.AggregationTemporality||(Pr.AggregationTemporality={}))});var wt=l(yr=>{\"use strict\";Object.defineProperty(yr,\"__esModule\",{value:!0});yr.DataPointType=void 0;var yT;(function(r){r[r.HISTOGRAM=0]=\"HISTOGRAM\",r[r.EXPONENTIAL_HISTOGRAM=1]=\"EXPONENTIAL_HISTOGRAM\",r[r.GAUGE=2]=\"GAUGE\",r[r.SUM=3]=\"SUM\"})(yT=yr.DataPointType||(yr.DataPointType={}))});var Ee=l(L=>{\"use strict\";Object.defineProperty(L,\"__esModule\",{value:!0});L.equalsCaseInsensitive=L.binarySearchLB=L.setEquals=L.FlatMap=L.isPromiseAllSettledRejectionResult=L.PromiseAllSettled=L.callWithTimeout=L.TimeoutError=L.instrumentationScopeId=L.hashAttributes=L.isNotNullish=void 0;function vT(r){return r!=null}L.isNotNullish=vT;function IT(r){let e=Object.keys(r);return e.length===0?\"\":(e=e.sort(),JSON.stringify(e.map(t=>[t,r[t]])))}L.hashAttributes=IT;function MT(r){var e,t;return`${r.name}:${(e=r.version)!==null&&e!==void 0?e:\"\"}:${(t=r.schemaUrl)!==null&&t!==void 0?t:\"\"}`}L.instrumentationScopeId=MT;var Ni=class r extends Error{constructor(e){super(e),Object.setPrototypeOf(this,r.prototype)}};L.TimeoutError=Ni;function LT(r,e){let t,n=new Promise(function(s,o){t=setTimeout(function(){o(new Ni(\"Operation timed out.\"))},e)});return Promise.race([r,n]).then(i=>(clearTimeout(t),i),i=>{throw clearTimeout(t),i})}L.callWithTimeout=LT;async function NT(r){return Promise.all(r.map(async e=>{try{return{status:\"fulfilled\",value:await e}}catch(t){return{status:\"rejected\",reason:t}}}))}L.PromiseAllSettled=NT;function CT(r){return r.status===\"rejected\"}L.isPromiseAllSettledRejectionResult=CT;function wT(r,e){let t=[];return r.forEach(n=>{t.push(...e(n))}),t}L.FlatMap=wT;function xT(r,e){if(r.size!==e.size)return!1;for(let t of r)if(!e.has(t))return!1;return!0}L.setEquals=xT;function DT(r,e){let t=0,n=r.length-1;for(;n-t>1;){let i=Math.trunc((n+t)/2);r[i]<=e?t=i:n=i-1}return r[n]<=e?n:r[t]<=e?t:-1}L.binarySearchLB=DT;function UT(r,e){return r.toLowerCase()===e.toLowerCase()}L.equalsCaseInsensitive=UT});var xt=l(vr=>{\"use strict\";Object.defineProperty(vr,\"__esModule\",{value:!0});vr.AggregatorKind=void 0;var BT;(function(r){r[r.DROP=0]=\"DROP\",r[r.SUM=1]=\"SUM\",r[r.LAST_VALUE=2]=\"LAST_VALUE\",r[r.HISTOGRAM=3]=\"HISTOGRAM\",r[r.EXPONENTIAL_HISTOGRAM=4]=\"EXPONENTIAL_HISTOGRAM\"})(BT=vr.AggregatorKind||(vr.AggregatorKind={}))});var n_=l(Ci=>{\"use strict\";Object.defineProperty(Ci,\"__esModule\",{value:!0});Ci.DropAggregator=void 0;var qT=xt(),Na=class{constructor(){this.kind=qT.AggregatorKind.DROP}createAccumulation(){}merge(e,t){}diff(e,t){}toMetricData(e,t,n,i){}};Ci.DropAggregator=Na});var be=l(ne=>{\"use strict\";Object.defineProperty(ne,\"__esModule\",{value:!0});ne.isValidName=ne.isDescriptorCompatibleWith=ne.createInstrumentDescriptorWithView=ne.createInstrumentDescriptor=ne.InstrumentType=void 0;var i_=(h(),m(d)),VT=Ee(),GT;(function(r){r.COUNTER=\"COUNTER\",r.HISTOGRAM=\"HISTOGRAM\",r.UP_DOWN_COUNTER=\"UP_DOWN_COUNTER\",r.OBSERVABLE_COUNTER=\"OBSERVABLE_COUNTER\",r.OBSERVABLE_GAUGE=\"OBSERVABLE_GAUGE\",r.OBSERVABLE_UP_DOWN_COUNTER=\"OBSERVABLE_UP_DOWN_COUNTER\"})(GT=ne.InstrumentType||(ne.InstrumentType={}));function HT(r,e,t){var n,i,s,o;return s_(r)||i_.diag.warn(`Invalid metric name: \"${r}\". The metric name should be a ASCII string with a length no greater than 255 characters.`),{name:r,type:e,description:(n=t?.description)!==null&&n!==void 0?n:\"\",unit:(i=t?.unit)!==null&&i!==void 0?i:\"\",valueType:(s=t?.valueType)!==null&&s!==void 0?s:i_.ValueType.DOUBLE,advice:(o=t?.advice)!==null&&o!==void 0?o:{}}}ne.createInstrumentDescriptor=HT;function jT(r,e){var t,n;return{name:(t=r.name)!==null&&t!==void 0?t:e.name,description:(n=r.description)!==null&&n!==void 0?n:e.description,type:e.type,unit:e.unit,valueType:e.valueType,advice:e.advice}}ne.createInstrumentDescriptorWithView=jT;function FT(r,e){return(0,VT.equalsCaseInsensitive)(r.name,e.name)&&r.unit===e.unit&&r.type===e.type&&r.valueType===e.valueType}ne.isDescriptorCompatibleWith=FT;var kT=/^[a-z][a-z0-9_.\\-/]{0,254}$/i;function s_(r){return r.match(kT)!=null}ne.isValidName=s_});var o_=l(Ut=>{\"use strict\";Object.defineProperty(Ut,\"__esModule\",{value:!0});Ut.HistogramAggregator=Ut.HistogramAccumulation=void 0;var $T=xt(),XT=wt(),Ca=be(),WT=Ee();function KT(r){let e=r.map(()=>0);return e.push(0),{buckets:{boundaries:r,counts:e},sum:0,count:0,hasMinMax:!1,min:1/0,max:-1/0}}var Dt=class{constructor(e,t,n=!0,i=KT(t)){this.startTime=e,this._boundaries=t,this._recordMinMax=n,this._current=i}record(e){this._current.count+=1,this._current.sum+=e,this._recordMinMax&&(this._current.min=Math.min(e,this._current.min),this._current.max=Math.max(e,this._current.max),this._current.hasMinMax=!0);let t=(0,WT.binarySearchLB)(this._boundaries,e);this._current.buckets.counts[t+1]+=1}setStartTime(e){this.startTime=e}toPointValue(){return this._current}};Ut.HistogramAccumulation=Dt;var wa=class{constructor(e,t){this._boundaries=e,this._recordMinMax=t,this.kind=$T.AggregatorKind.HISTOGRAM}createAccumulation(e){return new Dt(e,this._boundaries,this._recordMinMax)}merge(e,t){let n=e.toPointValue(),i=t.toPointValue(),s=n.buckets.counts,o=i.buckets.counts,a=new Array(s.length);for(let _=0;_{let a=o.toPointValue(),u=e.type===Ca.InstrumentType.UP_DOWN_COUNTER||e.type===Ca.InstrumentType.OBSERVABLE_GAUGE||e.type===Ca.InstrumentType.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:o.startTime,endTime:i,value:{min:a.hasMinMax?a.min:void 0,max:a.hasMinMax?a.max:void 0,sum:u?void 0:a.sum,buckets:a.buckets,count:a.count}}})}}};Ut.HistogramAggregator=wa});var a_=l(wi=>{\"use strict\";Object.defineProperty(wi,\"__esModule\",{value:!0});wi.Buckets=void 0;var xa=class r{constructor(e=new Da,t=0,n=0,i=0){this.backing=e,this.indexBase=t,this.indexStart=n,this.indexEnd=i}get offset(){return this.indexStart}get length(){return this.backing.length===0||this.indexEnd===this.indexStart&&this.at(0)===0?0:this.indexEnd-this.indexStart+1}counts(){return Array.from({length:this.length},(e,t)=>this.at(t))}at(e){let t=this.indexBase-this.indexStart;return e=0;e--)if(this.at(e)!==0){this.indexEnd-=this.length-e-1;break}this._rotate()}downscale(e){this._rotate();let t=1+this.indexEnd-this.indexStart,n=1<>=e,this.indexEnd>>=e,this.indexBase=this.indexStart}clone(){return new r(this.backing.clone(),this.indexBase,this.indexStart,this.indexEnd)}_rotate(){let e=this.indexBase-this.indexStart;e!==0&&(e>0?(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,e),this.backing.reverse(e,this.backing.length)):(this.backing.reverse(0,this.backing.length),this.backing.reverse(0,this.backing.length+e)),this.indexBase=this.indexStart)}_relocateBucket(e,t){e!==t&&this.incrementBucket(e,this.backing.emptyBucket(t))}};wi.Buckets=xa;var Da=class r{constructor(e=[0]){this._counts=e}get length(){return this._counts.length}countAt(e){return this._counts[e]}growTo(e,t,n){let i=new Array(e).fill(0);i.splice(n,this._counts.length-t,...this._counts.slice(t)),i.splice(0,t,...this._counts.slice(0,t)),this._counts=i}reverse(e,t){let n=Math.floor((e+t)/2)-e;for(let i=0;i=t?this._counts[e]-=t:this._counts[e]=0}clone(){return new r([...this._counts])}}});var Ba=l(Q=>{\"use strict\";Object.defineProperty(Q,\"__esModule\",{value:!0});Q.getSignificand=Q.getNormalBase2=Q.MIN_VALUE=Q.MAX_NORMAL_EXPONENT=Q.MIN_NORMAL_EXPONENT=Q.SIGNIFICAND_WIDTH=void 0;Q.SIGNIFICAND_WIDTH=52;var zT=2146435072,YT=1048575,Ua=1023;Q.MIN_NORMAL_EXPONENT=-Ua+1;Q.MAX_NORMAL_EXPONENT=Ua;Q.MIN_VALUE=Math.pow(2,-1022);function QT(r){let e=new DataView(new ArrayBuffer(8));return e.setFloat64(0,r),((e.getUint32(0)&zT)>>20)-Ua}Q.getNormalBase2=QT;function ZT(r){let e=new DataView(new ArrayBuffer(8));e.setFloat64(0,r);let t=e.getUint32(0),n=e.getUint32(4);return(t&YT)*Math.pow(2,32)+n}Q.getSignificand=ZT});var xi=l(Bt=>{\"use strict\";Object.defineProperty(Bt,\"__esModule\",{value:!0});Bt.nextGreaterSquare=Bt.ldexp=void 0;function JT(r,e){return r===0||r===Number.POSITIVE_INFINITY||r===Number.NEGATIVE_INFINITY||Number.isNaN(r)?r:r*Math.pow(2,e)}Bt.ldexp=JT;function eS(r){return r--,r|=r>>1,r|=r>>2,r|=r>>4,r|=r>>8,r|=r>>16,r++,r}Bt.nextGreaterSquare=eS});var Ui=l(Di=>{\"use strict\";Object.defineProperty(Di,\"__esModule\",{value:!0});Di.MappingError=void 0;var qa=class extends Error{};Di.MappingError=qa});var c_=l(Bi=>{\"use strict\";Object.defineProperty(Bi,\"__esModule\",{value:!0});Bi.ExponentMapping=void 0;var qt=Ba(),tS=xi(),u_=Ui(),Va=class{constructor(e){this._shift=-e}mapToIndex(e){if(e>this._shift}lowerBoundary(e){let t=this._minNormalLowerBoundaryIndex();if(en)throw new u_.MappingError(`overflow: ${e} is > maximum lower boundary: ${n}`);return tS.ldexp(1,e<>this._shift;return this._shift<2&&e--,e}_maxNormalLowerBoundaryIndex(){return qt.MAX_NORMAL_EXPONENT>>this._shift}_rightShift(e,t){return Math.floor(e*Math.pow(2,-t))}};Bi.ExponentMapping=Va});var __=l(qi=>{\"use strict\";Object.defineProperty(qi,\"__esModule\",{value:!0});qi.LogarithmMapping=void 0;var Vt=Ba(),l_=xi(),d_=Ui(),Ga=class{constructor(e){this._scale=e,this._scaleFactor=l_.ldexp(Math.LOG2E,e),this._inverseFactor=l_.ldexp(Math.LN2,-e)}mapToIndex(e){if(e<=Vt.MIN_VALUE)return this._minNormalLowerBoundaryIndex()-1;if(Vt.getSignificand(e)===0)return(Vt.getNormalBase2(e)<=n?n:t}lowerBoundary(e){let t=this._maxNormalLowerBoundaryIndex();if(e>=t){if(e===t)return 2*Math.exp((e-(1< maximum lower boundary: ${t}`)}let n=this._minNormalLowerBoundaryIndex();if(e<=n){if(e===n)return Vt.MIN_VALUE;if(e===n-1)return Math.exp((e+(1<{\"use strict\";Object.defineProperty(Vi,\"__esModule\",{value:!0});Vi.getMapping=void 0;var rS=c_(),nS=__(),iS=Ui(),p_=-10,h_=20,sS=Array.from({length:31},(r,e)=>e>10?new nS.LogarithmMapping(e-10):new rS.ExponentMapping(e-10));function oS(r){if(r>h_||r= ${p_} && <= ${h_}, got: ${r}`);return sS[r+10]}Vi.getMapping=oS});var g_=l(Ht=>{\"use strict\";Object.defineProperty(Ht,\"__esModule\",{value:!0});Ht.ExponentialHistogramAggregator=Ht.ExponentialHistogramAccumulation=void 0;var aS=xt(),uS=wt(),cS=(h(),m(d)),Ha=be(),E_=a_(),m_=f_(),lS=xi(),Gt=class r{constructor(e,t){this.low=e,this.high=t}static combine(e,t){return new r(Math.min(e.low,t.low),Math.max(e.high,t.high))}},dS=20,_S=160,ja=2,Gi=class r{constructor(e=e,t=_S,n=!0,i=0,s=0,o=0,a=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY,c=new E_.Buckets,_=new E_.Buckets,p=(0,m_.getMapping)(dS)){this.startTime=e,this._maxSize=t,this._recordMinMax=n,this._sum=i,this._count=s,this._zeroCount=o,this._min=a,this._max=u,this._positive=c,this._negative=_,this._mapping=p,this._maxSizethis._max&&(this._max=e),e0?this._updateBuckets(this._positive,e,t):this._updateBuckets(this._negative,-e,t)}merge(e){this._count===0?(this._min=e.min,this._max=e.max):e.count!==0&&(e.minthis.max&&(this._max=e.max)),this.startTime=e.startTime,this._sum+=e.sum,this._count+=e.count,this._zeroCount+=e.zeroCount;let t=this._minScale(e);this._downscale(this.scale-t),this._mergeBuckets(this.positive,e,e.positive,t),this._mergeBuckets(this.negative,e,e.negative,t)}diff(e){this._min=1/0,this._max=-1/0,this._sum-=e.sum,this._count-=e.count,this._zeroCount-=e.zeroCount;let t=this._minScale(e);this._downscale(this.scale-t),this._diffBuckets(this.positive,e,e.positive,t),this._diffBuckets(this.negative,e,e.negative,t)}clone(){return new r(this.startTime,this._maxSize,this._recordMinMax,this._sum,this._count,this._zeroCount,this._min,this._max,this.positive.clone(),this.negative.clone(),this._mapping)}_updateBuckets(e,t,n){let i=this._mapping.mapToIndex(t),s=!1,o=0,a=0;if(e.length===0?(e.indexStart=i,e.indexEnd=e.indexStart,e.indexBase=e.indexStart):i=this._maxSize?(s=!0,a=i,o=e.indexEnd):i>e.indexEnd&&i-e.indexStart>=this._maxSize&&(s=!0,a=e.indexStart,o=i),s){let u=this._changeScale(o,a);this._downscale(u),i=this._mapping.mapToIndex(t)}this._incrementIndexBy(e,i,n)}_incrementIndexBy(e,t,n){if(n===0)return;if(t=e.backing.length&&this._grow(e,s+1),e.indexStart=t}else if(t>e.indexEnd){let s=t-e.indexStart;s>=e.backing.length&&this._grow(e,s+1),e.indexEnd=t}let i=t-e.indexBase;i<0&&(i+=e.backing.length),e.incrementBucket(i,n)}_grow(e,t){let n=e.backing.length,i=e.indexBase-e.indexStart,s=n-i,o=(0,lS.nextGreaterSquare)(t);o>this._maxSize&&(o=this._maxSize);let a=o-i;e.backing.growTo(o,s,a)}_changeScale(e,t){let n=0;for(;e-t>=this._maxSize;)e>>=1,t>>=1,n++;return n}_downscale(e){if(e===0)return;if(e<0)throw new Error(`impossible change of scale: ${this.scale}`);let t=this._mapping.scale-e;this._positive.downscale(e),this._negative.downscale(e),this._mapping=(0,m_.getMapping)(t)}_minScale(e){let t=Math.min(this.scale,e.scale),n=Gt.combine(this._highLowAtScale(this.positive,this.scale,t),this._highLowAtScale(e.positive,e.scale,t)),i=Gt.combine(this._highLowAtScale(this.negative,this.scale,t),this._highLowAtScale(e.negative,e.scale,t));return Math.min(t-this._changeScale(n.high,n.low),t-this._changeScale(i.high,i.low))}_highLowAtScale(e,t,n){if(e.length===0)return new Gt(0,-1);let i=t-n;return new Gt(e.indexStart>>i,e.indexEnd>>i)}_mergeBuckets(e,t,n,i){let s=n.offset,o=t.scale-i;for(let a=0;a>o,n.at(a))}_diffBuckets(e,t,n,i){let s=n.offset,o=t.scale-i;for(let a=0;a>o)-e.indexBase;c<0&&(c+=e.backing.length),e.decrementBucket(c,n.at(a))}e.trim()}};Ht.ExponentialHistogramAccumulation=Gi;var Fa=class{constructor(e,t){this._maxSize=e,this._recordMinMax=t,this.kind=aS.AggregatorKind.EXPONENTIAL_HISTOGRAM}createAccumulation(e){return new Gi(e,this._maxSize,this._recordMinMax)}merge(e,t){let n=t.clone();return n.merge(e),n}diff(e,t){let n=t.clone();return n.diff(e),n}toMetricData(e,t,n,i){return{descriptor:e,aggregationTemporality:t,dataPointType:uS.DataPointType.EXPONENTIAL_HISTOGRAM,dataPoints:n.map(([s,o])=>{let a=o.toPointValue(),u=e.type===Ha.InstrumentType.UP_DOWN_COUNTER||e.type===Ha.InstrumentType.OBSERVABLE_GAUGE||e.type===Ha.InstrumentType.OBSERVABLE_UP_DOWN_COUNTER;return{attributes:s,startTime:o.startTime,endTime:i,value:{min:a.hasMinMax?a.min:void 0,max:a.hasMinMax?a.max:void 0,sum:u?void 0:a.sum,positive:{offset:a.positive.offset,bucketCounts:a.positive.bucketCounts},negative:{offset:a.negative.offset,bucketCounts:a.negative.bucketCounts},count:a.count,scale:a.scale,zeroCount:a.zeroCount}}})}}};Ht.ExponentialHistogramAggregator=Fa});var T_=l(Ft=>{\"use strict\";Object.defineProperty(Ft,\"__esModule\",{value:!0});Ft.LastValueAggregator=Ft.LastValueAccumulation=void 0;var pS=xt(),Ir=A(),hS=wt(),jt=class{constructor(e,t=0,n=[0,0]){this.startTime=e,this._current=t,this.sampleTime=n}record(e){this._current=e,this.sampleTime=(0,Ir.millisToHrTime)(Date.now())}setStartTime(e){this.startTime=e}toPointValue(){return this._current}};Ft.LastValueAccumulation=jt;var ka=class{constructor(){this.kind=pS.AggregatorKind.LAST_VALUE}createAccumulation(e){return new jt(e)}merge(e,t){let n=(0,Ir.hrTimeToMicroseconds)(t.sampleTime)>=(0,Ir.hrTimeToMicroseconds)(e.sampleTime)?t:e;return new jt(e.startTime,n.toPointValue(),n.sampleTime)}diff(e,t){let n=(0,Ir.hrTimeToMicroseconds)(t.sampleTime)>=(0,Ir.hrTimeToMicroseconds)(e.sampleTime)?t:e;return new jt(t.startTime,n.toPointValue(),n.sampleTime)}toMetricData(e,t,n,i){return{descriptor:e,aggregationTemporality:t,dataPointType:hS.DataPointType.GAUGE,dataPoints:n.map(([s,o])=>({attributes:s,startTime:o.startTime,endTime:i,value:o.toPointValue()}))}}};Ft.LastValueAggregator=ka});var S_=l(kt=>{\"use strict\";Object.defineProperty(kt,\"__esModule\",{value:!0});kt.SumAggregator=kt.SumAccumulation=void 0;var fS=xt(),ES=wt(),Ce=class{constructor(e,t,n=0,i=!1){this.startTime=e,this.monotonic=t,this._current=n,this.reset=i}record(e){this.monotonic&&e<0||(this._current+=e)}setStartTime(e){this.startTime=e}toPointValue(){return this._current}};kt.SumAccumulation=Ce;var $a=class{constructor(e){this.monotonic=e,this.kind=fS.AggregatorKind.SUM}createAccumulation(e){return new Ce(e,this.monotonic)}merge(e,t){let n=e.toPointValue(),i=t.toPointValue();return t.reset?new Ce(t.startTime,this.monotonic,i,t.reset):new Ce(e.startTime,this.monotonic,n+i)}diff(e,t){let n=e.toPointValue(),i=t.toPointValue();return this.monotonic&&n>i?new Ce(t.startTime,this.monotonic,i,!0):new Ce(t.startTime,this.monotonic,i-n)}toMetricData(e,t,n,i){return{descriptor:e,aggregationTemporality:t,dataPointType:ES.DataPointType.SUM,dataPoints:n.map(([s,o])=>({attributes:s,startTime:o.startTime,endTime:i,value:o.toPointValue()})),isMonotonic:this.monotonic}}};kt.SumAggregator=$a});var A_=l(ce=>{\"use strict\";var mS=ce&&ce.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),Mr=ce&&ce.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&mS(e,r,t)};Object.defineProperty(ce,\"__esModule\",{value:!0});Mr(n_(),ce);Mr(o_(),ce);Mr(g_(),ce);Mr(T_(),ce);Mr(S_(),ce)});var ki=l(q=>{\"use strict\";Object.defineProperty(q,\"__esModule\",{value:!0});q.DefaultAggregation=q.ExponentialHistogramAggregation=q.ExplicitBucketHistogramAggregation=q.HistogramAggregation=q.LastValueAggregation=q.SumAggregation=q.DropAggregation=q.Aggregation=void 0;var gS=(h(),m(d)),at=A_(),Pe=be(),me=class{static Drop(){return O_}static Sum(){return R_}static LastValue(){return b_}static Histogram(){return P_}static ExponentialHistogram(){return TS}static Default(){return SS}};q.Aggregation=me;var Lr=class r extends me{createAggregator(e){return r.DEFAULT_INSTANCE}};q.DropAggregation=Lr;Lr.DEFAULT_INSTANCE=new at.DropAggregator;var $t=class r extends me{createAggregator(e){switch(e.type){case Pe.InstrumentType.COUNTER:case Pe.InstrumentType.OBSERVABLE_COUNTER:case Pe.InstrumentType.HISTOGRAM:return r.MONOTONIC_INSTANCE;default:return r.NON_MONOTONIC_INSTANCE}}};q.SumAggregation=$t;$t.MONOTONIC_INSTANCE=new at.SumAggregator(!0);$t.NON_MONOTONIC_INSTANCE=new at.SumAggregator(!1);var Nr=class r extends me{createAggregator(e){return r.DEFAULT_INSTANCE}};q.LastValueAggregation=Nr;Nr.DEFAULT_INSTANCE=new at.LastValueAggregator;var Cr=class r extends me{createAggregator(e){return r.DEFAULT_INSTANCE}};q.HistogramAggregation=Cr;Cr.DEFAULT_INSTANCE=new at.HistogramAggregator([0,5,10,25,50,75,100,250,500,750,1e3,2500,5e3,7500,1e4],!0);var Hi=class extends me{constructor(e,t=!0){if(super(),this._recordMinMax=t,e===void 0||e.length===0)throw new Error(\"HistogramAggregator should be created with boundaries.\");e=e.concat(),e=e.sort((s,o)=>s-o);let n=e.lastIndexOf(-1/0),i=e.indexOf(1/0);i===-1&&(i=void 0),this._boundaries=e.slice(n+1,i)}createAggregator(e){return new at.HistogramAggregator(this._boundaries,this._recordMinMax)}};q.ExplicitBucketHistogramAggregation=Hi;var ji=class extends me{constructor(e=160,t=!0){super(),this._maxSize=e,this._recordMinMax=t}createAggregator(e){return new at.ExponentialHistogramAggregator(this._maxSize,this._recordMinMax)}};q.ExponentialHistogramAggregation=ji;var Fi=class extends me{_resolve(e){switch(e.type){case Pe.InstrumentType.COUNTER:case Pe.InstrumentType.UP_DOWN_COUNTER:case Pe.InstrumentType.OBSERVABLE_COUNTER:case Pe.InstrumentType.OBSERVABLE_UP_DOWN_COUNTER:return R_;case Pe.InstrumentType.OBSERVABLE_GAUGE:return b_;case Pe.InstrumentType.HISTOGRAM:return e.advice.explicitBucketBoundaries?new Hi(e.advice.explicitBucketBoundaries):P_}return gS.diag.warn(`Unable to recognize instrument type: ${e.type}`),O_}createAggregator(e){return this._resolve(e).createAggregator(e)}};q.DefaultAggregation=Fi;var O_=new Lr,R_=new $t,b_=new Nr,P_=new Cr,TS=new ji,SS=new Fi});var Xa=l(Xt=>{\"use strict\";Object.defineProperty(Xt,\"__esModule\",{value:!0});Xt.DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR=Xt.DEFAULT_AGGREGATION_SELECTOR=void 0;var AS=ki(),OS=Li(),RS=r=>AS.Aggregation.Default();Xt.DEFAULT_AGGREGATION_SELECTOR=RS;var bS=r=>OS.AggregationTemporality.CUMULATIVE;Xt.DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR=bS});var Ka=l(Xi=>{\"use strict\";Object.defineProperty(Xi,\"__esModule\",{value:!0});Xi.MetricReader=void 0;var y_=(h(),m(d)),$i=Ee(),v_=Xa(),Wa=class{constructor(e){var t,n,i;this._shutdown=!1,this._aggregationSelector=(t=e?.aggregationSelector)!==null&&t!==void 0?t:v_.DEFAULT_AGGREGATION_SELECTOR,this._aggregationTemporalitySelector=(n=e?.aggregationTemporalitySelector)!==null&&n!==void 0?n:v_.DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR,this._metricProducers=(i=e?.metricProducers)!==null&&i!==void 0?i:[]}setMetricProducer(e){if(this._sdkMetricProducer)throw new Error(\"MetricReader can not be bound to a MeterProvider again.\");this._sdkMetricProducer=e,this.onInitialized()}selectAggregation(e){return this._aggregationSelector(e)}selectAggregationTemporality(e){return this._aggregationTemporalitySelector(e)}onInitialized(){}async collect(e){if(this._sdkMetricProducer===void 0)throw new Error(\"MetricReader is not bound to a MetricProducer\");if(this._shutdown)throw new Error(\"MetricReader is shutdown\");let[t,...n]=await Promise.all([this._sdkMetricProducer.collect({timeoutMillis:e?.timeoutMillis}),...this._metricProducers.map(a=>a.collect({timeoutMillis:e?.timeoutMillis}))]),i=t.errors.concat((0,$i.FlatMap)(n,a=>a.errors)),s=t.resourceMetrics.resource,o=t.resourceMetrics.scopeMetrics.concat((0,$i.FlatMap)(n,a=>a.resourceMetrics.scopeMetrics));return{resourceMetrics:{resource:s,scopeMetrics:o},errors:i}}async shutdown(e){if(this._shutdown){y_.diag.error(\"Cannot call shutdown twice.\");return}e?.timeoutMillis==null?await this.onShutdown():await(0,$i.callWithTimeout)(this.onShutdown(),e.timeoutMillis),this._shutdown=!0}async forceFlush(e){if(this._shutdown){y_.diag.warn(\"Cannot forceFlush on already shutdown MetricReader.\");return}if(e?.timeoutMillis==null){await this.onForceFlush();return}await(0,$i.callWithTimeout)(this.onForceFlush(),e.timeoutMillis)}};Xi.MetricReader=Wa});var L_=l(Ki=>{\"use strict\";Object.defineProperty(Ki,\"__esModule\",{value:!0});Ki.PeriodicExportingMetricReader=void 0;var I_=(h(),m(d)),Wi=A(),PS=Ka(),M_=Ee(),yS=(h(),m(d)),za=class extends PS.MetricReader{constructor(e){var t,n,i,s;if(super({aggregationSelector:(t=e.exporter.selectAggregation)===null||t===void 0?void 0:t.bind(e.exporter),aggregationTemporalitySelector:(n=e.exporter.selectAggregationTemporality)===null||n===void 0?void 0:n.bind(e.exporter),metricProducers:e.metricProducers}),e.exportIntervalMillis!==void 0&&e.exportIntervalMillis<=0)throw Error(\"exportIntervalMillis must be greater than 0\");if(e.exportTimeoutMillis!==void 0&&e.exportTimeoutMillis<=0)throw Error(\"exportTimeoutMillis must be greater than 0\");if(e.exportTimeoutMillis!==void 0&&e.exportIntervalMillis!==void 0&&e.exportIntervalMillis0&&I_.diag.error(\"PeriodicExportingMetricReader: metrics collection errors\",...i);let s=async()=>{let o=await Wi.internal._export(this._exporter,n);if(o.code!==Wi.ExportResultCode.SUCCESS)throw new Error(`PeriodicExportingMetricReader: metrics export failed (error ${o.error})`)};n.resource.asyncAttributesPending?(t=(e=n.resource).waitForAsyncAttributes)===null||t===void 0||t.call(e).then(s,o=>yS.diag.debug(\"Error while resolving async portion of resource: \",o)):await s()}onInitialized(){this._interval=setInterval(()=>{this._runOnce()},this._exportInterval),(0,Wi.unrefTimer)(this._interval)}async onForceFlush(){await this._runOnce(),await this._exporter.forceFlush()}async onShutdown(){this._interval&&clearInterval(this._interval),await this._exporter.shutdown()}};Ki.PeriodicExportingMetricReader=za});var C_=l(zi=>{\"use strict\";Object.defineProperty(zi,\"__esModule\",{value:!0});zi.InMemoryMetricExporter=void 0;var N_=A(),Ya=class{constructor(e){this._shutdown=!1,this._metrics=[],this._aggregationTemporality=e}export(e,t){if(this._shutdown){setTimeout(()=>t({code:N_.ExportResultCode.FAILED}),0);return}this._metrics.push(e),setTimeout(()=>t({code:N_.ExportResultCode.SUCCESS}),0)}getMetrics(){return this._metrics}forceFlush(){return Promise.resolve()}reset(){this._metrics=[]}selectAggregationTemporality(e){return this._aggregationTemporality}shutdown(){return this._shutdown=!0,Promise.resolve()}};zi.InMemoryMetricExporter=Ya});var x_=l(Yi=>{\"use strict\";Object.defineProperty(Yi,\"__esModule\",{value:!0});Yi.ConsoleMetricExporter=void 0;var w_=A(),vS=Xa(),Qa=class r{constructor(e){var t;this._shutdown=!1,this._temporalitySelector=(t=e?.temporalitySelector)!==null&&t!==void 0?t:vS.DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR}export(e,t){if(this._shutdown){setImmediate(t,{code:w_.ExportResultCode.FAILED});return}return r._sendMetrics(e,t)}forceFlush(){return Promise.resolve()}selectAggregationTemporality(e){return this._temporalitySelector(e)}shutdown(){return this._shutdown=!0,Promise.resolve()}static _sendMetrics(e,t){for(let n of e.scopeMetrics)for(let i of n.metrics)console.dir({descriptor:i.descriptor,dataPointType:i.dataPointType,dataPoints:i.dataPoints});t({code:w_.ExportResultCode.SUCCESS})}};Yi.ConsoleMetricExporter=Qa});var D_=l(Qi=>{\"use strict\";Object.defineProperty(Qi,\"__esModule\",{value:!0});Qi.ViewRegistry=void 0;var Za=class{constructor(){this._registeredViews=[]}addView(e){this._registeredViews.push(e)}findViews(e,t){return this._registeredViews.filter(i=>this._matchInstrument(i.instrumentSelector,e)&&this._matchMeter(i.meterSelector,t))}_matchInstrument(e,t){return(e.getType()===void 0||t.type===e.getType())&&e.getNameFilter().match(t.name)&&e.getUnitFilter().match(t.unit)}_matchMeter(e,t){return e.getNameFilter().match(t.name)&&(t.version===void 0||e.getVersionFilter().match(t.version))&&(t.schemaUrl===void 0||e.getSchemaUrlFilter().match(t.schemaUrl))}};Qi.ViewRegistry=Za});var Zi=l(D=>{\"use strict\";Object.defineProperty(D,\"__esModule\",{value:!0});D.isObservableInstrument=D.ObservableUpDownCounterInstrument=D.ObservableGaugeInstrument=D.ObservableCounterInstrument=D.ObservableInstrument=D.HistogramInstrument=D.CounterInstrument=D.UpDownCounterInstrument=D.SyncInstrument=void 0;var Wt=(h(),m(d)),IS=A(),Kt=class{constructor(e,t){this._writableMetricStorage=e,this._descriptor=t}_record(e,t={},n=Wt.context.active()){if(typeof e!=\"number\"){Wt.diag.warn(`non-number value provided to metric ${this._descriptor.name}: ${e}`);return}this._descriptor.valueType===Wt.ValueType.INT&&!Number.isInteger(e)&&(Wt.diag.warn(`INT value type cannot accept a floating-point value for ${this._descriptor.name}, ignoring the fractional digits.`),e=Math.trunc(e),!Number.isInteger(e))||this._writableMetricStorage.record(e,t,n,(0,IS.millisToHrTime)(Date.now()))}};D.SyncInstrument=Kt;var Ja=class extends Kt{add(e,t,n){this._record(e,t,n)}};D.UpDownCounterInstrument=Ja;var eu=class extends Kt{add(e,t,n){if(e<0){Wt.diag.warn(`negative value provided to counter ${this._descriptor.name}: ${e}`);return}this._record(e,t,n)}};D.CounterInstrument=eu;var tu=class extends Kt{record(e,t,n){if(e<0){Wt.diag.warn(`negative value provided to histogram ${this._descriptor.name}: ${e}`);return}this._record(e,t,n)}};D.HistogramInstrument=tu;var ut=class{constructor(e,t,n){this._observableRegistry=n,this._descriptor=e,this._metricStorages=t}addCallback(e){this._observableRegistry.addCallback(e,this)}removeCallback(e){this._observableRegistry.removeCallback(e,this)}};D.ObservableInstrument=ut;var ru=class extends ut{};D.ObservableCounterInstrument=ru;var nu=class extends ut{};D.ObservableGaugeInstrument=nu;var iu=class extends ut{};D.ObservableUpDownCounterInstrument=iu;function MS(r){return r instanceof ut}D.isObservableInstrument=MS});var U_=l(Ji=>{\"use strict\";Object.defineProperty(Ji,\"__esModule\",{value:!0});Ji.Meter=void 0;var ie=be(),zt=Zi(),su=class{constructor(e){this._meterSharedState=e}createHistogram(e,t){let n=(0,ie.createInstrumentDescriptor)(e,ie.InstrumentType.HISTOGRAM,t),i=this._meterSharedState.registerMetricStorage(n);return new zt.HistogramInstrument(i,n)}createCounter(e,t){let n=(0,ie.createInstrumentDescriptor)(e,ie.InstrumentType.COUNTER,t),i=this._meterSharedState.registerMetricStorage(n);return new zt.CounterInstrument(i,n)}createUpDownCounter(e,t){let n=(0,ie.createInstrumentDescriptor)(e,ie.InstrumentType.UP_DOWN_COUNTER,t),i=this._meterSharedState.registerMetricStorage(n);return new zt.UpDownCounterInstrument(i,n)}createObservableGauge(e,t){let n=(0,ie.createInstrumentDescriptor)(e,ie.InstrumentType.OBSERVABLE_GAUGE,t),i=this._meterSharedState.registerAsyncMetricStorage(n);return new zt.ObservableGaugeInstrument(n,i,this._meterSharedState.observableRegistry)}createObservableCounter(e,t){let n=(0,ie.createInstrumentDescriptor)(e,ie.InstrumentType.OBSERVABLE_COUNTER,t),i=this._meterSharedState.registerAsyncMetricStorage(n);return new zt.ObservableCounterInstrument(n,i,this._meterSharedState.observableRegistry)}createObservableUpDownCounter(e,t){let n=(0,ie.createInstrumentDescriptor)(e,ie.InstrumentType.OBSERVABLE_UP_DOWN_COUNTER,t),i=this._meterSharedState.registerAsyncMetricStorage(n);return new zt.ObservableUpDownCounterInstrument(n,i,this._meterSharedState.observableRegistry)}addBatchObservableCallback(e,t){this._meterSharedState.observableRegistry.addBatchCallback(e,t)}removeBatchObservableCallback(e,t){this._meterSharedState.observableRegistry.removeBatchCallback(e,t)}};Ji.Meter=su});var au=l(es=>{\"use strict\";Object.defineProperty(es,\"__esModule\",{value:!0});es.MetricStorage=void 0;var LS=be(),ou=class{constructor(e){this._instrumentDescriptor=e}getInstrumentDescriptor(){return this._instrumentDescriptor}updateDescription(e){this._instrumentDescriptor=(0,LS.createInstrumentDescriptor)(this._instrumentDescriptor.name,this._instrumentDescriptor.type,{description:e,valueType:this._instrumentDescriptor.valueType,unit:this._instrumentDescriptor.unit,advice:this._instrumentDescriptor.advice})}};es.MetricStorage=ou});var wr=l(Yt=>{\"use strict\";Object.defineProperty(Yt,\"__esModule\",{value:!0});Yt.AttributeHashMap=Yt.HashMap=void 0;var NS=Ee(),ts=class{constructor(e){this._hash=e,this._valueMap=new Map,this._keyMap=new Map}get(e,t){return t??(t=this._hash(e)),this._valueMap.get(t)}getOrDefault(e,t){let n=this._hash(e);if(this._valueMap.has(n))return this._valueMap.get(n);let i=t();return this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,i),i}set(e,t,n){n??(n=this._hash(e)),this._keyMap.has(n)||this._keyMap.set(n,e),this._valueMap.set(n,t)}has(e,t){return t??(t=this._hash(e)),this._valueMap.has(t)}*keys(){let e=this._keyMap.entries(),t=e.next();for(;t.done!==!0;)yield[t.value[1],t.value[0]],t=e.next()}*entries(){let e=this._valueMap.entries(),t=e.next();for(;t.done!==!0;)yield[this._keyMap.get(t.value[0]),t.value[1],t.value[0]],t=e.next()}get size(){return this._valueMap.size}};Yt.HashMap=ts;var uu=class extends ts{constructor(){super(NS.hashAttributes)}};Yt.AttributeHashMap=uu});var du=l(rs=>{\"use strict\";Object.defineProperty(rs,\"__esModule\",{value:!0});rs.DeltaMetricProcessor=void 0;var cu=wr(),lu=class{constructor(e){this._aggregator=e,this._activeCollectionStorage=new cu.AttributeHashMap,this._cumulativeMemoStorage=new cu.AttributeHashMap}record(e,t,n,i){let s=this._activeCollectionStorage.getOrDefault(t,()=>this._aggregator.createAccumulation(i));s?.record(e)}batchCumulate(e,t){Array.from(e.entries()).forEach(([n,i,s])=>{let o=this._aggregator.createAccumulation(t);o?.record(i);let a=o;if(this._cumulativeMemoStorage.has(n,s)){let u=this._cumulativeMemoStorage.get(n,s);a=this._aggregator.diff(u,o)}if(this._activeCollectionStorage.has(n,s)){let u=this._activeCollectionStorage.get(n,s);a=this._aggregator.merge(u,a)}this._cumulativeMemoStorage.set(n,o,s),this._activeCollectionStorage.set(n,a,s)})}collect(){let e=this._activeCollectionStorage;return this._activeCollectionStorage=new cu.AttributeHashMap,e}};rs.DeltaMetricProcessor=lu});var pu=l(ns=>{\"use strict\";Object.defineProperty(ns,\"__esModule\",{value:!0});ns.TemporalMetricProcessor=void 0;var CS=Li(),wS=wr(),_u=class r{constructor(e,t){this._aggregator=e,this._unreportedAccumulations=new Map,this._reportHistory=new Map,t.forEach(n=>{this._unreportedAccumulations.set(n,[])})}buildMetrics(e,t,n,i){this._stashAccumulations(n);let s=this._getMergedUnreportedAccumulations(e),o=s,a;if(this._reportHistory.has(e)){let c=this._reportHistory.get(e),_=c.collectionTime;a=c.aggregationTemporality,a===CS.AggregationTemporality.CUMULATIVE?o=r.merge(c.accumulations,s,this._aggregator):o=r.calibrateStartTime(c.accumulations,s,_)}else a=e.selectAggregationTemporality(t.type);this._reportHistory.set(e,{accumulations:o,collectionTime:i,aggregationTemporality:a});let u=xS(o);if(u.length!==0)return this._aggregator.toMetricData(t,a,u,i)}_stashAccumulations(e){let t=this._unreportedAccumulations.keys();for(let n of t){let i=this._unreportedAccumulations.get(n);i===void 0&&(i=[],this._unreportedAccumulations.set(n,i)),i.push(e)}}_getMergedUnreportedAccumulations(e){let t=new wS.AttributeHashMap,n=this._unreportedAccumulations.get(e);if(this._unreportedAccumulations.set(e,[]),n===void 0)return t;for(let i of n)t=r.merge(t,i,this._aggregator);return t}static merge(e,t,n){let i=e,s=t.entries(),o=s.next();for(;o.done!==!0;){let[a,u,c]=o.value;if(e.has(a,c)){let _=e.get(a,c),p=n.merge(_,u);i.set(a,p,c)}else i.set(a,u,c);o=s.next()}return i}static calibrateStartTime(e,t,n){for(let[i,s]of e.keys()){let o=t.get(i,s);o?.setStartTime(n)}return t}};ns.TemporalMetricProcessor=_u;function xS(r){return Array.from(r.entries())}});var B_=l(is=>{\"use strict\";Object.defineProperty(is,\"__esModule\",{value:!0});is.AsyncMetricStorage=void 0;var DS=au(),US=du(),BS=pu(),qS=wr(),hu=class extends DS.MetricStorage{constructor(e,t,n,i){super(e),this._attributesProcessor=n,this._deltaMetricStorage=new US.DeltaMetricProcessor(t),this._temporalMetricStorage=new BS.TemporalMetricProcessor(t,i)}record(e,t){let n=new qS.AttributeHashMap;Array.from(e.entries()).forEach(([i,s])=>{n.set(this._attributesProcessor.process(i),s)}),this._deltaMetricStorage.batchCumulate(n,t)}collect(e,t){let n=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(e,this._instrumentDescriptor,n,t)}};is.AsyncMetricStorage=hu});var j_=l(Z=>{\"use strict\";Object.defineProperty(Z,\"__esModule\",{value:!0});Z.getConflictResolutionRecipe=Z.getDescriptionResolutionRecipe=Z.getTypeConflictResolutionRecipe=Z.getUnitConflictResolutionRecipe=Z.getValueTypeConflictResolutionRecipe=Z.getIncompatibilityDetails=void 0;function VS(r,e){let t=\"\";return r.unit!==e.unit&&(t+=`\t- Unit '${r.unit}' does not match '${e.unit}'\n`),r.type!==e.type&&(t+=`\t- Type '${r.type}' does not match '${e.type}'\n`),r.valueType!==e.valueType&&(t+=`\t- Value Type '${r.valueType}' does not match '${e.valueType}'\n`),r.description!==e.description&&(t+=`\t- Description '${r.description}' does not match '${e.description}'\n`),t}Z.getIncompatibilityDetails=VS;function q_(r,e){return`\t- use valueType '${r.valueType}' on instrument creation or use an instrument name other than '${e.name}'`}Z.getValueTypeConflictResolutionRecipe=q_;function V_(r,e){return`\t- use unit '${r.unit}' on instrument creation or use an instrument name other than '${e.name}'`}Z.getUnitConflictResolutionRecipe=V_;function G_(r,e){let t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return`\t- create a new view with a name other than '${r.name}' and InstrumentSelector '${n}'`}Z.getTypeConflictResolutionRecipe=G_;function H_(r,e){let t={name:e.name,type:e.type,unit:e.unit},n=JSON.stringify(t);return`\t- create a new view with a name other than '${r.name}' and InstrumentSelector '${n}'\n \t- OR - create a new view with the name ${r.name} and description '${r.description}' and InstrumentSelector ${n}\n \t- OR - create a new view with the name ${e.name} and description '${r.description}' and InstrumentSelector ${n}`}Z.getDescriptionResolutionRecipe=H_;function GS(r,e){return r.valueType!==e.valueType?q_(r,e):r.unit!==e.unit?V_(r,e):r.type!==e.type?G_(r,e):r.description!==e.description?H_(r,e):\"\"}Z.getConflictResolutionRecipe=GS});var k_=l(os=>{\"use strict\";Object.defineProperty(os,\"__esModule\",{value:!0});os.MetricStorageRegistry=void 0;var HS=be(),F_=(h(),m(d)),ss=j_(),fu=class r{constructor(){this._sharedRegistry=new Map,this._perCollectorRegistry=new Map}static create(){return new r}getStorages(e){let t=[];for(let i of this._sharedRegistry.values())t=t.concat(i);let n=this._perCollectorRegistry.get(e);if(n!=null)for(let i of n.values())t=t.concat(i);return t}register(e){this._registerStorage(e,this._sharedRegistry)}registerForCollector(e,t){let n=this._perCollectorRegistry.get(e);n==null&&(n=new Map,this._perCollectorRegistry.set(e,n)),this._registerStorage(t,n)}findOrUpdateCompatibleStorage(e){let t=this._sharedRegistry.get(e.name);return t===void 0?null:this._findOrUpdateCompatibleStorage(e,t)}findOrUpdateCompatibleCollectorStorage(e,t){let n=this._perCollectorRegistry.get(e);if(n===void 0)return null;let i=n.get(t.name);return i===void 0?null:this._findOrUpdateCompatibleStorage(t,i)}_registerStorage(e,t){let n=e.getInstrumentDescriptor(),i=t.get(n.name);if(i===void 0){t.set(n.name,[e]);return}i.push(e)}_findOrUpdateCompatibleStorage(e,t){let n=null;for(let i of t){let s=i.getInstrumentDescriptor();(0,HS.isDescriptorCompatibleWith)(s,e)?(s.description!==e.description&&(e.description.length>s.description.length&&i.updateDescription(e.description),F_.diag.warn(\"A view or instrument with the name \",e.name,` has already been registered, but has a different description and is incompatible with another registered view.\n`,`Details:\n`,(0,ss.getIncompatibilityDetails)(s,e),`The longer description will be used.\nTo resolve the conflict:`,(0,ss.getConflictResolutionRecipe)(s,e))),n=i):F_.diag.warn(\"A view or instrument with the name \",e.name,` has already been registered and is incompatible with another registered view.\n`,`Details:\n`,(0,ss.getIncompatibilityDetails)(s,e),`To resolve the conflict:\n`,(0,ss.getConflictResolutionRecipe)(s,e))}return n}};os.MetricStorageRegistry=fu});var $_=l(as=>{\"use strict\";Object.defineProperty(as,\"__esModule\",{value:!0});as.MultiMetricStorage=void 0;var Eu=class{constructor(e){this._backingStorages=e}record(e,t,n,i){this._backingStorages.forEach(s=>{s.record(e,t,n,i)})}};as.MultiMetricStorage=Eu});var W_=l(Zt=>{\"use strict\";Object.defineProperty(Zt,\"__esModule\",{value:!0});Zt.BatchObservableResultImpl=Zt.ObservableResultImpl=void 0;var Qt=(h(),m(d)),X_=wr(),jS=Zi(),mu=class{constructor(e,t){this._instrumentName=e,this._valueType=t,this._buffer=new X_.AttributeHashMap}observe(e,t={}){if(typeof e!=\"number\"){Qt.diag.warn(`non-number value provided to metric ${this._instrumentName}: ${e}`);return}this._valueType===Qt.ValueType.INT&&!Number.isInteger(e)&&(Qt.diag.warn(`INT value type cannot accept a floating-point value for ${this._instrumentName}, ignoring the fractional digits.`),e=Math.trunc(e),!Number.isInteger(e))||this._buffer.set(t,e)}};Zt.ObservableResultImpl=mu;var gu=class{constructor(){this._buffer=new Map}observe(e,t,n={}){if(!(0,jS.isObservableInstrument)(e))return;let i=this._buffer.get(e);if(i==null&&(i=new X_.AttributeHashMap,this._buffer.set(e,i)),typeof t!=\"number\"){Qt.diag.warn(`non-number value provided to metric ${e._descriptor.name}: ${t}`);return}e._descriptor.valueType===Qt.ValueType.INT&&!Number.isInteger(t)&&(Qt.diag.warn(`INT value type cannot accept a floating-point value for ${e._descriptor.name}, ignoring the fractional digits.`),t=Math.trunc(t),!Number.isInteger(t))||i.set(n,t)}};Zt.BatchObservableResultImpl=gu});var Y_=l(us=>{\"use strict\";Object.defineProperty(us,\"__esModule\",{value:!0});us.ObservableRegistry=void 0;var FS=(h(),m(d)),K_=Zi(),z_=W_(),xr=Ee(),Tu=class{constructor(){this._callbacks=[],this._batchCallbacks=[]}addCallback(e,t){this._findCallback(e,t)>=0||this._callbacks.push({callback:e,instrument:t})}removeCallback(e,t){let n=this._findCallback(e,t);n<0||this._callbacks.splice(n,1)}addBatchCallback(e,t){let n=new Set(t.filter(K_.isObservableInstrument));if(n.size===0){FS.diag.error(\"BatchObservableCallback is not associated with valid instruments\",t);return}this._findBatchCallback(e,n)>=0||this._batchCallbacks.push({callback:e,instruments:n})}removeBatchCallback(e,t){let n=new Set(t.filter(K_.isObservableInstrument)),i=this._findBatchCallback(e,n);i<0||this._batchCallbacks.splice(i,1)}async observe(e,t){let n=this._observeCallbacks(e,t),i=this._observeBatchCallbacks(e,t);return(await(0,xr.PromiseAllSettled)([...n,...i])).filter(xr.isPromiseAllSettledRejectionResult).map(a=>a.reason)}_observeCallbacks(e,t){return this._callbacks.map(async({callback:n,instrument:i})=>{let s=new z_.ObservableResultImpl(i._descriptor.name,i._descriptor.valueType),o=Promise.resolve(n(s));t!=null&&(o=(0,xr.callWithTimeout)(o,t)),await o,i._metricStorages.forEach(a=>{a.record(s._buffer,e)})})}_observeBatchCallbacks(e,t){return this._batchCallbacks.map(async({callback:n,instruments:i})=>{let s=new z_.BatchObservableResultImpl,o=Promise.resolve(n(s));t!=null&&(o=(0,xr.callWithTimeout)(o,t)),await o,i.forEach(a=>{let u=s._buffer.get(a);u!=null&&a._metricStorages.forEach(c=>{c.record(u,e)})})})}_findCallback(e,t){return this._callbacks.findIndex(n=>n.callback===e&&n.instrument===t)}_findBatchCallback(e,t){return this._batchCallbacks.findIndex(n=>n.callback===e&&(0,xr.setEquals)(n.instruments,t))}};us.ObservableRegistry=Tu});var Q_=l(cs=>{\"use strict\";Object.defineProperty(cs,\"__esModule\",{value:!0});cs.SyncMetricStorage=void 0;var kS=au(),$S=du(),XS=pu(),Su=class extends kS.MetricStorage{constructor(e,t,n,i){super(e),this._attributesProcessor=n,this._deltaMetricStorage=new $S.DeltaMetricProcessor(t),this._temporalMetricStorage=new XS.TemporalMetricProcessor(t,i)}record(e,t,n,i){t=this._attributesProcessor.process(t,n),this._deltaMetricStorage.record(e,t,n,i)}collect(e,t){let n=this._deltaMetricStorage.collect();return this._temporalMetricStorage.buildMetrics(e,this._instrumentDescriptor,n,t)}};cs.SyncMetricStorage=Su});var Ou=l(we=>{\"use strict\";Object.defineProperty(we,\"__esModule\",{value:!0});we.FilteringAttributesProcessor=we.NoopAttributesProcessor=we.AttributesProcessor=void 0;var Dr=class{static Noop(){return WS}};we.AttributesProcessor=Dr;var ls=class extends Dr{process(e,t){return e}};we.NoopAttributesProcessor=ls;var Au=class extends Dr{constructor(e){super(),this._allowedAttributeNames=e}process(e,t){let n={};return Object.keys(e).filter(i=>this._allowedAttributeNames.includes(i)).forEach(i=>n[i]=e[i]),n}};we.FilteringAttributesProcessor=Au;var WS=new ls});var Z_=l(ds=>{\"use strict\";Object.defineProperty(ds,\"__esModule\",{value:!0});ds.MeterSharedState=void 0;var KS=be(),zS=U_(),YS=Ee(),QS=B_(),ZS=k_(),JS=$_(),eA=Y_(),tA=Q_(),rA=Ou(),Ru=class{constructor(e,t){this._meterProviderSharedState=e,this._instrumentationScope=t,this.metricStorageRegistry=new ZS.MetricStorageRegistry,this.observableRegistry=new eA.ObservableRegistry,this.meter=new zS.Meter(this)}registerMetricStorage(e){let t=this._registerMetricStorage(e,tA.SyncMetricStorage);return t.length===1?t[0]:new JS.MultiMetricStorage(t)}registerAsyncMetricStorage(e){return this._registerMetricStorage(e,QS.AsyncMetricStorage)}async collect(e,t,n){let i=await this.observableRegistry.observe(t,n?.timeoutMillis),s=this.metricStorageRegistry.getStorages(e);if(s.length===0)return null;let o=s.map(a=>a.collect(e,t)).filter(YS.isNotNullish);return o.length===0?{errors:i}:{scopeMetrics:{scope:this._instrumentationScope,metrics:o},errors:i}}_registerMetricStorage(e,t){let i=this._meterProviderSharedState.viewRegistry.findViews(e,this._instrumentationScope).map(s=>{let o=(0,KS.createInstrumentDescriptorWithView)(s,e),a=this.metricStorageRegistry.findOrUpdateCompatibleStorage(o);if(a!=null)return a;let u=s.aggregation.createAggregator(o),c=new t(o,u,s.attributesProcessor,this._meterProviderSharedState.metricCollectors);return this.metricStorageRegistry.register(c),c});if(i.length===0){let o=this._meterProviderSharedState.selectAggregations(e.type).map(([a,u])=>{let c=this.metricStorageRegistry.findOrUpdateCompatibleCollectorStorage(a,e);if(c!=null)return c;let _=u.createAggregator(e),p=new t(e,_,rA.AttributesProcessor.Noop(),[a]);return this.metricStorageRegistry.registerForCollector(a,p),p});i=i.concat(o)}return i}};ds.MeterSharedState=Ru});var J_=l(_s=>{\"use strict\";Object.defineProperty(_s,\"__esModule\",{value:!0});_s.MeterProviderSharedState=void 0;var nA=Ee(),iA=D_(),sA=Z_(),bu=class{constructor(e){this.resource=e,this.viewRegistry=new iA.ViewRegistry,this.metricCollectors=[],this.meterSharedStates=new Map}getMeterSharedState(e){let t=(0,nA.instrumentationScopeId)(e),n=this.meterSharedStates.get(t);return n==null&&(n=new sA.MeterSharedState(this,e),this.meterSharedStates.set(t,n)),n}selectAggregations(e){let t=[];for(let n of this.metricCollectors)t.push([n,n.selectAggregation(e)]);return t}};_s.MeterProviderSharedState=bu});var ep=l(ps=>{\"use strict\";Object.defineProperty(ps,\"__esModule\",{value:!0});ps.MetricCollector=void 0;var oA=A(),Pu=class{constructor(e,t){this._sharedState=e,this._metricReader=t}async collect(e){let t=(0,oA.millisToHrTime)(Date.now()),n=[],i=[],s=Array.from(this._sharedState.meterSharedStates.values()).map(async o=>{let a=await o.collect(this,t,e);a?.scopeMetrics!=null&&n.push(a.scopeMetrics),a?.errors!=null&&i.push(...a.errors)});return await Promise.all(s),{resourceMetrics:{resource:this._sharedState.resource,scopeMetrics:n},errors:i}}async forceFlush(e){await this._metricReader.forceFlush(e)}async shutdown(e){await this._metricReader.shutdown(e)}selectAggregationTemporality(e){return this._metricReader.selectAggregationTemporality(e)}selectAggregation(e){return this._metricReader.selectAggregation(e)}};ps.MetricCollector=Pu});var rp=l(fs=>{\"use strict\";Object.defineProperty(fs,\"__esModule\",{value:!0});fs.MeterProvider=void 0;var hs=(h(),m(d)),tp=rt(),aA=J_(),uA=ep(),yu=class{constructor(e){var t;this._shutdown=!1;let n=tp.Resource.default().merge((t=e?.resource)!==null&&t!==void 0?t:tp.Resource.empty());if(this._sharedState=new aA.MeterProviderSharedState(n),e?.views!=null&&e.views.length>0)for(let i of e.views)this._sharedState.viewRegistry.addView(i)}getMeter(e,t=\"\",n={}){return this._shutdown?(hs.diag.warn(\"A shutdown MeterProvider cannot provide a Meter\"),(0,hs.createNoopMeter)()):this._sharedState.getMeterSharedState({name:e,version:t,schemaUrl:n.schemaUrl}).meter}addMetricReader(e){let t=new uA.MetricCollector(this._sharedState,e);e.setMetricProducer(t),this._sharedState.metricCollectors.push(t)}async shutdown(e){if(this._shutdown){hs.diag.warn(\"shutdown may only be called once per MeterProvider\");return}this._shutdown=!0,await Promise.all(this._sharedState.metricCollectors.map(t=>t.shutdown(e)))}async forceFlush(e){if(this._shutdown){hs.diag.warn(\"invalid attempt to force flush after MeterProvider shutdown\");return}await Promise.all(this._sharedState.metricCollectors.map(t=>t.forceFlush(e)))}};fs.MeterProvider=yu});var Es=l(Jt=>{\"use strict\";Object.defineProperty(Jt,\"__esModule\",{value:!0});Jt.ExactPredicate=Jt.PatternPredicate=void 0;var cA=/[\\^$\\\\.+?()[\\]{}|]/g,vu=class r{constructor(e){e===\"*\"?(this._matchAll=!0,this._regexp=/.*/):(this._matchAll=!1,this._regexp=new RegExp(r.escapePattern(e)))}match(e){return this._matchAll?!0:this._regexp.test(e)}static escapePattern(e){return`^${e.replace(cA,\"\\\\$&\").replace(\"*\",\".*\")}$`}static hasWildcard(e){return e.includes(\"*\")}};Jt.PatternPredicate=vu;var Iu=class{constructor(e){this._matchAll=e===void 0,this._pattern=e}match(e){return!!(this._matchAll||e===this._pattern)}};Jt.ExactPredicate=Iu});var ip=l(ms=>{\"use strict\";Object.defineProperty(ms,\"__esModule\",{value:!0});ms.InstrumentSelector=void 0;var np=Es(),Mu=class{constructor(e){var t;this._nameFilter=new np.PatternPredicate((t=e?.name)!==null&&t!==void 0?t:\"*\"),this._type=e?.type,this._unitFilter=new np.ExactPredicate(e?.unit)}getType(){return this._type}getNameFilter(){return this._nameFilter}getUnitFilter(){return this._unitFilter}};ms.InstrumentSelector=Mu});var sp=l(gs=>{\"use strict\";Object.defineProperty(gs,\"__esModule\",{value:!0});gs.MeterSelector=void 0;var Lu=Es(),Nu=class{constructor(e){this._nameFilter=new Lu.ExactPredicate(e?.name),this._versionFilter=new Lu.ExactPredicate(e?.version),this._schemaUrlFilter=new Lu.ExactPredicate(e?.schemaUrl)}getNameFilter(){return this._nameFilter}getVersionFilter(){return this._versionFilter}getSchemaUrlFilter(){return this._schemaUrlFilter}};gs.MeterSelector=Nu});var ap=l(Ts=>{\"use strict\";Object.defineProperty(Ts,\"__esModule\",{value:!0});Ts.View=void 0;var lA=Es(),op=Ou(),dA=ip(),_A=sp(),pA=ki();function hA(r){return r.instrumentName==null&&r.instrumentType==null&&r.instrumentUnit==null&&r.meterName==null&&r.meterVersion==null&&r.meterSchemaUrl==null}var Cu=class{constructor(e){var t;if(hA(e))throw new Error(\"Cannot create view with no selector arguments supplied\");if(e.name!=null&&(e?.instrumentName==null||lA.PatternPredicate.hasWildcard(e.instrumentName)))throw new Error(\"Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.\");e.attributeKeys!=null?this.attributesProcessor=new op.FilteringAttributesProcessor(e.attributeKeys):this.attributesProcessor=op.AttributesProcessor.Noop(),this.name=e.name,this.description=e.description,this.aggregation=(t=e.aggregation)!==null&&t!==void 0?t:pA.Aggregation.Default(),this.instrumentSelector=new dA.InstrumentSelector({name:e.instrumentName,type:e.instrumentType,unit:e.instrumentUnit}),this.meterSelector=new _A.MeterSelector({name:e.meterName,version:e.meterVersion,schemaUrl:e.meterSchemaUrl})}};Ts.View=Cu});var wu=l(g=>{\"use strict\";Object.defineProperty(g,\"__esModule\",{value:!0});g.TimeoutError=g.View=g.Aggregation=g.SumAggregation=g.LastValueAggregation=g.HistogramAggregation=g.DropAggregation=g.ExponentialHistogramAggregation=g.ExplicitBucketHistogramAggregation=g.DefaultAggregation=g.MeterProvider=g.InstrumentType=g.ConsoleMetricExporter=g.InMemoryMetricExporter=g.PeriodicExportingMetricReader=g.MetricReader=g.DataPointType=g.AggregationTemporality=void 0;var fA=Li();Object.defineProperty(g,\"AggregationTemporality\",{enumerable:!0,get:function(){return fA.AggregationTemporality}});var EA=wt();Object.defineProperty(g,\"DataPointType\",{enumerable:!0,get:function(){return EA.DataPointType}});var mA=Ka();Object.defineProperty(g,\"MetricReader\",{enumerable:!0,get:function(){return mA.MetricReader}});var gA=L_();Object.defineProperty(g,\"PeriodicExportingMetricReader\",{enumerable:!0,get:function(){return gA.PeriodicExportingMetricReader}});var TA=C_();Object.defineProperty(g,\"InMemoryMetricExporter\",{enumerable:!0,get:function(){return TA.InMemoryMetricExporter}});var SA=x_();Object.defineProperty(g,\"ConsoleMetricExporter\",{enumerable:!0,get:function(){return SA.ConsoleMetricExporter}});var AA=be();Object.defineProperty(g,\"InstrumentType\",{enumerable:!0,get:function(){return AA.InstrumentType}});var OA=rp();Object.defineProperty(g,\"MeterProvider\",{enumerable:!0,get:function(){return OA.MeterProvider}});var xe=ki();Object.defineProperty(g,\"DefaultAggregation\",{enumerable:!0,get:function(){return xe.DefaultAggregation}});Object.defineProperty(g,\"ExplicitBucketHistogramAggregation\",{enumerable:!0,get:function(){return xe.ExplicitBucketHistogramAggregation}});Object.defineProperty(g,\"ExponentialHistogramAggregation\",{enumerable:!0,get:function(){return xe.ExponentialHistogramAggregation}});Object.defineProperty(g,\"DropAggregation\",{enumerable:!0,get:function(){return xe.DropAggregation}});Object.defineProperty(g,\"HistogramAggregation\",{enumerable:!0,get:function(){return xe.HistogramAggregation}});Object.defineProperty(g,\"LastValueAggregation\",{enumerable:!0,get:function(){return xe.LastValueAggregation}});Object.defineProperty(g,\"SumAggregation\",{enumerable:!0,get:function(){return xe.SumAggregation}});Object.defineProperty(g,\"Aggregation\",{enumerable:!0,get:function(){return xe.Aggregation}});var RA=ap();Object.defineProperty(g,\"View\",{enumerable:!0,get:function(){return RA.View}});var bA=Ee();Object.defineProperty(g,\"TimeoutError\",{enumerable:!0,get:function(){return bA.TimeoutError}})});var up=l(Ss=>{\"use strict\";Object.defineProperty(Ss,\"__esModule\",{value:!0});Ss.AbstractAsyncHooksContextManager=void 0;var PA=z(\"events\"),yA=[\"addListener\",\"on\",\"once\",\"prependListener\",\"prependOnceListener\"],xu=class{constructor(){this._kOtListeners=Symbol(\"OtListeners\"),this._wrapped=!1}bind(e,t){return t instanceof PA.EventEmitter?this._bindEventEmitter(e,t):typeof t==\"function\"?this._bindFunction(e,t):t}_bindFunction(e,t){let n=this,i=function(...s){return n.with(e,()=>t.apply(this,s))};return Object.defineProperty(i,\"length\",{enumerable:!1,configurable:!0,writable:!1,value:t.length}),i}_bindEventEmitter(e,t){return this._getPatchMap(t)!==void 0||(this._createPatchMap(t),yA.forEach(i=>{t[i]!==void 0&&(t[i]=this._patchAddListener(t,t[i],e))}),typeof t.removeListener==\"function\"&&(t.removeListener=this._patchRemoveListener(t,t.removeListener)),typeof t.off==\"function\"&&(t.off=this._patchRemoveListener(t,t.off)),typeof t.removeAllListeners==\"function\"&&(t.removeAllListeners=this._patchRemoveAllListeners(t,t.removeAllListeners))),t}_patchRemoveListener(e,t){let n=this;return function(i,s){var o;let a=(o=n._getPatchMap(e))===null||o===void 0?void 0:o[i];if(a===void 0)return t.call(this,i,s);let u=a.get(s);return t.call(this,i,u||s)}}_patchRemoveAllListeners(e,t){let n=this;return function(i){let s=n._getPatchMap(e);return s!==void 0&&(arguments.length===0?n._createPatchMap(e):s[i]!==void 0&&delete s[i]),t.apply(this,arguments)}}_patchAddListener(e,t,n){let i=this;return function(s,o){if(i._wrapped)return t.call(this,s,o);let a=i._getPatchMap(e);a===void 0&&(a=i._createPatchMap(e));let u=a[s];u===void 0&&(u=new WeakMap,a[s]=u);let c=i.bind(n,o);u.set(o,c),i._wrapped=!0;try{return t.call(this,s,c)}finally{i._wrapped=!1}}}_createPatchMap(e){let t=Object.create(null);return e[this._kOtListeners]=t,t}_getPatchMap(e){return e[this._kOtListeners]}};Ss.AbstractAsyncHooksContextManager=xu});var cp=l(As=>{\"use strict\";Object.defineProperty(As,\"__esModule\",{value:!0});As.AsyncLocalStorageContextManager=void 0;var vA=(h(),m(d)),IA=z(\"async_hooks\"),MA=up(),Du=class extends MA.AbstractAsyncHooksContextManager{constructor(){super(),this._asyncLocalStorage=new IA.AsyncLocalStorage}active(){var e;return(e=this._asyncLocalStorage.getStore())!==null&&e!==void 0?e:vA.ROOT_CONTEXT}with(e,t,n,...i){let s=n==null?t:t.bind(n);return this._asyncLocalStorage.run(e,s,...i)}enable(){return this}disable(){return this._asyncLocalStorage.disable(),this}};As.AsyncLocalStorageContextManager=Du});var Ur=l(De=>{\"use strict\";Object.defineProperty(De,\"__esModule\",{value:!0});De.toAnyValue=De.toKeyValue=De.toAttributes=void 0;function DA(r){return Object.keys(r).map(e=>Vu(e,r[e]))}De.toAttributes=DA;function Vu(r,e){return{key:r,value:Gu(e)}}De.toKeyValue=Vu;function Gu(r){let e=typeof r;return e===\"string\"?{stringValue:r}:e===\"number\"?Number.isInteger(r)?{intValue:r}:{doubleValue:r}:e===\"boolean\"?{boolValue:r}:r instanceof Uint8Array?{bytesValue:r}:Array.isArray(r)?{arrayValue:{values:r.map(Gu)}}:e===\"object\"&&r!=null?{kvlistValue:{values:Object.entries(r).map(([t,n])=>Vu(t,n))}}:{}}De.toAnyValue=Gu});var wp=l(Ue=>{\"use strict\";Object.defineProperty(Ue,\"__esModule\",{value:!0});Ue.toOtlpSpanEvent=Ue.toOtlpLink=Ue.sdkSpanToOtlpSpan=void 0;var Hu=Ur();function UA(r,e){var t;let n=r.spanContext(),i=r.status;return{traceId:e.encodeSpanContext(n.traceId),spanId:e.encodeSpanContext(n.spanId),parentSpanId:e.encodeOptionalSpanContext(r.parentSpanId),traceState:(t=n.traceState)===null||t===void 0?void 0:t.serialize(),name:r.name,kind:r.kind==null?0:r.kind+1,startTimeUnixNano:e.encodeHrTime(r.startTime),endTimeUnixNano:e.encodeHrTime(r.endTime),attributes:(0,Hu.toAttributes)(r.attributes),droppedAttributesCount:r.droppedAttributesCount,events:r.events.map(s=>Cp(s,e)),droppedEventsCount:r.droppedEventsCount,status:{code:i.code,message:i.message},links:r.links.map(s=>Np(s,e)),droppedLinksCount:r.droppedLinksCount}}Ue.sdkSpanToOtlpSpan=UA;function Np(r,e){var t;return{attributes:r.attributes?(0,Hu.toAttributes)(r.attributes):[],spanId:e.encodeSpanContext(r.context.spanId),traceId:e.encodeSpanContext(r.context.traceId),traceState:(t=r.context.traceState)===null||t===void 0?void 0:t.serialize(),droppedAttributesCount:r.droppedAttributesCount||0}}Ue.toOtlpLink=Np;function Cp(r,e){return{attributes:r.attributes?(0,Hu.toAttributes)(r.attributes):[],name:r.name,timeUnixNano:e.encodeHrTime(r.time),droppedAttributesCount:r.droppedAttributesCount||0}}Ue.toOtlpSpanEvent=Cp});var Br=l(oe=>{\"use strict\";Object.defineProperty(oe,\"__esModule\",{value:!0});oe.getOtlpEncoder=oe.encodeAsString=oe.encodeAsLongBits=oe.toLongBits=oe.hrTimeToNanos=void 0;var bs=A(),BA=BigInt(1e9);function ju(r){return BigInt(r[0])*BA+BigInt(r[1])}oe.hrTimeToNanos=ju;function Dp(r){let e=Number(BigInt.asUintN(32,r)),t=Number(BigInt.asUintN(32,r>>BigInt(32)));return{low:e,high:t}}oe.toLongBits=Dp;function Fu(r){let e=ju(r);return Dp(e)}oe.encodeAsLongBits=Fu;function Up(r){return ju(r).toString()}oe.encodeAsString=Up;var qA=typeof BigInt<\"u\"?Up:bs.hrTimeToNanoseconds;function xp(r){return r}function Bp(r){if(r!==void 0)return(0,bs.hexToBase64)(r)}var VA={encodeHrTime:Fu,encodeSpanContext:bs.hexToBase64,encodeOptionalSpanContext:Bp};function GA(r){var e,t;if(r===void 0)return VA;let n=(e=r.useLongBits)!==null&&e!==void 0?e:!0,i=(t=r.useHex)!==null&&t!==void 0?t:!1;return{encodeHrTime:n?Fu:qA,encodeSpanContext:i?xp:bs.hexToBase64,encodeOptionalSpanContext:i?xp:Bp}}oe.getOtlpEncoder=GA});var ys=l(Ps=>{\"use strict\";Object.defineProperty(Ps,\"__esModule\",{value:!0});Ps.createExportTraceServiceRequest=void 0;var HA=Ur(),jA=wp(),FA=Br();function kA(r,e){let t=(0,FA.getOtlpEncoder)(e);return{resourceSpans:XA(r,t)}}Ps.createExportTraceServiceRequest=kA;function $A(r){let e=new Map;for(let t of r){let n=e.get(t.resource);n||(n=new Map,e.set(t.resource,n));let i=`${t.instrumentationLibrary.name}@${t.instrumentationLibrary.version||\"\"}:${t.instrumentationLibrary.schemaUrl||\"\"}`,s=n.get(i);s||(s=[],n.set(i,s)),s.push(t)}return e}function XA(r,e){let t=$A(r),n=[],i=t.entries(),s=i.next();for(;!s.done;){let[o,a]=s.value,u=[],c=a.values(),_=c.next();for(;!_.done;){let f=_.value;if(f.length>0){let{name:M,version:R,schemaUrl:w}=f[0].instrumentationLibrary,U=f.map(S=>(0,jA.sdkSpanToOtlpSpan)(S,e));u.push({scope:{name:M,version:R},spans:U,schemaUrl:w})}_=c.next()}let p={resource:{attributes:(0,HA.toAttributes)(o.attributes),droppedAttributesCount:0},scopeSpans:u,schemaUrl:void 0};n.push(p),s=i.next()}return n}});var Gp=l(N=>{\"use strict\";Object.defineProperty(N,\"__esModule\",{value:!0});N.parseRetryAfterToMills=N.isExportRetryable=N.invalidTimeout=N.configureExporterTimeout=N.appendRootPathToUrlIfNeeded=N.appendResourcePathToUrl=N.parseHeaders=N.DEFAULT_EXPORT_BACKOFF_MULTIPLIER=N.DEFAULT_EXPORT_MAX_BACKOFF=N.DEFAULT_EXPORT_INITIAL_BACKOFF=N.DEFAULT_EXPORT_MAX_ATTEMPTS=void 0;var ku=(h(),m(d)),qp=A(),Vp=1e4;N.DEFAULT_EXPORT_MAX_ATTEMPTS=5;N.DEFAULT_EXPORT_INITIAL_BACKOFF=1e3;N.DEFAULT_EXPORT_MAX_BACKOFF=5e3;N.DEFAULT_EXPORT_BACKOFF_MULTIPLIER=1.5;function WA(r={}){let e={};return Object.entries(r).forEach(([t,n])=>{typeof n<\"u\"?e[t]=String(n):ku.diag.warn(`Header \"${t}\" has wrong value and will be ignored`)}),e}N.parseHeaders=WA;function KA(r,e){return r.endsWith(\"/\")||(r=r+\"/\"),r+e}N.appendResourcePathToUrl=KA;function zA(r){try{let e=new URL(r);return e.pathname===\"\"&&(e.pathname=e.pathname+\"/\"),e.toString()}catch{return ku.diag.warn(`Could not parse export URL: '${r}'`),r}}N.appendRootPathToUrlIfNeeded=zA;function YA(r){return typeof r==\"number\"?r<=0?$u(r,Vp):r:QA()}N.configureExporterTimeout=YA;function QA(){var r;let e=Number((r=(0,qp.getEnv)().OTEL_EXPORTER_OTLP_TRACES_TIMEOUT)!==null&&r!==void 0?r:(0,qp.getEnv)().OTEL_EXPORTER_OTLP_TIMEOUT);return e<=0?$u(e,Vp):e}function $u(r,e){return ku.diag.warn(\"Timeout must be greater than 0\",r),e}N.invalidTimeout=$u;function ZA(r){return[429,502,503,504].includes(r)}N.isExportRetryable=ZA;function JA(r){if(r==null)return-1;let e=Number.parseInt(r,10);if(Number.isInteger(e))return e>0?e*1e3:-1;let t=new Date(r).getTime()-Date.now();return t>=0?t:0}N.parseRetryAfterToMills=JA});var jp=l(vs=>{\"use strict\";Object.defineProperty(vs,\"__esModule\",{value:!0});vs.OTLPExporterBase=void 0;var Hp=(h(),m(d)),qr=A(),eO=Gp(),Xu=class{constructor(e={}){this._sendingPromises=[],this.url=this.getDefaultUrl(e),typeof e.hostname==\"string\"&&(this.hostname=e.hostname),this.shutdown=this.shutdown.bind(this),this._shutdownOnce=new qr.BindOnceFuture(this._shutdown,this),this._concurrencyLimit=typeof e.concurrencyLimit==\"number\"?e.concurrencyLimit:30,this.timeoutMillis=(0,eO.configureExporterTimeout)(e.timeoutMillis),this.onInit(e)}export(e,t){if(this._shutdownOnce.isCalled){t({code:qr.ExportResultCode.FAILED,error:new Error(\"Exporter has been shutdown\")});return}if(this._sendingPromises.length>=this._concurrencyLimit){t({code:qr.ExportResultCode.FAILED,error:new Error(\"Concurrent export limit reached\")});return}this._export(e).then(()=>{t({code:qr.ExportResultCode.SUCCESS})}).catch(n=>{t({code:qr.ExportResultCode.FAILED,error:n})})}_export(e){return new Promise((t,n)=>{try{Hp.diag.debug(\"items to be sent\",e),this.send(e,t,n)}catch(i){n(i)}})}shutdown(){return this._shutdownOnce.call()}forceFlush(){return Promise.all(this._sendingPromises).then(()=>{})}_shutdown(){return Hp.diag.debug(\"shutdown started\"),this.onShutdown(),this.forceFlush()}};vs.OTLPExporterBase=Xu});var Xp=l((ky,$p)=>{\"use strict\";$p.exports=nO;function nO(r,e){for(var t=new Array(arguments.length-1),n=0,i=2,s=!0;i{\"use strict\";var Ms=zp;Ms.length=function(e){var t=e.length;if(!t)return 0;for(var n=0;--t%4>1&&e.charAt(t)===\"=\";)++n;return Math.ceil(e.length*3)/4-n};var nr=new Array(64),Kp=new Array(123);for(le=0;le<64;)Kp[nr[le]=le<26?le+65:le<52?le+71:le<62?le-4:le-59|43]=le++;var le;Ms.encode=function(e,t,n){for(var i=null,s=[],o=0,a=0,u;t>2],u=(c&3)<<4,a=1;break;case 1:s[o++]=nr[u|c>>4],u=(c&15)<<2,a=2;break;case 2:s[o++]=nr[u|c>>6],s[o++]=nr[c&63],a=0;break}o>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,s)),o=0)}return a&&(s[o++]=nr[u],s[o++]=61,a===1&&(s[o++]=61)),i?(o&&i.push(String.fromCharCode.apply(String,s.slice(0,o))),i.join(\"\")):String.fromCharCode.apply(String,s.slice(0,o))};var Wp=\"invalid encoding\";Ms.decode=function(e,t,n){for(var i=n,s=0,o,a=0;a1)break;if((u=Kp[u])===void 0)throw Error(Wp);switch(s){case 0:o=u,s=1;break;case 1:t[n++]=o<<2|(u&48)>>4,o=u,s=2;break;case 2:t[n++]=(o&15)<<4|(u&60)>>2,o=u,s=3;break;case 3:t[n++]=(o&3)<<6|u,s=0;break}}if(s===1)throw Error(Wp);return n-i};Ms.test=function(e){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e)}});var Zp=l((Xy,Qp)=>{\"use strict\";Qp.exports=Ls;function Ls(){this._listeners={}}Ls.prototype.on=function(e,t,n){return(this._listeners[e]||(this._listeners[e]=[])).push({fn:t,ctx:n||this}),this};Ls.prototype.off=function(e,t){if(e===void 0)this._listeners={};else if(t===void 0)this._listeners[e]=[];else for(var n=this._listeners[e],i=0;i{\"use strict\";ih.exports=Jp(Jp);function Jp(r){return typeof Float32Array<\"u\"?function(){var e=new Float32Array([-0]),t=new Uint8Array(e.buffer),n=t[3]===128;function i(u,c,_){e[0]=u,c[_]=t[0],c[_+1]=t[1],c[_+2]=t[2],c[_+3]=t[3]}function s(u,c,_){e[0]=u,c[_]=t[3],c[_+1]=t[2],c[_+2]=t[1],c[_+3]=t[0]}r.writeFloatLE=n?i:s,r.writeFloatBE=n?s:i;function o(u,c){return t[0]=u[c],t[1]=u[c+1],t[2]=u[c+2],t[3]=u[c+3],e[0]}function a(u,c){return t[3]=u[c],t[2]=u[c+1],t[1]=u[c+2],t[0]=u[c+3],e[0]}r.readFloatLE=n?o:a,r.readFloatBE=n?a:o}():function(){function e(n,i,s,o){var a=i<0?1:0;if(a&&(i=-i),i===0)n(1/i>0?0:2147483648,s,o);else if(isNaN(i))n(2143289344,s,o);else if(i>34028234663852886e22)n((a<<31|2139095040)>>>0,s,o);else if(i<11754943508222875e-54)n((a<<31|Math.round(i/1401298464324817e-60))>>>0,s,o);else{var u=Math.floor(Math.log(i)/Math.LN2),c=Math.round(i*Math.pow(2,-u)*8388608)&8388607;n((a<<31|u+127<<23|c)>>>0,s,o)}}r.writeFloatLE=e.bind(null,eh),r.writeFloatBE=e.bind(null,th);function t(n,i,s){var o=n(i,s),a=(o>>31)*2+1,u=o>>>23&255,c=o&8388607;return u===255?c?NaN:a*(1/0):u===0?a*1401298464324817e-60*c:a*Math.pow(2,u-150)*(c+8388608)}r.readFloatLE=t.bind(null,rh),r.readFloatBE=t.bind(null,nh)}(),typeof Float64Array<\"u\"?function(){var e=new Float64Array([-0]),t=new Uint8Array(e.buffer),n=t[7]===128;function i(u,c,_){e[0]=u,c[_]=t[0],c[_+1]=t[1],c[_+2]=t[2],c[_+3]=t[3],c[_+4]=t[4],c[_+5]=t[5],c[_+6]=t[6],c[_+7]=t[7]}function s(u,c,_){e[0]=u,c[_]=t[7],c[_+1]=t[6],c[_+2]=t[5],c[_+3]=t[4],c[_+4]=t[3],c[_+5]=t[2],c[_+6]=t[1],c[_+7]=t[0]}r.writeDoubleLE=n?i:s,r.writeDoubleBE=n?s:i;function o(u,c){return t[0]=u[c],t[1]=u[c+1],t[2]=u[c+2],t[3]=u[c+3],t[4]=u[c+4],t[5]=u[c+5],t[6]=u[c+6],t[7]=u[c+7],e[0]}function a(u,c){return t[7]=u[c],t[6]=u[c+1],t[5]=u[c+2],t[4]=u[c+3],t[3]=u[c+4],t[2]=u[c+5],t[1]=u[c+6],t[0]=u[c+7],e[0]}r.readDoubleLE=n?o:a,r.readDoubleBE=n?a:o}():function(){function e(n,i,s,o,a,u){var c=o<0?1:0;if(c&&(o=-o),o===0)n(0,a,u+i),n(1/o>0?0:2147483648,a,u+s);else if(isNaN(o))n(0,a,u+i),n(2146959360,a,u+s);else if(o>17976931348623157e292)n(0,a,u+i),n((c<<31|2146435072)>>>0,a,u+s);else{var _;if(o<22250738585072014e-324)_=o/5e-324,n(_>>>0,a,u+i),n((c<<31|_/4294967296)>>>0,a,u+s);else{var p=Math.floor(Math.log(o)/Math.LN2);p===1024&&(p=1023),_=o*Math.pow(2,-p),n(_*4503599627370496>>>0,a,u+i),n((c<<31|p+1023<<20|_*1048576&1048575)>>>0,a,u+s)}}}r.writeDoubleLE=e.bind(null,eh,0,4),r.writeDoubleBE=e.bind(null,th,4,0);function t(n,i,s,o,a){var u=n(o,a+i),c=n(o,a+s),_=(c>>31)*2+1,p=c>>>20&2047,f=4294967296*(c&1048575)+u;return p===2047?f?NaN:_*(1/0):p===0?_*5e-324*f:_*Math.pow(2,p-1075)*(f+4503599627370496)}r.readDoubleLE=t.bind(null,rh,0,4),r.readDoubleBE=t.bind(null,nh,4,0)}(),r}function eh(r,e,t){e[t]=r&255,e[t+1]=r>>>8&255,e[t+2]=r>>>16&255,e[t+3]=r>>>24}function th(r,e,t){e[t]=r>>>24,e[t+1]=r>>>16&255,e[t+2]=r>>>8&255,e[t+3]=r&255}function rh(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0}function nh(r,e){return(r[e]<<24|r[e+1]<<16|r[e+2]<<8|r[e+3])>>>0}});var oh=l((exports,module)=>{\"use strict\";module.exports=inquire;function inquire(moduleName){try{var mod=eval(\"quire\".replace(/^/,\"re\"))(moduleName);if(mod&&(mod.length||Object.keys(mod).length))return mod}catch(r){}return null}});var uh=l(ah=>{\"use strict\";var Ku=ah;Ku.length=function(e){for(var t=0,n=0,i=0;i191&&u<224?o[a++]=(u&31)<<6|e[t++]&63:u>239&&u<365?(u=((u&7)<<18|(e[t++]&63)<<12|(e[t++]&63)<<6|e[t++]&63)-65536,o[a++]=55296+(u>>10),o[a++]=56320+(u&1023)):o[a++]=(u&15)<<12|(e[t++]&63)<<6|e[t++]&63,a>8191&&((s||(s=[])).push(String.fromCharCode.apply(String,o)),a=0);return s?(a&&s.push(String.fromCharCode.apply(String,o.slice(0,a))),s.join(\"\")):String.fromCharCode.apply(String,o.slice(0,a))};Ku.write=function(e,t,n){for(var i=n,s,o,a=0;a>6|192,t[n++]=s&63|128):(s&64512)===55296&&((o=e.charCodeAt(a+1))&64512)===56320?(s=65536+((s&1023)<<10)+(o&1023),++a,t[n++]=s>>18|240,t[n++]=s>>12&63|128,t[n++]=s>>6&63|128,t[n++]=s&63|128):(t[n++]=s>>12|224,t[n++]=s>>6&63|128,t[n++]=s&63|128);return n-i}});var lh=l((zy,ch)=>{\"use strict\";ch.exports=iO;function iO(r,e,t){var n=t||8192,i=n>>>1,s=null,o=n;return function(u){if(u<1||u>i)return r(u);o+u>n&&(s=r(n),o=0);var c=e.call(s,o,o+=u);return o&7&&(o=(o|7)+1),c}}});var _h=l((Yy,dh)=>{\"use strict\";dh.exports=V;var Vr=qe();function V(r,e){this.lo=r>>>0,this.hi=e>>>0}var ct=V.zero=new V(0,0);ct.toNumber=function(){return 0};ct.zzEncode=ct.zzDecode=function(){return this};ct.length=function(){return 1};var sO=V.zeroHash=\"\\0\\0\\0\\0\\0\\0\\0\\0\";V.fromNumber=function(e){if(e===0)return ct;var t=e<0;t&&(e=-e);var n=e>>>0,i=(e-n)/4294967296>>>0;return t&&(i=~i>>>0,n=~n>>>0,++n>4294967295&&(n=0,++i>4294967295&&(i=0))),new V(n,i)};V.from=function(e){if(typeof e==\"number\")return V.fromNumber(e);if(Vr.isString(e))if(Vr.Long)e=Vr.Long.fromString(e);else return V.fromNumber(parseInt(e,10));return e.low||e.high?new V(e.low>>>0,e.high>>>0):ct};V.prototype.toNumber=function(e){if(!e&&this.hi>>>31){var t=~this.lo+1>>>0,n=~this.hi>>>0;return t||(n=n+1>>>0),-(t+n*4294967296)}return this.lo+this.hi*4294967296};V.prototype.toLong=function(e){return Vr.Long?new Vr.Long(this.lo|0,this.hi|0,!!e):{low:this.lo|0,high:this.hi|0,unsigned:!!e}};var Be=String.prototype.charCodeAt;V.fromHash=function(e){return e===sO?ct:new V((Be.call(e,0)|Be.call(e,1)<<8|Be.call(e,2)<<16|Be.call(e,3)<<24)>>>0,(Be.call(e,4)|Be.call(e,5)<<8|Be.call(e,6)<<16|Be.call(e,7)<<24)>>>0)};V.prototype.toHash=function(){return String.fromCharCode(this.lo&255,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,this.hi&255,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)};V.prototype.zzEncode=function(){var e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this};V.prototype.zzDecode=function(){var e=-(this.lo&1);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this};V.prototype.length=function(){var e=this.lo,t=(this.lo>>>28|this.hi<<4)>>>0,n=this.hi>>>24;return n===0?t===0?e<16384?e<128?1:2:e<2097152?3:4:t<16384?t<128?5:6:t<2097152?7:8:n<128?9:10}});var qe=l(zu=>{\"use strict\";var E=zu;E.asPromise=Xp();E.base64=Yp();E.EventEmitter=Zp();E.float=sh();E.inquire=oh();E.utf8=uh();E.pool=lh();E.LongBits=_h();E.isNode=!!(typeof global<\"u\"&&global&&global.process&&global.process.versions&&global.process.versions.node);E.global=E.isNode&&global||typeof window<\"u\"&&window||typeof self<\"u\"&&self||zu;E.emptyArray=Object.freeze?Object.freeze([]):[];E.emptyObject=Object.freeze?Object.freeze({}):{};E.isInteger=Number.isInteger||function(e){return typeof e==\"number\"&&isFinite(e)&&Math.floor(e)===e};E.isString=function(e){return typeof e==\"string\"||e instanceof String};E.isObject=function(e){return e&&typeof e==\"object\"};E.isset=E.isSet=function(e,t){var n=e[t];return n!=null&&e.hasOwnProperty(t)?typeof n!=\"object\"||(Array.isArray(n)?n.length:Object.keys(n).length)>0:!1};E.Buffer=function(){try{var r=E.inquire(\"buffer\").Buffer;return r.prototype.utf8Write?r:null}catch{return null}}();E._Buffer_from=null;E._Buffer_allocUnsafe=null;E.newBuffer=function(e){return typeof e==\"number\"?E.Buffer?E._Buffer_allocUnsafe(e):new E.Array(e):E.Buffer?E._Buffer_from(e):typeof Uint8Array>\"u\"?e:new Uint8Array(e)};E.Array=typeof Uint8Array<\"u\"?Uint8Array:Array;E.Long=E.global.dcodeIO&&E.global.dcodeIO.Long||E.global.Long||E.inquire(\"long\");E.key2Re=/^true|false|0|1$/;E.key32Re=/^-?(?:0|[1-9][0-9]*)$/;E.key64Re=/^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;E.longToHash=function(e){return e?E.LongBits.from(e).toHash():E.LongBits.zeroHash};E.longFromHash=function(e,t){var n=E.LongBits.fromHash(e);return E.Long?E.Long.fromBits(n.lo,n.hi,t):n.toNumber(!!t)};function ph(r,e,t){for(var n=Object.keys(e),i=0;i-1;--s)if(t[i[s]]===1&&this[i[s]]!==void 0&&this[i[s]]!==null)return i[s]}};E.oneOfSetter=function(e){return function(t){for(var n=0;n{\"use strict\";gh.exports=O;var ae=qe(),Yu,Ns=ae.LongBits,fh=ae.base64,Eh=ae.utf8;function Gr(r,e,t){this.fn=r,this.len=e,this.next=void 0,this.val=t}function Zu(){}function oO(r){this.head=r.head,this.tail=r.tail,this.len=r.len,this.next=r.states}function O(){this.len=0,this.head=new Gr(Zu,0,0),this.tail=this.head,this.states=null}var mh=function(){return ae.Buffer?function(){return(O.create=function(){return new Yu})()}:function(){return new O}};O.create=mh();O.alloc=function(e){return new ae.Array(e)};ae.Array!==Array&&(O.alloc=ae.pool(O.alloc,ae.Array.prototype.subarray));O.prototype._push=function(e,t,n){return this.tail=this.tail.next=new Gr(e,t,n),this.len+=t,this};function Ju(r,e,t){e[t]=r&255}function aO(r,e,t){for(;r>127;)e[t++]=r&127|128,r>>>=7;e[t]=r}function ec(r,e){this.len=r,this.next=void 0,this.val=e}ec.prototype=Object.create(Gr.prototype);ec.prototype.fn=aO;O.prototype.uint32=function(e){return this.len+=(this.tail=this.tail.next=new ec((e=e>>>0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this};O.prototype.int32=function(e){return e<0?this._push(tc,10,Ns.fromNumber(e)):this.uint32(e)};O.prototype.sint32=function(e){return this.uint32((e<<1^e>>31)>>>0)};function tc(r,e,t){for(;r.hi;)e[t++]=r.lo&127|128,r.lo=(r.lo>>>7|r.hi<<25)>>>0,r.hi>>>=7;for(;r.lo>127;)e[t++]=r.lo&127|128,r.lo=r.lo>>>7;e[t++]=r.lo}O.prototype.uint64=function(e){var t=Ns.from(e);return this._push(tc,t.length(),t)};O.prototype.int64=O.prototype.uint64;O.prototype.sint64=function(e){var t=Ns.from(e).zzEncode();return this._push(tc,t.length(),t)};O.prototype.bool=function(e){return this._push(Ju,1,e?1:0)};function Qu(r,e,t){e[t]=r&255,e[t+1]=r>>>8&255,e[t+2]=r>>>16&255,e[t+3]=r>>>24}O.prototype.fixed32=function(e){return this._push(Qu,4,e>>>0)};O.prototype.sfixed32=O.prototype.fixed32;O.prototype.fixed64=function(e){var t=Ns.from(e);return this._push(Qu,4,t.lo)._push(Qu,4,t.hi)};O.prototype.sfixed64=O.prototype.fixed64;O.prototype.float=function(e){return this._push(ae.float.writeFloatLE,4,e)};O.prototype.double=function(e){return this._push(ae.float.writeDoubleLE,8,e)};var uO=ae.Array.prototype.set?function(e,t,n){t.set(e,n)}:function(e,t,n){for(var i=0;i>>0;if(!t)return this._push(Ju,1,0);if(ae.isString(e)){var n=O.alloc(t=fh.length(e));fh.decode(e,n,0),e=n}return this.uint32(t)._push(uO,t,e)};O.prototype.string=function(e){var t=Eh.length(e);return t?this.uint32(t)._push(Eh.write,t,e):this._push(Ju,1,0)};O.prototype.fork=function(){return this.states=new oO(this),this.head=this.tail=new Gr(Zu,0,0),this.len=0,this};O.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Gr(Zu,0,0),this.len=0),this};O.prototype.ldelim=function(){var e=this.head,t=this.tail,n=this.len;return this.reset().uint32(n),n&&(this.tail.next=e.next,this.tail=t,this.len+=n),this};O.prototype.finish=function(){for(var e=this.head.next,t=this.constructor.alloc(this.len),n=0;e;)e.fn(e.val,t,n),n+=e.len,e=e.next;return t};O._configure=function(r){Yu=r,O.create=mh(),Yu._configure()}});var Ah=l((Jy,Sh)=>{\"use strict\";Sh.exports=ge;var Th=rc();(ge.prototype=Object.create(Th.prototype)).constructor=ge;var Ve=qe();function ge(){Th.call(this)}ge._configure=function(){ge.alloc=Ve._Buffer_allocUnsafe,ge.writeBytesBuffer=Ve.Buffer&&Ve.Buffer.prototype instanceof Uint8Array&&Ve.Buffer.prototype.set.name===\"set\"?function(e,t,n){t.set(e,n)}:function(e,t,n){if(e.copy)e.copy(t,n,0,e.length);else for(var i=0;i>>0;return this.uint32(t),t&&this._push(ge.writeBytesBuffer,t,e),this};function cO(r,e,t){r.length<40?Ve.utf8.write(r,e,t):e.utf8Write?e.utf8Write(r,t):e.write(r,t)}ge.prototype.string=function(e){var t=Ve.Buffer.byteLength(e);return this.uint32(t),t&&this._push(cO,t,e),this};ge._configure()});var sc=l((ev,yh)=>{\"use strict\";yh.exports=x;var de=qe(),ic,bh=de.LongBits,lO=de.utf8;function _e(r,e){return RangeError(\"index out of range: \"+r.pos+\" + \"+(e||1)+\" > \"+r.len)}function x(r){this.buf=r,this.pos=0,this.len=r.length}var Oh=typeof Uint8Array<\"u\"?function(e){if(e instanceof Uint8Array||Array.isArray(e))return new x(e);throw Error(\"illegal buffer\")}:function(e){if(Array.isArray(e))return new x(e);throw Error(\"illegal buffer\")},Ph=function(){return de.Buffer?function(t){return(x.create=function(i){return de.Buffer.isBuffer(i)?new ic(i):Oh(i)})(t)}:Oh};x.create=Ph();x.prototype._slice=de.Array.prototype.subarray||de.Array.prototype.slice;x.prototype.uint32=function(){var e=4294967295;return function(){if(e=(this.buf[this.pos]&127)>>>0,this.buf[this.pos++]<128||(e=(e|(this.buf[this.pos]&127)<<7)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<14)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&127)<<21)>>>0,this.buf[this.pos++]<128)||(e=(e|(this.buf[this.pos]&15)<<28)>>>0,this.buf[this.pos++]<128))return e;if((this.pos+=5)>this.len)throw this.pos=this.len,_e(this,10);return e}}();x.prototype.int32=function(){return this.uint32()|0};x.prototype.sint32=function(){var e=this.uint32();return e>>>1^-(e&1)|0};function nc(){var r=new bh(0,0),e=0;if(this.len-this.pos>4){for(;e<4;++e)if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r;if(r.lo=(r.lo|(this.buf[this.pos]&127)<<28)>>>0,r.hi=(r.hi|(this.buf[this.pos]&127)>>4)>>>0,this.buf[this.pos++]<128)return r;e=0}else{for(;e<3;++e){if(this.pos>=this.len)throw _e(this);if(r.lo=(r.lo|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}return r.lo=(r.lo|(this.buf[this.pos++]&127)<>>0,r}if(this.len-this.pos>4){for(;e<5;++e)if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}else for(;e<5;++e){if(this.pos>=this.len)throw _e(this);if(r.hi=(r.hi|(this.buf[this.pos]&127)<>>0,this.buf[this.pos++]<128)return r}throw Error(\"invalid varint encoding\")}x.prototype.bool=function(){return this.uint32()!==0};function Cs(r,e){return(r[e-4]|r[e-3]<<8|r[e-2]<<16|r[e-1]<<24)>>>0}x.prototype.fixed32=function(){if(this.pos+4>this.len)throw _e(this,4);return Cs(this.buf,this.pos+=4)};x.prototype.sfixed32=function(){if(this.pos+4>this.len)throw _e(this,4);return Cs(this.buf,this.pos+=4)|0};function Rh(){if(this.pos+8>this.len)throw _e(this,8);return new bh(Cs(this.buf,this.pos+=4),Cs(this.buf,this.pos+=4))}x.prototype.float=function(){if(this.pos+4>this.len)throw _e(this,4);var e=de.float.readFloatLE(this.buf,this.pos);return this.pos+=4,e};x.prototype.double=function(){if(this.pos+8>this.len)throw _e(this,4);var e=de.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,e};x.prototype.bytes=function(){var e=this.uint32(),t=this.pos,n=this.pos+e;if(n>this.len)throw _e(this,e);if(this.pos+=e,Array.isArray(this.buf))return this.buf.slice(t,n);if(t===n){var i=de.Buffer;return i?i.alloc(0):new this.buf.constructor(0)}return this._slice.call(this.buf,t,n)};x.prototype.string=function(){var e=this.bytes();return lO.read(e,0,e.length)};x.prototype.skip=function(e){if(typeof e==\"number\"){if(this.pos+e>this.len)throw _e(this,e);this.pos+=e}else do if(this.pos>=this.len)throw _e(this);while(this.buf[this.pos++]&128);return this};x.prototype.skipType=function(r){switch(r){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;(r=this.uint32()&7)!==4;)this.skipType(r);break;case 5:this.skip(4);break;default:throw Error(\"invalid wire type \"+r+\" at offset \"+this.pos)}return this};x._configure=function(r){ic=r,x.create=Ph(),ic._configure();var e=de.Long?\"toLong\":\"toNumber\";de.merge(x.prototype,{int64:function(){return nc.call(this)[e](!1)},uint64:function(){return nc.call(this)[e](!0)},sint64:function(){return nc.call(this).zzDecode()[e](!1)},fixed64:function(){return Rh.call(this)[e](!0)},sfixed64:function(){return Rh.call(this)[e](!1)}})}});var Lh=l((tv,Mh)=>{\"use strict\";Mh.exports=lt;var Ih=sc();(lt.prototype=Object.create(Ih.prototype)).constructor=lt;var vh=qe();function lt(r){Ih.call(this,r)}lt._configure=function(){vh.Buffer&&(lt.prototype._slice=vh.Buffer.prototype.slice)};lt.prototype.string=function(){var e=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+e,this.len)):this.buf.toString(\"utf-8\",this.pos,this.pos=Math.min(this.pos+e,this.len))};lt._configure()});var Ch=l((rv,Nh)=>{\"use strict\";Nh.exports=Hr;var oc=qe();(Hr.prototype=Object.create(oc.EventEmitter.prototype)).constructor=Hr;function Hr(r,e,t){if(typeof r!=\"function\")throw TypeError(\"rpcImpl must be a function\");oc.EventEmitter.call(this),this.rpcImpl=r,this.requestDelimited=!!e,this.responseDelimited=!!t}Hr.prototype.rpcCall=function r(e,t,n,i,s){if(!i)throw TypeError(\"request must be specified\");var o=this;if(!s)return oc.asPromise(r,o,e,t,n,i);if(!o.rpcImpl){setTimeout(function(){s(Error(\"already ended\"))},0);return}try{return o.rpcImpl(e,t[o.requestDelimited?\"encodeDelimited\":\"encode\"](i).finish(),function(u,c){if(u)return o.emit(\"error\",u,e),s(u);if(c===null){o.end(!0);return}if(!(c instanceof n))try{c=n[o.responseDelimited?\"decodeDelimited\":\"decode\"](c)}catch(_){return o.emit(\"error\",_,e),s(_)}return o.emit(\"data\",c,e),s(null,c)})}catch(a){o.emit(\"error\",a,e),setTimeout(function(){s(a)},0);return}};Hr.prototype.end=function(e){return this.rpcImpl&&(e||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit(\"end\").off()),this}});var xh=l(wh=>{\"use strict\";var dO=wh;dO.Service=Ch()});var Uh=l((iv,Dh)=>{\"use strict\";Dh.exports={}});var Vh=l(qh=>{\"use strict\";var J=qh;J.build=\"minimal\";J.Writer=rc();J.BufferWriter=Ah();J.Reader=sc();J.BufferReader=Lh();J.util=qe();J.rpc=xh();J.roots=Uh();J.configure=Bh;function Bh(){J.util._configure(),J.Writer._configure(J.BufferWriter),J.Reader._configure(J.BufferReader)}Bh()});var Hh=l((ov,Gh)=>{\"use strict\";Gh.exports=Vh()});var Qh=l(Yh=>{\"use strict\";Object.defineProperty(Yh,\"__esModule\",{value:!0})});var Jh=l(Zh=>{\"use strict\";Object.defineProperty(Zh,\"__esModule\",{value:!0})});var tf=l(ef=>{\"use strict\";Object.defineProperty(ef,\"__esModule\",{value:!0})});var rf=l(Fr=>{\"use strict\";Object.defineProperty(Fr,\"__esModule\",{value:!0});Fr.ESpanKind=void 0;var LO;(function(r){r[r.SPAN_KIND_UNSPECIFIED=0]=\"SPAN_KIND_UNSPECIFIED\",r[r.SPAN_KIND_INTERNAL=1]=\"SPAN_KIND_INTERNAL\",r[r.SPAN_KIND_SERVER=2]=\"SPAN_KIND_SERVER\",r[r.SPAN_KIND_CLIENT=3]=\"SPAN_KIND_CLIENT\",r[r.SPAN_KIND_PRODUCER=4]=\"SPAN_KIND_PRODUCER\",r[r.SPAN_KIND_CONSUMER=5]=\"SPAN_KIND_CONSUMER\"})(LO=Fr.ESpanKind||(Fr.ESpanKind={}))});var sf=l(nf=>{\"use strict\";Object.defineProperty(nf,\"__esModule\",{value:!0})});var lf=l(Ge=>{\"use strict\";Object.defineProperty(Ge,\"__esModule\",{value:!0});Ge.toMetric=Ge.toScopeMetrics=Ge.toResourceMetrics=void 0;var of=(h(),m(d)),or=wu(),Ds=Ur(),NO=Br();function CO(r,e){let t=(0,NO.getOtlpEncoder)(e);return{resource:{attributes:(0,Ds.toAttributes)(r.resource.attributes),droppedAttributesCount:0},schemaUrl:void 0,scopeMetrics:uf(r.scopeMetrics,t)}}Ge.toResourceMetrics=CO;function uf(r,e){return Array.from(r.map(t=>({scope:{name:t.scope.name,version:t.scope.version},metrics:t.metrics.map(n=>cf(n,e)),schemaUrl:t.scope.schemaUrl})))}Ge.toScopeMetrics=uf;function cf(r,e){let t={name:r.descriptor.name,description:r.descriptor.description,unit:r.descriptor.unit},n=UO(r.aggregationTemporality);switch(r.dataPointType){case or.DataPointType.SUM:t.sum={aggregationTemporality:n,isMonotonic:r.isMonotonic,dataPoints:af(r,e)};break;case or.DataPointType.GAUGE:t.gauge={dataPoints:af(r,e)};break;case or.DataPointType.HISTOGRAM:t.histogram={aggregationTemporality:n,dataPoints:xO(r,e)};break;case or.DataPointType.EXPONENTIAL_HISTOGRAM:t.exponentialHistogram={aggregationTemporality:n,dataPoints:DO(r,e)};break}return t}Ge.toMetric=cf;function wO(r,e,t){let n={attributes:(0,Ds.toAttributes)(r.attributes),startTimeUnixNano:t.encodeHrTime(r.startTime),timeUnixNano:t.encodeHrTime(r.endTime)};switch(e){case of.ValueType.INT:n.asInt=r.value;break;case of.ValueType.DOUBLE:n.asDouble=r.value;break}return n}function af(r,e){return r.dataPoints.map(t=>wO(t,r.descriptor.valueType,e))}function xO(r,e){return r.dataPoints.map(t=>{let n=t.value;return{attributes:(0,Ds.toAttributes)(t.attributes),bucketCounts:n.buckets.counts,explicitBounds:n.buckets.boundaries,count:n.count,sum:n.sum,min:n.min,max:n.max,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function DO(r,e){return r.dataPoints.map(t=>{let n=t.value;return{attributes:(0,Ds.toAttributes)(t.attributes),count:n.count,min:n.min,max:n.max,sum:n.sum,positive:{offset:n.positive.offset,bucketCounts:n.positive.bucketCounts},negative:{offset:n.negative.offset,bucketCounts:n.negative.bucketCounts},scale:n.scale,zeroCount:n.zeroCount,startTimeUnixNano:e.encodeHrTime(t.startTime),timeUnixNano:e.encodeHrTime(t.endTime)}})}function UO(r){switch(r){case or.AggregationTemporality.DELTA:return 1;case or.AggregationTemporality.CUMULATIVE:return 2}}});var df=l(Us=>{\"use strict\";Object.defineProperty(Us,\"__esModule\",{value:!0});Us.createExportMetricsServiceRequest=void 0;var BO=lf();function qO(r,e){return{resourceMetrics:r.map(t=>(0,BO.toResourceMetrics)(t,e))}}Us.createExportMetricsServiceRequest=qO});var pf=l(ar=>{\"use strict\";Object.defineProperty(ar,\"__esModule\",{value:!0});ar.toLogAttributes=ar.createExportLogsServiceRequest=void 0;var VO=Br(),lc=Ur();function GO(r,e){let t=(0,VO.getOtlpEncoder)(e);return{resourceLogs:jO(r,t)}}ar.createExportLogsServiceRequest=GO;function HO(r){let e=new Map;for(let t of r){let{resource:n,instrumentationScope:{name:i,version:s=\"\",schemaUrl:o=\"\"}}=t,a=e.get(n);a||(a=new Map,e.set(n,a));let u=`${i}@${s}:${o}`,c=a.get(u);c||(c=[],a.set(u,c)),c.push(t)}return e}function jO(r,e){let t=HO(r);return Array.from(t,([n,i])=>({resource:{attributes:(0,lc.toAttributes)(n.attributes),droppedAttributesCount:0},scopeLogs:Array.from(i,([,s])=>{let{instrumentationScope:{name:o,version:a,schemaUrl:u}}=s[0];return{scope:{name:o,version:a},logRecords:s.map(c=>FO(c,e)),schemaUrl:u}}),schemaUrl:void 0}))}function FO(r,e){var t,n,i;return{timeUnixNano:e.encodeHrTime(r.hrTime),observedTimeUnixNano:e.encodeHrTime(r.hrTimeObserved),severityNumber:r.severityNumber,severityText:r.severityText,body:(0,lc.toAnyValue)(r.body),attributes:_f(r.attributes),droppedAttributesCount:r.droppedAttributesCount,flags:(t=r.spanContext)===null||t===void 0?void 0:t.traceFlags,traceId:e.encodeOptionalSpanContext((n=r.spanContext)===null||n===void 0?void 0:n.traceId),spanId:e.encodeOptionalSpanContext((i=r.spanContext)===null||i===void 0?void 0:i.spanId)}}function _f(r){return Object.keys(r).map(e=>(0,lc.toKeyValue)(e,r[e]))}ar.toLogAttributes=_f});var hf=l(G=>{\"use strict\";var kO=G&&G.__createBinding||(Object.create?function(r,e,t,n){n===void 0&&(n=t),Object.defineProperty(r,n,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,n){n===void 0&&(n=t),r[n]=e[t]}),ur=G&&G.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&kO(e,r,t)};Object.defineProperty(G,\"__esModule\",{value:!0});G.createExportLogsServiceRequest=G.createExportMetricsServiceRequest=G.createExportTraceServiceRequest=void 0;ur(Qh(),G);ur(Br(),G);ur(Jh(),G);ur(tf(),G);ur(rf(),G);ur(sf(),G);var $O=ys();Object.defineProperty(G,\"createExportTraceServiceRequest\",{enumerable:!0,get:function(){return $O.createExportTraceServiceRequest}});var XO=df();Object.defineProperty(G,\"createExportMetricsServiceRequest\",{enumerable:!0,get:function(){return XO.createExportMetricsServiceRequest}});var WO=pf();Object.defineProperty(G,\"createExportLogsServiceRequest\",{enumerable:!0,get:function(){return WO.createExportLogsServiceRequest}})});var C=Y(la(),1);h();fa();var Tf=Y(Gd(),1),lr=Y(rt(),1),Sf=Y(r_(),1),Af=Y(wu(),1),Gs=Y(Qr(),1),Of=Y(cp(),1),He=Y(A(),1);h();var LA=Symbol.for(\"@vercel/request-context\");function se(){return globalThis[LA]?.get()}var lp=\"http.method\",dp=\"http.url\",Os=\"http.host\",_p=\"http.scheme\",Uu=\"http.status_code\",pp=\"http.user_agent\",Bu=\"http.response_content_length_uncompressed\",hp=\"net.peer.port\",fp=\"net.peer.name\",Ep=\"cloud.region\";var mp=\"deployment.environment.name\",gp=\"deployment.id\";var Tp=\"process.runtime.name\",Sp=\"vcs.ref.head.name\",Ap=\"vcs.ref.head.revision\",Op=\"vcs.repository.name\",Rp=\"vcs.repository.ref.revision\";var bp=\"service.name\",Pp=\"service.version\";function qu(r){return Object.fromEntries(Object.entries(r).filter(([e,t])=>t!==void 0))}function vp({attributes:r,env:e=process.env,runtime:t,serviceName:n}){let i=e.VERCEL_ENV||e.NEXT_PUBLIC_VERCEL_ENV,s=e.VERCEL_DEPLOYMENT_ID,o=e.VERCEL_GIT_COMMIT_SHA||e.NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA,a=e.VERCEL_REGION,u=e.VERCEL_GIT_COMMIT_REF,c=e.VERCEL_URL||e.NEXT_PUBLIC_VERCEL_URL||void 0,_=e.VERCEL_BRANCH_URL||e.NEXT_PUBLIC_VERCEL_BRANCH_URL||void 0,p=e.VERCEL_GIT_REPO_SLUG;return qu({[bp]:n,\"node.ci\":e.CI?!0:void 0,\"node.env\":e.NODE_ENV,[mp]:i,env:i,[Ep]:a,\"vercel.region\":a,[Tp]:t,\"vercel.runtime\":t,[Sp]:u,[Ap]:o,[Op]:p,[Rp]:o,\"vercel.sha\":o,\"vercel.host\":c,\"vercel.branch_host\":_,[gp]:s,\"vercel.deployment_id\":s,[Pp]:s,\"vercel.project_id\":e.VERCEL_PROJECT_ID||void 0,...r})}function Ip(r){return r?r.split(\"::\").at(-1):void 0}function Mp(r=se(),e){if(!r)return;let t=e?CA(e,r.headers):void 0;return qu({[Os]:r.headers.host,[pp]:r.headers[\"user-agent\"],\"http.referer\":r.headers.referer,\"vercel.request_id\":Ip(r.headers[\"x-vercel-id\"]),\"vercel.matched_path\":r.headers[\"x-matched-path\"],\"vercel.edge_region\":process.env.VERCEL_REGION,...t})}var NA={keys(r){return[]},get(r,e){return r[e.toLocaleLowerCase()]}};function CA(r,e){if(typeof r==\"function\")return r(e,NA);let t={};for(let[n,i]of Object.entries(r)){let s=e[i.toLocaleLowerCase()];s!==void 0&&(t[n]=s)}return t}h();function er(r){return(r&d.TraceFlags.SAMPLED)!==0}var Rs=class{constructor(e,t){this.processors=e;this.attributesFromHeaders=t;this.rootSpanIds=new Map;this.waitSpanEnd=new Map}forceFlush(){return Promise.all(this.processors.map(e=>e.forceFlush().catch(t=>{d.diag.error(\"@vercel/otel: forceFlush failed:\",t)}))).then(()=>{})}shutdown(){return Promise.all(this.processors.map(e=>e.shutdown().catch(()=>{}))).then(()=>{})}onStart(e,t){let{traceId:n,spanId:i,traceFlags:s}=e.spanContext(),o=!e.parentSpanId||!this.rootSpanIds.has(n);if(o?this.rootSpanIds.set(n,{rootSpanId:i,open:[]}):this.rootSpanIds.get(n)?.open.push(e),o&&er(s)){let a=se(),u=Mp(a,this.attributesFromHeaders);u&&e.setAttributes(u),a&&a.waitUntil(async()=>{if(this.rootSpanIds.has(n)){let c=new Promise(p=>{this.waitSpanEnd.set(n,p)}),_;await Promise.race([c,new Promise(p=>{_=setTimeout(()=>{this.waitSpanEnd.delete(n),p(void 0)},50)})]),_&&clearTimeout(_)}return this.forceFlush()})}for(let a of this.processors)a.onStart(e,t)}onEnd(e){let{traceId:t,spanId:n,traceFlags:i}=e.spanContext(),s=er(i),o=this.rootSpanIds.get(t),a=o?.rootSpanId===n;if(s){let u=xA(e);u&&Object.assign(e.attributes,u)}if(a){if(this.rootSpanIds.delete(t),o.open.length>0){for(let u of o.open)if(!u.ended&&u.spanContext().spanId!==n)try{u.end()}catch(c){d.diag.error(\"@vercel/otel: onEnd failed:\",c)}}}else if(o)for(let u=0;u{d.diag.debug(\"@vercel/otel/otlp: onSuccess\",c.status,c.statusText),t(),c.arrayBuffer().catch(()=>{})}).catch(c=>{d.diag.error(\"@vercel/otel/otlp: onError\",c),n(c)}).finally(()=>{let c=this._sendingPromises.indexOf(u);this._sendingPromises.splice(c,1)});this._sendingPromises.push(u)}getDefaultUrl(e){throw new Error(\"Method not implemented.\")}};var tO=\"v1/traces\",rO=`http://localhost:4318/${tO}`;function Is(r){return typeof r.url==\"string\"?r.url:rO}var rr=class{constructor(e={}){this.impl=new Wu(e)}export(e,t){this.impl.export(e,t)}shutdown(){return this.impl.shutdown()}forceFlush(){return this.impl.forceFlush()}},Wu=class extends tr{convert(e){return(0,kp.createExportTraceServiceRequest)(e,{useHex:!0,useLongBits:!1})}toMessage(e){return{body:JSON.stringify(e),contentType:\"application/json\"}}getDefaultUrl(e){return Is(e)}};var $h=Y(ys(),1);var jh=Y(Hh(),1);function Fh(r){let e=new jh.Writer;return _O(r,e),e.finish()}function _O(r,e){if(r.resourceSpans!=null&&r.resourceSpans.length)for(let t=0;t[^{}]+)\\}/g,(t,n)=>{let i=e[n];return i!==void 0?String(i):t})}var sr=class{constructor(e={}){this.instrumentationName=\"@vercel/otel/fetch\";this.instrumentationVersion=\"1.0.0\";this.config=e}getConfig(){return this.config}setConfig(){}setTracerProvider(e){this.tracerProvider=e}setMeterProvider(){}shouldIgnore(e,t){let n=this.config.ignoreUrls??[];if(t?.opentelemetry?.ignore!==void 0)return t.opentelemetry.ignore;if(n.length===0)return!1;let i=e.toString();return n.some(s=>typeof s==\"string\"?s===\"*\"?!0:i.startsWith(s):s.test(i))}shouldPropagate(e,t){let n=process.env.VERCEL_URL||process.env.NEXT_PUBLIC_VERCEL_URL||null,i=process.env.VERCEL_BRANCH_URL||process.env.NEXT_PUBLIC_VERCEL_BRANCH_URL||null,s=this.config.propagateContextUrls??[],o=this.config.dontPropagateContextUrls??[];if(t?.opentelemetry?.propagateContext)return t.opentelemetry.propagateContext;let a=e.toString();return o.length>0&&o.some(u=>typeof u==\"string\"?u===\"*\"?!0:a.startsWith(u):u.test(a))?!1:n&&e.protocol===\"https:\"&&(e.host===n||e.host===i||e.host===se()?.headers.host)||!n&&e.protocol===\"http:\"&&e.hostname===\"localhost\"?!0:s.some(u=>typeof u==\"string\"?u===\"*\"?!0:a.startsWith(u):u.test(a))}startSpan({tracer:e,url:t,fetchType:n,method:i=\"GET\",name:s,attributes:o={}}){let a=this.config.resourceNameTemplate,u={[lp]:i,[dp]:t.toString(),[Os]:t.host,[_p]:t.protocol.replace(\":\",\"\"),[fp]:t.hostname,[hp]:t.port},c=a?Xh(a,u):PO(t.toString()),_=s??`${n} ${i} ${t.toString()}`,p=d.context.active();return e.startSpan(_,{kind:d.SpanKind.CLIENT,attributes:{...u,\"operation.name\":`${n}.${i}`,\"http.client.name\":n,\"resource.name\":c,...o}},p)}instrumentHttp(e,t){let{tracerProvider:n}=this;if(!n)return;let i=n.getTracer(this.instrumentationName,this.instrumentationVersion),{attributesFromRequestHeaders:s,attributesFromResponseHeaders:o}=this.config,a=e.request,u=e.get,c=_=>(p,f,M)=>{let R,w={},U;if(typeof p==\"string\"||p instanceof URL?(R=new URL(p.toString()),typeof f==\"function\"?U=f:f&&typeof M==\"function\"?(w=f,U=M):f&&(w=f)):(w=p,typeof f==\"function\"&&(U=f),R=vO(w,t)),this.shouldIgnore(R))return _.apply(this,[R,w,U]);let S=this.startSpan({tracer:i,url:R,fetchType:\"http\",method:w.method||\"GET\"});if(!S.isRecording()||!er(S.spanContext().traceFlags))return S.end(),_.apply(this,[R,w,U]);if(this.shouldPropagate(R)){let Te=d.context.active(),Se=d.trace.setSpan(Te,S);d.propagation.inject(Se,w.headers||{},bO)}s&&ws(S,s,w.headers||{},Kh);try{let Te=Date.now(),Se=_.apply(this,[R,w,U]);return Se.prependListener(\"response\",K=>{let pt=Date.now()-Te;S.setAttribute(\"http.response_time\",pt),K.statusCode!==void 0?(S.setAttribute(Uu,K.statusCode),K.statusCode>=500&&_t(S,`Status: ${K.statusCode}`)):_t(S,\"Response status code is undefined\"),o&&ws(S,o,K.headers,Kh),Se.listenerCount(\"response\")<=1&&K.resume(),K.on(\"end\",()=>{let $r,Hs=K.statusCode;K.aborted&&!K.complete?$r={code:d.SpanStatusCode.ERROR}:Hs&&Hs>=100&&Hs<500?$r={code:d.SpanStatusCode.UNSET}:$r={code:d.SpanStatusCode.ERROR},S.setStatus($r),S.isRecording()&&(K.headers[\"content-length\"]&&S.setAttribute(Bu,K.headers[\"content-length\"]),S.end())})}),Se.on(\"error\",K=>{S.isRecording()&&(_t(S,K),S.end())}),Se.on(\"close\",()=>{S.isRecording()&&S.end()}),Se}catch(Te){throw _t(S,Te),S.end(),Te}};e.request=c(a),e.get=c(u)}instrumentFetch(){let{tracerProvider:e}=this;if(!e)return;let t=e.getTracer(this.instrumentationName,this.instrumentationVersion),{attributesFromRequestHeaders:n,attributesFromResponseHeaders:i}=this.config;process.env.NEXT_OTEL_FETCH_DISABLED=\"1\";let s=globalThis.fetch;this.originalFetch=s;let o=async(a,u)=>{let c=u;if(c?.next?.internal)return s(a,c);let _=new Request(a instanceof Request?a.clone():a,c),p=new URL(_.url);if(this.shouldIgnore(p,c))return s(a,c);let f=this.startSpan({tracer:t,url:p,fetchType:\"fetch\",method:_.method,name:c?.opentelemetry?.spanName,attributes:c?.opentelemetry?.attributes});if(!f.isRecording()||!er(f.spanContext().traceFlags))return f.end(),s(a,c);if(this.shouldPropagate(p,c)){let M=d.context.active(),R=d.trace.setSpan(M,f);d.propagation.inject(R,_.headers,RO)}n&&ws(f,n,_.headers,Wh);try{let M=Date.now();c?.body&&c.body instanceof FormData&&_.headers.delete(\"content-type\");let R=await s(a,{...c,headers:_.headers}),w=Date.now()-M;return f.setAttribute(Uu,R.status),f.setAttribute(\"http.response_time\",w),i&&ws(f,i,R.headers,Wh),R.status>=500&&_t(f,`Status: ${R.status} (${R.statusText})`),R.body?yO(R).then(U=>{f.isRecording()&&(f.setAttribute(Bu,U),f.end())},U=>{f.isRecording()&&(_t(f,U),f.end())}):f.end(),R}catch(M){throw _t(f,M),f.end(),M}};globalThis.fetch=o}enable(){this.disable(),this.instrumentFetch();try{let e=z(\"node:http\"),t=z(\"node:https\");this.instrumentHttp(e,\"http:\"),this.instrumentHttp(t,\"https:\")}catch{}}disable(){this.originalFetch&&(globalThis.fetch=this.originalFetch)}},RO={set(r,e,t){r.set(e,t)}},Wh={get(r,e){let t=r.get(e);if(t!==null)return t.includes(\",\")?t.split(\",\").map(n=>n.trimStart()):t},keys(r){let e=[];return r.forEach((t,n)=>{e.push(n)}),e}},bO={set(r,e,t){r[e.toLowerCase()]=t}},Kh={get(r,e){return r[e.toLowerCase()]},keys(r){return Object.keys(r)}};function PO(r){let e=r.indexOf(\"?\");return e===-1?r:r.substring(0,e)}function yO(r){let e=0,n=r.clone().body?.getReader();if(!n)return Promise.resolve(0);let i=()=>n.read().then(({done:s,value:o})=>{if(!s)return e+=o.byteLength,i()});return i().then(()=>e)}function _t(r,e){if(e instanceof Error)r.recordException(e),r.setStatus({code:d.SpanStatusCode.ERROR,message:e.message});else{let t=String(e);r.setStatus({code:d.SpanStatusCode.ERROR,message:t})}}function ws(r,e,t,n){for(let[i,s]of Object.entries(e)){let o=n.get(t,s);o!==void 0&&r.setAttribute(i,o)}}function vO(r,e){if(r.socketPath)throw new Error(\"Cannot construct a network URL: options.socketPath is specified, indicating a Unix domain socket.\");let t=r.protocol??e;t&&!t.endsWith(\":\")&&(t+=\":\");let n=r.hostname,i=r.port??r.defaultPort;if(!n&&r.host){let c=r.host.split(\":\");n=c[0];let _=c[1];if(c.length>1&&_&&i===void 0){let p=parseInt(_,10);isNaN(p)||(i=p)}}n||(n=\"localhost\");let s;if(i!==void 0&&i!==\"\"){let c=parseInt(String(i),10);isNaN(c)?s=t===\"https:\"?443:80:s=c}else s=t===\"https:\"?443:80;let o=r.path||\"/\",a=`${t}//${n}:${s}`,u=new URL(o,a);if(r.auth){let c=r.auth.split(\":\");u.username=decodeURIComponent(c[0]||\"\"),c.length>1&&(u.password=decodeURIComponent(c[1]||\"\"))}return u}h();var zh=Y(A(),1),IO=\"00\",uc=\"traceparent\",cc=\"tracestate\",jr=class{fields(){return[uc,cc]}inject(e,t,n){let i=d.trace.getSpanContext(e);if(!i||(0,zh.isTracingSuppressed)(e)||!(0,d.isSpanContextValid)(i))return;let s=`${IO}-${i.traceId}-${i.spanId}-0${Number(i.traceFlags||0).toString(16)}`;n.set(t,uc,s),i.traceState&&n.set(t,cc,i.traceState.serialize())}extract(e,t,n){let i=n.get(t,uc);if(!i)return e;let s=Array.isArray(i)?i[0]:i;if(typeof s!=\"string\")return e;let o=MO(s);if(!o)return e;o.isRemote=!0;let a=n.get(t,cc);if(a){let u=Array.isArray(a)?a.join(\",\"):a;o.traceState=(0,d.createTraceState)(typeof u==\"string\"?u:void 0)}return d.trace.setSpanContext(e,o)}};function MO(r){let[e,t,n,i,s]=r.split(\"-\");return!e||!t||!n||!i||e.length!==2||t.length!==32||n.length!==16||i.length!==2||e===\"00\"&&s?null:{traceId:t,spanId:n,traceFlags:parseInt(i,16)}}h();var xs=class{fields(){return[]}inject(){}extract(e){let t=se();if(!t?.telemetry)return d.diag.warn(\"@vercel/otel: Vercel telemetry extension not found.\"),e;let{rootSpanContext:n}=t.telemetry;return n?(d.diag.debug(\"@vercel/otel: Extracted root SpanContext from Vercel request context.\",n),d.trace.setSpanContext(e,{...n,isRemote:!0,traceFlags:n.traceFlags||d.TraceFlags.SAMPLED})):e}};h();var Bs=Y(A(),1),ff=Y(hf(),1);var qs=class{export(e,t){let n=se();if(!n?.telemetry){d.diag.warn(\"@vercel/otel: no telemetry context found\"),t({code:Bs.ExportResultCode.SUCCESS,error:void 0});return}try{let i=(0,ff.createExportTraceServiceRequest)(e,{useHex:!0,useLongBits:!1});n.telemetry.reportSpans(i),t({code:Bs.ExportResultCode.SUCCESS,error:void 0})}catch(i){t({code:Bs.ExportResultCode.FAILED,error:i instanceof Error?i:new Error(String(i))})}}shutdown(){return Promise.resolve()}forceFlush(){return Promise.resolve()}};h();function dc(){return!!se()?.telemetry?.traceDrains?.length}var Ef=!1,kr=class{constructor(e){this.processor=e}forceFlush(){return this.processor.forceFlush()}shutdown(){return this.processor.shutdown()}onStart(e,t){if(dc()){Ef||(Ef=!0,d.diag.debug(\"@vercel/otel: skipping automatic exporter due to configured trace drains\"));return}this.processor.onStart(e,t)}onEnd(e){dc()||this.processor.onEnd(e)}};var KO={ALL:d.DiagLogLevel.ALL,VERBOSE:d.DiagLogLevel.VERBOSE,DEBUG:d.DiagLogLevel.DEBUG,INFO:d.DiagLogLevel.INFO,WARN:d.DiagLogLevel.WARN,ERROR:d.DiagLogLevel.ERROR,NONE:d.DiagLogLevel.NONE},Vs=class{constructor(e={}){this.configuration=e}start(){let e=zO(),t=this.configuration,n=\"nodejs\"||0,i=!!e.OTEL_SDK_DISABLED;if(process.env.OTEL_LOG_LEVEL&&d.diag.setLogger(new d.DiagConsoleLogger,{logLevel:KO[process.env.OTEL_LOG_LEVEL.toUpperCase()]}),i)return;let s=t.idGenerator??new C.RandomIdGenerator,o=t.contextManager??new Of.AsyncLocalStorageContextManager;o.enable(),this.contextManager=o;let a=e.OTEL_SERVICE_NAME||t.serviceName||\"app\",u=new lr.Resource(vp({attributes:t.attributes,runtime:n,serviceName:a})),c=t.resourceDetectors??[lr.envDetectorSync];if(t.autoDetectResources??!0){let S={detectors:c};u=u.merge((0,lr.detectResourcesSync)(S))}let p=QO(t.propagators,t,e),f=ZO(t.traceSampler,e),M=JO(t.spanProcessors,t,e);M.length===0&&d.diag.warn(\"@vercel/otel: No span processors configured. No spans will be exported.\");let R=t.spanLimits,w=new C.BasicTracerProvider({resource:u,idGenerator:s,sampler:f,spanLimits:R});if(w.addSpanProcessor(new Rs(M,t.attributesFromHeaders)),w.register({contextManager:o,propagator:new He.CompositePropagator({propagators:p})}),this.tracerProvider=w,t.logRecordProcessor){let S=new Sf.LoggerProvider({resource:u});this.loggerProvider=S,S.addLogRecordProcessor(t.logRecordProcessor),st.logs.setGlobalLoggerProvider(S)}if(t.metricReader||t.views){let S=new Af.MeterProvider({resource:u,views:t.views??[]});t.metricReader&&S.addMetricReader(t.metricReader),d.metrics.setGlobalMeterProvider(S),this.meterProvider=S}let U=YO(t.instrumentations,t.instrumentationConfig);this.disableInstrumentations=(0,Tf.registerInstrumentations)({instrumentations:U}),d.diag.info(\"@vercel/otel: started\",a,n)}async shutdown(){let e=[];this.tracerProvider&&e.push(this.tracerProvider.shutdown()),this.loggerProvider&&e.push(this.loggerProvider.shutdown()),this.meterProvider&&e.push(this.meterProvider.shutdown()),d.diag.info(\"@vercel/otel: shutting down\",e.length,\"nodejs\"),await Promise.all(e),this.contextManager&&this.contextManager.disable();let{disableInstrumentations:t}=this;t&&t()}};function zO(){let r=(0,Gs.parseEnvironment)(process.env);return{...Gs.DEFAULT_ENVIRONMENT,...r}}function YO(r,e){return(r??[\"auto\"]).map(t=>t===\"auto\"?(d.diag.debug(\"@vercel/otel: Configure instrumentations: fetch\",e?.fetch),[new sr(e?.fetch)]):t===\"fetch\"?(d.diag.debug(\"@vercel/otel: Configure instrumentations: fetch\",e?.fetch),new sr(e?.fetch)):t).flat()}function QO(r,e,t){let n=process.env.OTEL_PROPAGATORS&&t.OTEL_PROPAGATORS&&t.OTEL_PROPAGATORS.length>0?t.OTEL_PROPAGATORS:void 0;return(r??n??[\"auto\"]).map(i=>{if(i===\"none\")return[];if(i===\"auto\"){let s=[];return s.push({name:\"tracecontext\",propagator:new jr}),s.push({name:\"baggage\",propagator:new He.W3CBaggagePropagator}),s.push({name:\"vercel-runtime\",propagator:new xs}),d.diag.debug(`@vercel/otel: Configure propagators: ${s.map(o=>o.name).join(\", \")}`),s.map(o=>o.propagator)}if(i===\"tracecontext\")return d.diag.debug(\"@vercel/otel: Configure propagator: tracecontext\"),new jr;if(i===\"baggage\")return d.diag.debug(\"@vercel/otel: Configure propagator: baggage\"),new He.W3CBaggagePropagator;if(typeof i==\"string\")throw new Error(`Unknown propagator: \"${i}\"`);return i}).flat()}var mf=\"always_on\",cr=1;function ZO(r,e){if(r&&typeof r!=\"string\")return r;let t=r&&r!==\"auto\"?r:e.OTEL_TRACES_SAMPLER||mf;switch(d.diag.debug(\"@vercel/otel: Configure sampler: \",t),t){case\"always_on\":return new C.AlwaysOnSampler;case\"always_off\":return new C.AlwaysOffSampler;case\"parentbased_always_on\":return new C.ParentBasedSampler({root:new C.AlwaysOnSampler});case\"parentbased_always_off\":return new C.ParentBasedSampler({root:new C.AlwaysOffSampler});case\"traceidratio\":return new C.TraceIdRatioBasedSampler(gf(e));case\"parentbased_traceidratio\":return new C.ParentBasedSampler({root:new C.TraceIdRatioBasedSampler(gf(e))});default:return d.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER value \"${String(e.OTEL_TRACES_SAMPLER)} invalid, defaulting to ${mf}\".`),new C.AlwaysOnSampler}}function gf(r){if(r.OTEL_TRACES_SAMPLER_ARG===void 0||r.OTEL_TRACES_SAMPLER_ARG===\"\")return d.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER_ARG is blank, defaulting to ${cr}.`),cr;d.diag.debug(\"@vercel/otel: Configure sampler probability: \",r.OTEL_TRACES_SAMPLER_ARG);let e=Number(r.OTEL_TRACES_SAMPLER_ARG);return isNaN(e)?(d.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER_ARG=${r.OTEL_TRACES_SAMPLER_ARG} was given, but it is invalid, defaulting to ${cr}.`),cr):e<0||e>1?(d.diag.error(`@vercel/otel: OTEL_TRACES_SAMPLER_ARG=${r.OTEL_TRACES_SAMPLER_ARG} was given, but it is out of range ([0..1]), defaulting to ${cr}.`),cr):e}function JO(r,e,t){return[...(r??[\"auto\"]).flatMap(n=>{if(n===\"auto\"){let i=[new C.BatchSpanProcessor(new qs)];if(process.env.VERCEL_OTEL_ENDPOINTS){let s=process.env.VERCEL_OTEL_ENDPOINTS_PORT||\"4318\",o=process.env.VERCEL_OTEL_ENDPOINTS_PROTOCOL||\"http/protobuf\";d.diag.debug(\"@vercel/otel: Configure vercel otel collector on port: \",s,o);let a={url:`http://localhost:${s}/v1/traces`,headers:{}},u=o===\"http/protobuf\"?new dt(a):new rr(a);i.push(new kr(new C.BatchSpanProcessor(u)))}else(!e.traceExporter||e.traceExporter===\"auto\"||t.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT||t.OTEL_EXPORTER_OTLP_ENDPOINT)&&i.push(new kr(new C.BatchSpanProcessor(eR(t))));return i}return n}).filter(nR),...e.traceExporter&&e.traceExporter!==\"auto\"?[new C.BatchSpanProcessor(e.traceExporter)]:[]]}function eR(r){let e=process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL??process.env.OTEL_EXPORTER_OTLP_PROTOCOL??\"http/protobuf\",t=rR(r),n={...He.baggageUtils.parseKeyPairsIntoRecord(r.OTEL_EXPORTER_OTLP_HEADERS),...He.baggageUtils.parseKeyPairsIntoRecord(r.OTEL_EXPORTER_OTLP_TRACES_HEADERS)};switch(d.diag.debug(\"@vercel/otel: Configure trace exporter: \",e,t,`headers: ${Object.keys(n).join(\",\")||\"\"}`),e){case\"http/json\":return new rr({url:t,headers:n});case\"http/protobuf\":return new dt({url:t,headers:n});default:return d.diag.warn(`@vercel/otel: Unsupported OTLP traces protocol: ${e}. Using http/protobuf.`),new dt}}var Rf=\"v1/traces\",tR=`http://localhost:4318/${Rf}`;function rR(r){let e=r.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT;if(e&&typeof e==\"string\")return e;let t=r.OTEL_EXPORTER_OTLP_ENDPOINT;return t&&typeof t==\"string\"?`${t}/${Rf}`:tR}function nR(r){return r!=null}function Jv(r){let e;r?typeof r==\"string\"?e={serviceName:r}:e=r:e={},new Vs(e).start()}\n//# sourceMappingURL=index.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGluc3RydW1lbnQpLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AdmVyY2VsK290ZWxAMS4xNC4xX0BvcGVudGVsZW1ldHJ5K2FwaS1sb2dzQDAuMjE1LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xX0BvcGVudGVsZW1ldHJ5K2lfY2c1azJueG9qcHUzMnZmM2dqZjdtZmU1emEvbm9kZV9tb2R1bGVzL0B2ZXJjZWwvb3RlbC9kaXN0L25vZGUvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQW9DO0FBQzRCO0FBQ3ZDO0FBQ3pCLGdCQUFnQixxREFBcUIsQ0FBQyw0T0FBZTtBQUNyRCxtQkFBbUIsa0RBQWEsQ0FBQyw0T0FBZTtBQUNoRCxrQkFBa0IseUNBQWM7QUFDaEMscUJBQXFCLDZCQUE2Qix1Q0FBdUMsa0NBQWtDLGdFQUFnRSxtRUFBbUUsNkNBQTZDLGlCQUFpQiwyREFBMkQsMkRBQTJELEVBQUUsb0NBQW9DLDJCQUEyQixXQUFXLHdCQUF3QixtQkFBbUIsZ0dBQWdHLG1EQUFtRCxFQUFFLFNBQVMsd0ZBQXdGLHlDQUF5QyxzQkFBc0IscUJBQXFCLGVBQWUsU0FBUyxLQUFLLFNBQStDLGNBQWMsS0FBSywrQ0FBRSxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsc0VBQXNFLCtGQUErRixlQUFlLHlCQUF5QixzQkFBc0IsZUFBZSx5QkFBeUIsd0JBQXdCLGVBQWUsMkJBQTJCLDBCQUEwQixFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLDJNQUEyTSxpQ0FBaUMsaUNBQWlDLEVBQUUsOEJBQThCLDJCQUEyQixtQ0FBbUMsd0NBQXdDLGdDQUFnQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJGQUEyRiwwQkFBMEIsZUFBZSx3QkFBd0IsU0FBUyxFQUFFLEVBQUUscUNBQXFDLEVBQUUsRUFBRSxFQUFFLGdEQUFnRCxLQUFLLHdCQUF3QixlQUFlLHVDQUF1QyxTQUFTLHNCQUFzQixHQUFHLDRCQUE0QixFQUFFLHlGQUF5RixFQUFFLGtCQUFrQixlQUFlLCtDQUErQyxzQkFBc0IsZ0JBQWdCLGFBQWEsK0NBQStDLGVBQWUsa0dBQWtHLHVHQUF1RywwQkFBMEIsd0JBQXdCLGVBQWUsMENBQTBDLGdJQUFnSSxFQUFFLDhCQUE4QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLCtCQUErQixtREFBbUQsY0FBYyxtQ0FBbUMsNENBQTRDLDRKQUE0Six5Q0FBeUMsZUFBZSx5RkFBeUYsZUFBZSxTQUFTLHNFQUFzRSxrQ0FBa0MsTUFBTSxPQUFPLGVBQWUsZ0RBQWdELCtGQUErRixTQUFTLDRCQUE0QiwyQkFBMkIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx3QkFBd0IsYUFBYSxpQkFBaUIsaUZBQWlGLE1BQU0seURBQXlELDZCQUE2QixvQkFBb0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxtRUFBbUUsa0JBQWtCLGVBQWUsU0FBUyx3Q0FBd0Msa0NBQWtDLFdBQVcsdUNBQXVDLEVBQUUsR0FBRyxTQUFTLFdBQVcscURBQXFELEVBQUUsR0FBRyxTQUFTLHVDQUF1QyxTQUFTLHlCQUF5QixlQUFlLHNDQUFzQyxxQkFBcUIsZUFBZSwrQ0FBK0MsdUJBQXVCLGVBQWUsTUFBTSwyQkFBMkIsT0FBTyxVQUFVLFdBQVcsU0FBUyxTQUFTLHlCQUF5QixTQUFTLGVBQWUsaUJBQWlCLGlEQUFpRCxVQUFVLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsOEJBQThCLGtCQUFrQixjQUFjLFdBQVcsc0JBQXNCLDBCQUEwQixlQUFlLGtEQUFrRCxlQUFlLFFBQVEsS0FBSyxLQUFLLFNBQVMsMkNBQTJDLGVBQWUsV0FBVyxvQkFBb0IsNkJBQTZCLFVBQVUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxzREFBc0QsNENBQTRDLGVBQWUsS0FBSyw0QkFBNEIsZUFBZSxJQUFJLE1BQU0sUUFBUSx5QkFBeUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw4QkFBOEIsT0FBTyxhQUFhLGlPQUFpTyx1REFBdUQsR0FBRyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHNCQUFzQixrSkFBa0osRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSw0T0FBNE8sa0VBQWtFLGVBQWUsd0JBQXdCLHd3QkFBd3dCLGVBQWUsd0JBQXdCLG9EQUFvRCxlQUFlLHdCQUF3QiwyQ0FBMkMsb0NBQW9DLG1EQUFtRCxrREFBa0QsdUJBQXVCLDIvRkFBMi9GLG1CQUFtQiwwQkFBMEIsbUJBQW1CLDhCQUE4QixnQ0FBZ0Msb0JBQW9CLG1CQUFtQiwwQ0FBMEMsd0JBQXdCLFdBQVcsdURBQXVELFFBQVEsK0xBQStMLG1CQUFtQixXQUFXLHVCQUF1QiwwQkFBMEIsbUJBQW1CLGVBQWUsU0FBUyxvQ0FBb0MsUUFBUSxVQUFVLCtCQUErQixNQUFNLDJCQUEyQix3QkFBd0Isd0JBQXdCLEtBQUssV0FBVywyQ0FBMkMsU0FBUyxzQkFBc0IsY0FBYyxtRkFBbUYsMkJBQTJCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsaUJBQWlCLHVCQUF1QixjQUFjLDJDQUEyQyxzQkFBc0IsdUJBQXVCLDJCQUEyQixhQUFhLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsc0JBQXNCLDZEQUE2RCxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHNCQUFzQixlQUFlLGlEQUFpRCwyQ0FBMkMsZUFBZSxNQUFNLGlFQUFpRSxRQUFRLFlBQVksV0FBVyxNQUFNLGtEQUFrRCx5QkFBeUIsNEJBQTRCLGtCQUFrQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDRCQUE0Qix3QkFBd0IsY0FBYyx5REFBeUQsd0JBQXdCLDhCQUE4QixlQUFlLGtCQUFrQixZQUFZLE1BQU0sa0RBQWtELFlBQVksZ0JBQWdCLHlCQUF5QixnQ0FBZ0MsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx3QkFBd0IsdUJBQXVCLGdDQUFnQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGtCQUFrQixvQkFBb0IsRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSxnWEFBZ1gsc0JBQXNCLDZsTEFBNmxMLGtCQUFrQix1MUJBQXUxQixxQ0FBcUMsK0xBQStMLHFCQUFxQixpRkFBaUYsK0JBQStCLDZDQUE2Qyw2QkFBNkIsaUVBQWlFLHNCQUFzQiwrRkFBK0YsK0JBQStCLG1GQUFtRixrQ0FBa0MsNlNBQTZTLG9CQUFvQixzRUFBc0Usa0NBQWtDLDZCQUE2Qiw0QkFBNEIscUNBQXFDLDJCQUEyQixzUUFBc1EscUJBQXFCLGlDQUFpQyxFQUFFLGNBQWMsYUFBYSxnRUFBZ0UsNkNBQTZDLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLDRCQUE0Qix3Q0FBd0MscUZBQXFGLHVDQUF1QyxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLHNLQUFzSyw4QkFBOEIsaTRGQUFpNEYsdUJBQXVCLGlFQUFpRSx1QkFBdUIsNmlCQUE2aUIsMEJBQTBCLDZCQUE2QixrQkFBa0IsNkZBQTZGLGdCQUFnQixxTEFBcUwsOEJBQThCLG1JQUFtSSxFQUFFLGNBQWMsYUFBYSxnRUFBZ0UsNkNBQTZDLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLDRCQUE0Qix3Q0FBd0MscUZBQXFGLHVDQUF1QyxTQUFTLEVBQUUsWUFBWSxFQUFFLGNBQWMsYUFBYSxnRUFBZ0UsNkNBQTZDLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLDRCQUE0Qix3Q0FBd0MscUZBQXFGLHVDQUF1QyxTQUFTLEVBQUUsWUFBWSxZQUFZLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsbUJBQW1CLG9CQUFvQixhQUFhLDZSQUE2UixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHFCQUFxQixlQUFlLFVBQVUsaUJBQWlCLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLEVBQUUsYUFBYSxhQUFhLHNDQUFzQyxTQUFTLEVBQUUsNk5BQTZOLDREQUE0RCxlQUFlLG1EQUFtRCxZQUFZLG9CQUFvQixjQUFjLGtDQUFrQyx1QkFBdUIsdUJBQXVCLGdDQUFnQyxTQUFTLG1CQUFtQixlQUFlLGlFQUFpRSxlQUFlLFlBQVksZUFBZSxrQkFBa0IsZ0RBQWdELDRDQUE0QyxzQ0FBc0MsdUJBQXVCLGlCQUFpQiw0QkFBNEIsK0JBQStCLG9CQUFvQixlQUFlLGNBQWMsY0FBYyxFQUFFLEtBQUssNEJBQTRCLDBEQUEwRCx1QkFBdUIsZUFBZSxvQkFBb0IseUJBQXlCLGVBQWUseUJBQXlCLDBCQUEwQixlQUFlLHlCQUF5QiwwQkFBMEIsZUFBZSxvRkFBb0YsdUJBQXVCLGVBQWUsb0RBQW9ELGlCQUFpQixpQkFBaUIsNEJBQTRCLHNDQUFzQyxnQkFBZ0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJCQUEyQixPQUFPLGFBQWEsZ0RBQWdELGlEQUFpRCxHQUFHLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsOEJBQThCLDJCQUEyQixnQkFBZ0IsRUFBRSxNQUFNLGdNQUFnTSxjQUFjLG1DQUFtQyxnQkFBZ0IsU0FBUyxzQ0FBc0MsbUJBQW1CLFNBQVMsVUFBVSxJQUFJLGVBQWUsd0NBQXdDLElBQUksd0JBQXdCLFNBQVMsc0NBQXNDLG1CQUFtQixTQUFTLFVBQVUsR0FBRyxTQUFTLElBQUksU0FBUyw4QkFBOEIsMEJBQTBCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsdUNBQXVDLGlDQUFpQyxJQUFJLE1BQU0sZ0JBQWdCLElBQUksTUFBTSxRQUFRLElBQUksS0FBSyx1QkFBdUIsR0FBRyxHQUFHLEdBQUcsZ0JBQWdCLE1BQU0saUJBQWlCLGVBQWUsa0JBQWtCLGtCQUFrQixlQUFlLCtCQUErQixvQkFBb0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxxQkFBcUIsa0RBQWtELGVBQWUsOENBQThDLFNBQVMsb0JBQW9CLHVGQUF1RixTQUFTLG9CQUFvQixvQ0FBb0MsT0FBTyxrQ0FBa0MsWUFBWSw0RUFBNEUsVUFBVSx1RUFBdUUsK0JBQStCLFdBQVcsMkNBQTJDLDJEQUEyRCxTQUFTLHVJQUF1SSxRQUFRLHdEQUF3RCxTQUFTLFlBQVkseURBQXlELGlCQUFpQixFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLGlHQUFpRyxrQ0FBa0Msb0NBQW9DLGtDQUFrQywrQkFBK0IsRUFBRSxhQUFhLEdBQUcsVUFBVSxHQUFHLGFBQWEsR0FBRyxVQUFVLEdBQUcsZUFBZSxFQUFFLHlCQUF5QixHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLGVBQWUsZUFBZSxpQkFBaUIsa0NBQWtDLHVEQUF1RCxzQkFBc0IsYUFBYSxjQUFjLGlDQUFpQywyRUFBMkUsU0FBUyxHQUFHLEdBQUcsVUFBVSxHQUFHLFNBQVMsSUFBSSxzREFBc0QsRUFBRSxzR0FBc0csZUFBZSxxQ0FBcUMsZUFBZSw4QkFBOEIsK0JBQStCLFlBQVksZUFBZSxjQUFjLG9DQUFvQyxNQUFNLHFDQUFxQyw0REFBNEQsb0NBQW9DLFNBQVMscURBQXFELCtCQUErQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMkVBQTJFLDhGQUE4RixhQUFhLGNBQWMsK0JBQStCLEdBQUcsaUJBQWlCLHdCQUF3QixxQkFBcUIsZUFBZSx5QkFBeUIsd0JBQXdCLGVBQWUsc0JBQXNCLHFCQUFxQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJCQUEyQiwyQkFBMkIsZUFBZSxPQUFPLHlDQUF5QyxXQUFXLDJCQUEyQix1QkFBdUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwwQkFBMEIsMkJBQTJCLGVBQWUsT0FBTyxpREFBaUQsV0FBVywwQkFBMEIsc0JBQXNCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNkJBQTZCLG1EQUFtRCxlQUFlLFlBQVksMmlCQUEyaUIsMEJBQTBCLGlDQUFpQyxrWEFBa1gsV0FBVyxtQkFBbUIsT0FBTyxzQkFBc0Isd0JBQXdCLHFDQUFxQywyQkFBMkIsd0NBQXdDLHVCQUF1QixvQ0FBb0MsMEJBQTBCLHdDQUF3QyxJQUFJLHlCQUF5QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG1DQUFtQywyQkFBMkIsaUJBQWlCLGlHQUFpRyxrQkFBa0IsT0FBTywrSUFBK0ksV0FBVyx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsY0FBYyxzREFBc0QsZUFBZSxRQUFRLFlBQVksYUFBYSxLQUFLLHdDQUF3QyxZQUFZLFdBQVcsK0JBQStCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsd0JBQXdCLDRQQUE0UCxpQkFBaUIsbUJBQW1CLGdCQUFnQixlQUFlLCtCQUErQixZQUFZLHFCQUFxQiw4Q0FBOEMsNkRBQTZELG9CQUFvQixlQUFlLG1DQUFtQyxlQUFlLGdFQUFnRSxlQUFlLGlDQUFpQyxJQUFJLGtCQUFrQixPQUFPLGlCQUFpQixxQ0FBcUMsZUFBZSxtQkFBbUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxnQkFBZ0Isa0JBQWtCLGtCQUFrQiw4QkFBOEIsS0FBSyxXQUFXLHVCQUF1QixTQUFTLFlBQVksZUFBZSx5QkFBeUIsdUJBQXVCLE1BQU0sWUFBWSxtQ0FBbUMsZUFBZSw0Q0FBNEMsSUFBSSxxQkFBcUIsZUFBZSxxQkFBcUIsdUJBQXVCLElBQUksS0FBSyxXQUFXLGdCQUFnQix3QkFBd0IscUJBQXFCLGtCQUFrQixJQUFJLHFCQUFxQix1QkFBdUIsSUFBSSxLQUFLLGtCQUFrQix5Q0FBeUMsS0FBSyxlQUFlLG9DQUFvQyxLQUFLLGlCQUFpQixrQ0FBa0MsUUFBUSxZQUFZLFVBQVUsWUFBWSx3QkFBd0IsdUJBQXVCLFNBQVMsVUFBVSxtQkFBbUIsc0JBQXNCLHVCQUF1QixJQUFJLEtBQUssV0FBVyxpQ0FBaUMsU0FBUyxlQUFlLHdCQUF3QixlQUFlLDRCQUE0QixlQUFlLGlEQUFpRCxlQUFlLG1JQUFtSSxpQkFBaUIsNkRBQTZELEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMENBQTBDLDZCQUE2QixlQUFlLG1EQUFtRCxtQkFBbUIsaUJBQWlCLGtDQUFrQyx3QkFBd0Isa0NBQWtDLElBQUksRUFBRSwyREFBMkQsd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUscUNBQXFDLGlCQUFpQiw2Q0FBNkMsaUJBQWlCLGlCQUFpQixlQUFlLG1DQUFtQyxTQUFTLG1CQUFtQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG9CQUFvQixlQUFlLDhHQUE4RyxnQkFBZ0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLGtDQUFrQywrQkFBK0IsRUFBRSxjQUFjLHFCQUFxQixXQUFXLGlCQUFpQixVQUFVLGtCQUFrQixlQUFlLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUseUJBQXlCLHFCQUFxQixpQkFBaUIsK0VBQStFLGVBQWUsc0JBQXNCLGNBQWMsOEJBQThCLFdBQVcsb0JBQW9CLGtCQUFrQixJQUFJLHFIQUFxSCxTQUFTLDBCQUEwQixnQ0FBZ0MscUJBQXFCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsa0JBQWtCLDBCQUEwQixpQkFBaUIsdUJBQXVCLGlFQUFpRSxlQUFlLEtBQUssRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLFlBQVksYUFBYSw4REFBOEQsNkNBQTZDLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLDRCQUE0QixxQ0FBcUMscUZBQXFGLHNDQUFzQyxTQUFTLEVBQUUsaUNBQWlDLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxvQkFBb0IsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxZQUFZLFlBQVksb0JBQW9CLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNkJBQTZCLGtDQUFrQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGVBQWUsaURBQWlELG9DQUFvQyxrQkFBa0IsK0hBQStILDZCQUE2Qix1SUFBdUksaUJBQWlCLGtmQUFrZixjQUFjLHlCQUF5QixrQkFBa0IsOEZBQThGLEVBQUUscVRBQXFULEVBQUUsU0FBUyxpQkFBaUIsd0RBQXdELFlBQVksZ0JBQWdCLG1DQUFtQyxrSEFBa0gsMk1BQTJNLGtDQUFrQyx5QkFBeUIsbUVBQW1FLE9BQU8sYUFBYSxxREFBcUQsY0FBYyxtREFBbUQsT0FBTyx3QkFBd0IsaUJBQWlCLFdBQVcsRUFBRSwwQkFBMEIsR0FBRywwQkFBMEIsNENBQTRDLE9BQU8sOFZBQThWLFlBQVksNkZBQTZGLG9EQUFvRCw2REFBNkQsdUNBQXVDLGtFQUFrRSx1REFBdUQsK0RBQStELGNBQWMsd0JBQXdCLHFCQUFxQixTQUFTLDZlQUE2ZSxFQUFFLEdBQUcsZUFBZSxzQkFBc0IsWUFBWSxtQkFBbUIsNkJBQTZCLG9DQUFvQyx5QkFBeUIsZ0NBQWdDLHdCQUF3QiwrQkFBK0IsZUFBZSwrRUFBK0UsV0FBVywwQkFBMEIsWUFBWSwwQkFBMEIsZUFBZSwwQkFBMEIsbUNBQW1DLG1CQUFtQixzQ0FBc0MseUVBQXlFLEVBQUUsMklBQTJJLFdBQVcsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwyQkFBMkIsT0FBTyxhQUFhLHFHQUFxRyxpREFBaUQsR0FBRyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJCQUEyQixxQkFBcUIsZUFBZSxPQUFPLHlDQUF5QyxXQUFXLDJCQUEyQix1QkFBdUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwwQkFBMEIscUJBQXFCLGVBQWUsT0FBTyxpREFBaUQsV0FBVywwQkFBMEIsc0JBQXNCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNkJBQTZCLGtEQUFrRCxlQUFlLFlBQVksMmlCQUEyaUIsMEJBQTBCLGlDQUFpQyxrWEFBa1gsV0FBVyxtQkFBbUIsT0FBTyxzQkFBc0Isd0JBQXdCLHFDQUFxQywyQkFBMkIsd0NBQXdDLHVCQUF1QixvQ0FBb0MsMEJBQTBCLHdDQUF3QyxJQUFJLHlCQUF5QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG1DQUFtQyxtQ0FBbUMsaUJBQWlCLGlHQUFpRyxrQkFBa0IsT0FBTywrSUFBK0ksV0FBVyx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsY0FBYyxzREFBc0QsZUFBZSxRQUFRLFlBQVksYUFBYSxLQUFLLHdDQUF3QyxZQUFZLFdBQVcsK0JBQStCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsbURBQW1ELGlIQUFpSCxjQUFjLE9BQU8sMERBQTBELHlJQUF5SSxhQUFhLGliQUFpYix3QkFBd0IsOEJBQThCLDhCQUE4QixrRUFBa0Usb0VBQW9FLGlGQUFpRiw0QkFBNEIsRUFBRSxrRkFBa0YsNkJBQTZCLEVBQUUsc0ZBQXNGLHFGQUFxRiw0Q0FBNEMsRUFBRSwyREFBMkQsdUJBQXVCLHlCQUF5QixHQUFHLDZCQUE2QiwwQkFBMEIsZUFBZSw4SUFBOEksR0FBRyxPQUFPLHdDQUF3QywwREFBMEQsMkJBQTJCLDhDQUE4QyxHQUFHLDJEQUEyRCwyQkFBMkIsNERBQTRELEdBQUcsV0FBVyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJDQUEyQyxtQkFBbUIsZUFBZSxPQUFPLHFDQUFxQyxnREFBZ0QsUUFBUSx1Q0FBdUMsb0NBQW9DLCtCQUErQiw4QkFBOEIsSUFBSSxrQkFBa0IsZUFBZSw0QkFBNEIsc0JBQXNCLGdEQUFnRCw0dkJBQTR2QixJQUFJLGFBQWEsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxpQ0FBaUMsa0NBQWtDLGlCQUFpQix1RkFBdUYsc0JBQXNCLHF1QkFBcXVCLGFBQWEsK0VBQStFLGNBQWMsU0FBUyxvR0FBb0csV0FBVyxpQ0FBaUMsWUFBWSxvSEFBb0gsZ0JBQWdCLG1EQUFtRCw2R0FBNkcsT0FBTyxvREFBb0QseUJBQXlCLG9IQUFvSCxZQUFZLDJCQUEyQiwwRUFBMEUsZ0JBQWdCLElBQUksa0NBQWtDLHlCQUF5QixJQUFJLFdBQVcsRUFBRSxpQkFBaUIsK0ZBQStGLHNCQUFzQix3QkFBd0IsNEJBQTRCLGlFQUFpRSwrRkFBK0YsTUFBTSxpSkFBaUosNkRBQTZELHVDQUF1QyxNQUFNLHVFQUF1RSxjQUFjLGtDQUFrQyxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsNEJBQTRCLFdBQVcscURBQXFELGdHQUFnRyxZQUFZLGtEQUFrRCxHQUFHLG1FQUFtRSxrSEFBa0gsY0FBYyx1RUFBdUUsNkJBQTZCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNkJBQTZCLHVEQUF1RCxnQkFBZ0IseUJBQXlCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNEJBQTRCLHdCQUF3QixjQUFjLHlEQUF5RCx3QkFBd0IsOEJBQThCLGVBQWUsa0JBQWtCLFlBQVksTUFBTSxrREFBa0QsWUFBWSxnQkFBZ0IseUJBQXlCLGdDQUFnQyxFQUFFLGNBQWMsYUFBYSxnRUFBZ0UsNkNBQTZDLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLDRCQUE0Qix3Q0FBd0MscUZBQXFGLHVDQUF1QyxTQUFTLEVBQUUsWUFBWSxZQUFZLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsaUJBQWlCLHlEQUF5RCxtQkFBbUIsdUJBQXVCLDRCQUE0QiwyTUFBMk0sZ0JBQWdCLHVCQUF1QixVQUFVLGtDQUFrQyx5QkFBeUIsd0pBQXdKLGtFQUFrRSxpSEFBaUgsNEdBQTRHLHVFQUF1RSx1RkFBdUYsMENBQTBDLG9HQUFvRyw4Q0FBOEMsK0pBQStKLGdFQUFnRSw0REFBNEQseUJBQXlCLFVBQVUsNkJBQTZCLHNFQUFzRSwyRUFBMkUsb0NBQW9DLG1CQUFtQiwyQkFBMkIsZ0JBQWdCLHdCQUF3Qix5QkFBeUIsdURBQXVELGFBQWEsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw2QkFBNkIsY0FBYyx5QkFBeUIsY0FBYyxFQUFFLHlCQUF5QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHlDQUF5QyxXQUFXLFVBQVUsd0JBQXdCLHdCQUF3Qix3QkFBd0IsbUJBQW1CLG9CQUFvQixXQUFXLFVBQVUsNEJBQTRCLDRCQUE0QixtQkFBbUIsb0JBQW9CLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsb0JBQW9CLHVDQUF1QyxtQ0FBbUMsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx1QkFBdUIsMEJBQTBCLG9CQUFvQixJQUFJO0FBQ25rNkQseUNBQXlDLGVBQWUsdUJBQXVCLHdDQUF3QyxTQUFTLDJDQUEyQyxFQUFFLEdBQUcsU0FBUyxtQkFBbUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx1QkFBdUIsNkJBQTZCLG9CQUFvQixxREFBcUQsbUJBQW1CLHFDQUFxQyxnQkFBZ0IsVUFBVSxTQUFTLDJDQUEyQyxFQUFFLEdBQUcsU0FBUyxtQkFBbUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx1QkFBdUIscUNBQXFDLG9CQUFvQixJQUFJLGlEQUFpRCxnQkFBZ0IsVUFBVSxTQUFTLDJDQUEyQyxFQUFFLEdBQUcsSUFBSSwwRUFBMEUsU0FBUywyQ0FBMkMsRUFBRSxHQUFHLFNBQVMsbUJBQW1CLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsdUJBQXVCLDBDQUEwQyxvQkFBb0IsbUhBQW1ILDhGQUE4RixJQUFJLGdDQUFnQyxHQUFHLEVBQUUsRUFBRSwyQkFBMkIsbUNBQW1DLFNBQVMsMkNBQTJDLEVBQUUsR0FBRyxTQUFTLG1CQUFtQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHVCQUF1QixrQkFBa0Isb0JBQW9CLDJFQUEyRSxtQkFBbUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx1QkFBdUIsdUJBQXVCLG1CQUFtQixvQkFBb0Isa0RBQWtELE1BQU0saURBQWlELE1BQU0sbURBQW1ELE1BQU0saURBQWlELE1BQU0sOENBQThDLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMkJBQTJCLHdEQUF3RCxVQUFVLE9BQU8sMklBQTJJLHFEQUFxRCxzQkFBc0IscUNBQXFDLFNBQVMseURBQXlELElBQUksMkJBQTJCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsdUJBQXVCLHFCQUFxQixVQUFVLHdEQUF3RCx1QkFBdUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx5QkFBeUIsZ0RBQWdELFVBQVUsT0FBTyw2SUFBNkksNEJBQTRCLHlCQUF5QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHFCQUFxQixxQkFBcUIsVUFBVSxzREFBc0QscUJBQXFCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsOEJBQThCLHNEQUFzRCxVQUFVLE9BQU8sOGdCQUE4Z0IsMEZBQTBGLElBQUksb0JBQW9CLDBEQUEwRCxTQUFTLGdEQUFnRCxFQUFFLEdBQUcsNEJBQTRCLDhCQUE4QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDBCQUEwQixxQkFBcUIsVUFBVSwyREFBMkQsMEJBQTBCLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsbUJBQW1CLG9EQUFvRCxpQkFBaUIsTUFBTSx3SEFBd0gsMkVBQTJFLGtLQUFrSyxHQUFHLGVBQWUsZUFBZSxpQkFBaUIsY0FBYywwYUFBMGEsRUFBRSxpQkFBaUIsTUFBTSxnS0FBZ0ssK0JBQStCLGdFQUFnRSxTQUFTLE1BQU0sa0JBQWtCLG9DQUFvQyxnRkFBZ0YsNkVBQTZFLDJGQUEyRixNQUFNLGlFQUFpRSxzRkFBc0YsRUFBRSxvQkFBb0IsZUFBZSxrQkFBa0IsRUFBRSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDBCQUEwQixxQkFBcUIsVUFBVSwyREFBMkQsMEJBQTBCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMEJBQTBCLGtEQUFrRCxjQUFjLG1WQUFtVixVQUFVLFFBQVEsc0VBQXNFLFNBQVMsdUNBQXVDLG1CQUFtQixTQUFTLHFDQUFxQyxVQUFVLEdBQUcsK0VBQStFLDRCQUE0QixlQUFlLFFBQVEscUNBQXFDLGdCQUFnQixpREFBaUQseUJBQXlCLFdBQVcsK0dBQStHLGtDQUFrQyxHQUFHLHdEQUF3RCxrQ0FBa0MsR0FBRywyQkFBMkIsU0FBUyxZQUFZLGlFQUFpRSx5QkFBeUIsWUFBWSxXQUFXLEtBQUssc0JBQXNCLGdEQUFnRCxTQUFTLHVCQUF1QixzQ0FBc0MsMEJBQTBCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsc0JBQXNCLHFCQUFxQixVQUFVLHVEQUF1RCxzQkFBc0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw4QkFBOEIsMkNBQTJDLFVBQVUsc0RBQXNELE9BQU8sc05BQXNOLHdDQUF3Qyw0QkFBNEIsZ05BQWdOLE9BQU8sOEJBQThCLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLFlBQVksWUFBWSxZQUFZLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsd0JBQXdCLGtFQUFrRSxvQkFBb0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxpREFBaUQsK0NBQStDLElBQUksd0RBQXdELElBQUksd0JBQXdCLHdCQUF3QixvQkFBb0Isc0JBQXNCLFNBQVMsd0JBQXdCLG9CQUFvQixVQUFVLFVBQVUsd0JBQXdCLEdBQUcsOERBQThELHNCQUFzQixZQUFZLElBQUksTUFBTSx3REFBd0QsSUFBSSxvQkFBb0IsNEJBQTRCLG9DQUFvQyxvQkFBb0IsTUFBTSxTQUFTLHFGQUFxRixvQkFBb0Isc0NBQXNDLG9CQUFvQixzQkFBc0IsU0FBUyx3QkFBd0Isb0JBQW9CLFVBQVUsVUFBVSx3QkFBd0Isb0RBQW9ELHNFQUFzRSxNQUFNLEtBQUssMEJBQTBCLFdBQVcsY0FBYyx1Q0FBdUMsMENBQTBDLG9CQUFvQixHQUFHLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksWUFBWSxZQUFZLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNkJBQTZCLG9CQUFvQixlQUFlLHVCQUF1QixhQUFhLFNBQVMseURBQXlELHVCQUF1Qix5QkFBeUIsSUFBSSxZQUFZLHFGQUFxRixFQUFFLEVBQUUsYUFBYSxpREFBaUQsU0FBUyw2Q0FBNkMsV0FBVyxTQUFTLHVEQUF1RCwyQkFBMkIseUJBQXlCLElBQUksSUFBSSxJQUFJLHlCQUF5QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDRCQUE0QixhQUFhLGNBQWMsVUFBVSxXQUFXLHlCQUF5QixhQUFhLDJCQUEyQix3QkFBd0IsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxpREFBaUQsb0ZBQW9GLGFBQWEsd0dBQXdHLCtDQUErQyxHQUFHLGFBQWEsZ0JBQWdCLEVBQUUsTUFBTSx3REFBd0QscUJBQXFCLHlEQUF5RCw0SkFBNEosSUFBSSx1QkFBdUIsRUFBRSxtQ0FBbUMsZUFBZSxtQ0FBbUMsMkJBQTJCLHVEQUF1RCxpQkFBaUIsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLGlCQUFpQixFQUFFLGdFQUFnRSx3Q0FBd0MsMENBQTBDLG9CQUFvQiw0UkFBNFIseUJBQXlCLGdDQUFnQyxhQUFhLEVBQUUsa1BBQWtQLGFBQWEsbUdBQW1HLHdCQUF3Qix5RUFBeUUsR0FBRyxtQkFBbUIsSUFBSSx5QkFBeUIscURBQXFELFlBQVksZ0NBQWdDLEVBQUUsR0FBRywyQkFBMkIsd0JBQXdCLG1DQUFtQyxvQkFBb0IsbUJBQW1CLEVBQUUsV0FBVywyQ0FBMkMsa0JBQWtCLE1BQU0sdUZBQXVGLG9CQUFvQixNQUFNLHFGQUFxRiwwQkFBMEIsd0VBQXdFLDZCQUE2QixzQ0FBc0MsRUFBRSw2REFBNkQscUNBQXFDLHFFQUFxRSxjQUFjLEVBQUUsd0JBQXdCLDJDQUEyQyw2QkFBNkIsK0JBQStCLHFDQUFxQyxFQUFFLCtEQUErRCwwQkFBMEIsdUlBQXVJLGdDQUFnQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDhCQUE4QixvQkFBb0IsWUFBWSw0QkFBNEIsV0FBVyw2Q0FBNkMsYUFBYSx5QkFBeUIsZUFBZSxNQUFNLE9BQU8sdVdBQXVXLGdCQUFnQixnREFBZ0QsUUFBUSxFQUFFLGVBQWUsaUNBQWlDLElBQUksMEJBQTBCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsK0JBQStCLG9CQUFvQixjQUFjLHdDQUF3QyxZQUFZLDJCQUEyQiw2RUFBNkUsRUFBRSxpREFBaUQsaUNBQWlDLEtBQUssV0FBVyxpRUFBaUUsYUFBYSx5QkFBeUIsUUFBUSx1QkFBdUIsbUJBQW1CLDZCQUE2QiwyQkFBMkIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDhCQUE4QixrQ0FBa0MsZUFBZSwrR0FBK0csbUJBQW1CLG9IQUFvSCxjQUFjLFNBQVMsUUFBUSwyRkFBMkYsMkRBQTJELE1BQU0sOEpBQThKLEVBQUUsS0FBSyxZQUFZLDZCQUE2QixFQUFFLHNDQUFzQywrS0FBK0ssd0NBQXdDLFNBQVMsV0FBVyxpQ0FBaUMsWUFBWSxtQ0FBbUMsMEJBQTBCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxFQUFFLGFBQWEsYUFBYSw4REFBOEQsNkNBQTZDLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLDRCQUE0QixxQ0FBcUMscUZBQXFGLHNDQUFzQyxTQUFTLEVBQUUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxVQUFVLFVBQVUsVUFBVSxFQUFFLFVBQXFELGVBQWUsTUFBTSxvREFBRSxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsMkZBQTJGLGtCQUFrQixTQUFTLHVCQUF1QixJQUFJLEtBQUssV0FBVyxxQkFBcUIsWUFBWSwrQkFBK0IseUVBQXlFLE9BQU8sb0JBQW9CLGtDQUFrQyxtQkFBbUIsdUJBQXVCLElBQUksS0FBSyxXQUFXLHNGQUFzRiw2QkFBNkIsZUFBZSwwQkFBMEIsOEJBQThCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsbUNBQW1DLDBCQUEwQixlQUFlLElBQUksbUJBQW1CLDBKQUEwSixnREFBZ0QsbUNBQW1DLCtCQUErQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG9CQUFvQixnREFBZ0QsbUJBQW1CLGtCQUFrQixpREFBaUQsSUFBSSxzRkFBc0YsV0FBVyxnQkFBZ0Isb0dBQW9HLGlDQUFpQyxrREFBa0QseUtBQXlLLG9CQUFvQixvREFBb0QsbUJBQW1CLDBCQUEwQixzQkFBc0Isc0RBQXNELHFCQUFxQiw0QkFBNEIsWUFBWSw0Q0FBNEMsV0FBVyxrQkFBa0IsNkJBQTZCLHFFQUFxRSxrQkFBa0IsMkdBQTJHLEVBQUUsOEpBQThKLEVBQUUsd1JBQXdSLGlCQUFpQix3REFBd0QsWUFBWSxXQUFXLHdCQUF3QixxQkFBcUIsa0NBQWtDLG1CQUFtQixnQ0FBZ0MsZ0JBQWdCLG9CQUFvQixtQkFBbUIsc0RBQXNELHlFQUF5RSxFQUFFLHlJQUF5SSwwQkFBMEIsc0NBQXNDLHVCQUF1QixnSEFBZ0gsZ0JBQWdCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsaUJBQWlCLG1DQUFtQyxpQkFBaUIsZ0RBQWdELFFBQVEsbUhBQW1ILFVBQVUsS0FBSyxrRUFBa0UsYUFBYSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGlEQUFpRCxXQUFXLGNBQWMsT0FBTyw2Q0FBNkMsK0pBQStKLHlCQUF5Qix3QkFBd0IsZUFBZSxnQkFBZ0IscUNBQXFDLE9BQU8sc2RBQXNkLHdCQUF3QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGtDQUFrQyxvQkFBb0IsaUJBQWlCLGlEQUFpRCxtQkFBbUIsbUNBQW1DLG9GQUFvRixZQUFZLDBDQUEwQyxpQkFBaUIsMERBQTBELDhCQUE4QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGlDQUFpQyxhQUFhLGFBQWEseUJBQXlCLGFBQWEsV0FBVywyQkFBMkIsNkJBQTZCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsb0NBQW9DLHFCQUFxQixtQkFBbUIsc0xBQXNMLGdDQUFnQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGdEQUFnRCxpRkFBaUYsaUNBQWlDLGFBQWEsZ0JBQWdCLEVBQUUsSUFBSSw2RUFBNkUsZ0JBQWdCLCtCQUErQixrSkFBa0osaUJBQWlCLHVIQUF1SCx3RUFBd0UscUNBQXFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsaUJBQWlCLEVBQUUsd0ZBQXdGLHdDQUF3QyxzREFBc0QseUJBQXlCLHNaQUFzWixhQUFhLDRMQUE0TCxXQUFXLDhKQUE4SixZQUFZLHNEQUFzRCxxQkFBcUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxtQ0FBbUMsMkJBQTJCLFlBQVksMEJBQTBCLFdBQVcseUJBQXlCLGVBQWUsVUFBVSxPQUFPLCtVQUErVSxxQkFBcUIsZ0RBQWdELFFBQVEsRUFBRSxLQUFLLGlDQUFpQyxJQUFJLCtCQUErQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG1DQUFtQyxvQkFBb0IsZUFBZSwrRUFBK0UsVUFBVSwyREFBMkQsTUFBTSx5Q0FBeUMsbUlBQW1JLEVBQUUsS0FBSyxRQUFRLEVBQUUsYUFBYSx5QkFBeUIsV0FBVyxpQ0FBaUMsWUFBWSxtQ0FBbUMsK0JBQStCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsb0NBQW9DLG9CQUFvQixjQUFjLDZDQUE2QyxZQUFZLDJCQUEyQiw2RUFBNkUsRUFBRSx1Q0FBdUMsaUNBQWlDLEVBQUUsV0FBVyx1REFBdUQsd0JBQXdCLGdDQUFnQyxRQUFRLDhCQUE4QixnQ0FBZ0MsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxzQ0FBc0Msa0NBQWtDLGlCQUFpQixZQUFZLDZDQUE2QyxzQkFBc0IsNnJCQUE2ckIsVUFBVSxrREFBa0QsYUFBYSwrRUFBK0UsV0FBVyxpQ0FBaUMsa0JBQWtCLHlFQUF5RSxnQkFBZ0IsZ0hBQWdILFlBQVksMkJBQTJCLCtFQUErRSxZQUFZLElBQUksa0NBQWtDLHlCQUF5QixJQUFJLFdBQVcsRUFBRSxpQkFBaUIsb0dBQW9HLG1KQUFtSixFQUFFLG1CQUFtQixtREFBbUQsZ0NBQWdDLGdGQUFnRixZQUFZLDZCQUE2QixFQUFFLDZEQUE2RCxjQUFjLHFFQUFxRSxXQUFXLDJCQUEyQiw0QkFBNEIsTUFBTSx5Q0FBeUMsOEdBQThHLEVBQUUsS0FBSyxPQUFPLEtBQUssRUFBRSxJQUFJLGtDQUFrQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGtDQUFrQyw0REFBNEQsZ0JBQWdCLDhCQUE4QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGtDQUFrQyxZQUFZLG9EQUFvRCw2QkFBNkIsbUNBQW1DLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxrQ0FBa0MsWUFBWSxvREFBb0QsNkJBQTZCLG1DQUFtQyxFQUFFLEVBQUUsYUFBYSxhQUFhLHNDQUFzQyxTQUFTLEVBQUUseUtBQXlLLFlBQVksMENBQTBDLDZCQUE2QiwwQkFBMEIsRUFBRSxZQUFZLHFDQUFxQyw2QkFBNkIscUJBQXFCLEVBQUUsWUFBWSxrREFBa0QsNkJBQTZCLGtDQUFrQyxFQUFFLFlBQVksb0RBQW9ELDZCQUE2QixvQ0FBb0MsRUFBRSxZQUFZLG9EQUFvRCw2QkFBNkIsb0NBQW9DLEVBQUUsWUFBWSxxREFBcUQsNkJBQTZCLHFDQUFxQyxFQUFFLFlBQVksbURBQW1ELDZCQUE2QixtQ0FBbUMsRUFBRSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGlDQUFpQyxPQUFPLGFBQWEsb0RBQW9ELDZEQUE2RCxHQUFHLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsd0JBQXdCLE9BQU8sYUFBYSx3SEFBd0gsMkNBQTJDLEdBQUcsRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSx5TkFBeU4sZUFBZSxlQUFlLGtCQUFrQixlQUFlLHFCQUFxQix1RUFBdUUsb0JBQW9CLGVBQWUsUUFBUSxTQUFTLE9BQU8sR0FBRyxzQ0FBc0MsR0FBRyx3Q0FBd0MsRUFBRSw0QkFBNEIsNkJBQTZCLGVBQWUsbURBQW1ELGtCQUFrQixpQkFBaUIsa0NBQWtDLHdCQUF3QixrQ0FBa0MsSUFBSSxFQUFFLDJEQUEyRCx3QkFBd0IsRUFBRSxxQkFBcUIscUJBQXFCLG1DQUFtQyxJQUFJLE9BQU8sa0NBQWtDLFNBQVMsT0FBTyw2QkFBNkIsR0FBRyx1QkFBdUIsZUFBZSw2QkFBNkIsd0NBQXdDLGlCQUFpQixTQUFTLHFCQUFxQixnQkFBZ0IsSUFBSSxhQUFhLGlCQUFpQiw0QkFBNEIscUNBQXFDLFNBQVMsZUFBZSxpQkFBaUIscUJBQXFCLEtBQUssTUFBTSxFQUFFLDBCQUEwQixrQkFBa0IsOEJBQThCLG9CQUFvQixpQkFBaUIseUNBQXlDLDJCQUEyQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHlCQUF5QixPQUFPLGFBQWEscUpBQXFKLDZDQUE2QyxHQUFHLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUseUJBQXlCLHFCQUFxQixjQUFjLGlDQUFpQyxzQkFBc0IsWUFBWSxXQUFXLHlCQUF5QixxQkFBcUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwwSUFBMEksNkJBQTZCLGFBQWEsME5BQTBOLDZDQUE2QyxHQUFHLG1CQUFtQixZQUFZLG9EQUFvRCxFQUFFLDZGQUE2RixnT0FBZ08saUNBQWlDLGlCQUFpQixRQUFRLE9BQU8sNEtBQTRLLHlDQUF5QyxpQkFBaUIsK0dBQStHLGlDQUFpQyw0QkFBNEIsTUFBTSxJQUFJLGVBQWUseUJBQXlCLGtCQUFrQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHVEQUF1RCxvQ0FBb0MsZUFBZSxtQkFBbUIsa0JBQWtCLFNBQVMsc0JBQXNCLDhDQUE4QyxhQUFhLDhCQUE4Qix5RUFBeUUsVUFBVSw2TEFBNkwsZ0RBQWdELHFDQUFxQyxnQkFBZ0IsaUJBQWlCLGVBQWUsdUJBQXVCLDRCQUE0QixhQUFhLGlCQUFpQiw4RUFBOEUsc0JBQXNCLHFEQUFxRCxXQUFXLHNHQUFzRyxZQUFZLFdBQVcsbUJBQW1CLGlCQUFpQixpT0FBaU8sU0FBUyx5Q0FBeUMsNEdBQTRHLEVBQUUsVUFBVSxzR0FBc0csWUFBWSxXQUFXLG1CQUFtQixtRUFBbUUsU0FBUyx5Q0FBeUMscUVBQXFFLEVBQUUsc0JBQXNCLE9BQU8sMEdBQTBHLHdLQUF3SyxPQUFPLG9EQUFvRCwrR0FBK0csS0FBSywwQkFBMEIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxrQkFBa0IsZUFBZSxrQ0FBa0Msa0VBQWtFLGFBQWEsdUJBQXVCLGFBQWEsa0hBQWtILFNBQVMsbUJBQW1CLG1CQUFtQixvQkFBb0IsTUFBTSxxQ0FBcUMsa0VBQWtFLHFCQUFxQiw0QkFBNEIscUJBQXFCLDRCQUE0QixPQUFPLFlBQVksY0FBYyx1QkFBdUIsbUJBQW1CLE1BQU0sMkJBQTJCLCtDQUErQyxPQUFPLHdCQUF3QixLQUFLLHVCQUF1QiwrQkFBK0IsTUFBTSxlQUFlLGFBQWEsZUFBZSxxREFBcUQsMEJBQTBCLGlCQUFpQixFQUFFLFVBQVUsWUFBWSxZQUFZLFNBQVMsc0NBQXNDLElBQUkscUVBQXFFLFFBQVEsZ0ZBQWdGLFVBQVUscUNBQXFDLDRQQUE0UCxxQkFBcUIsNkRBQTZELGNBQWMsZUFBZSxtQkFBbUIsZUFBZSxhQUFhLDJCQUEyQixXQUFXLHVCQUF1QixjQUFjLDJCQUEyQixtSEFBbUgsYUFBYSw0QkFBNEIsWUFBWSxJQUFJLEtBQUssd0JBQXdCLDZEQUE2RCxlQUFlLHNCQUFzQiwyQkFBMkIsZUFBZSxtQkFBbUIsZUFBZSx3REFBd0QsUUFBUSxrQ0FBa0MsRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSxxSEFBcUgsdUJBQXVCLHFDQUFxQyw0QkFBNEIseUJBQXlCLDhCQUE4QixlQUFlLHVDQUF1QyxzREFBc0Qsb0JBQW9CLGVBQWUsdUNBQXVDLGtCQUFrQixzQ0FBc0MsOEJBQThCLG9CQUFvQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHFDQUFxQyxpQkFBaUIsNEdBQTRHLFlBQVksZUFBZSwwREFBMEQsd0JBQXdCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsdUJBQXVCLDZCQUE2QixtQkFBbUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwwQkFBMEIscUNBQXFDLGVBQWUsZUFBZSxjQUFjLDZEQUE2RCwyRkFBMkYsd0JBQXdCLGlCQUFpQiwwQ0FBMEMsK0NBQStDLEdBQUcsK0JBQStCLEVBQUUsR0FBRywwQ0FBMEMsOENBQThDLEdBQUcsK0JBQStCLEVBQUUsR0FBRyxrQ0FBa0MsWUFBWSxzQ0FBc0MsK0JBQStCLDBDQUEwQyw0QkFBNEIsK0JBQStCLDJDQUEyQyxpQkFBaUIsc0NBQXNDLHNCQUFzQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJCQUEyQixxQ0FBcUMsZUFBZSxpR0FBaUcsY0FBYyxnRUFBZ0Usd0VBQXdFLHNGQUFzRixnQkFBZ0IsaUJBQWlCLDBDQUEwQyxTQUFTLG1FQUFtRSx1Q0FBdUMsR0FBRywrQkFBK0IsRUFBRSxHQUFHLDBDQUEwQyxTQUFTLDZCQUE2QixxRUFBcUUsdUNBQXVDLEdBQUcsK0JBQStCLEVBQUUsR0FBRyx1Q0FBdUMsWUFBWSxtQkFBbUIsK0JBQStCLDJDQUEyQywrQkFBK0Isa0RBQWtELHVCQUF1QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLHFCQUFxQix3REFBd0QsVUFBVSx5RUFBeUUsZUFBZSw2REFBNkQsSUFBSSxRQUFRLEdBQUcsU0FBUyxFQUFFLEdBQUcsZ0JBQWdCLGlCQUFpQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDZFQUE2RSw2RUFBNkUsaUJBQWlCLHVCQUF1QixvQkFBb0IsNkRBQTZELDhCQUE4Qix1SkFBdUoscVBBQXFQLGNBQWMscURBQXFELEdBQUcscUJBQXFCLFVBQVUsNEJBQTRCLGdCQUFnQixpQkFBaUIsZUFBZSxPQUFPLDhFQUE4RSxnRUFBZ0UsV0FBVyxnRUFBZ0UsNkRBQTZELFVBQVUsaUJBQWlCLFVBQVUsaUJBQWlCLFVBQVUsaUJBQWlCLFlBQVksbUJBQW1CLGdCQUFnQix1QkFBdUIsWUFBWSwyREFBMkQsZUFBZSxzQkFBc0IsZUFBZSxzQkFBc0IsdUJBQXVCLCtFQUErRSxtQkFBbUIsT0FBTyxvR0FBb0csU0FBUyxtT0FBbU8sd0JBQXdCLGdJQUFnSSxRQUFRLGdHQUFnRyx3QkFBd0IsOEhBQThILFFBQVEsa0xBQWtMLHNCQUFzQiwrQ0FBK0MsZ09BQWdPLDZCQUE2QixpREFBaUQsOEJBQThCLHlCQUF5QixnQkFBZ0IsbUJBQW1CLG1CQUFtQixzREFBc0Qsc0JBQXNCLHFCQUFxQixvREFBb0Qsb0JBQW9CLGtEQUFrRCxXQUFXLHNGQUFzRixtQ0FBbUMsVUFBVSx3QkFBd0Isa0JBQWtCLFFBQVEsS0FBSyxtQkFBbUIsaUJBQWlCLFNBQVMsY0FBYyxnQkFBZ0Isc0RBQXNELFdBQVcsR0FBRyw0QkFBNEIsMkZBQTJGLGFBQWEsdVBBQXVQLHFGQUFxRix1QkFBdUIsb0NBQW9DLFVBQVUsNkNBQTZDLHVCQUF1QiwyQkFBMkIsWUFBWSxXQUFXLDZDQUE2QyxzQkFBc0IsMkJBQTJCLFlBQVksV0FBVyxLQUFLLDJCQUEyQix3REFBd0QsV0FBVyx1Q0FBdUMsYUFBYSxpQkFBaUIsdUZBQXVGLHNCQUFzQixrREFBa0QsV0FBVyxnQkFBZ0Isb0JBQW9CLFVBQVUsZ0JBQWdCLG1CQUFtQixzQkFBc0IsT0FBTyxzSEFBc0gsd0tBQXdLLE9BQU8sb0RBQW9ELHVGQUF1Riw4REFBOEQsV0FBVyw4REFBOEQscURBQXFELEtBQUsscUNBQXFDLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsdURBQXVELG9DQUFvQywyQkFBMkIsbURBQW1ELFVBQVUsa0VBQWtFLGdCQUFnQixpQkFBaUIsZUFBZSx1QkFBdUIsNEJBQTRCLGFBQWEsY0FBYyx1Q0FBdUMsc0JBQXNCLGlCQUFpQixXQUFXLCtGQUErRix5REFBeUQsVUFBVSwrRkFBK0YseURBQXlELHNCQUFzQixPQUFPLHVHQUF1RyxvRUFBb0UsTUFBTSwwQkFBMEIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwyQ0FBMkMsNkJBQTZCLDBCQUEwQiwrREFBK0QsVUFBVSx3Q0FBd0MsZ0JBQWdCLGlCQUFpQixlQUFlLHVCQUF1QixzQkFBc0IsYUFBYSxlQUFlLGlEQUFpRCxzQkFBc0IsZ0NBQWdDLFdBQVcsMENBQTBDLG1HQUFtRyxVQUFVLDBDQUEwQywwR0FBMEcsc0JBQXNCLE9BQU8scUdBQXFHLG9FQUFvRSxpQ0FBaUMsb0JBQW9CLEVBQUUsY0FBYyxhQUFhLGdFQUFnRSw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHdDQUF3QyxxRkFBcUYsdUNBQXVDLFNBQVMsRUFBRSxZQUFZLFlBQVksWUFBWSxZQUFZLFlBQVksRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSxrTUFBa00sMkNBQTJDLGNBQWMsVUFBVSxhQUFhLFVBQVUsbUJBQW1CLFVBQVUsbUJBQW1CLFVBQVUsOEJBQThCLFVBQVUsaUJBQWlCLFlBQVksaUJBQWlCLDBCQUEwQixvQkFBb0IsNEJBQTRCLHFCQUFxQiwwQ0FBMEMsMEJBQTBCLG9CQUFvQixlQUFlLHNJQUFzSSwyQ0FBMkMsb0JBQW9CLCtDQUErQyxtREFBbUQsMEJBQTBCLG9CQUFvQiw0QkFBNEIsMEJBQTBCLCtDQUErQywwQkFBMEIsb0JBQW9CLDRCQUE0QiwwQkFBMEIsMkdBQTJHLHdCQUF3QixvQkFBb0IsbUlBQW1JLGtDQUFrQywyQ0FBMkMsbURBQW1ELG9CQUFvQix5RUFBeUUsd0NBQXdDLHdCQUF3Qix3QkFBd0IsNkNBQTZDLG9CQUFvQixpRkFBaUYscUNBQXFDLHdCQUF3QixZQUFZLGVBQWUsNEtBQTRLLGtEQUFrRCx1SEFBdUgsNERBQTRELE9BQU8sTUFBTSxvQkFBb0IsOENBQThDLHdCQUF3QixnRUFBZ0UsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxtRkFBbUYsbURBQW1ELG1DQUFtQywrQ0FBK0MsK0NBQStDLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsdUJBQXVCLDJDQUEyQyxlQUFlLFVBQVUsNlVBQTZVLHFCQUFxQixzR0FBc0csK0NBQStDLHFCQUFxQixvQ0FBb0MsZ0NBQWdDLCtDQUErQyxpQkFBaUIsaUJBQWlCLHFHQUFxRyw4REFBOEQsZ0VBQWdFLCtCQUErQiw2Q0FBNkMsK0JBQStCLGdMQUFnTCxPQUFPLGlCQUFpQiwwQkFBMEIsV0FBVyxrQkFBa0IsbUJBQW1CLDZDQUE2QyxPQUFPLGdJQUFnSSxvQkFBb0IsbUJBQW1CLG9FQUFvRSxPQUFPLDJCQUEyQiwwQkFBMEIsT0FBTyxtRUFBbUUsbUJBQW1CLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsd0NBQXdDLHdGQUF3RixlQUFlLFlBQVksVUFBVSw0UEFBNFAsd0hBQXdILHNIQUFzSCwwTUFBME0sMEtBQTBLLGlCQUFpQixJQUFJLCtEQUErRCxTQUFTLGlDQUFpQyw0RkFBNEYsT0FBTyw4QkFBOEIsZUFBZSxRQUFRLElBQUksMkJBQTJCLHFCQUFxQixrQ0FBa0MsRUFBRSwyRkFBMkYsZ0JBQWdCLGtEQUFrRCx1SEFBdUgsUUFBUSxLQUFLLG9NQUFvTSxnQkFBZ0IsZ0NBQWdDLGdCQUFnQix5REFBeUQscUJBQXFCLHdEQUF3RCxtQkFBbUIsZ0ZBQWdGLG9DQUFvQyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGlDQUFpQyxvQkFBb0IsZUFBZSxrRUFBa0UsWUFBWSxtQkFBbUIsa0JBQWtCLGdDQUFnQyxLQUFLLE9BQU8sd0NBQXdDLGlDQUFpQyxLQUFLLGFBQWEscUJBQXFCLGFBQWEseUJBQXlCLFFBQVEsaUJBQWlCLGdDQUFnQyxvQ0FBb0MsV0FBVyw2Q0FBNkMsNkJBQTZCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsZ0NBQWdDLDhCQUE4QixlQUFlLE1BQU0sd0lBQXdJLFlBQVksbUJBQW1CLGdCQUFnQixnQ0FBZ0MsRUFBRSxPQUFPLDJCQUEyQixhQUFhLHlCQUF5QixnQ0FBZ0Msb0NBQW9DLFdBQVcsMkNBQTJDLHlCQUF5QixnRUFBZ0UsOEVBQThFLEVBQUUsR0FBRyxpQ0FBaUMsSUFBSSw0QkFBNEIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx1QkFBdUIsYUFBYSxjQUFjLHlCQUF5QixXQUFXLDhCQUE4QixlQUFlLDJIQUEySCxzQkFBc0IscUhBQXFILGlCQUFpQix5S0FBeUssbUJBQW1CLEVBQUUsYUFBYSxhQUFhLHNDQUFzQyxTQUFTLEVBQUUsME9BQTBPLGtDQUFrQyxpQkFBaUIsaURBQWlELGNBQWMsd0JBQXdCLHVCQUF1QixvREFBb0Qsc0JBQXNCLElBQUksRUFBRSxHQUFHLE9BQU8sOElBQThJLHNCQUFzQix5SkFBeUosb0JBQW9CLHdCQUF3QixXQUFXLHNCQUFzQiw2QkFBNkIsd0JBQXdCLFdBQVcsUUFBUSxtREFBbUQsc0JBQXNCLElBQUksRUFBRSxHQUFHLE9BQU8sc0JBQXNCLHVCQUF1Qix3QkFBd0IsY0FBYyxRQUFRLHFEQUFxRCxzQkFBc0IsSUFBSSxFQUFFLEdBQUcsT0FBTyxzQkFBc0IseUJBQXlCLGFBQWEsbUJBQW1CLHFFQUFxRSxlQUFlLDZDQUE2QyxrQkFBa0Isa0RBQWtELDBCQUEwQiwwQkFBMEIsaUNBQWlDLDBCQUEwQiwrQkFBK0IsMEJBQTBCLHVDQUF1QyxlQUFlLHVCQUF1Qiw0QkFBNEIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxnQkFBZ0IsNkJBQTZCLGVBQWUseUJBQXlCLHFCQUFxQiwySEFBMkgsdUNBQXVDLG1CQUFtQix5SEFBeUgscUNBQXFDLHlCQUF5QixpSUFBaUksMkNBQTJDLDJCQUEyQix1SUFBdUksdUZBQXVGLDZCQUE2Qix5SUFBeUkseUZBQXlGLG1DQUFtQyxpSkFBaUosK0ZBQStGLGdDQUFnQyxnRUFBZ0UsbUNBQW1DLHFFQUFxRSxZQUFZLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsd0JBQXdCLHFCQUFxQixlQUFlLDZCQUE2QiwwQkFBMEIsa0NBQWtDLHFCQUFxQiw4SEFBOEgsMklBQTJJLElBQUksb0JBQW9CLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsc0NBQXNDLHFCQUFxQixlQUFlLHlEQUF5RCxTQUFTLGtEQUFrRCxrQkFBa0Isb0JBQW9CLHNEQUFzRCxVQUFVLDRFQUE0RSxXQUFXLHdGQUF3RixTQUFTLGtEQUFrRCxRQUFRLHdDQUF3QyxLQUFLLFlBQVkseUNBQXlDLFdBQVcsMENBQTBDLEtBQUssWUFBWSxzRUFBc0UsV0FBVyw2QkFBNkIsY0FBYyx3QkFBd0IsY0FBYywyQkFBMkIsdUJBQXVCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsK0JBQStCLHFCQUFxQixlQUFlLDZIQUE2SCxnQkFBZ0IsK0ZBQStGLGFBQWEsbUJBQW1CLDRDQUE0Qyw2Q0FBNkMsYUFBYSxRQUFRLHlDQUF5QywyQ0FBMkMsNkJBQTZCLDJDQUEyQyw2Q0FBNkMsOEJBQThCLGdGQUFnRixFQUFFLFVBQVUsb0NBQW9DLGlFQUFpRSwyQkFBMkIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxrQ0FBa0MsK0JBQStCLGlCQUFpQixtR0FBbUcsd0NBQXdDLEVBQUUsc0JBQXNCLDRCQUE0QixzREFBc0QsK0JBQStCLG9EQUFvRCw4SkFBOEosOENBQThDLDJCQUEyQiwwREFBMEQsRUFBRSxZQUFZLDhEQUE4RCx1QkFBdUIsMkNBQTJDLGdCQUFnQiwyQ0FBMkMscUVBQXFFLHFDQUFxQyxxRUFBcUUsK0RBQStELCtDQUErQyxTQUFTLG9CQUFvQixpQ0FBaUMsS0FBSyxZQUFZLEVBQUUsbUJBQW1CLGVBQWUsZ0NBQWdDLGFBQWEsa0JBQWtCLFdBQVcsU0FBUyxpQ0FBaUMseUJBQXlCLGlCQUFpQixtQkFBbUIsV0FBVyw4QkFBOEIsZUFBZSxnQ0FBZ0MsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw2QkFBNkIsc0VBQXNFLHFCQUFxQiw2SkFBNkosWUFBWSw4QkFBOEIsMENBQTBDLDhDQUE4Qyw4Q0FBOEMsYUFBYSx5Q0FBeUMsb0ZBQW9GLHlCQUF5QixFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLDZNQUE2TSxpQkFBaUIsU0FBUyx3Q0FBd0MsT0FBTyxvQkFBb0IsT0FBTztBQUMxb3dFLG9DQUFvQyxPQUFPLG9CQUFvQixPQUFPO0FBQ3RFLG9EQUFvRCxZQUFZLG9CQUFvQixZQUFZO0FBQ2hHLHlEQUF5RCxjQUFjLG9CQUFvQixjQUFjO0FBQ3pHLEtBQUssK0JBQStCLGlCQUFpQiwyQkFBMkIsWUFBWSxpRUFBaUUsT0FBTyxHQUFHLDBDQUEwQyxpQkFBaUIsc0JBQXNCLE9BQU8saUVBQWlFLE9BQU8sR0FBRyxxQ0FBcUMsaUJBQWlCLE9BQU8sb0NBQW9DLHFCQUFxQixzREFBc0QsT0FBTyw0QkFBNEIsRUFBRSxHQUFHLHFDQUFxQyxpQkFBaUIsT0FBTyxvQ0FBb0MscUJBQXFCLHNEQUFzRCxPQUFPLDRCQUE0QixFQUFFO0FBQy91Qiw4Q0FBOEMsUUFBUSxtQkFBbUIsY0FBYywyQkFBMkI7QUFDbEgsOENBQThDLFFBQVEsbUJBQW1CLGNBQWMsMkJBQTJCLEVBQUUsRUFBRSxvQ0FBb0MsaUJBQWlCLGtJQUFrSSxpQ0FBaUMsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxnQ0FBZ0MsNkNBQTZDLGNBQWMsZ0VBQWdFLGdCQUFnQixhQUFhLGVBQWUsU0FBUyx5REFBeUQsd0NBQXdDLGlEQUFpRCxTQUFTLFlBQVksOENBQThDLDBCQUEwQix3Q0FBd0Msb0ZBQW9GLGlDQUFpQyx1Q0FBdUMsZ0VBQWdFLDRDQUE0Qyx3Q0FBd0MsMEJBQTBCLG9CQUFvQixnRUFBZ0Usc0JBQXNCLGtEQUFrRCxlQUFlLGtCQUFrQixPQUFPLFVBQVUsb0NBQW9DLFdBQVcsZ0JBQWdCLGtDQUFrQztBQUM3L0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxXQUFXLDRCQUE0QixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDZCQUE2QixhQUFhLGVBQWUsd0JBQXdCLGdCQUFnQixrQ0FBa0Msa0JBQWtCLElBQUkseUJBQXlCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNERBQTRELDJDQUEyQyxpQkFBaUIsOEVBQThFLGNBQWMsRUFBRSx1QkFBdUIsb0RBQW9ELHFCQUFxQixJQUFJLEVBQUUsR0FBRyxPQUFPLG1JQUFtSSxxQkFBcUIsbUdBQW1HLDJCQUEyQixhQUFhLGNBQWMscUJBQXFCLGdCQUFnQixFQUFFLDRDQUE0QywwQkFBMEIsa0ZBQWtGLG9EQUFvRCxtQkFBbUIsSUFBSSxFQUFFLEdBQUcsT0FBTywySUFBMkksbUJBQW1CLHdGQUF3RixnQ0FBZ0MsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw2QkFBNkIsbURBQW1ELGNBQWMsMkNBQTJDLGlCQUFpQixrREFBa0Qsd0JBQXdCLEVBQUUsb0JBQW9CLDhCQUE4QixpQ0FBaUMsc0JBQXNCLG1EQUFtRCxlQUFlLG9GQUFvRixPQUFPLDREQUE0RCx5QkFBeUIsRUFBRSx5QkFBeUIsa0ZBQWtGLHNDQUFzQyxtQkFBbUIscUVBQXFFLGtIQUFrSCx1QkFBdUIsa0NBQWtDLHdCQUF3QixJQUFJLHNHQUFzRywrRUFBK0Usc0JBQXNCLEVBQUUsRUFBRSw0QkFBNEIsdUNBQXVDLHlCQUF5QixJQUFJLCtEQUErRCwrREFBK0QsdUJBQXVCLHVDQUF1QyxjQUFjLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixzRUFBc0Usd0JBQXdCLDhGQUE4Rix5QkFBeUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw0QkFBNEIsOERBQThELHFCQUFxQiw2SkFBNkosZ0JBQWdCLGtGQUFrRixhQUFhLHlDQUF5QyxvRkFBb0Ysd0JBQXdCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUseUZBQXlGLGFBQWEsY0FBYyxZQUFZLDBCQUEwQix3QkFBd0IsYUFBYSxXQUFXLDhCQUE4Qix3QkFBd0IsZUFBZSxzQ0FBc0MsYUFBYSxTQUFTLG1HQUFtRyxtQ0FBbUMsY0FBYyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDJCQUEyQixxRkFBcUYsaUJBQWlCLHNNQUFzTSx5QkFBeUIsMERBQTBELHNEQUFzRCw4QkFBOEIsNERBQTRELHFCQUFxQiw0R0FBNEcsNEJBQTRCLHVEQUF1RCxxQkFBcUIsU0FBUyxFQUFFLGNBQWMsMkNBQTJDLFdBQVcsNEJBQTRCLGtHQUFrRyxtSEFBbUgsb0JBQW9CLDJIQUEySCxnREFBZ0QsRUFBRSxpQkFBaUIsOEVBQThFLDZFQUE2RSxvQkFBb0IsMkVBQTJFLDhEQUE4RCxFQUFFLGNBQWMsV0FBVyx1QkFBdUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxtQ0FBbUMscUNBQXFDLGVBQWUsOEdBQThHLHVCQUF1Qix1RUFBdUUsc0ZBQXNGLHNCQUFzQixTQUFTLHNFQUFzRSxXQUFXLCtCQUErQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDBCQUEwQixvQkFBb0IsaUJBQWlCLHlDQUF5QyxpQkFBaUIsMkhBQTJILGdDQUFnQyxtRkFBbUYsRUFBRSw2QkFBNkIsaUJBQWlCLG1EQUFtRCxXQUFXLG9CQUFvQix1Q0FBdUMsa0JBQWtCLHFDQUFxQyxnQ0FBZ0MsMERBQTBELHFCQUFxQixpREFBaUQsc0JBQXNCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsd0JBQXdCLG1EQUFtRCxlQUFlLE1BQU0sa0JBQWtCLDRGQUE0Rix3SkFBd0osb0JBQW9CLEVBQUUsd0pBQXdKLHVDQUF1QyxRQUFRLG1CQUFtQixrREFBa0Qsa0VBQWtFLGtCQUFrQixtQkFBbUIsbUVBQW1FLE9BQU8sOEZBQThGLG9CQUFvQixtQkFBbUIsNEVBQTRFLE9BQU8sZ0ZBQWdGLG9CQUFvQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDZDQUE2Qyx3QkFBd0IsZ0JBQWdCLGVBQWUsOEdBQThHLFNBQVMsOENBQThDLHdCQUF3QixVQUFVLHVDQUF1QyxHQUFHLHNCQUFzQix5QkFBeUIsdUJBQXVCLGFBQWEsZUFBZSwwQ0FBMEMsU0FBUyw4Q0FBOEMscUJBQXFCLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNkJBQTZCLHFCQUFxQixlQUFlLE1BQU0sa0pBQWtKLFVBQVUsa0JBQWtCLGdCQUFnQix3QkFBd0IsZ0JBQWdCLDBCQUEwQix5QkFBeUIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSx3QkFBd0IscUJBQXFCLGVBQWUsZ0tBQWdLLGdCQUFnQix3QkFBd0IsbUJBQW1CLDJCQUEyQixxQkFBcUIsK0JBQStCLG9CQUFvQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLGVBQWUsNENBQTRDLGVBQWUsK0lBQStJLGFBQWEsZUFBZSxNQUFNLG1GQUFtRix5T0FBeU8sK1VBQStVLGtFQUFrRSwyQ0FBMkMsbUVBQW1FLElBQUksV0FBVyxFQUFFLGFBQWEsYUFBYSxzQ0FBc0MsU0FBUyxFQUFFLGtZQUFrWSxZQUFZLGtEQUFrRCw2QkFBNkIsa0NBQWtDLEVBQUUsWUFBWSx5Q0FBeUMsNkJBQTZCLHlCQUF5QixFQUFFLFlBQVksd0NBQXdDLDZCQUE2Qix3QkFBd0IsRUFBRSxZQUFZLHlEQUF5RCw2QkFBNkIseUNBQXlDLEVBQUUsWUFBWSxrREFBa0QsNkJBQTZCLGtDQUFrQyxFQUFFLFlBQVksaURBQWlELDZCQUE2QixpQ0FBaUMsRUFBRSxZQUFZLDBDQUEwQyw2QkFBNkIsMEJBQTBCLEVBQUUsWUFBWSx5Q0FBeUMsNkJBQTZCLHlCQUF5QixFQUFFLFlBQVksOENBQThDLDZCQUE2Qiw4QkFBOEIsRUFBRSw4REFBOEQsNkJBQTZCLDhDQUE4QyxFQUFFLDJEQUEyRCw2QkFBNkIsMkNBQTJDLEVBQUUsMkNBQTJDLDZCQUE2QiwyQkFBMkIsRUFBRSxnREFBZ0QsNkJBQTZCLGdDQUFnQyxFQUFFLGdEQUFnRCw2QkFBNkIsZ0NBQWdDLEVBQUUsMENBQTBDLDZCQUE2QiwwQkFBMEIsRUFBRSx1Q0FBdUMsNkJBQTZCLHVCQUF1QixFQUFFLFlBQVksZ0NBQWdDLDZCQUE2QixnQkFBZ0IsRUFBRSxZQUFZLHdDQUF3Qyw2QkFBNkIsd0JBQXdCLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwyQ0FBMkMsbUdBQW1HLGNBQWMsMERBQTBELFVBQVUsK0dBQStHLG1CQUFtQiw0QkFBNEIsc0NBQXNDLHlDQUF5Qyx5REFBeUQsSUFBSSx1QkFBdUIsOEVBQThFLHVEQUF1RCxzU0FBc1MsMEJBQTBCLFdBQVcscUJBQXFCLE1BQU0sMkRBQTJELHNDQUFzQyxlQUFlLDRCQUE0Qiw4QkFBOEIsV0FBVyxtQkFBbUIsd0JBQXdCLG1IQUFtSCx5QkFBeUIsV0FBVyxxQkFBcUIsc0NBQXNDLHdCQUF3QixxQ0FBcUMsV0FBVyxtQ0FBbUMsa0JBQWtCLHlCQUF5QixJQUFJLHdCQUF3QixRQUFRLGdCQUFnQixtQkFBbUIsMEJBQTBCLGlDQUFpQyxnQkFBZ0IsK0JBQStCLHVDQUF1QyxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDBDQUEwQyxtR0FBbUcsY0FBYyx5REFBeUQsU0FBUyxNQUFNLGtGQUFrRixpQkFBaUIsMEJBQTBCLDZDQUE2QyxTQUFTLFlBQVksVUFBVSxnREFBZ0Qsc0NBQXNDLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsbURBQW1ELGVBQWUseUNBQXlDLG1CQUFtQixpQkFBaUIsT0FBTyxtQkFBbUIsaUJBQWlCLGVBQWUsZUFBZSxxQkFBcUIsY0FBYyxtQ0FBbUMsV0FBVyxFQUFFLGNBQWMsZ0JBQWdCLFlBQVksMEJBQTBCLGFBQWEsbUJBQW1CLFlBQVksa0JBQWtCLHdCQUF3QixhQUFhLGdEQUFnRCxJQUFJLGlCQUFpQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDZEQUE2RCxZQUFZLGlCQUFpQixNQUFNLGlDQUFpQyxPQUFPLHVmQUF1Ziw4QkFBOEIsc0VBQXNFLHdCQUF3QixpQkFBaUIsTUFBTSxPQUFPLHlSQUF5UixpQkFBaUIsaUJBQWlCLE9BQU8saUtBQWlLLHNCQUFzQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDhGQUE4RiwwQkFBMEIsZUFBZSxvQ0FBb0Msb0JBQW9CLGVBQWUsOEVBQThFLE9BQU8sY0FBYyxpQkFBaUIsZUFBZSxZQUFZLGFBQWEsdUJBQXVCLGVBQWUsd0JBQXdCLHFCQUFxQixtREFBbUQsZUFBZSxTQUFTLGVBQWUsMENBQTBDLFFBQVEsK0VBQStFLGVBQWUsUUFBUSx3QkFBd0IsdUZBQXVGLE9BQU8sOEZBQThGLHFCQUFxQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLDBDQUEwQyw0QkFBNEIsaUJBQWlCLCtCQUErQixPQUFPLHVCQUF1QixzQ0FBc0MsZUFBZSxjQUFjLGdCQUFnQix3QkFBd0IsbUNBQW1DLFNBQVMsOEJBQThCLEdBQUcscUNBQXFDLEdBQUcsdUNBQXVDLGFBQWEsK0JBQStCLFNBQVMsaUJBQWlCLDBDQUEwQyxLQUFLLFFBQVEsRUFBRSw4Q0FBOEMsS0FBSyxRQUFRLEVBQUUsY0FBYyxlQUFlLElBQUksNkJBQTZCLHVFQUF1RSxRQUFRLE9BQU8saUJBQWlCLHFCQUFxQixFQUFFLFdBQVcsT0FBTyxVQUFVLHNFQUFzRSxnQ0FBZ0MscUJBQXFCLFVBQVUsRUFBRSxhQUFhLGFBQWEsc0NBQXNDLFNBQVMsRUFBRSx1U0FBdVMsZ0NBQWdDLGdDQUFnQyxxQ0FBcUMsaUNBQWlDLHdDQUF3QyxnQkFBZ0IsRUFBRSxTQUFTLDJDQUEyQyxvREFBb0QsRUFBRSx3Q0FBd0MsSUFBSSxrQkFBa0IsaUJBQWlCLHNDQUFzQyw2QkFBNkIsZUFBZSxJQUFJLGlCQUFpQixpRUFBaUUsTUFBTSxvREFBb0QsRUFBRSxPQUFPLGlDQUFpQyxlQUFlLCtDQUErQyw4QkFBOEIsY0FBYyxNQUFNLG9JQUFvSSx1QkFBdUIsaUJBQWlCLDBEQUEwRCxvQkFBb0IsZUFBZSxvQ0FBb0MsdUJBQXVCLGVBQWUsb0JBQW9CLDRCQUE0QiwyQ0FBMkMsdUNBQXVDLGdCQUFnQiw0QkFBNEIsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwyQkFBMkIsMENBQTBDLGdCQUFnQixFQUFFLHlYQUF5WCxZQUFZLGdDQUFnQyxHQUFHLDhFQUE4RSxFQUFFLE9BQU8seURBQXlELEdBQUcsbUZBQW1GLEVBQUUsT0FBTywwQkFBMEIsR0FBRyxpQ0FBaUMsRUFBRSxZQUFZLEdBQUcsd0NBQXdDLEVBQUUsRUFBRSxXQUFXLDJCQUEyQixJQUFJLHFEQUFxRCxTQUFTLE1BQU0sRUFBRSxXQUFXLGlDQUFpQyxhQUFhLHFEQUFxRCxFQUFFLFlBQVksK0VBQStFLHVCQUF1QixFQUFFLG1CQUFtQixhQUFhLGNBQWMsaUJBQWlCLHFEQUFxRCxtQkFBbUIsdUJBQXVCLGlDQUFpQyxpQkFBaUIsb0JBQW9CLEtBQUssNENBQTRDLFdBQVcscUJBQXFCLGtCQUFrQixJQUFJLG1CQUFtQixTQUFTLGdCQUFnQixHQUFHLEVBQUUsY0FBYyxhQUFhLFVBQVUsc0JBQXNCLGVBQWUsZUFBZSxZQUFZLDJCQUEyQixLQUFLLGtDQUFrQyx1Q0FBdUMsU0FBUyxNQUFNLDZEQUE2RCxPQUFPLDBCQUEwQiw4QkFBOEIsSUFBSSxFQUFFLGFBQWEsVUFBVSxzQ0FBc0MsTUFBTSx5Q0FBeUMsTUFBTSw2Q0FBNkMsTUFBTSxvRUFBb0UsK0tBQStLLDBCQUEwQiwwQkFBMEIsc0JBQXNCLFdBQVcsRUFBRSx3QkFBd0IscUJBQXFCLHNDQUFzQyxVQUFVLGVBQWUsTUFBTSxxQ0FBcUMsTUFBTSwwQ0FBMEMsTUFBTSw2QkFBNkIsT0FBTyx5QkFBeUIsWUFBWSxvQkFBb0IseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixhQUFhLGNBQWMsY0FBYyxtQkFBbUIsZ0NBQWdDLDBEQUEwRCxpQkFBaUIsUUFBUSwrQkFBK0IsaUNBQWlDLHlDQUF5QyxzQ0FBc0MsV0FBVywrQkFBK0IsYUFBYSw4QkFBOEIseUJBQXlCLE1BQU0saUJBQWlCLG1CQUFtQix3QkFBd0IsUUFBUSxXQUFXLDZCQUE2QixhQUFhLEVBQUUsbUJBQW1CLGFBQWEsa0JBQWtCLGVBQWUsMENBQTBDLHFFQUFxRSxrQkFBa0IscURBQXFELGtCQUFrQixxREFBcUQsMENBQTBDLGdCQUFnQiwwREFBMEQsZ0JBQWdCLDBEQUEwRCx3Q0FBd0MsY0FBYyxvQkFBb0IsY0FBYyw2Q0FBNkMsbUNBQW1DLDZEQUE2RCxzRkFBc0YsS0FBSyxzRkFBc0YsZ0NBQWdDLDhEQUE4RCxrQkFBa0Isb0RBQW9ELDRGQUE0Riw0REFBNEQsc0NBQXNDLHFFQUFxRSxrQkFBa0IscUdBQXFHLGtCQUFrQixxR0FBcUcsNENBQTRDLGdCQUFnQiwwR0FBMEcsZ0JBQWdCLDBHQUEwRywwQ0FBMEMsY0FBYyx3QkFBd0IsY0FBYywwREFBMEQsZ0RBQWdELDJFQUEyRSxLQUFLLE1BQU0sd0ZBQXdGLEtBQUssdUNBQXVDLDBIQUEwSCx3RUFBd0Usc0JBQXNCLGlGQUFpRix5RkFBeUYsc0VBQXNFLEtBQUssbUJBQW1CLDREQUE0RCxtQkFBbUIsNERBQTRELGlCQUFpQixpREFBaUQsaUJBQWlCLGtEQUFrRCxFQUFFLDRCQUE0QixhQUFhLHVCQUF1Qiw2QkFBNkIsSUFBSSxvREFBb0QseURBQXlELFVBQVUsYUFBYSxFQUFFLGNBQWMsYUFBYSxVQUFVLHNCQUFzQixvQkFBb0IsV0FBVyxrSEFBa0gsVUFBVSx3QkFBd0IsVUFBVSxnQkFBZ0IsMEJBQTBCLElBQUksdVNBQXVTLGdJQUFnSSx5QkFBeUIsb0JBQW9CLFdBQVcsMlNBQTJTLFlBQVksRUFBRSxtQkFBbUIsYUFBYSxjQUFjLG1CQUFtQixpQ0FBaUMsbUJBQW1CLHdCQUF3QixvQkFBb0IsdUJBQXVCLDRCQUE0QixFQUFFLG1CQUFtQixhQUFhLGFBQWEsWUFBWSxnQkFBZ0IsNEJBQTRCLHlCQUF5Qix1QkFBdUIsVUFBVSxtQ0FBbUMsYUFBYSxxQkFBcUIsVUFBVSxxQ0FBcUMseUJBQXlCLG1CQUFtQixVQUFVLFVBQVUsbUNBQW1DLHNGQUFzRixtQkFBbUIsNkNBQTZDLHFEQUFxRCx5Q0FBeUMscURBQXFELGlDQUFpQyxxQkFBcUIsb0NBQW9DLHdDQUF3QyxtQ0FBbUMsK0JBQStCLHFEQUFxRCw0Q0FBNEMsbUNBQW1DLHVCQUF1QixtS0FBbUssOEJBQThCLGlKQUFpSixnQ0FBZ0Msa0JBQWtCLGtGQUFrRixnQ0FBZ0MsbUJBQW1CLG1GQUFtRiw4QkFBOEIsNkRBQTZELCtGQUErRixFQUFFLGNBQWMsYUFBYSxTQUFTLGlCQUFpQixjQUFjLG9CQUFvQixhQUFhLGVBQWUsWUFBWSxZQUFZLGdCQUFnQiw4R0FBOEcsZ0ZBQWdGLGdEQUFnRCw0Q0FBNEMsS0FBSywwQ0FBMEMsMkRBQTJELHVCQUF1QixnREFBZ0QsdUJBQXVCLDhCQUE4Qiw4QkFBOEIsV0FBVyxnSEFBZ0gsb0JBQW9CLElBQUksaUNBQWlDLG9DQUFvQyxNQUFNLGFBQWEsR0FBRyxvQkFBb0IsMkJBQTJCLHdCQUF3QixpSkFBaUosK0NBQStDLGlGQUFpRiw0QkFBNEIsa0NBQWtDLDZCQUE2QixFQUFFLHdCQUF3Qix5QkFBeUIsMERBQTBELDZCQUE2Qiw2QkFBNkIsNERBQTRELG1CQUFtQiw2QkFBNkIsV0FBVyw4Q0FBOEMsU0FBUyxXQUFXLHNCQUFzQixpREFBaUQsZUFBZSxnQkFBZ0IsMENBQTBDLHNDQUFzQyxlQUFlLFVBQVUsOEZBQThGLDRCQUE0QixnQkFBZ0Isa0RBQWtELGFBQWEsa0RBQWtELE9BQU8sZUFBZSxTQUFTLDBDQUEwQyxXQUFXLGlCQUFpQixtQ0FBbUMsNENBQTRDLElBQUksY0FBYyxvQ0FBb0MsMEJBQTBCLFlBQVksS0FBSyxXQUFXLGNBQWMsa0JBQWtCLHlDQUF5QyxLQUFLLHlFQUF5RSwwQkFBMEIsbUJBQW1CLFlBQVksV0FBVyxrQ0FBa0MsaUJBQWlCLGdEQUFnRCx3QkFBd0IsZUFBZSxPQUFPLDBDQUEwQyxPQUFPLCtEQUErRCxrQkFBa0Isa0RBQWtELGtCQUFrQixFQUFFLG1CQUFtQixhQUFhLGFBQWEsc0RBQXNELG1CQUFtQixpREFBaUQsZUFBZSxlQUFlLG9FQUFvRSxhQUFhLHlFQUF5RSxrQkFBa0IsNEJBQTRCLDJCQUEyQixjQUFjLElBQUksWUFBWSxlQUFlLGNBQWMsb0JBQW9CLHdCQUF3Qix5RUFBeUUsa0NBQWtDLGdFQUFnRSxtQkFBbUIsV0FBVyxtQkFBbUIsS0FBSyxNQUFNLHlCQUF5QixPQUFPLGlCQUFpQix1Q0FBdUMseUNBQXlDLG1CQUFtQiwrQkFBK0Isc0hBQXNILDhCQUE4Qiw4REFBOEQsK0JBQStCLHNDQUFzQyxtQkFBbUIsS0FBSyxLQUFLLDREQUE0RCxLQUFLLFNBQVMsbUNBQW1DLFlBQVksK0JBQStCLGlCQUFpQixvQ0FBb0MscUNBQXFDLCtCQUErQiw0QkFBNEIsb0NBQW9DLDZCQUE2QiwrQkFBK0IsbUJBQW1CLDREQUE0RCxnQ0FBZ0MsK0JBQStCLHlDQUF5QyxnQ0FBZ0MsaUJBQWlCLCtDQUErQyx5Q0FBeUMsOEJBQThCLDhDQUE4QywrQkFBK0IsK0NBQStDLDhDQUE4QyxXQUFXLGlCQUFpQixZQUFZLFdBQVcsaUJBQWlCLDhCQUE4QixtQkFBbUIsZ0NBQWdDLG1CQUFtQiw4QkFBOEIscUJBQXFCLHFDQUFxQywrQkFBK0IsbUJBQW1CLGdFQUFnRSw0QkFBNEIsb0ZBQW9GLDZCQUE2Qix1TEFBdUwsOEJBQThCLHVDQUF1Qyx1RkFBdUYsOEJBQThCLGdFQUFnRSxFQUFFLG1DQUFtQyxVQUFVLHlCQUF5QixvQ0FBb0MsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLFlBQVksMERBQTBELFlBQVksY0FBYyxjQUFjLHlCQUF5QiwrSkFBK0osV0FBVyxpQkFBaUIsaUNBQWlDLGlCQUFpQixXQUFXLGlCQUFpQiwrQkFBK0IsZ0RBQWdELG1CQUFtQixtRUFBbUUsbUJBQW1CLDJFQUEyRSxnQ0FBZ0MsOEJBQThCLGtEQUFrRCxnQkFBZ0IsRUFBRSxtQkFBbUIsYUFBYSxhQUFhLHlDQUF5QyxpQkFBaUIseUVBQXlFLGNBQWMsd0NBQXdDLHlDQUF5Qyw2REFBNkQsOEJBQThCLGFBQWEsb0NBQW9DLDhCQUE4QixlQUFlLDZCQUE2Qiw0QkFBNEIsNkNBQTZDLEtBQUssS0FBSyxjQUFjLHlFQUF5RSw4QkFBOEIsaUJBQWlCLGtCQUFrQiw4VUFBOFUsOERBQThELFVBQVUsR0FBRyw2QkFBNkIsd0JBQXdCLDhCQUE4QixvQkFBb0IsdUJBQXVCLGNBQWMsc0JBQXNCLHdCQUF3QixLQUFLLElBQUksdUZBQXVGLDhIQUE4SCxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUsscUNBQXFDLG1GQUFtRix5REFBeUQsd0JBQXdCLEtBQUssSUFBSSx5RkFBeUYsVUFBVSxJQUFJLEtBQUsscUNBQXFDLHFGQUFxRix1Q0FBdUMsNEJBQTRCLDBCQUEwQixpQkFBaUIsbURBQW1ELCtCQUErQix3Q0FBd0MsaUNBQWlDLGdDQUFnQyx3Q0FBd0MsbUNBQW1DLGNBQWMsd0NBQXdDLGlFQUFpRSw2QkFBNkIsd0NBQXdDLDhDQUE4QyxzQkFBc0IsOEJBQThCLHdDQUF3QywrQ0FBK0Msc0JBQXNCLDZCQUE2Qiw0Q0FBNEMsK0JBQStCLGtFQUFrRSxVQUFVLGdCQUFnQixnREFBZ0QsdUNBQXVDLDhCQUE4QixtQkFBbUIsOEJBQThCLDZCQUE2Qix1QkFBdUIsd0NBQXdDLFlBQVksNkNBQTZDLGdDQUFnQyxhQUFhLGlDQUFpQyxVQUFVLG1CQUFtQixNQUFNLG9CQUFvQixNQUFNLGdDQUFnQyxNQUFNLFlBQVksd0JBQXdCLGtCQUFrQixNQUFNLG9CQUFvQixNQUFNLG1FQUFtRSxhQUFhLHlCQUF5QixtQ0FBbUMsa0NBQWtDLHNCQUFzQixpQkFBaUIsNEJBQTRCLG1CQUFtQiw0QkFBNEIsbUJBQW1CLHVDQUF1QyxvQkFBb0IsNEJBQTRCLHFCQUFxQiw2QkFBNkIsR0FBRyxFQUFFLG1CQUFtQixhQUFhLGNBQWMsWUFBWSwwREFBMEQsWUFBWSxlQUFlLGdCQUFnQix5QkFBeUIsNERBQTRELCtCQUErQixvQkFBb0IsMEtBQTBLLGdCQUFnQixFQUFFLG1CQUFtQixhQUFhLGNBQWMsWUFBWSx1RUFBdUUsbUJBQW1CLHNFQUFzRSwrRkFBK0YsMkNBQTJDLG1EQUFtRCxXQUFXLHVDQUF1QyxlQUFlLHNCQUFzQiwwQkFBMEIsSUFBSSxPQUFPLElBQUksOEZBQThGLHFDQUFxQyxhQUFhLFVBQVUsT0FBTyx5QkFBeUIsdURBQXVELFNBQVMsZ0NBQWdDLG9DQUFvQyxFQUFFLFNBQVMsMENBQTBDLEtBQUssSUFBSSxTQUFTLDZCQUE2QixzR0FBc0csRUFBRSxjQUFjLGFBQWEsVUFBVSxnQkFBZ0IsRUFBRSxtQkFBbUIsYUFBYSxjQUFjLEVBQUUsY0FBYyxhQUFhLFNBQVMsa0JBQWtCLGNBQWMsb0JBQW9CLGNBQWMsb0JBQW9CLFlBQVksV0FBVyxhQUFhLGVBQWUsY0FBYyw0RkFBNEYsS0FBSyxFQUFFLG1CQUFtQixhQUFhLGdCQUFnQixFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSxFQUFFLGNBQWMsYUFBYSx1Q0FBdUMsU0FBUyxFQUFFLG9CQUFvQixPQUFPLGFBQWEsd1JBQXdSLG1DQUFtQyxHQUFHLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSwwREFBMEQsMENBQTBDLGlCQUFpQiwrQkFBK0IsT0FBTyxVQUFVLCtFQUErRSxxREFBcUQsd0JBQXdCLGlCQUFpQiw2QkFBNkIsT0FBTywwQ0FBMEMsK0RBQStELElBQUkscUJBQXFCLGlCQUFpQixPQUFPLG1GQUFtRixnQ0FBZ0Msd0JBQXdCLGlDQUFpQyx1RUFBdUUsTUFBTSxxQ0FBcUMsb0JBQW9CLE1BQU0sNkNBQTZDLDZDQUE2QyxNQUFNLG9FQUFvRSw2Q0FBNkMsTUFBTSxTQUFTLGVBQWUsbUJBQW1CLE9BQU8sbUlBQW1JLFVBQVUsc0NBQXNDLE1BQU0sNENBQTRDLE1BQU0sU0FBUyxpQkFBaUIsMkRBQTJELGlCQUFpQiw0QkFBNEIsY0FBYyxPQUFPLGlQQUFpUCxFQUFFLGlCQUFpQiw0QkFBNEIsY0FBYyxPQUFPLG1HQUFtRyw4REFBOEQsV0FBVyw4REFBOEQsMkhBQTJILEVBQUUsZUFBZSxVQUFVLDhDQUE4QyxxREFBcUQsRUFBRSxjQUFjLGFBQWEsdUNBQXVDLFNBQVMsRUFBRSw0Q0FBNEMsWUFBWSxpQkFBaUIsT0FBTyx5REFBeUQsd0NBQXdDLEVBQUUsY0FBYyxhQUFhLHVDQUF1QyxTQUFTLEVBQUUsNERBQTRELG9CQUFvQixpQkFBaUIsK0JBQStCLE9BQU8sc0JBQXNCLHFDQUFxQyxlQUFlLGNBQWMsZ0JBQWdCLElBQUksaUNBQWlDLG9DQUFvQyxjQUFjLDBCQUEwQixTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxhQUFhLCtCQUErQixTQUFTLGlCQUFpQixZQUFZLCtCQUErQixVQUFVLHNFQUFzRSxpQ0FBaUMsSUFBSSxzQkFBc0IsOEJBQThCLE1BQU0sT0FBTyxPQUFPLGlCQUFpQiwyQ0FBMkMsbUJBQW1CLEdBQUcsaUJBQWlCLFVBQVUsT0FBTyx1ZkFBdWYsZUFBZSx3REFBd0Qsc0JBQXNCLEVBQUUsYUFBYSxhQUFhLDhEQUE4RCw2Q0FBNkMsNkJBQTZCLGFBQWEsRUFBRSxtQkFBbUIsNEJBQTRCLHNDQUFzQyxxRkFBcUYsc0NBQXNDLFNBQVMsRUFBRSw4R0FBOEcsV0FBVyxXQUFXLFdBQVcsV0FBVyxXQUFXLFdBQVcsWUFBWSwyREFBMkQsNkJBQTZCLDJDQUEyQyxFQUFFLFlBQVksNkRBQTZELDZCQUE2Qiw2Q0FBNkMsRUFBRSxZQUFZLDBEQUEwRCw2QkFBNkIsMENBQTBDLEVBQUUsRUFBRSxnQkFBZ0IsSUFBSSxLQUFLLDhGQUE4RixJQUFJLDZDQUE2QyxjQUFjLDZCQUE2QixxTkFBcU4sd0RBQXdELDBJQUEwSSwyQ0FBMkMsZUFBZSx5RUFBeUUsYUFBYSx1REFBdUQsRUFBRSwwVEFBMFQsV0FBVyxvU0FBb1MsRUFBRSxlQUFlLHFDQUFxQyxzQkFBc0IsYUFBYSwrQkFBK0IsV0FBVyx5T0FBeU8sRUFBRSxRQUFRLFFBQVEsU0FBUyxVQUFVLGtDQUFrQyxpQkFBaUIsdUNBQXVDLFNBQVMsa0NBQWtDLCtCQUErQixxQkFBcUIsU0FBUyxJQUFJLGVBQWUsbUNBQW1DLGFBQWEsaUJBQWlCLGtCQUFrQiw2QkFBNkIseUJBQXlCLHlCQUF5QixhQUFhLG1FQUFtRSxtREFBbUQsZUFBZSxFQUFFLFdBQVcsbUVBQW1FLGVBQWUsRUFBRSxhQUFhLElBQUksZ0NBQWdDLDZEQUE2RCw2QkFBNkIscUJBQXFCLGtEQUFrRCw4Q0FBOEMsK0NBQStDLDRCQUE0QixzQkFBc0IsMEJBQTBCLElBQUksc0NBQXNDLGtCQUFrQixxQ0FBcUMsS0FBSyx1QkFBdUIseUJBQXlCLEVBQUUsNENBQTRDLFNBQVMsSUFBSSxnQ0FBZ0MsdUVBQXVFLE1BQU0sWUFBWSxpQ0FBaUMsTUFBTSwrQ0FBK0MsZ0VBQWdFLFFBQVEsU0FBUyxnREFBZ0Qsc0JBQXNCLGdCQUFnQiw0REFBNEQsd0NBQXdDLE1BQU0sOEJBQThCLHNDQUFzQyxLQUFLLDhKQUE4SixlQUFlLElBQUksb0JBQW9CLElBQUkscUdBQXFHLEdBQUcsWUFBWSwwREFBMEQsR0FBRyxFQUFFLEVBQUUsS0FBSyxtRkFBbUYsa0RBQWtELDJDQUEyQywwQkFBMEIsY0FBYyxVQUFVLHFDQUFxQyxFQUFFLG9CQUFvQixPQUFPLHlEQUF5RCxpQkFBaUIsZUFBZSwrQkFBK0IsOENBQThDLEVBQUUsR0FBRyxFQUFFLElBQUksaUJBQWlCLGlCQUFpQixJQUFJLHlDQUF5QyxnQkFBZ0IsRUFBRSw4Q0FBOEMsYUFBYSw4Q0FBOEMsU0FBUywwQ0FBMEMsWUFBWSxnQ0FBZ0MsaUZBQWlGLE9BQU8sNEJBQTRCLElBQUksRUFBRSwrQkFBK0Isb0JBQW9CLFNBQVMsNkNBQTZDLE9BQU8sc0JBQXNCLDhCQUE4QiwyRkFBMkYsT0FBTyxhQUFhLFdBQVcsbUdBQW1HLEVBQUUsWUFBWSxrREFBa0QsZUFBZSx1Q0FBdUMsa0NBQWtDLEVBQUUsOEJBQThCLGlCQUFpQiw2Q0FBNkMsK0NBQStDLEdBQUcsRUFBRSxlQUFlLHVDQUF1QyxhQUFhLGdCQUFnQixFQUFFLG9CQUFvQixZQUFZLHNCQUFzQixXQUFXLDRCQUE0QixhQUFhLCtCQUErQixxQkFBcUIsV0FBVyxnREFBZ0QseUJBQXlCLEVBQUUsYUFBYSxPQUFPLHVEQUF1RCxpQkFBaUIsZUFBZSxpQkFBaUIsaUJBQWlCLGVBQWUsb0JBQW9CLDBCQUEwQixpQkFBaUIsNkRBQTZELHlCQUF5Qix3REFBd0QsU0FBUyxpQkFBaUIscUhBQXFILHNCQUFzQixxREFBcUQsNkRBQTZELGlCQUFpQix1REFBdUQsc0JBQXNCLHFEQUFxRCx1RkFBdUYsaUJBQWlCLHFHQUFxRyxpQkFBaUIsZ0RBQWdELDZEQUE2RCxpQkFBaUIseUdBQXlHLGlCQUFpQix1WkFBdVosaUJBQWlCLCtDQUErQyxrQkFBa0IsaURBQWlELFNBQVMsaUJBQWlCLCtDQUErQyxrQkFBa0IsaURBQWlELFNBQVMsaUJBQWlCLGlKQUFpSixzQkFBc0IscURBQXFELHVGQUF1RixpQkFBaUIsMmRBQTJkLHNCQUFzQixxREFBcUQsNkhBQTZILGtCQUFrQixpREFBaUQsbUhBQW1ILGlCQUFpQixpREFBaUQseUlBQXlJLGlCQUFpQixrR0FBa0csaUJBQWlCLDJKQUEySixzQkFBc0IscURBQXFELHVGQUF1RixpQkFBaUIseU1BQXlNLHNCQUFzQixxREFBcUQsdUZBQXVGLGFBQWEsZ0JBQWdCLEVBQUUsb0JBQW9CLFlBQVksc0JBQXNCLFdBQVcsNEJBQTRCLGFBQWEsK0JBQStCLHFCQUFxQixXQUFXLHVEQUF1RCxhQUFhLE9BQU8seURBQXlELGtDQUFrQyxpQkFBaUIsZUFBZSxJQUFJLGlCQUFpQixvQkFBb0IsYUFBYSxLQUFLLFdBQVcsV0FBVyw4QkFBOEIsRUFBRSxhQUFhLGdCQUFnQixFQUFFLDhDQUE4QyxvQ0FBb0MsY0FBYyxZQUFZLG1CQUFtQixhQUFhLHFCQUFxQixzQkFBc0Isb0JBQW9CLGtCQUFrQixpQ0FBaUMsbUVBQW1FLHlCQUF5QixtQkFBbUIsMEVBQTBFLHFCQUFxQiwwT0FBME8sOEVBQThFLG1CQUFtQixtU0FBbVMsV0FBVyxpRUFBaUUsRUFBRSwwQ0FBMEMsaUdBQWlHLHNDQUFzQyxHQUFHLEVBQUUsR0FBRyxFQUFFLGFBQWEsdUJBQXVCLHNCQUFzQixtQ0FBbUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFLCtDQUErQyxJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixNQUFNLGFBQWEseUVBQXlFLCtEQUErRCxnREFBZ0QsVUFBVSxHQUFHLG9PQUFvTyxzQkFBc0IsdURBQXVELEVBQUUsMEZBQTBGLDRCQUE0QixtREFBbUQscUNBQXFDLEtBQUssdUJBQXVCLEtBQUssSUFBSSwyQ0FBMkMseUNBQXlDLHFCQUFxQixrSUFBa0ksYUFBYSxrSUFBa0ksdUJBQXVCLDJCQUEyQiw0QkFBNEIseUJBQXlCLDRCQUE0QixLQUFLLDRCQUE0Qix3SEFBd0gsRUFBRSxvQkFBb0IsbUNBQW1DLHFCQUFxQix5QkFBeUIsS0FBSyxVQUFVLDRCQUE0QiwwQkFBMEIsa0JBQWtCLElBQUksaUJBQWlCLE1BQU0sYUFBYSx5RUFBeUUsK0RBQStELGFBQWEseUNBQXlDLHVCQUF1QixxQkFBcUIsbUJBQW1CLFFBQVEsbUNBQW1DLHVFQUF1RSx3Q0FBd0Msc0JBQXNCLHlIQUF5SCxFQUFFLDJFQUEyRSw4QkFBOEIsZ0RBQWdELHFDQUFxQyx3QkFBd0IsSUFBSSxpQkFBaUIsc0VBQXNFLGlCQUFpQix1QkFBdUIsaUJBQWlCLGlJQUFpSSxVQUFVLEdBQUcsYUFBYSwwQkFBMEIsZ0RBQWdELEtBQUssbUNBQW1DLFlBQVksU0FBUywwQkFBMEIsbUJBQW1CLFNBQVMsc0NBQXNDLElBQUksdUNBQXVDLCtEQUErRCxRQUFRLFVBQVUsMkRBQTJELEtBQUssV0FBVyxZQUFZLEtBQUssU0FBUyxlQUFlLHdFQUF3RSxTQUFTLFNBQVMseUJBQXlCLFVBQVUsS0FBSyxLQUFLLFdBQVcsc0JBQXNCLEtBQUssU0FBUywwQkFBMEIsU0FBUyx3QkFBd0IsZUFBZSxxQkFBcUIsaUNBQWlDLGVBQWUsc0NBQXNDLGdDQUFnQywwQkFBMEIsZUFBZSxJQUFJLGlDQUFpQyxFQUFFLHVCQUF1QixpQkFBaUIsd0RBQXdELDhDQUE4QyxFQUFFLEtBQUssZ0JBQWdCLGFBQWEsc0NBQXNDLEdBQUcscUJBQXFCLGtDQUFrQyxpQkFBaUIsaUNBQWlDLGlCQUFpQixxSUFBcUksb0JBQW9CLDhCQUE4Qix5Q0FBeUMsZUFBZSx3QkFBd0IsT0FBTyxXQUFXLDhCQUE4QixxQkFBcUIsaUJBQWlCLG1CQUFtQixNQUFNLHVCQUF1Qiw2QkFBNkIsbUNBQW1DLDJCQUEyQix1QkFBdUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixXQUFXLHdCQUF3Qiw4RkFBOEYsU0FBUyxJQUFJLGtFQUFrRSxTQUFTLGNBQWMsY0FBYyxnQ0FBZ0MsMEVBQTBFLFNBQVMsR0FBRyxHQUFHLFVBQVUsR0FBRyxTQUFTLElBQUkscUNBQXFDLEVBQUUsaUVBQWlFLGVBQWUsa0JBQWtCLGVBQWUsOEJBQThCLCtCQUErQixZQUFZLGVBQWUsY0FBYyxrQkFBa0IsTUFBTSxxQ0FBcUMsaUVBQWlFLHFDQUFxQyxlQUFlLDRCQUE0QixrR0FBa0csOENBQThDLElBQUksYUFBYSxTQUFTLFNBQVMsVUFBVSxXQUFXLFdBQVcsNkZBQTZGLElBQUksa0JBQWtCLGFBQWEsNEhBQTRILCtEQUErRCxPQUFPLElBQUksNkJBQTZCLGFBQWEsWUFBWSxXQUFXLGtCQUFrQiwyREFBMkQsOENBQThDLEVBQUUsT0FBTyxJQUFJLGdEQUFnRCx5QkFBeUIsRUFBRSw4QkFBOEIsOENBQThDLEVBQUUsU0FBUyxHQUFHLGdGQUFnRixHQUFHLFdBQVcseUJBQXlCLGFBQWEsMkJBQTJCLElBQUksY0FBYyw2Q0FBNkMsbUJBQW1CLGVBQWUsaUJBQWlCLGFBQWEsbUNBQW1DLFdBQVcsaUNBQWlDLGFBQWEsU0FBUyxxR0FBcUcsT0FBTyw0QkFBNEIsU0FBUyxnQ0FBZ0MsUUFBUSx1TEFBdUwsVUFBVSxnQkFBZ0IsRUFBRSxxQkFBcUIsUUFBUSxrQ0FBa0MsUUFBd0IsRUFBRSxDQUFRLHlCQUF5Qix5RUFBeUUsc0RBQXNELFdBQVcsd0dBQXdHLGlDQUFpQyxzRUFBc0UsZ0RBQWdELCtDQUErQyw4QkFBOEIsT0FBTyxhQUFhLHlDQUF5Qyw4RUFBOEUscUdBQXFHLGdEQUFnRCxnREFBZ0QsRUFBRSxxRUFBcUUsd0RBQXdELGNBQWMsRUFBRSw4Q0FBOEMsNkJBQTZCLFdBQVcsRUFBRSx1R0FBdUcsNEJBQTRCLDRCQUE0Qiw2QkFBNkIsRUFBRSwyR0FBMkcscURBQXFELDhEQUE4RCxtQkFBbUIsMkNBQTJDLGlCQUFpQixTQUFTLHFPQUFxTyxRQUF3QiwwRUFBMEUsSUFBSSwwQkFBMEIsTUFBTSxTQUFTLGNBQWMsMkNBQTJDLE9BQU8sZ0NBQWdDLGlCQUFpQixzUEFBc1AsbUJBQW1CLDhHQUE4RywrQkFBK0IsdUJBQXVCLGVBQWUsU0FBUyxlQUFlLHNDQUFzQyxVQUFVLHNEQUFzRCxVQUFVLHdDQUF3Qyx1REFBdUQsNEJBQTRCLDBCQUEwQixxR0FBcUcsZ0hBQWdILDhEQUE4RCxFQUFFLElBQUksU0FBUyxTQUFTLHdCQUF3QixpQkFBaUIsa0NBQWtDLGdEQUFnRCw4REFBOEQsNkNBQTZDLCtDQUErQyw2REFBNkQsMkJBQTJCLEVBQUUsOERBQThELDRCQUE0QixFQUFFLGdFQUFnRSxnRUFBZ0UsMkNBQTJDLEVBQUUsd0VBQXdFLCtCQUErQix5QkFBeUIsR0FBRyw0QkFBNEIsZUFBZSwySkFBMkosR0FBRyxPQUFPLHdGQUF3Rix3Q0FBd0MsdUVBQXVFLDJCQUEyQiw4Q0FBOEMsR0FBRyx3RUFBd0UsMkJBQTJCLDREQUE0RCxHQUFHLFVBQVUsbUJBQW1CLG9DQUFvQyxlQUFlLHlDQUF5QyxzQ0FBc0MsbUhBQW1ILDRFQUE0RSxPQUFPLHdCQUF3QixFQUFFLHVCQUF1QiwyQ0FBMkMsNENBQTRDLHVLQUF1SyxTQUFTLFNBQVMsMEdBQTBHLGVBQWUsMEhBQTBILDBKQUEwSiwrRUFBK0UsbUNBQW1DLE1BQU0sK0JBQStCLGdCQUFnQixFQUFFLG1DQUFtQyxnQkFBZ0IsRUFBRSw4RUFBOEUsRUFBRSxpQ0FBaUMsK0NBQStDLEdBQUcsRUFBRSxlQUFlLDJDQUEyQyxrQ0FBa0Msb0NBQW9DLGdDQUFnQyxFQUFFLEdBQUcsR0FBRyxLQUFLLGVBQWUsZUFBZSxlQUFlLE1BQU0sd0JBQXdCLGNBQWMsU0FBUyxtQkFBMEk7QUFDcmsyRSIsInNvdXJjZXMiOlsiL2hvbWUvc21sZmxnL1Byb2pla3RlL0V4cGVyaW1lbnRlL3N1cGVybG9nL25vZGVfbW9kdWxlcy8ucG5wbS9AdmVyY2VsK290ZWxAMS4xNC4xX0BvcGVudGVsZW1ldHJ5K2FwaS1sb2dzQDAuMjE1LjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4xX0BvcGVudGVsZW1ldHJ5K2lfY2c1azJueG9qcHUzMnZmM2dqZjdtZmU1emEvbm9kZV9tb2R1bGVzL0B2ZXJjZWwvb3RlbC9kaXN0L25vZGUvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIGFzIHRvcExldmVsQ3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7XG5pbXBvcnQgX25QYXRoIGZyb20gJ3BhdGgnXG5jb25zdCByZXF1aXJlID0gdG9wTGV2ZWxDcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgX19kaXJuYW1lID0gX25QYXRoLmRpcm5hbWUoX19maWxlbmFtZSk7XG52YXIgYmY9T2JqZWN0LmNyZWF0ZTt2YXIganM9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBQZj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3ZhciB5Zj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgdmY9T2JqZWN0LmdldFByb3RvdHlwZU9mLElmPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIHo9KHI9PnR5cGVvZiByZXF1aXJlPFwidVwiP3JlcXVpcmU6dHlwZW9mIFByb3h5PFwidVwiP25ldyBQcm94eShyLHtnZXQ6KGUsdCk9Pih0eXBlb2YgcmVxdWlyZTxcInVcIj9yZXF1aXJlOmUpW3RdfSk6cikoZnVuY3Rpb24ocil7aWYodHlwZW9mIHJlcXVpcmU8XCJ1XCIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgXCInK3IrJ1wiIGlzIG5vdCBzdXBwb3J0ZWQnKX0pO3ZhciBfYz0ocixlKT0+KCk9PihyJiYoZT1yKHI9MCkpLGUpO3ZhciBsPShyLGUpPT4oKT0+KGV8fHIoKGU9e2V4cG9ydHM6e319KS5leHBvcnRzLGUpLGUuZXhwb3J0cyk7dmFyIFhyPShyLGUsdCxuKT0+e2lmKGUmJnR5cGVvZiBlPT1cIm9iamVjdFwifHx0eXBlb2YgZT09XCJmdW5jdGlvblwiKWZvcihsZXQgaSBvZiB5ZihlKSkhSWYuY2FsbChyLGkpJiZpIT09dCYmanMocixpLHtnZXQ6KCk9PmVbaV0sZW51bWVyYWJsZTohKG49UGYoZSxpKSl8fG4uZW51bWVyYWJsZX0pO3JldHVybiByfSxodD0ocixlLHQpPT4oWHIocixlLFwiZGVmYXVsdFwiKSx0JiZYcih0LGUsXCJkZWZhdWx0XCIpKSxZPShyLGUsdCk9Pih0PXIhPW51bGw/YmYodmYocikpOnt9LFhyKGV8fCFyfHwhci5fX2VzTW9kdWxlP2pzKHQsXCJkZWZhdWx0XCIse3ZhbHVlOnIsZW51bWVyYWJsZTohMH0pOnQscikpLG09cj0+WHIoanMoe30sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSkscik7dmFyIGQ9e307aW1wb3J0KmFzIHNSIGZyb21cIkBvcGVudGVsZW1ldHJ5L2FwaVwiO3ZhciBoPV9jKCgpPT57aHQoZCxzUil9KTt2YXIgZHI9bCh5ZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh5ZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt5ZS5pc1RyYWNpbmdTdXBwcmVzc2VkPXllLnVuc3VwcHJlc3NUcmFjaW5nPXllLnN1cHByZXNzVHJhY2luZz12b2lkIDA7dmFyIE1mPShoKCksbShkKSksRnM9KDAsTWYuY3JlYXRlQ29udGV4dEtleSkoXCJPcGVuVGVsZW1ldHJ5IFNESyBDb250ZXh0IEtleSBTVVBQUkVTU19UUkFDSU5HXCIpO2Z1bmN0aW9uIExmKHIpe3JldHVybiByLnNldFZhbHVlKEZzLCEwKX15ZS5zdXBwcmVzc1RyYWNpbmc9TGY7ZnVuY3Rpb24gTmYocil7cmV0dXJuIHIuZGVsZXRlVmFsdWUoRnMpfXllLnVuc3VwcHJlc3NUcmFjaW5nPU5mO2Z1bmN0aW9uIENmKHIpe3JldHVybiByLmdldFZhbHVlKEZzKT09PSEwfXllLmlzVHJhY2luZ1N1cHByZXNzZWQ9Q2Z9KTt2YXIga3M9bChGPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEYsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Ri5CQUdHQUdFX01BWF9UT1RBTF9MRU5HVEg9Ri5CQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUz1GLkJBR0dBR0VfTUFYX05BTUVfVkFMVUVfUEFJUlM9Ri5CQUdHQUdFX0hFQURFUj1GLkJBR0dBR0VfSVRFTVNfU0VQQVJBVE9SPUYuQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUj1GLkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SPXZvaWQgMDtGLkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SPVwiPVwiO0YuQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUj1cIjtcIjtGLkJBR0dBR0VfSVRFTVNfU0VQQVJBVE9SPVwiLFwiO0YuQkFHR0FHRV9IRUFERVI9XCJiYWdnYWdlXCI7Ri5CQUdHQUdFX01BWF9OQU1FX1ZBTFVFX1BBSVJTPTE4MDtGLkJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTPTQwOTY7Ri5CQUdHQUdFX01BWF9UT1RBTF9MRU5HVEg9ODE5Mn0pO3ZhciAkcz1sKHBlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHBlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3BlLnBhcnNlS2V5UGFpcnNJbnRvUmVjb3JkPXBlLnBhcnNlUGFpcktleVZhbHVlPXBlLmdldEtleVBhaXJzPXBlLnNlcmlhbGl6ZUtleVBhaXJzPXZvaWQgMDt2YXIgd2Y9KGgoKSxtKGQpKSxqZT1rcygpO2Z1bmN0aW9uIHhmKHIpe3JldHVybiByLnJlZHVjZSgoZSx0KT0+e2xldCBuPWAke2V9JHtlIT09XCJcIj9qZS5CQUdHQUdFX0lURU1TX1NFUEFSQVRPUjpcIlwifSR7dH1gO3JldHVybiBuLmxlbmd0aD5qZS5CQUdHQUdFX01BWF9UT1RBTF9MRU5HVEg/ZTpufSxcIlwiKX1wZS5zZXJpYWxpemVLZXlQYWlycz14ZjtmdW5jdGlvbiBEZihyKXtyZXR1cm4gci5nZXRBbGxFbnRyaWVzKCkubWFwKChbZSx0XSk9PntsZXQgbj1gJHtlbmNvZGVVUklDb21wb25lbnQoZSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQudmFsdWUpfWA7cmV0dXJuIHQubWV0YWRhdGEhPT12b2lkIDAmJihuKz1qZS5CQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SK3QubWV0YWRhdGEudG9TdHJpbmcoKSksbn0pfXBlLmdldEtleVBhaXJzPURmO2Z1bmN0aW9uIHBjKHIpe2xldCBlPXIuc3BsaXQoamUuQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUik7aWYoZS5sZW5ndGg8PTApcmV0dXJuO2xldCB0PWUuc2hpZnQoKTtpZighdClyZXR1cm47bGV0IG49dC5pbmRleE9mKGplLkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SKTtpZihuPD0wKXJldHVybjtsZXQgaT1kZWNvZGVVUklDb21wb25lbnQodC5zdWJzdHJpbmcoMCxuKS50cmltKCkpLHM9ZGVjb2RlVVJJQ29tcG9uZW50KHQuc3Vic3RyaW5nKG4rMSkudHJpbSgpKSxvO3JldHVybiBlLmxlbmd0aD4wJiYobz0oMCx3Zi5iYWdnYWdlRW50cnlNZXRhZGF0YUZyb21TdHJpbmcpKGUuam9pbihqZS5CQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SKSkpLHtrZXk6aSx2YWx1ZTpzLG1ldGFkYXRhOm99fXBlLnBhcnNlUGFpcktleVZhbHVlPXBjO2Z1bmN0aW9uIFVmKHIpe3JldHVybiB0eXBlb2YgciE9XCJzdHJpbmdcInx8ci5sZW5ndGg9PT0wP3t9OnIuc3BsaXQoamUuQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpLm1hcChlPT5wYyhlKSkuZmlsdGVyKGU9PmUhPT12b2lkIDAmJmUudmFsdWUubGVuZ3RoPjApLnJlZHVjZSgoZSx0KT0+KGVbdC5rZXldPXQudmFsdWUsZSkse30pfXBlLnBhcnNlS2V5UGFpcnNJbnRvUmVjb3JkPVVmfSk7dmFyIGhjPWwoV3I9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoV3IsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7V3IuVzNDQmFnZ2FnZVByb3BhZ2F0b3I9dm9pZCAwO3ZhciBYcz0oaCgpLG0oZCkpLEJmPWRyKCksRmU9a3MoKSxXcz0kcygpLEtzPWNsYXNze2luamVjdChlLHQsbil7bGV0IGk9WHMucHJvcGFnYXRpb24uZ2V0QmFnZ2FnZShlKTtpZighaXx8KDAsQmYuaXNUcmFjaW5nU3VwcHJlc3NlZCkoZSkpcmV0dXJuO2xldCBzPSgwLFdzLmdldEtleVBhaXJzKShpKS5maWx0ZXIoYT0+YS5sZW5ndGg8PUZlLkJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTKS5zbGljZSgwLEZlLkJBR0dBR0VfTUFYX05BTUVfVkFMVUVfUEFJUlMpLG89KDAsV3Muc2VyaWFsaXplS2V5UGFpcnMpKHMpO28ubGVuZ3RoPjAmJm4uc2V0KHQsRmUuQkFHR0FHRV9IRUFERVIsbyl9ZXh0cmFjdChlLHQsbil7bGV0IGk9bi5nZXQodCxGZS5CQUdHQUdFX0hFQURFUikscz1BcnJheS5pc0FycmF5KGkpP2kuam9pbihGZS5CQUdHQUdFX0lURU1TX1NFUEFSQVRPUik6aTtpZighcylyZXR1cm4gZTtsZXQgbz17fTtyZXR1cm4gcy5sZW5ndGg9PT0wfHwocy5zcGxpdChGZS5CQUdHQUdFX0lURU1TX1NFUEFSQVRPUikuZm9yRWFjaCh1PT57bGV0IGM9KDAsV3MucGFyc2VQYWlyS2V5VmFsdWUpKHUpO2lmKGMpe2xldCBfPXt2YWx1ZTpjLnZhbHVlfTtjLm1ldGFkYXRhJiYoXy5tZXRhZGF0YT1jLm1ldGFkYXRhKSxvW2Mua2V5XT1ffX0pLE9iamVjdC5lbnRyaWVzKG8pLmxlbmd0aD09PTApP2U6WHMucHJvcGFnYXRpb24uc2V0QmFnZ2FnZShlLFhzLnByb3BhZ2F0aW9uLmNyZWF0ZUJhZ2dhZ2UobykpfWZpZWxkcygpe3JldHVybltGZS5CQUdHQUdFX0hFQURFUl19fTtXci5XM0NCYWdnYWdlUHJvcGFnYXRvcj1Lc30pO3ZhciBmYz1sKEtyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEtyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0tyLkFuY2hvcmVkQ2xvY2s9dm9pZCAwO3ZhciB6cz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX21vbm90b25pY0Nsb2NrPXQsdGhpcy5fZXBvY2hNaWxsaXM9ZS5ub3coKSx0aGlzLl9wZXJmb3JtYW5jZU1pbGxpcz10Lm5vdygpfW5vdygpe2xldCBlPXRoaXMuX21vbm90b25pY0Nsb2NrLm5vdygpLXRoaXMuX3BlcmZvcm1hbmNlTWlsbGlzO3JldHVybiB0aGlzLl9lcG9jaE1pbGxpcytlfX07S3IuQW5jaG9yZWRDbG9jaz16c30pO3ZhciBTYz1sKHZlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHZlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZlLmlzQXR0cmlidXRlVmFsdWU9dmUuaXNBdHRyaWJ1dGVLZXk9dmUuc2FuaXRpemVBdHRyaWJ1dGVzPXZvaWQgMDt2YXIgRWM9KGgoKSxtKGQpKTtmdW5jdGlvbiBxZihyKXtsZXQgZT17fTtpZih0eXBlb2YgciE9XCJvYmplY3RcInx8cj09bnVsbClyZXR1cm4gZTtmb3IobGV0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhyKSl7aWYoIW1jKHQpKXtFYy5kaWFnLndhcm4oYEludmFsaWQgYXR0cmlidXRlIGtleTogJHt0fWApO2NvbnRpbnVlfWlmKCFnYyhuKSl7RWMuZGlhZy53YXJuKGBJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogJHt0fWApO2NvbnRpbnVlfUFycmF5LmlzQXJyYXkobik/ZVt0XT1uLnNsaWNlKCk6ZVt0XT1ufXJldHVybiBlfXZlLnNhbml0aXplQXR0cmlidXRlcz1xZjtmdW5jdGlvbiBtYyhyKXtyZXR1cm4gdHlwZW9mIHI9PVwic3RyaW5nXCImJnIubGVuZ3RoPjB9dmUuaXNBdHRyaWJ1dGVLZXk9bWM7ZnVuY3Rpb24gZ2Mocil7cmV0dXJuIHI9PW51bGw/ITA6QXJyYXkuaXNBcnJheShyKT9WZihyKTpUYyhyKX12ZS5pc0F0dHJpYnV0ZVZhbHVlPWdjO2Z1bmN0aW9uIFZmKHIpe2xldCBlO2ZvcihsZXQgdCBvZiByKWlmKHQhPW51bGwpe2lmKCFlKXtpZihUYyh0KSl7ZT10eXBlb2YgdDtjb250aW51ZX1yZXR1cm4hMX1pZih0eXBlb2YgdCE9PWUpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gVGMocil7c3dpdGNoKHR5cGVvZiByKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJib29sZWFuXCI6Y2FzZVwic3RyaW5nXCI6cmV0dXJuITB9cmV0dXJuITF9fSk7dmFyIFlzPWwoenI9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoenIsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7enIubG9nZ2luZ0Vycm9ySGFuZGxlcj12b2lkIDA7dmFyIEdmPShoKCksbShkKSk7ZnVuY3Rpb24gSGYoKXtyZXR1cm4gcj0+e0dmLmRpYWcuZXJyb3IoamYocikpfX16ci5sb2dnaW5nRXJyb3JIYW5kbGVyPUhmO2Z1bmN0aW9uIGpmKHIpe3JldHVybiB0eXBlb2Ygcj09XCJzdHJpbmdcIj9yOkpTT04uc3RyaW5naWZ5KEZmKHIpKX1mdW5jdGlvbiBGZihyKXtsZXQgZT17fSx0PXI7Zm9yKDt0IT09bnVsbDspT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaChuPT57aWYoZVtuXSlyZXR1cm47bGV0IGk9dFtuXTtpJiYoZVtuXT1TdHJpbmcoaSkpfSksdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7cmV0dXJuIGV9fSk7dmFyIFFzPWwoZnQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZnQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7ZnQuZ2xvYmFsRXJyb3JIYW5kbGVyPWZ0LnNldEdsb2JhbEVycm9ySGFuZGxlcj12b2lkIDA7dmFyIGtmPVlzKCksQWM9KDAsa2YubG9nZ2luZ0Vycm9ySGFuZGxlcikoKTtmdW5jdGlvbiAkZihyKXtBYz1yfWZ0LnNldEdsb2JhbEVycm9ySGFuZGxlcj0kZjtmdW5jdGlvbiBYZihyKXt0cnl7QWMocil9Y2F0Y2h7fX1mdC5nbG9iYWxFcnJvckhhbmRsZXI9WGZ9KTt2YXIgWnM9bChfcj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShfcixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtfci5UcmFjZXNTYW1wbGVyVmFsdWVzPXZvaWQgMDt2YXIgV2Y7KGZ1bmN0aW9uKHIpe3IuQWx3YXlzT2ZmPVwiYWx3YXlzX29mZlwiLHIuQWx3YXlzT249XCJhbHdheXNfb25cIixyLlBhcmVudEJhc2VkQWx3YXlzT2ZmPVwicGFyZW50YmFzZWRfYWx3YXlzX29mZlwiLHIuUGFyZW50QmFzZWRBbHdheXNPbj1cInBhcmVudGJhc2VkX2Fsd2F5c19vblwiLHIuUGFyZW50QmFzZWRUcmFjZUlkUmF0aW89XCJwYXJlbnRiYXNlZF90cmFjZWlkcmF0aW9cIixyLlRyYWNlSWRSYXRpbz1cInRyYWNlaWRyYXRpb1wifSkoV2Y9X3IuVHJhY2VzU2FtcGxlclZhbHVlc3x8KF9yLlRyYWNlc1NhbXBsZXJWYWx1ZXM9e30pKX0pO3ZhciBPYz1sKFlyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFlyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1lyLl9nbG9iYWxUaGlzPXZvaWQgMDtZci5fZ2xvYmFsVGhpcz10eXBlb2YgZ2xvYmFsVGhpcz09XCJvYmplY3RcIj9nbG9iYWxUaGlzOnR5cGVvZiBzZWxmPT1cIm9iamVjdFwiP3NlbGY6dHlwZW9mIHdpbmRvdz09XCJvYmplY3RcIj93aW5kb3c6dHlwZW9mIGdsb2JhbD09XCJvYmplY3RcIj9nbG9iYWw6e319KTt2YXIgUXI9bCh2PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHYsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7di5nZXRFbnZXaXRob3V0RGVmYXVsdHM9di5wYXJzZUVudmlyb25tZW50PXYuREVGQVVMVF9FTlZJUk9OTUVOVD12LkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQ9di5ERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVD12LkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUPXYuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUPXZvaWQgMDt2YXIgSWU9KGgoKSxtKGQpKSxLZj1acygpLHpmPU9jKCksWWY9XCIsXCIsUWY9W1wiT1RFTF9TREtfRElTQUJMRURcIl07ZnVuY3Rpb24gWmYocil7cmV0dXJuIFFmLmluZGV4T2Yocik+LTF9dmFyIEpmPVtcIk9URUxfQlNQX0VYUE9SVF9USU1FT1VUXCIsXCJPVEVMX0JTUF9NQVhfRVhQT1JUX0JBVENIX1NJWkVcIixcIk9URUxfQlNQX01BWF9RVUVVRV9TSVpFXCIsXCJPVEVMX0JTUF9TQ0hFRFVMRV9ERUxBWVwiLFwiT1RFTF9CTFJQX0VYUE9SVF9USU1FT1VUXCIsXCJPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFXCIsXCJPVEVMX0JMUlBfTUFYX1FVRVVFX1NJWkVcIixcIk9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWVwiLFwiT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUXCIsXCJPVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVFwiLFwiT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVRcIixcIk9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVRcIixcIk9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVRcIixcIk9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9DT1VOVF9MSU1JVFwiLFwiT1RFTF9TUEFOX0VWRU5UX0NPVU5UX0xJTUlUXCIsXCJPVEVMX1NQQU5fTElOS19DT1VOVF9MSU1JVFwiLFwiT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVRcIixcIk9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVRcIixcIk9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUXCIsXCJPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVRcIixcIk9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVRcIixcIk9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVRcIixcIk9URUxfRVhQT1JURVJfSkFFR0VSX0FHRU5UX1BPUlRcIl07ZnVuY3Rpb24gZUUocil7cmV0dXJuIEpmLmluZGV4T2Yocik+LTF9dmFyIHRFPVtcIk9URUxfTk9fUEFUQ0hfTU9EVUxFU1wiLFwiT1RFTF9QUk9QQUdBVE9SU1wiXTtmdW5jdGlvbiByRShyKXtyZXR1cm4gdEUuaW5kZXhPZihyKT4tMX12LkRFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVD0xLzA7di5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVD0xMjg7di5ERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVD0xMjg7di5ERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlUPTEyODt2LkRFRkFVTFRfRU5WSVJPTk1FTlQ9e09URUxfU0RLX0RJU0FCTEVEOiExLENPTlRBSU5FUl9OQU1FOlwiXCIsRUNTX0NPTlRBSU5FUl9NRVRBREFUQV9VUklfVjQ6XCJcIixFQ1NfQ09OVEFJTkVSX01FVEFEQVRBX1VSSTpcIlwiLEhPU1ROQU1FOlwiXCIsS1VCRVJORVRFU19TRVJWSUNFX0hPU1Q6XCJcIixOQU1FU1BBQ0U6XCJcIixPVEVMX0JTUF9FWFBPUlRfVElNRU9VVDozZTQsT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOjUxMixPVEVMX0JTUF9NQVhfUVVFVUVfU0laRToyMDQ4LE9URUxfQlNQX1NDSEVEVUxFX0RFTEFZOjVlMyxPVEVMX0JMUlBfRVhQT1JUX1RJTUVPVVQ6M2U0LE9URUxfQkxSUF9NQVhfRVhQT1JUX0JBVENIX1NJWkU6NTEyLE9URUxfQkxSUF9NQVhfUVVFVUVfU0laRToyMDQ4LE9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWTo1ZTMsT1RFTF9FWFBPUlRFUl9KQUVHRVJfQUdFTlRfSE9TVDpcIlwiLE9URUxfRVhQT1JURVJfSkFFR0VSX0FHRU5UX1BPUlQ6NjgzMixPVEVMX0VYUE9SVEVSX0pBRUdFUl9FTkRQT0lOVDpcIlwiLE9URUxfRVhQT1JURVJfSkFFR0VSX1BBU1NXT1JEOlwiXCIsT1RFTF9FWFBPUlRFUl9KQUVHRVJfVVNFUjpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVDpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19FTkRQT0lOVDpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0VORFBPSU5UOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlM6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0hFQURFUlM6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19IRUFERVJTOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfSEVBREVSUzpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUOjFlNCxPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVQ6MWU0LE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQ6MWU0LE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVQ6MWU0LE9URUxfRVhQT1JURVJfWklQS0lOX0VORFBPSU5UOlwiaHR0cDovL2xvY2FsaG9zdDo5NDExL2FwaS92Mi9zcGFuc1wiLE9URUxfTE9HX0xFVkVMOkllLkRpYWdMb2dMZXZlbC5JTkZPLE9URUxfTk9fUEFUQ0hfTU9EVUxFUzpbXSxPVEVMX1BST1BBR0FUT1JTOltcInRyYWNlY29udGV4dFwiLFwiYmFnZ2FnZVwiXSxPVEVMX1JFU09VUkNFX0FUVFJJQlVURVM6XCJcIixPVEVMX1NFUlZJQ0VfTkFNRTpcIlwiLE9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDp2LkRFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxPVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVDp2LkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULE9URUxfU1BBTl9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUOnYuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULE9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6di5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUOnYuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULE9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9DT1VOVF9MSU1JVDp2LkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULE9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVDoxMjgsT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQ6MTI4LE9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlUOnYuREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQsT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVDp2LkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQsT1RFTF9UUkFDRVNfRVhQT1JURVI6XCJcIixPVEVMX1RSQUNFU19TQU1QTEVSOktmLlRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbixPVEVMX1RSQUNFU19TQU1QTEVSX0FSRzpcIlwiLE9URUxfTE9HU19FWFBPUlRFUjpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9JTlNFQ1VSRTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfSU5TRUNVUkU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19JTlNFQ1VSRTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0lOU0VDVVJFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0NFUlRJRklDQVRFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DRVJUSUZJQ0FURTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0NFUlRJRklDQVRFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfQ09NUFJFU1NJT046XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NPTVBSRVNTSU9OOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ09NUFJFU1NJT046XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DT01QUkVTU0lPTjpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9DTElFTlRfS0VZOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfS0VZOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ0xJRU5UX0tFWTpcIlwiLE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0NMSUVOVF9LRVk6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0NFUlRJRklDQVRFOlwiXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DTElFTlRfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfQ0VSVElGSUNBVEU6XCJcIixPVEVMX0VYUE9SVEVSX09UTFBfUFJPVE9DT0w6XCJodHRwL3Byb3RvYnVmXCIsT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19QUk9UT0NPTDpcImh0dHAvcHJvdG9idWZcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19QUk9UT0NPTDpcImh0dHAvcHJvdG9idWZcIixPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19QUk9UT0NPTDpcImh0dHAvcHJvdG9idWZcIixPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19URU1QT1JBTElUWV9QUkVGRVJFTkNFOlwiY3VtdWxhdGl2ZVwifTtmdW5jdGlvbiBuRShyLGUsdCl7aWYodHlwZW9mIHRbcl0+XCJ1XCIpcmV0dXJuO2xldCBuPVN0cmluZyh0W3JdKTtlW3JdPW4udG9Mb3dlckNhc2UoKT09PVwidHJ1ZVwifWZ1bmN0aW9uIGlFKHIsZSx0LG49LTEvMCxpPTEvMCl7aWYodHlwZW9mIHRbcl08XCJ1XCIpe2xldCBzPU51bWJlcih0W3JdKTtpc05hTihzKXx8KHM8bj9lW3JdPW46cz5pP2Vbcl09aTplW3JdPXMpfX1mdW5jdGlvbiBzRShyLGUsdCxuPVlmKXtsZXQgaT10W3JdO3R5cGVvZiBpPT1cInN0cmluZ1wiJiYoZVtyXT1pLnNwbGl0KG4pLm1hcChzPT5zLnRyaW0oKSkpfXZhciBvRT17QUxMOkllLkRpYWdMb2dMZXZlbC5BTEwsVkVSQk9TRTpJZS5EaWFnTG9nTGV2ZWwuVkVSQk9TRSxERUJVRzpJZS5EaWFnTG9nTGV2ZWwuREVCVUcsSU5GTzpJZS5EaWFnTG9nTGV2ZWwuSU5GTyxXQVJOOkllLkRpYWdMb2dMZXZlbC5XQVJOLEVSUk9SOkllLkRpYWdMb2dMZXZlbC5FUlJPUixOT05FOkllLkRpYWdMb2dMZXZlbC5OT05FfTtmdW5jdGlvbiBhRShyLGUsdCl7bGV0IG49dFtyXTtpZih0eXBlb2Ygbj09XCJzdHJpbmdcIil7bGV0IGk9b0Vbbi50b1VwcGVyQ2FzZSgpXTtpIT1udWxsJiYoZVtyXT1pKX19ZnVuY3Rpb24gSnMocil7bGV0IGU9e307Zm9yKGxldCB0IGluIHYuREVGQVVMVF9FTlZJUk9OTUVOVCl7bGV0IG49dDtzd2l0Y2gobil7Y2FzZVwiT1RFTF9MT0dfTEVWRUxcIjphRShuLGUscik7YnJlYWs7ZGVmYXVsdDppZihaZihuKSluRShuLGUscik7ZWxzZSBpZihlRShuKSlpRShuLGUscik7ZWxzZSBpZihyRShuKSlzRShuLGUscik7ZWxzZXtsZXQgaT1yW25dO3R5cGVvZiBpPFwidVwiJiZpIT09bnVsbCYmKGVbbl09U3RyaW5nKGkpKX19fXJldHVybiBlfXYucGFyc2VFbnZpcm9ubWVudD1KcztmdW5jdGlvbiB1RSgpe3JldHVybiB0eXBlb2YgcHJvY2VzczxcInVcIiYmcHJvY2VzcyYmcHJvY2Vzcy5lbnY/SnMocHJvY2Vzcy5lbnYpOkpzKHpmLl9nbG9iYWxUaGlzKX12LmdldEVudldpdGhvdXREZWZhdWx0cz11RX0pO3ZhciBiYz1sKFpyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFpyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1pyLmdldEVudj12b2lkIDA7dmFyIGNFPXooXCJvc1wiKSxSYz1RcigpO2Z1bmN0aW9uIGxFKCl7bGV0IHI9KDAsUmMucGFyc2VFbnZpcm9ubWVudCkocHJvY2Vzcy5lbnYpO3JldHVybiBPYmplY3QuYXNzaWduKHtIT1NUTkFNRTpjRS5ob3N0bmFtZSgpfSxSYy5ERUZBVUxUX0VOVklST05NRU5ULHIpfVpyLmdldEVudj1sRX0pO3ZhciBQYz1sKEpyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEpyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0pyLl9nbG9iYWxUaGlzPXZvaWQgMDtKci5fZ2xvYmFsVGhpcz10eXBlb2YgZ2xvYmFsVGhpcz09XCJvYmplY3RcIj9nbG9iYWxUaGlzOmdsb2JhbH0pO3ZhciB2Yz1sKGVuPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGVuLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2VuLmhleFRvQmFzZTY0PXZvaWQgMDtmdW5jdGlvbiB5YyhyKXtyZXR1cm4gcj49NDgmJnI8PTU3P3ItNDg6cj49OTcmJnI8PTEwMj9yLTg3OnItNTV9dmFyIGRFPUJ1ZmZlci5hbGxvYyg4KSxfRT1CdWZmZXIuYWxsb2MoMTYpO2Z1bmN0aW9uIHBFKHIpe2xldCBlO3IubGVuZ3RoPT09MTY/ZT1kRTpyLmxlbmd0aD09PTMyP2U9X0U6ZT1CdWZmZXIuYWxsb2Moci5sZW5ndGgvMik7bGV0IHQ9MDtmb3IobGV0IG49MDtuPHIubGVuZ3RoO24rPTIpe2xldCBpPXljKHIuY2hhckNvZGVBdChuKSkscz15YyhyLmNoYXJDb2RlQXQobisxKSk7ZS53cml0ZVVJbnQ4KGk8PDR8cyx0KyspfXJldHVybiBlLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWVuLmhleFRvQmFzZTY0PXBFfSk7dmFyIExjPWwocm49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkocm4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7cm4uUmFuZG9tSWRHZW5lcmF0b3I9dm9pZCAwO3ZhciBoRT04LE1jPTE2LGVvPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5nZW5lcmF0ZVRyYWNlSWQ9SWMoTWMpLHRoaXMuZ2VuZXJhdGVTcGFuSWQ9SWMoaEUpfX07cm4uUmFuZG9tSWRHZW5lcmF0b3I9ZW87dmFyIHRuPUJ1ZmZlci5hbGxvY1Vuc2FmZShNYyk7ZnVuY3Rpb24gSWMocil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDxyLzQ7dCsrKXRuLndyaXRlVUludDMyQkUoTWF0aC5yYW5kb20oKSoyKiozMj4+PjAsdCo0KTtmb3IobGV0IHQ9MDt0PHImJiEodG5bdF0+MCk7dCsrKXQ9PT1yLTEmJih0bltyLTFdPTEpO3JldHVybiB0bi50b1N0cmluZyhcImhleFwiLDAscil9fX0pO3ZhciBOYz1sKG5uPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG5uLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO25uLm90cGVyZm9ybWFuY2U9dm9pZCAwO3ZhciBmRT16KFwicGVyZl9ob29rc1wiKTtubi5vdHBlcmZvcm1hbmNlPWZFLnBlcmZvcm1hbmNlfSk7dmFyIHRvPWwoc249PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoc24sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7c24uVkVSU0lPTj12b2lkIDA7c24uVkVSU0lPTj1cIjEuMTkuMFwifSk7dmFyIENjPWwoYj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2IuTWVzc2FnZVR5cGVWYWx1ZXM9Yi5ScGNHcnBjU3RhdHVzQ29kZVZhbHVlcz1iLk1lc3NhZ2luZ09wZXJhdGlvblZhbHVlcz1iLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uS2luZFZhbHVlcz1iLkh0dHBGbGF2b3JWYWx1ZXM9Yi5OZXRIb3N0Q29ubmVjdGlvblN1YnR5cGVWYWx1ZXM9Yi5OZXRIb3N0Q29ubmVjdGlvblR5cGVWYWx1ZXM9Yi5OZXRUcmFuc3BvcnRWYWx1ZXM9Yi5GYWFzSW52b2tlZFByb3ZpZGVyVmFsdWVzPWIuRmFhc0RvY3VtZW50T3BlcmF0aW9uVmFsdWVzPWIuRmFhc1RyaWdnZXJWYWx1ZXM9Yi5EYkNhc3NhbmRyYUNvbnNpc3RlbmN5TGV2ZWxWYWx1ZXM9Yi5EYlN5c3RlbVZhbHVlcz1iLlNlbWFudGljQXR0cmlidXRlcz12b2lkIDA7Yi5TZW1hbnRpY0F0dHJpYnV0ZXM9e0FXU19MQU1CREFfSU5WT0tFRF9BUk46XCJhd3MubGFtYmRhLmludm9rZWRfYXJuXCIsREJfU1lTVEVNOlwiZGIuc3lzdGVtXCIsREJfQ09OTkVDVElPTl9TVFJJTkc6XCJkYi5jb25uZWN0aW9uX3N0cmluZ1wiLERCX1VTRVI6XCJkYi51c2VyXCIsREJfSkRCQ19EUklWRVJfQ0xBU1NOQU1FOlwiZGIuamRiYy5kcml2ZXJfY2xhc3NuYW1lXCIsREJfTkFNRTpcImRiLm5hbWVcIixEQl9TVEFURU1FTlQ6XCJkYi5zdGF0ZW1lbnRcIixEQl9PUEVSQVRJT046XCJkYi5vcGVyYXRpb25cIixEQl9NU1NRTF9JTlNUQU5DRV9OQU1FOlwiZGIubXNzcWwuaW5zdGFuY2VfbmFtZVwiLERCX0NBU1NBTkRSQV9LRVlTUEFDRTpcImRiLmNhc3NhbmRyYS5rZXlzcGFjZVwiLERCX0NBU1NBTkRSQV9QQUdFX1NJWkU6XCJkYi5jYXNzYW5kcmEucGFnZV9zaXplXCIsREJfQ0FTU0FORFJBX0NPTlNJU1RFTkNZX0xFVkVMOlwiZGIuY2Fzc2FuZHJhLmNvbnNpc3RlbmN5X2xldmVsXCIsREJfQ0FTU0FORFJBX1RBQkxFOlwiZGIuY2Fzc2FuZHJhLnRhYmxlXCIsREJfQ0FTU0FORFJBX0lERU1QT1RFTkNFOlwiZGIuY2Fzc2FuZHJhLmlkZW1wb3RlbmNlXCIsREJfQ0FTU0FORFJBX1NQRUNVTEFUSVZFX0VYRUNVVElPTl9DT1VOVDpcImRiLmNhc3NhbmRyYS5zcGVjdWxhdGl2ZV9leGVjdXRpb25fY291bnRcIixEQl9DQVNTQU5EUkFfQ09PUkRJTkFUT1JfSUQ6XCJkYi5jYXNzYW5kcmEuY29vcmRpbmF0b3IuaWRcIixEQl9DQVNTQU5EUkFfQ09PUkRJTkFUT1JfREM6XCJkYi5jYXNzYW5kcmEuY29vcmRpbmF0b3IuZGNcIixEQl9IQkFTRV9OQU1FU1BBQ0U6XCJkYi5oYmFzZS5uYW1lc3BhY2VcIixEQl9SRURJU19EQVRBQkFTRV9JTkRFWDpcImRiLnJlZGlzLmRhdGFiYXNlX2luZGV4XCIsREJfTU9OR09EQl9DT0xMRUNUSU9OOlwiZGIubW9uZ29kYi5jb2xsZWN0aW9uXCIsREJfU1FMX1RBQkxFOlwiZGIuc3FsLnRhYmxlXCIsRVhDRVBUSU9OX1RZUEU6XCJleGNlcHRpb24udHlwZVwiLEVYQ0VQVElPTl9NRVNTQUdFOlwiZXhjZXB0aW9uLm1lc3NhZ2VcIixFWENFUFRJT05fU1RBQ0tUUkFDRTpcImV4Y2VwdGlvbi5zdGFja3RyYWNlXCIsRVhDRVBUSU9OX0VTQ0FQRUQ6XCJleGNlcHRpb24uZXNjYXBlZFwiLEZBQVNfVFJJR0dFUjpcImZhYXMudHJpZ2dlclwiLEZBQVNfRVhFQ1VUSU9OOlwiZmFhcy5leGVjdXRpb25cIixGQUFTX0RPQ1VNRU5UX0NPTExFQ1RJT046XCJmYWFzLmRvY3VtZW50LmNvbGxlY3Rpb25cIixGQUFTX0RPQ1VNRU5UX09QRVJBVElPTjpcImZhYXMuZG9jdW1lbnQub3BlcmF0aW9uXCIsRkFBU19ET0NVTUVOVF9USU1FOlwiZmFhcy5kb2N1bWVudC50aW1lXCIsRkFBU19ET0NVTUVOVF9OQU1FOlwiZmFhcy5kb2N1bWVudC5uYW1lXCIsRkFBU19USU1FOlwiZmFhcy50aW1lXCIsRkFBU19DUk9OOlwiZmFhcy5jcm9uXCIsRkFBU19DT0xEU1RBUlQ6XCJmYWFzLmNvbGRzdGFydFwiLEZBQVNfSU5WT0tFRF9OQU1FOlwiZmFhcy5pbnZva2VkX25hbWVcIixGQUFTX0lOVk9LRURfUFJPVklERVI6XCJmYWFzLmludm9rZWRfcHJvdmlkZXJcIixGQUFTX0lOVk9LRURfUkVHSU9OOlwiZmFhcy5pbnZva2VkX3JlZ2lvblwiLE5FVF9UUkFOU1BPUlQ6XCJuZXQudHJhbnNwb3J0XCIsTkVUX1BFRVJfSVA6XCJuZXQucGVlci5pcFwiLE5FVF9QRUVSX1BPUlQ6XCJuZXQucGVlci5wb3J0XCIsTkVUX1BFRVJfTkFNRTpcIm5ldC5wZWVyLm5hbWVcIixORVRfSE9TVF9JUDpcIm5ldC5ob3N0LmlwXCIsTkVUX0hPU1RfUE9SVDpcIm5ldC5ob3N0LnBvcnRcIixORVRfSE9TVF9OQU1FOlwibmV0Lmhvc3QubmFtZVwiLE5FVF9IT1NUX0NPTk5FQ1RJT05fVFlQRTpcIm5ldC5ob3N0LmNvbm5lY3Rpb24udHlwZVwiLE5FVF9IT1NUX0NPTk5FQ1RJT05fU1VCVFlQRTpcIm5ldC5ob3N0LmNvbm5lY3Rpb24uc3VidHlwZVwiLE5FVF9IT1NUX0NBUlJJRVJfTkFNRTpcIm5ldC5ob3N0LmNhcnJpZXIubmFtZVwiLE5FVF9IT1NUX0NBUlJJRVJfTUNDOlwibmV0Lmhvc3QuY2Fycmllci5tY2NcIixORVRfSE9TVF9DQVJSSUVSX01OQzpcIm5ldC5ob3N0LmNhcnJpZXIubW5jXCIsTkVUX0hPU1RfQ0FSUklFUl9JQ0M6XCJuZXQuaG9zdC5jYXJyaWVyLmljY1wiLFBFRVJfU0VSVklDRTpcInBlZXIuc2VydmljZVwiLEVORFVTRVJfSUQ6XCJlbmR1c2VyLmlkXCIsRU5EVVNFUl9ST0xFOlwiZW5kdXNlci5yb2xlXCIsRU5EVVNFUl9TQ09QRTpcImVuZHVzZXIuc2NvcGVcIixUSFJFQURfSUQ6XCJ0aHJlYWQuaWRcIixUSFJFQURfTkFNRTpcInRocmVhZC5uYW1lXCIsQ09ERV9GVU5DVElPTjpcImNvZGUuZnVuY3Rpb25cIixDT0RFX05BTUVTUEFDRTpcImNvZGUubmFtZXNwYWNlXCIsQ09ERV9GSUxFUEFUSDpcImNvZGUuZmlsZXBhdGhcIixDT0RFX0xJTkVOTzpcImNvZGUubGluZW5vXCIsSFRUUF9NRVRIT0Q6XCJodHRwLm1ldGhvZFwiLEhUVFBfVVJMOlwiaHR0cC51cmxcIixIVFRQX1RBUkdFVDpcImh0dHAudGFyZ2V0XCIsSFRUUF9IT1NUOlwiaHR0cC5ob3N0XCIsSFRUUF9TQ0hFTUU6XCJodHRwLnNjaGVtZVwiLEhUVFBfU1RBVFVTX0NPREU6XCJodHRwLnN0YXR1c19jb2RlXCIsSFRUUF9GTEFWT1I6XCJodHRwLmZsYXZvclwiLEhUVFBfVVNFUl9BR0VOVDpcImh0dHAudXNlcl9hZ2VudFwiLEhUVFBfUkVRVUVTVF9DT05URU5UX0xFTkdUSDpcImh0dHAucmVxdWVzdF9jb250ZW50X2xlbmd0aFwiLEhUVFBfUkVRVUVTVF9DT05URU5UX0xFTkdUSF9VTkNPTVBSRVNTRUQ6XCJodHRwLnJlcXVlc3RfY29udGVudF9sZW5ndGhfdW5jb21wcmVzc2VkXCIsSFRUUF9SRVNQT05TRV9DT05URU5UX0xFTkdUSDpcImh0dHAucmVzcG9uc2VfY29udGVudF9sZW5ndGhcIixIVFRQX1JFU1BPTlNFX0NPTlRFTlRfTEVOR1RIX1VOQ09NUFJFU1NFRDpcImh0dHAucmVzcG9uc2VfY29udGVudF9sZW5ndGhfdW5jb21wcmVzc2VkXCIsSFRUUF9TRVJWRVJfTkFNRTpcImh0dHAuc2VydmVyX25hbWVcIixIVFRQX1JPVVRFOlwiaHR0cC5yb3V0ZVwiLEhUVFBfQ0xJRU5UX0lQOlwiaHR0cC5jbGllbnRfaXBcIixBV1NfRFlOQU1PREJfVEFCTEVfTkFNRVM6XCJhd3MuZHluYW1vZGIudGFibGVfbmFtZXNcIixBV1NfRFlOQU1PREJfQ09OU1VNRURfQ0FQQUNJVFk6XCJhd3MuZHluYW1vZGIuY29uc3VtZWRfY2FwYWNpdHlcIixBV1NfRFlOQU1PREJfSVRFTV9DT0xMRUNUSU9OX01FVFJJQ1M6XCJhd3MuZHluYW1vZGIuaXRlbV9jb2xsZWN0aW9uX21ldHJpY3NcIixBV1NfRFlOQU1PREJfUFJPVklTSU9ORURfUkVBRF9DQVBBQ0lUWTpcImF3cy5keW5hbW9kYi5wcm92aXNpb25lZF9yZWFkX2NhcGFjaXR5XCIsQVdTX0RZTkFNT0RCX1BST1ZJU0lPTkVEX1dSSVRFX0NBUEFDSVRZOlwiYXdzLmR5bmFtb2RiLnByb3Zpc2lvbmVkX3dyaXRlX2NhcGFjaXR5XCIsQVdTX0RZTkFNT0RCX0NPTlNJU1RFTlRfUkVBRDpcImF3cy5keW5hbW9kYi5jb25zaXN0ZW50X3JlYWRcIixBV1NfRFlOQU1PREJfUFJPSkVDVElPTjpcImF3cy5keW5hbW9kYi5wcm9qZWN0aW9uXCIsQVdTX0RZTkFNT0RCX0xJTUlUOlwiYXdzLmR5bmFtb2RiLmxpbWl0XCIsQVdTX0RZTkFNT0RCX0FUVFJJQlVURVNfVE9fR0VUOlwiYXdzLmR5bmFtb2RiLmF0dHJpYnV0ZXNfdG9fZ2V0XCIsQVdTX0RZTkFNT0RCX0lOREVYX05BTUU6XCJhd3MuZHluYW1vZGIuaW5kZXhfbmFtZVwiLEFXU19EWU5BTU9EQl9TRUxFQ1Q6XCJhd3MuZHluYW1vZGIuc2VsZWN0XCIsQVdTX0RZTkFNT0RCX0dMT0JBTF9TRUNPTkRBUllfSU5ERVhFUzpcImF3cy5keW5hbW9kYi5nbG9iYWxfc2Vjb25kYXJ5X2luZGV4ZXNcIixBV1NfRFlOQU1PREJfTE9DQUxfU0VDT05EQVJZX0lOREVYRVM6XCJhd3MuZHluYW1vZGIubG9jYWxfc2Vjb25kYXJ5X2luZGV4ZXNcIixBV1NfRFlOQU1PREJfRVhDTFVTSVZFX1NUQVJUX1RBQkxFOlwiYXdzLmR5bmFtb2RiLmV4Y2x1c2l2ZV9zdGFydF90YWJsZVwiLEFXU19EWU5BTU9EQl9UQUJMRV9DT1VOVDpcImF3cy5keW5hbW9kYi50YWJsZV9jb3VudFwiLEFXU19EWU5BTU9EQl9TQ0FOX0ZPUldBUkQ6XCJhd3MuZHluYW1vZGIuc2Nhbl9mb3J3YXJkXCIsQVdTX0RZTkFNT0RCX1NFR01FTlQ6XCJhd3MuZHluYW1vZGIuc2VnbWVudFwiLEFXU19EWU5BTU9EQl9UT1RBTF9TRUdNRU5UUzpcImF3cy5keW5hbW9kYi50b3RhbF9zZWdtZW50c1wiLEFXU19EWU5BTU9EQl9DT1VOVDpcImF3cy5keW5hbW9kYi5jb3VudFwiLEFXU19EWU5BTU9EQl9TQ0FOTkVEX0NPVU5UOlwiYXdzLmR5bmFtb2RiLnNjYW5uZWRfY291bnRcIixBV1NfRFlOQU1PREJfQVRUUklCVVRFX0RFRklOSVRJT05TOlwiYXdzLmR5bmFtb2RiLmF0dHJpYnV0ZV9kZWZpbml0aW9uc1wiLEFXU19EWU5BTU9EQl9HTE9CQUxfU0VDT05EQVJZX0lOREVYX1VQREFURVM6XCJhd3MuZHluYW1vZGIuZ2xvYmFsX3NlY29uZGFyeV9pbmRleF91cGRhdGVzXCIsTUVTU0FHSU5HX1NZU1RFTTpcIm1lc3NhZ2luZy5zeXN0ZW1cIixNRVNTQUdJTkdfREVTVElOQVRJT046XCJtZXNzYWdpbmcuZGVzdGluYXRpb25cIixNRVNTQUdJTkdfREVTVElOQVRJT05fS0lORDpcIm1lc3NhZ2luZy5kZXN0aW5hdGlvbl9raW5kXCIsTUVTU0FHSU5HX1RFTVBfREVTVElOQVRJT046XCJtZXNzYWdpbmcudGVtcF9kZXN0aW5hdGlvblwiLE1FU1NBR0lOR19QUk9UT0NPTDpcIm1lc3NhZ2luZy5wcm90b2NvbFwiLE1FU1NBR0lOR19QUk9UT0NPTF9WRVJTSU9OOlwibWVzc2FnaW5nLnByb3RvY29sX3ZlcnNpb25cIixNRVNTQUdJTkdfVVJMOlwibWVzc2FnaW5nLnVybFwiLE1FU1NBR0lOR19NRVNTQUdFX0lEOlwibWVzc2FnaW5nLm1lc3NhZ2VfaWRcIixNRVNTQUdJTkdfQ09OVkVSU0FUSU9OX0lEOlwibWVzc2FnaW5nLmNvbnZlcnNhdGlvbl9pZFwiLE1FU1NBR0lOR19NRVNTQUdFX1BBWUxPQURfU0laRV9CWVRFUzpcIm1lc3NhZ2luZy5tZXNzYWdlX3BheWxvYWRfc2l6ZV9ieXRlc1wiLE1FU1NBR0lOR19NRVNTQUdFX1BBWUxPQURfQ09NUFJFU1NFRF9TSVpFX0JZVEVTOlwibWVzc2FnaW5nLm1lc3NhZ2VfcGF5bG9hZF9jb21wcmVzc2VkX3NpemVfYnl0ZXNcIixNRVNTQUdJTkdfT1BFUkFUSU9OOlwibWVzc2FnaW5nLm9wZXJhdGlvblwiLE1FU1NBR0lOR19DT05TVU1FUl9JRDpcIm1lc3NhZ2luZy5jb25zdW1lcl9pZFwiLE1FU1NBR0lOR19SQUJCSVRNUV9ST1VUSU5HX0tFWTpcIm1lc3NhZ2luZy5yYWJiaXRtcS5yb3V0aW5nX2tleVwiLE1FU1NBR0lOR19LQUZLQV9NRVNTQUdFX0tFWTpcIm1lc3NhZ2luZy5rYWZrYS5tZXNzYWdlX2tleVwiLE1FU1NBR0lOR19LQUZLQV9DT05TVU1FUl9HUk9VUDpcIm1lc3NhZ2luZy5rYWZrYS5jb25zdW1lcl9ncm91cFwiLE1FU1NBR0lOR19LQUZLQV9DTElFTlRfSUQ6XCJtZXNzYWdpbmcua2Fma2EuY2xpZW50X2lkXCIsTUVTU0FHSU5HX0tBRktBX1BBUlRJVElPTjpcIm1lc3NhZ2luZy5rYWZrYS5wYXJ0aXRpb25cIixNRVNTQUdJTkdfS0FGS0FfVE9NQlNUT05FOlwibWVzc2FnaW5nLmthZmthLnRvbWJzdG9uZVwiLFJQQ19TWVNURU06XCJycGMuc3lzdGVtXCIsUlBDX1NFUlZJQ0U6XCJycGMuc2VydmljZVwiLFJQQ19NRVRIT0Q6XCJycGMubWV0aG9kXCIsUlBDX0dSUENfU1RBVFVTX0NPREU6XCJycGMuZ3JwYy5zdGF0dXNfY29kZVwiLFJQQ19KU09OUlBDX1ZFUlNJT046XCJycGMuanNvbnJwYy52ZXJzaW9uXCIsUlBDX0pTT05SUENfUkVRVUVTVF9JRDpcInJwYy5qc29ucnBjLnJlcXVlc3RfaWRcIixSUENfSlNPTlJQQ19FUlJPUl9DT0RFOlwicnBjLmpzb25ycGMuZXJyb3JfY29kZVwiLFJQQ19KU09OUlBDX0VSUk9SX01FU1NBR0U6XCJycGMuanNvbnJwYy5lcnJvcl9tZXNzYWdlXCIsTUVTU0FHRV9UWVBFOlwibWVzc2FnZS50eXBlXCIsTUVTU0FHRV9JRDpcIm1lc3NhZ2UuaWRcIixNRVNTQUdFX0NPTVBSRVNTRURfU0laRTpcIm1lc3NhZ2UuY29tcHJlc3NlZF9zaXplXCIsTUVTU0FHRV9VTkNPTVBSRVNTRURfU0laRTpcIm1lc3NhZ2UudW5jb21wcmVzc2VkX3NpemVcIn07Yi5EYlN5c3RlbVZhbHVlcz17T1RIRVJfU1FMOlwib3RoZXJfc3FsXCIsTVNTUUw6XCJtc3NxbFwiLE1ZU1FMOlwibXlzcWxcIixPUkFDTEU6XCJvcmFjbGVcIixEQjI6XCJkYjJcIixQT1NUR1JFU1FMOlwicG9zdGdyZXNxbFwiLFJFRFNISUZUOlwicmVkc2hpZnRcIixISVZFOlwiaGl2ZVwiLENMT1VEU0NBUEU6XCJjbG91ZHNjYXBlXCIsSFNRTERCOlwiaHNxbGRiXCIsUFJPR1JFU1M6XCJwcm9ncmVzc1wiLE1BWERCOlwibWF4ZGJcIixIQU5BREI6XCJoYW5hZGJcIixJTkdSRVM6XCJpbmdyZXNcIixGSVJTVFNRTDpcImZpcnN0c3FsXCIsRURCOlwiZWRiXCIsQ0FDSEU6XCJjYWNoZVwiLEFEQUJBUzpcImFkYWJhc1wiLEZJUkVCSVJEOlwiZmlyZWJpcmRcIixERVJCWTpcImRlcmJ5XCIsRklMRU1BS0VSOlwiZmlsZW1ha2VyXCIsSU5GT1JNSVg6XCJpbmZvcm1peFwiLElOU1RBTlREQjpcImluc3RhbnRkYlwiLElOVEVSQkFTRTpcImludGVyYmFzZVwiLE1BUklBREI6XCJtYXJpYWRiXCIsTkVURVpaQTpcIm5ldGV6emFcIixQRVJWQVNJVkU6XCJwZXJ2YXNpdmVcIixQT0lOVEJBU0U6XCJwb2ludGJhc2VcIixTUUxJVEU6XCJzcWxpdGVcIixTWUJBU0U6XCJzeWJhc2VcIixURVJBREFUQTpcInRlcmFkYXRhXCIsVkVSVElDQTpcInZlcnRpY2FcIixIMjpcImgyXCIsQ09MREZVU0lPTjpcImNvbGRmdXNpb25cIixDQVNTQU5EUkE6XCJjYXNzYW5kcmFcIixIQkFTRTpcImhiYXNlXCIsTU9OR09EQjpcIm1vbmdvZGJcIixSRURJUzpcInJlZGlzXCIsQ09VQ0hCQVNFOlwiY291Y2hiYXNlXCIsQ09VQ0hEQjpcImNvdWNoZGJcIixDT1NNT1NEQjpcImNvc21vc2RiXCIsRFlOQU1PREI6XCJkeW5hbW9kYlwiLE5FTzRKOlwibmVvNGpcIixHRU9ERTpcImdlb2RlXCIsRUxBU1RJQ1NFQVJDSDpcImVsYXN0aWNzZWFyY2hcIixNRU1DQUNIRUQ6XCJtZW1jYWNoZWRcIixDT0NLUk9BQ0hEQjpcImNvY2tyb2FjaGRiXCJ9O2IuRGJDYXNzYW5kcmFDb25zaXN0ZW5jeUxldmVsVmFsdWVzPXtBTEw6XCJhbGxcIixFQUNIX1FVT1JVTTpcImVhY2hfcXVvcnVtXCIsUVVPUlVNOlwicXVvcnVtXCIsTE9DQUxfUVVPUlVNOlwibG9jYWxfcXVvcnVtXCIsT05FOlwib25lXCIsVFdPOlwidHdvXCIsVEhSRUU6XCJ0aHJlZVwiLExPQ0FMX09ORTpcImxvY2FsX29uZVwiLEFOWTpcImFueVwiLFNFUklBTDpcInNlcmlhbFwiLExPQ0FMX1NFUklBTDpcImxvY2FsX3NlcmlhbFwifTtiLkZhYXNUcmlnZ2VyVmFsdWVzPXtEQVRBU09VUkNFOlwiZGF0YXNvdXJjZVwiLEhUVFA6XCJodHRwXCIsUFVCU1VCOlwicHVic3ViXCIsVElNRVI6XCJ0aW1lclwiLE9USEVSOlwib3RoZXJcIn07Yi5GYWFzRG9jdW1lbnRPcGVyYXRpb25WYWx1ZXM9e0lOU0VSVDpcImluc2VydFwiLEVESVQ6XCJlZGl0XCIsREVMRVRFOlwiZGVsZXRlXCJ9O2IuRmFhc0ludm9rZWRQcm92aWRlclZhbHVlcz17QUxJQkFCQV9DTE9VRDpcImFsaWJhYmFfY2xvdWRcIixBV1M6XCJhd3NcIixBWlVSRTpcImF6dXJlXCIsR0NQOlwiZ2NwXCJ9O2IuTmV0VHJhbnNwb3J0VmFsdWVzPXtJUF9UQ1A6XCJpcF90Y3BcIixJUF9VRFA6XCJpcF91ZHBcIixJUDpcImlwXCIsVU5JWDpcInVuaXhcIixQSVBFOlwicGlwZVwiLElOUFJPQzpcImlucHJvY1wiLE9USEVSOlwib3RoZXJcIn07Yi5OZXRIb3N0Q29ubmVjdGlvblR5cGVWYWx1ZXM9e1dJRkk6XCJ3aWZpXCIsV0lSRUQ6XCJ3aXJlZFwiLENFTEw6XCJjZWxsXCIsVU5BVkFJTEFCTEU6XCJ1bmF2YWlsYWJsZVwiLFVOS05PV046XCJ1bmtub3duXCJ9O2IuTmV0SG9zdENvbm5lY3Rpb25TdWJ0eXBlVmFsdWVzPXtHUFJTOlwiZ3Byc1wiLEVER0U6XCJlZGdlXCIsVU1UUzpcInVtdHNcIixDRE1BOlwiY2RtYVwiLEVWRE9fMDpcImV2ZG9fMFwiLEVWRE9fQTpcImV2ZG9fYVwiLENETUEyMDAwXzFYUlRUOlwiY2RtYTIwMDBfMXhydHRcIixIU0RQQTpcImhzZHBhXCIsSFNVUEE6XCJoc3VwYVwiLEhTUEE6XCJoc3BhXCIsSURFTjpcImlkZW5cIixFVkRPX0I6XCJldmRvX2JcIixMVEU6XCJsdGVcIixFSFJQRDpcImVocnBkXCIsSFNQQVA6XCJoc3BhcFwiLEdTTTpcImdzbVwiLFREX1NDRE1BOlwidGRfc2NkbWFcIixJV0xBTjpcIml3bGFuXCIsTlI6XCJuclwiLE5STlNBOlwibnJuc2FcIixMVEVfQ0E6XCJsdGVfY2FcIn07Yi5IdHRwRmxhdm9yVmFsdWVzPXtIVFRQXzFfMDpcIjEuMFwiLEhUVFBfMV8xOlwiMS4xXCIsSFRUUF8yXzA6XCIyLjBcIixTUERZOlwiU1BEWVwiLFFVSUM6XCJRVUlDXCJ9O2IuTWVzc2FnaW5nRGVzdGluYXRpb25LaW5kVmFsdWVzPXtRVUVVRTpcInF1ZXVlXCIsVE9QSUM6XCJ0b3BpY1wifTtiLk1lc3NhZ2luZ09wZXJhdGlvblZhbHVlcz17UkVDRUlWRTpcInJlY2VpdmVcIixQUk9DRVNTOlwicHJvY2Vzc1wifTtiLlJwY0dycGNTdGF0dXNDb2RlVmFsdWVzPXtPSzowLENBTkNFTExFRDoxLFVOS05PV046MixJTlZBTElEX0FSR1VNRU5UOjMsREVBRExJTkVfRVhDRUVERUQ6NCxOT1RfRk9VTkQ6NSxBTFJFQURZX0VYSVNUUzo2LFBFUk1JU1NJT05fREVOSUVEOjcsUkVTT1VSQ0VfRVhIQVVTVEVEOjgsRkFJTEVEX1BSRUNPTkRJVElPTjo5LEFCT1JURUQ6MTAsT1VUX09GX1JBTkdFOjExLFVOSU1QTEVNRU5URUQ6MTIsSU5URVJOQUw6MTMsVU5BVkFJTEFCTEU6MTQsREFUQV9MT1NTOjE1LFVOQVVUSEVOVElDQVRFRDoxNn07Yi5NZXNzYWdlVHlwZVZhbHVlcz17U0VOVDpcIlNFTlRcIixSRUNFSVZFRDpcIlJFQ0VJVkVEXCJ9fSk7dmFyIHdjPWwoa2U9PntcInVzZSBzdHJpY3RcIjt2YXIgRUU9a2UmJmtlLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19KX06ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCkscltuXT1lW3RdfSksbUU9a2UmJmtlLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQgaW4gcil0IT09XCJkZWZhdWx0XCImJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSYmRUUoZSxyLHQpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoa2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7bUUoQ2MoKSxrZSl9KTt2YXIgeGM9bChrPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGssXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7ay5UZWxlbWV0cnlTZGtMYW5ndWFnZVZhbHVlcz1rLk9zVHlwZVZhbHVlcz1rLkhvc3RBcmNoVmFsdWVzPWsuQXdzRWNzTGF1bmNodHlwZVZhbHVlcz1rLkNsb3VkUGxhdGZvcm1WYWx1ZXM9ay5DbG91ZFByb3ZpZGVyVmFsdWVzPWsuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXM9dm9pZCAwO2suU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXM9e0NMT1VEX1BST1ZJREVSOlwiY2xvdWQucHJvdmlkZXJcIixDTE9VRF9BQ0NPVU5UX0lEOlwiY2xvdWQuYWNjb3VudC5pZFwiLENMT1VEX1JFR0lPTjpcImNsb3VkLnJlZ2lvblwiLENMT1VEX0FWQUlMQUJJTElUWV9aT05FOlwiY2xvdWQuYXZhaWxhYmlsaXR5X3pvbmVcIixDTE9VRF9QTEFURk9STTpcImNsb3VkLnBsYXRmb3JtXCIsQVdTX0VDU19DT05UQUlORVJfQVJOOlwiYXdzLmVjcy5jb250YWluZXIuYXJuXCIsQVdTX0VDU19DTFVTVEVSX0FSTjpcImF3cy5lY3MuY2x1c3Rlci5hcm5cIixBV1NfRUNTX0xBVU5DSFRZUEU6XCJhd3MuZWNzLmxhdW5jaHR5cGVcIixBV1NfRUNTX1RBU0tfQVJOOlwiYXdzLmVjcy50YXNrLmFyblwiLEFXU19FQ1NfVEFTS19GQU1JTFk6XCJhd3MuZWNzLnRhc2suZmFtaWx5XCIsQVdTX0VDU19UQVNLX1JFVklTSU9OOlwiYXdzLmVjcy50YXNrLnJldmlzaW9uXCIsQVdTX0VLU19DTFVTVEVSX0FSTjpcImF3cy5la3MuY2x1c3Rlci5hcm5cIixBV1NfTE9HX0dST1VQX05BTUVTOlwiYXdzLmxvZy5ncm91cC5uYW1lc1wiLEFXU19MT0dfR1JPVVBfQVJOUzpcImF3cy5sb2cuZ3JvdXAuYXJuc1wiLEFXU19MT0dfU1RSRUFNX05BTUVTOlwiYXdzLmxvZy5zdHJlYW0ubmFtZXNcIixBV1NfTE9HX1NUUkVBTV9BUk5TOlwiYXdzLmxvZy5zdHJlYW0uYXJuc1wiLENPTlRBSU5FUl9OQU1FOlwiY29udGFpbmVyLm5hbWVcIixDT05UQUlORVJfSUQ6XCJjb250YWluZXIuaWRcIixDT05UQUlORVJfUlVOVElNRTpcImNvbnRhaW5lci5ydW50aW1lXCIsQ09OVEFJTkVSX0lNQUdFX05BTUU6XCJjb250YWluZXIuaW1hZ2UubmFtZVwiLENPTlRBSU5FUl9JTUFHRV9UQUc6XCJjb250YWluZXIuaW1hZ2UudGFnXCIsREVQTE9ZTUVOVF9FTlZJUk9OTUVOVDpcImRlcGxveW1lbnQuZW52aXJvbm1lbnRcIixERVZJQ0VfSUQ6XCJkZXZpY2UuaWRcIixERVZJQ0VfTU9ERUxfSURFTlRJRklFUjpcImRldmljZS5tb2RlbC5pZGVudGlmaWVyXCIsREVWSUNFX01PREVMX05BTUU6XCJkZXZpY2UubW9kZWwubmFtZVwiLEZBQVNfTkFNRTpcImZhYXMubmFtZVwiLEZBQVNfSUQ6XCJmYWFzLmlkXCIsRkFBU19WRVJTSU9OOlwiZmFhcy52ZXJzaW9uXCIsRkFBU19JTlNUQU5DRTpcImZhYXMuaW5zdGFuY2VcIixGQUFTX01BWF9NRU1PUlk6XCJmYWFzLm1heF9tZW1vcnlcIixIT1NUX0lEOlwiaG9zdC5pZFwiLEhPU1RfTkFNRTpcImhvc3QubmFtZVwiLEhPU1RfVFlQRTpcImhvc3QudHlwZVwiLEhPU1RfQVJDSDpcImhvc3QuYXJjaFwiLEhPU1RfSU1BR0VfTkFNRTpcImhvc3QuaW1hZ2UubmFtZVwiLEhPU1RfSU1BR0VfSUQ6XCJob3N0LmltYWdlLmlkXCIsSE9TVF9JTUFHRV9WRVJTSU9OOlwiaG9zdC5pbWFnZS52ZXJzaW9uXCIsSzhTX0NMVVNURVJfTkFNRTpcIms4cy5jbHVzdGVyLm5hbWVcIixLOFNfTk9ERV9OQU1FOlwiazhzLm5vZGUubmFtZVwiLEs4U19OT0RFX1VJRDpcIms4cy5ub2RlLnVpZFwiLEs4U19OQU1FU1BBQ0VfTkFNRTpcIms4cy5uYW1lc3BhY2UubmFtZVwiLEs4U19QT0RfVUlEOlwiazhzLnBvZC51aWRcIixLOFNfUE9EX05BTUU6XCJrOHMucG9kLm5hbWVcIixLOFNfQ09OVEFJTkVSX05BTUU6XCJrOHMuY29udGFpbmVyLm5hbWVcIixLOFNfUkVQTElDQVNFVF9VSUQ6XCJrOHMucmVwbGljYXNldC51aWRcIixLOFNfUkVQTElDQVNFVF9OQU1FOlwiazhzLnJlcGxpY2FzZXQubmFtZVwiLEs4U19ERVBMT1lNRU5UX1VJRDpcIms4cy5kZXBsb3ltZW50LnVpZFwiLEs4U19ERVBMT1lNRU5UX05BTUU6XCJrOHMuZGVwbG95bWVudC5uYW1lXCIsSzhTX1NUQVRFRlVMU0VUX1VJRDpcIms4cy5zdGF0ZWZ1bHNldC51aWRcIixLOFNfU1RBVEVGVUxTRVRfTkFNRTpcIms4cy5zdGF0ZWZ1bHNldC5uYW1lXCIsSzhTX0RBRU1PTlNFVF9VSUQ6XCJrOHMuZGFlbW9uc2V0LnVpZFwiLEs4U19EQUVNT05TRVRfTkFNRTpcIms4cy5kYWVtb25zZXQubmFtZVwiLEs4U19KT0JfVUlEOlwiazhzLmpvYi51aWRcIixLOFNfSk9CX05BTUU6XCJrOHMuam9iLm5hbWVcIixLOFNfQ1JPTkpPQl9VSUQ6XCJrOHMuY3JvbmpvYi51aWRcIixLOFNfQ1JPTkpPQl9OQU1FOlwiazhzLmNyb25qb2IubmFtZVwiLE9TX1RZUEU6XCJvcy50eXBlXCIsT1NfREVTQ1JJUFRJT046XCJvcy5kZXNjcmlwdGlvblwiLE9TX05BTUU6XCJvcy5uYW1lXCIsT1NfVkVSU0lPTjpcIm9zLnZlcnNpb25cIixQUk9DRVNTX1BJRDpcInByb2Nlc3MucGlkXCIsUFJPQ0VTU19FWEVDVVRBQkxFX05BTUU6XCJwcm9jZXNzLmV4ZWN1dGFibGUubmFtZVwiLFBST0NFU1NfRVhFQ1VUQUJMRV9QQVRIOlwicHJvY2Vzcy5leGVjdXRhYmxlLnBhdGhcIixQUk9DRVNTX0NPTU1BTkQ6XCJwcm9jZXNzLmNvbW1hbmRcIixQUk9DRVNTX0NPTU1BTkRfTElORTpcInByb2Nlc3MuY29tbWFuZF9saW5lXCIsUFJPQ0VTU19DT01NQU5EX0FSR1M6XCJwcm9jZXNzLmNvbW1hbmRfYXJnc1wiLFBST0NFU1NfT1dORVI6XCJwcm9jZXNzLm93bmVyXCIsUFJPQ0VTU19SVU5USU1FX05BTUU6XCJwcm9jZXNzLnJ1bnRpbWUubmFtZVwiLFBST0NFU1NfUlVOVElNRV9WRVJTSU9OOlwicHJvY2Vzcy5ydW50aW1lLnZlcnNpb25cIixQUk9DRVNTX1JVTlRJTUVfREVTQ1JJUFRJT046XCJwcm9jZXNzLnJ1bnRpbWUuZGVzY3JpcHRpb25cIixTRVJWSUNFX05BTUU6XCJzZXJ2aWNlLm5hbWVcIixTRVJWSUNFX05BTUVTUEFDRTpcInNlcnZpY2UubmFtZXNwYWNlXCIsU0VSVklDRV9JTlNUQU5DRV9JRDpcInNlcnZpY2UuaW5zdGFuY2UuaWRcIixTRVJWSUNFX1ZFUlNJT046XCJzZXJ2aWNlLnZlcnNpb25cIixURUxFTUVUUllfU0RLX05BTUU6XCJ0ZWxlbWV0cnkuc2RrLm5hbWVcIixURUxFTUVUUllfU0RLX0xBTkdVQUdFOlwidGVsZW1ldHJ5LnNkay5sYW5ndWFnZVwiLFRFTEVNRVRSWV9TREtfVkVSU0lPTjpcInRlbGVtZXRyeS5zZGsudmVyc2lvblwiLFRFTEVNRVRSWV9BVVRPX1ZFUlNJT046XCJ0ZWxlbWV0cnkuYXV0by52ZXJzaW9uXCIsV0VCRU5HSU5FX05BTUU6XCJ3ZWJlbmdpbmUubmFtZVwiLFdFQkVOR0lORV9WRVJTSU9OOlwid2ViZW5naW5lLnZlcnNpb25cIixXRUJFTkdJTkVfREVTQ1JJUFRJT046XCJ3ZWJlbmdpbmUuZGVzY3JpcHRpb25cIn07ay5DbG91ZFByb3ZpZGVyVmFsdWVzPXtBTElCQUJBX0NMT1VEOlwiYWxpYmFiYV9jbG91ZFwiLEFXUzpcImF3c1wiLEFaVVJFOlwiYXp1cmVcIixHQ1A6XCJnY3BcIn07ay5DbG91ZFBsYXRmb3JtVmFsdWVzPXtBTElCQUJBX0NMT1VEX0VDUzpcImFsaWJhYmFfY2xvdWRfZWNzXCIsQUxJQkFCQV9DTE9VRF9GQzpcImFsaWJhYmFfY2xvdWRfZmNcIixBV1NfRUMyOlwiYXdzX2VjMlwiLEFXU19FQ1M6XCJhd3NfZWNzXCIsQVdTX0VLUzpcImF3c19la3NcIixBV1NfTEFNQkRBOlwiYXdzX2xhbWJkYVwiLEFXU19FTEFTVElDX0JFQU5TVEFMSzpcImF3c19lbGFzdGljX2JlYW5zdGFsa1wiLEFaVVJFX1ZNOlwiYXp1cmVfdm1cIixBWlVSRV9DT05UQUlORVJfSU5TVEFOQ0VTOlwiYXp1cmVfY29udGFpbmVyX2luc3RhbmNlc1wiLEFaVVJFX0FLUzpcImF6dXJlX2Frc1wiLEFaVVJFX0ZVTkNUSU9OUzpcImF6dXJlX2Z1bmN0aW9uc1wiLEFaVVJFX0FQUF9TRVJWSUNFOlwiYXp1cmVfYXBwX3NlcnZpY2VcIixHQ1BfQ09NUFVURV9FTkdJTkU6XCJnY3BfY29tcHV0ZV9lbmdpbmVcIixHQ1BfQ0xPVURfUlVOOlwiZ2NwX2Nsb3VkX3J1blwiLEdDUF9LVUJFUk5FVEVTX0VOR0lORTpcImdjcF9rdWJlcm5ldGVzX2VuZ2luZVwiLEdDUF9DTE9VRF9GVU5DVElPTlM6XCJnY3BfY2xvdWRfZnVuY3Rpb25zXCIsR0NQX0FQUF9FTkdJTkU6XCJnY3BfYXBwX2VuZ2luZVwifTtrLkF3c0Vjc0xhdW5jaHR5cGVWYWx1ZXM9e0VDMjpcImVjMlwiLEZBUkdBVEU6XCJmYXJnYXRlXCJ9O2suSG9zdEFyY2hWYWx1ZXM9e0FNRDY0OlwiYW1kNjRcIixBUk0zMjpcImFybTMyXCIsQVJNNjQ6XCJhcm02NFwiLElBNjQ6XCJpYTY0XCIsUFBDMzI6XCJwcGMzMlwiLFBQQzY0OlwicHBjNjRcIixYODY6XCJ4ODZcIn07ay5Pc1R5cGVWYWx1ZXM9e1dJTkRPV1M6XCJ3aW5kb3dzXCIsTElOVVg6XCJsaW51eFwiLERBUldJTjpcImRhcndpblwiLEZSRUVCU0Q6XCJmcmVlYnNkXCIsTkVUQlNEOlwibmV0YnNkXCIsT1BFTkJTRDpcIm9wZW5ic2RcIixEUkFHT05GTFlCU0Q6XCJkcmFnb25mbHlic2RcIixIUFVYOlwiaHB1eFwiLEFJWDpcImFpeFwiLFNPTEFSSVM6XCJzb2xhcmlzXCIsWl9PUzpcInpfb3NcIn07ay5UZWxlbWV0cnlTZGtMYW5ndWFnZVZhbHVlcz17Q1BQOlwiY3BwXCIsRE9UTkVUOlwiZG90bmV0XCIsRVJMQU5HOlwiZXJsYW5nXCIsR086XCJnb1wiLEpBVkE6XCJqYXZhXCIsTk9ERUpTOlwibm9kZWpzXCIsUEhQOlwicGhwXCIsUFlUSE9OOlwicHl0aG9uXCIsUlVCWTpcInJ1YnlcIixXRUJKUzpcIndlYmpzXCJ9fSk7dmFyIERjPWwoJGU9PntcInVzZSBzdHJpY3RcIjt2YXIgZ0U9JGUmJiRlLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19KX06ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCkscltuXT1lW3RdfSksVEU9JGUmJiRlLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQgaW4gcil0IT09XCJkZWZhdWx0XCImJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSYmZ0UoZSxyLHQpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoJGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VEUoeGMoKSwkZSl9KTt2YXIgQWU9bChNZT0+e1widXNlIHN0cmljdFwiO3ZhciBTRT1NZSYmTWUuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihyLGUsdCxuKXtuPT09dm9pZCAwJiYobj10KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlW3RdfX0pfTpmdW5jdGlvbihyLGUsdCxuKXtuPT09dm9pZCAwJiYobj10KSxyW25dPWVbdF19KSxVYz1NZSYmTWUuX19leHBvcnRTdGFyfHxmdW5jdGlvbihyLGUpe2Zvcih2YXIgdCBpbiByKXQhPT1cImRlZmF1bHRcIiYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpJiZTRShlLHIsdCl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShNZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtVYyh3YygpLE1lKTtVYyhEYygpLE1lKX0pO3ZhciBCYz1sKG9uPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9uLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO29uLlNES19JTkZPPXZvaWQgMDt2YXIgQUU9dG8oKSxwcj1BZSgpO29uLlNES19JTkZPPXtbcHIuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19OQU1FXTpcIm9wZW50ZWxlbWV0cnlcIixbcHIuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuUFJPQ0VTU19SVU5USU1FX05BTUVdOlwibm9kZVwiLFtwci5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5URUxFTUVUUllfU0RLX0xBTkdVQUdFXTpwci5UZWxlbWV0cnlTZGtMYW5ndWFnZVZhbHVlcy5OT0RFSlMsW3ByLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlRFTEVNRVRSWV9TREtfVkVSU0lPTl06QUUuVkVSU0lPTn19KTt2YXIgcWM9bChhbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTthbi51bnJlZlRpbWVyPXZvaWQgMDtmdW5jdGlvbiBPRShyKXtyLnVucmVmKCl9YW4udW5yZWZUaW1lcj1PRX0pO3ZhciBWYz1sKGVlPT57XCJ1c2Ugc3RyaWN0XCI7dmFyIFJFPWVlJiZlZS5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fSl9OmZ1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLHJbbl09ZVt0XX0pLFhlPWVlJiZlZS5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJlJFKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGVlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1hlKGJjKCksZWUpO1hlKFBjKCksZWUpO1hlKHZjKCksZWUpO1hlKExjKCksZWUpO1hlKE5jKCksZWUpO1hlKEJjKCksZWUpO1hlKHFjKCksZWUpfSk7dmFyIHJvPWwoV2U9PntcInVzZSBzdHJpY3RcIjt2YXIgYkU9V2UmJldlLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19KX06ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCkscltuXT1lW3RdfSksUEU9V2UmJldlLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQgaW4gcil0IT09XCJkZWZhdWx0XCImJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSYmYkUoZSxyLHQpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoV2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7UEUoVmMoKSxXZSl9KTt2YXIgRmM9bCh5PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7eS5hZGRIclRpbWVzPXkuaXNUaW1lSW5wdXQ9eS5pc1RpbWVJbnB1dEhyVGltZT15LmhyVGltZVRvTWljcm9zZWNvbmRzPXkuaHJUaW1lVG9NaWxsaXNlY29uZHM9eS5oclRpbWVUb05hbm9zZWNvbmRzPXkuaHJUaW1lVG9UaW1lU3RhbXA9eS5oclRpbWVEdXJhdGlvbj15LnRpbWVJbnB1dFRvSHJUaW1lPXkuaHJUaW1lPXkuZ2V0VGltZU9yaWdpbj15Lm1pbGxpc1RvSHJUaW1lPXZvaWQgMDt2YXIgbm89cm8oKSxHYz05LHlFPTYsdkU9TWF0aC5wb3coMTAseUUpLHVuPU1hdGgucG93KDEwLEdjKTtmdW5jdGlvbiBocihyKXtsZXQgZT1yLzFlMyx0PU1hdGgudHJ1bmMoZSksbj1NYXRoLnJvdW5kKHIlMWUzKnZFKTtyZXR1cm5bdCxuXX15Lm1pbGxpc1RvSHJUaW1lPWhyO2Z1bmN0aW9uIGlvKCl7bGV0IHI9bm8ub3RwZXJmb3JtYW5jZS50aW1lT3JpZ2luO2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXtsZXQgZT1uby5vdHBlcmZvcm1hbmNlO3I9ZS50aW1pbmcmJmUudGltaW5nLmZldGNoU3RhcnR9cmV0dXJuIHJ9eS5nZXRUaW1lT3JpZ2luPWlvO2Z1bmN0aW9uIEhjKHIpe2xldCBlPWhyKGlvKCkpLHQ9aHIodHlwZW9mIHI9PVwibnVtYmVyXCI/cjpuby5vdHBlcmZvcm1hbmNlLm5vdygpKTtyZXR1cm4gamMoZSx0KX15LmhyVGltZT1IYztmdW5jdGlvbiBJRShyKXtpZihzbyhyKSlyZXR1cm4gcjtpZih0eXBlb2Ygcj09XCJudW1iZXJcIilyZXR1cm4gcjxpbygpP0hjKHIpOmhyKHIpO2lmKHIgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBocihyLmdldFRpbWUoKSk7dGhyb3cgVHlwZUVycm9yKFwiSW52YWxpZCBpbnB1dCB0eXBlXCIpfXkudGltZUlucHV0VG9IclRpbWU9SUU7ZnVuY3Rpb24gTUUocixlKXtsZXQgdD1lWzBdLXJbMF0sbj1lWzFdLXJbMV07cmV0dXJuIG48MCYmKHQtPTEsbis9dW4pLFt0LG5dfXkuaHJUaW1lRHVyYXRpb249TUU7ZnVuY3Rpb24gTEUocil7bGV0IGU9R2MsdD1gJHtcIjBcIi5yZXBlYXQoZSl9JHtyWzFdfVpgLG49dC5zdWJzdHIodC5sZW5ndGgtZS0xKTtyZXR1cm4gbmV3IERhdGUoclswXSoxZTMpLnRvSVNPU3RyaW5nKCkucmVwbGFjZShcIjAwMFpcIixuKX15LmhyVGltZVRvVGltZVN0YW1wPUxFO2Z1bmN0aW9uIE5FKHIpe3JldHVybiByWzBdKnVuK3JbMV19eS5oclRpbWVUb05hbm9zZWNvbmRzPU5FO2Z1bmN0aW9uIENFKHIpe3JldHVybiByWzBdKjFlMytyWzFdLzFlNn15LmhyVGltZVRvTWlsbGlzZWNvbmRzPUNFO2Z1bmN0aW9uIHdFKHIpe3JldHVybiByWzBdKjFlNityWzFdLzFlM315LmhyVGltZVRvTWljcm9zZWNvbmRzPXdFO2Z1bmN0aW9uIHNvKHIpe3JldHVybiBBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aD09PTImJnR5cGVvZiByWzBdPT1cIm51bWJlclwiJiZ0eXBlb2YgclsxXT09XCJudW1iZXJcIn15LmlzVGltZUlucHV0SHJUaW1lPXNvO2Z1bmN0aW9uIHhFKHIpe3JldHVybiBzbyhyKXx8dHlwZW9mIHI9PVwibnVtYmVyXCJ8fHIgaW5zdGFuY2VvZiBEYXRlfXkuaXNUaW1lSW5wdXQ9eEU7ZnVuY3Rpb24gamMocixlKXtsZXQgdD1bclswXStlWzBdLHJbMV0rZVsxXV07cmV0dXJuIHRbMV0+PXVuJiYodFsxXS09dW4sdFswXSs9MSksdH15LmFkZEhyVGltZXM9amN9KTt2YXIgJGM9bChrYz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShrYyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO3ZhciBYYz1sKGZyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGZyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2ZyLkV4cG9ydFJlc3VsdENvZGU9dm9pZCAwO3ZhciBERTsoZnVuY3Rpb24ocil7cltyLlNVQ0NFU1M9MF09XCJTVUNDRVNTXCIscltyLkZBSUxFRD0xXT1cIkZBSUxFRFwifSkoREU9ZnIuRXhwb3J0UmVzdWx0Q29kZXx8KGZyLkV4cG9ydFJlc3VsdENvZGU9e30pKX0pO3ZhciBLYz1sKGNuPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNuLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2NuLkNvbXBvc2l0ZVByb3BhZ2F0b3I9dm9pZCAwO3ZhciBXYz0oaCgpLG0oZCkpLG9vPWNsYXNze2NvbnN0cnVjdG9yKGU9e30pe3ZhciB0O3RoaXMuX3Byb3BhZ2F0b3JzPSh0PWUucHJvcGFnYXRvcnMpIT09bnVsbCYmdCE9PXZvaWQgMD90OltdLHRoaXMuX2ZpZWxkcz1BcnJheS5mcm9tKG5ldyBTZXQodGhpcy5fcHJvcGFnYXRvcnMubWFwKG49PnR5cGVvZiBuLmZpZWxkcz09XCJmdW5jdGlvblwiP24uZmllbGRzKCk6W10pLnJlZHVjZSgobixpKT0+bi5jb25jYXQoaSksW10pKSl9aW5qZWN0KGUsdCxuKXtmb3IobGV0IGkgb2YgdGhpcy5fcHJvcGFnYXRvcnMpdHJ5e2kuaW5qZWN0KGUsdCxuKX1jYXRjaChzKXtXYy5kaWFnLndhcm4oYEZhaWxlZCB0byBpbmplY3Qgd2l0aCAke2kuY29uc3RydWN0b3IubmFtZX0uIEVycjogJHtzLm1lc3NhZ2V9YCl9fWV4dHJhY3QoZSx0LG4pe3JldHVybiB0aGlzLl9wcm9wYWdhdG9ycy5yZWR1Y2UoKGkscyk9Pnt0cnl7cmV0dXJuIHMuZXh0cmFjdChpLHQsbil9Y2F0Y2gobyl7V2MuZGlhZy53YXJuKGBGYWlsZWQgdG8gaW5qZWN0IHdpdGggJHtzLmNvbnN0cnVjdG9yLm5hbWV9LiBFcnI6ICR7by5tZXNzYWdlfWApfXJldHVybiBpfSxlKX1maWVsZHMoKXtyZXR1cm4gdGhpcy5fZmllbGRzLnNsaWNlKCl9fTtjbi5Db21wb3NpdGVQcm9wYWdhdG9yPW9vfSk7dmFyIHpjPWwoRXQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoRXQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7RXQudmFsaWRhdGVWYWx1ZT1FdC52YWxpZGF0ZUtleT12b2lkIDA7dmFyIGFvPVwiW18wLTlhLXotKi9dXCIsVUU9YFthLXpdJHthb317MCwyNTV9YCxCRT1gW2EtejAtOV0ke2FvfXswLDI0MH1AW2Etel0ke2FvfXswLDEzfWAscUU9bmV3IFJlZ0V4cChgXig/OiR7VUV9fCR7QkV9KSRgKSxWRT0vXlsgLX5dezAsMjU1fVshLX5dJC8sR0U9Lyx8PS87ZnVuY3Rpb24gSEUocil7cmV0dXJuIHFFLnRlc3Qocil9RXQudmFsaWRhdGVLZXk9SEU7ZnVuY3Rpb24gakUocil7cmV0dXJuIFZFLnRlc3QocikmJiFHRS50ZXN0KHIpfUV0LnZhbGlkYXRlVmFsdWU9akV9KTt2YXIgY289bChsbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtsbi5UcmFjZVN0YXRlPXZvaWQgMDt2YXIgWWM9emMoKSxRYz0zMixGRT01MTIsWmM9XCIsXCIsSmM9XCI9XCIsdW89Y2xhc3Mgcntjb25zdHJ1Y3RvcihlKXt0aGlzLl9pbnRlcm5hbFN0YXRlPW5ldyBNYXAsZSYmdGhpcy5fcGFyc2UoZSl9c2V0KGUsdCl7bGV0IG49dGhpcy5fY2xvbmUoKTtyZXR1cm4gbi5faW50ZXJuYWxTdGF0ZS5oYXMoZSkmJm4uX2ludGVybmFsU3RhdGUuZGVsZXRlKGUpLG4uX2ludGVybmFsU3RhdGUuc2V0KGUsdCksbn11bnNldChlKXtsZXQgdD10aGlzLl9jbG9uZSgpO3JldHVybiB0Ll9pbnRlcm5hbFN0YXRlLmRlbGV0ZShlKSx0fWdldChlKXtyZXR1cm4gdGhpcy5faW50ZXJuYWxTdGF0ZS5nZXQoZSl9c2VyaWFsaXplKCl7cmV0dXJuIHRoaXMuX2tleXMoKS5yZWR1Y2UoKGUsdCk9PihlLnB1c2godCtKYyt0aGlzLmdldCh0KSksZSksW10pLmpvaW4oWmMpfV9wYXJzZShlKXtlLmxlbmd0aD5GRXx8KHRoaXMuX2ludGVybmFsU3RhdGU9ZS5zcGxpdChaYykucmV2ZXJzZSgpLnJlZHVjZSgodCxuKT0+e2xldCBpPW4udHJpbSgpLHM9aS5pbmRleE9mKEpjKTtpZihzIT09LTEpe2xldCBvPWkuc2xpY2UoMCxzKSxhPWkuc2xpY2UocysxLG4ubGVuZ3RoKTsoMCxZYy52YWxpZGF0ZUtleSkobykmJigwLFljLnZhbGlkYXRlVmFsdWUpKGEpJiZ0LnNldChvLGEpfXJldHVybiB0fSxuZXcgTWFwKSx0aGlzLl9pbnRlcm5hbFN0YXRlLnNpemU+UWMmJih0aGlzLl9pbnRlcm5hbFN0YXRlPW5ldyBNYXAoQXJyYXkuZnJvbSh0aGlzLl9pbnRlcm5hbFN0YXRlLmVudHJpZXMoKSkucmV2ZXJzZSgpLnNsaWNlKDAsUWMpKSkpfV9rZXlzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpLnJldmVyc2UoKX1fY2xvbmUoKXtsZXQgZT1uZXcgcjtyZXR1cm4gZS5faW50ZXJuYWxTdGF0ZT1uZXcgTWFwKHRoaXMuX2ludGVybmFsU3RhdGUpLGV9fTtsbi5UcmFjZVN0YXRlPXVvfSk7dmFyIHRsPWwoJD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pOyQuVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcj0kLnBhcnNlVHJhY2VQYXJlbnQ9JC5UUkFDRV9TVEFURV9IRUFERVI9JC5UUkFDRV9QQVJFTlRfSEVBREVSPXZvaWQgMDt2YXIgZG49KGgoKSxtKGQpKSxrRT1kcigpLCRFPWNvKCk7JC5UUkFDRV9QQVJFTlRfSEVBREVSPVwidHJhY2VwYXJlbnRcIjskLlRSQUNFX1NUQVRFX0hFQURFUj1cInRyYWNlc3RhdGVcIjt2YXIgWEU9XCIwMFwiLFdFPVwiKD8hZmYpW1xcXFxkYS1mXXsyfVwiLEtFPVwiKD8hWzBdezMyfSlbXFxcXGRhLWZdezMyfVwiLHpFPVwiKD8hWzBdezE2fSlbXFxcXGRhLWZdezE2fVwiLFlFPVwiW1xcXFxkYS1mXXsyfVwiLFFFPW5ldyBSZWdFeHAoYF5cXFxccz8oJHtXRX0pLSgke0tFfSktKCR7ekV9KS0oJHtZRX0pKC0uKik/XFxcXHM/JGApO2Z1bmN0aW9uIGVsKHIpe2xldCBlPVFFLmV4ZWMocik7cmV0dXJuIWV8fGVbMV09PT1cIjAwXCImJmVbNV0/bnVsbDp7dHJhY2VJZDplWzJdLHNwYW5JZDplWzNdLHRyYWNlRmxhZ3M6cGFyc2VJbnQoZVs0XSwxNil9fSQucGFyc2VUcmFjZVBhcmVudD1lbDt2YXIgbG89Y2xhc3N7aW5qZWN0KGUsdCxuKXtsZXQgaT1kbi50cmFjZS5nZXRTcGFuQ29udGV4dChlKTtpZighaXx8KDAsa0UuaXNUcmFjaW5nU3VwcHJlc3NlZCkoZSl8fCEoMCxkbi5pc1NwYW5Db250ZXh0VmFsaWQpKGkpKXJldHVybjtsZXQgcz1gJHtYRX0tJHtpLnRyYWNlSWR9LSR7aS5zcGFuSWR9LTAke051bWJlcihpLnRyYWNlRmxhZ3N8fGRuLlRyYWNlRmxhZ3MuTk9ORSkudG9TdHJpbmcoMTYpfWA7bi5zZXQodCwkLlRSQUNFX1BBUkVOVF9IRUFERVIscyksaS50cmFjZVN0YXRlJiZuLnNldCh0LCQuVFJBQ0VfU1RBVEVfSEVBREVSLGkudHJhY2VTdGF0ZS5zZXJpYWxpemUoKSl9ZXh0cmFjdChlLHQsbil7bGV0IGk9bi5nZXQodCwkLlRSQUNFX1BBUkVOVF9IRUFERVIpO2lmKCFpKXJldHVybiBlO2xldCBzPUFycmF5LmlzQXJyYXkoaSk/aVswXTppO2lmKHR5cGVvZiBzIT1cInN0cmluZ1wiKXJldHVybiBlO2xldCBvPWVsKHMpO2lmKCFvKXJldHVybiBlO28uaXNSZW1vdGU9ITA7bGV0IGE9bi5nZXQodCwkLlRSQUNFX1NUQVRFX0hFQURFUik7aWYoYSl7bGV0IHU9QXJyYXkuaXNBcnJheShhKT9hLmpvaW4oXCIsXCIpOmE7by50cmFjZVN0YXRlPW5ldyAkRS5UcmFjZVN0YXRlKHR5cGVvZiB1PT1cInN0cmluZ1wiP3U6dm9pZCAwKX1yZXR1cm4gZG4udHJhY2Uuc2V0U3BhbkNvbnRleHQoZSxvKX1maWVsZHMoKXtyZXR1cm5bJC5UUkFDRV9QQVJFTlRfSEVBREVSLCQuVFJBQ0VfU1RBVEVfSEVBREVSXX19OyQuVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcj1sb30pO3ZhciBubD1sKHJsPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJsLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSk7dmFyIGlsPWwodWU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodWUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dWUuZ2V0UlBDTWV0YWRhdGE9dWUuZGVsZXRlUlBDTWV0YWRhdGE9dWUuc2V0UlBDTWV0YWRhdGE9dWUuUlBDVHlwZT12b2lkIDA7dmFyIFpFPShoKCksbShkKSksX289KDAsWkUuY3JlYXRlQ29udGV4dEtleSkoXCJPcGVuVGVsZW1ldHJ5IFNESyBDb250ZXh0IEtleSBSUENfTUVUQURBVEFcIiksSkU7KGZ1bmN0aW9uKHIpe3IuSFRUUD1cImh0dHBcIn0pKEpFPXVlLlJQQ1R5cGV8fCh1ZS5SUENUeXBlPXt9KSk7ZnVuY3Rpb24gZW0ocixlKXtyZXR1cm4gci5zZXRWYWx1ZShfbyxlKX11ZS5zZXRSUENNZXRhZGF0YT1lbTtmdW5jdGlvbiB0bShyKXtyZXR1cm4gci5kZWxldGVWYWx1ZShfbyl9dWUuZGVsZXRlUlBDTWV0YWRhdGE9dG07ZnVuY3Rpb24gcm0ocil7cmV0dXJuIHIuZ2V0VmFsdWUoX28pfXVlLmdldFJQQ01ldGFkYXRhPXJtfSk7dmFyIGhvPWwoX249PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoX24sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7X24uQWx3YXlzT2ZmU2FtcGxlcj12b2lkIDA7dmFyIG5tPShoKCksbShkKSkscG89Y2xhc3N7c2hvdWxkU2FtcGxlKCl7cmV0dXJue2RlY2lzaW9uOm5tLlNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRH19dG9TdHJpbmcoKXtyZXR1cm5cIkFsd2F5c09mZlNhbXBsZXJcIn19O19uLkFsd2F5c09mZlNhbXBsZXI9cG99KTt2YXIgRW89bChwbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShwbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtwbi5BbHdheXNPblNhbXBsZXI9dm9pZCAwO3ZhciBpbT0oaCgpLG0oZCkpLGZvPWNsYXNze3Nob3VsZFNhbXBsZSgpe3JldHVybntkZWNpc2lvbjppbS5TYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRH19dG9TdHJpbmcoKXtyZXR1cm5cIkFsd2F5c09uU2FtcGxlclwifX07cG4uQWx3YXlzT25TYW1wbGVyPWZvfSk7dmFyIG9sPWwoZm49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Zm4uUGFyZW50QmFzZWRTYW1wbGVyPXZvaWQgMDt2YXIgaG49KGgoKSxtKGQpKSxzbT1RcygpLHNsPWhvKCksbW89RW8oKSxnbz1jbGFzc3tjb25zdHJ1Y3RvcihlKXt2YXIgdCxuLGksczt0aGlzLl9yb290PWUucm9vdCx0aGlzLl9yb290fHwoKDAsc20uZ2xvYmFsRXJyb3JIYW5kbGVyKShuZXcgRXJyb3IoXCJQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWRcIikpLHRoaXMuX3Jvb3Q9bmV3IG1vLkFsd2F5c09uU2FtcGxlciksdGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZD0odD1lLnJlbW90ZVBhcmVudFNhbXBsZWQpIT09bnVsbCYmdCE9PXZvaWQgMD90Om5ldyBtby5BbHdheXNPblNhbXBsZXIsdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZD0obj1lLnJlbW90ZVBhcmVudE5vdFNhbXBsZWQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOm5ldyBzbC5BbHdheXNPZmZTYW1wbGVyLHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZD0oaT1lLmxvY2FsUGFyZW50U2FtcGxlZCkhPT1udWxsJiZpIT09dm9pZCAwP2k6bmV3IG1vLkFsd2F5c09uU2FtcGxlcix0aGlzLl9sb2NhbFBhcmVudE5vdFNhbXBsZWQ9KHM9ZS5sb2NhbFBhcmVudE5vdFNhbXBsZWQpIT09bnVsbCYmcyE9PXZvaWQgMD9zOm5ldyBzbC5BbHdheXNPZmZTYW1wbGVyfXNob3VsZFNhbXBsZShlLHQsbixpLHMsbyl7bGV0IGE9aG4udHJhY2UuZ2V0U3BhbkNvbnRleHQoZSk7cmV0dXJuIWF8fCEoMCxobi5pc1NwYW5Db250ZXh0VmFsaWQpKGEpP3RoaXMuX3Jvb3Quc2hvdWxkU2FtcGxlKGUsdCxuLGkscyxvKTphLmlzUmVtb3RlP2EudHJhY2VGbGFncyZobi5UcmFjZUZsYWdzLlNBTVBMRUQ/dGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoZSx0LG4saSxzLG8pOnRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQuc2hvdWxkU2FtcGxlKGUsdCxuLGkscyxvKTphLnRyYWNlRmxhZ3MmaG4uVHJhY2VGbGFncy5TQU1QTEVEP3RoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoZSx0LG4saSxzLG8pOnRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoZSx0LG4saSxzLG8pfXRvU3RyaW5nKCl7cmV0dXJuYFBhcmVudEJhc2Vke3Jvb3Q9JHt0aGlzLl9yb290LnRvU3RyaW5nKCl9LCByZW1vdGVQYXJlbnRTYW1wbGVkPSR7dGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC50b1N0cmluZygpfSwgcmVtb3RlUGFyZW50Tm90U2FtcGxlZD0ke3RoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKX0sIGxvY2FsUGFyZW50U2FtcGxlZD0ke3RoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpfSwgbG9jYWxQYXJlbnROb3RTYW1wbGVkPSR7dGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnRvU3RyaW5nKCl9fWB9fTtmbi5QYXJlbnRCYXNlZFNhbXBsZXI9Z299KTt2YXIgYWw9bChFbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtFbi5UcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXI9dm9pZCAwO3ZhciBUbz0oaCgpLG0oZCkpLFNvPWNsYXNze2NvbnN0cnVjdG9yKGU9MCl7dGhpcy5fcmF0aW89ZSx0aGlzLl9yYXRpbz10aGlzLl9ub3JtYWxpemUoZSksdGhpcy5fdXBwZXJCb3VuZD1NYXRoLmZsb29yKHRoaXMuX3JhdGlvKjQyOTQ5NjcyOTUpfXNob3VsZFNhbXBsZShlLHQpe3JldHVybntkZWNpc2lvbjooMCxUby5pc1ZhbGlkVHJhY2VJZCkodCkmJnRoaXMuX2FjY3VtdWxhdGUodCk8dGhpcy5fdXBwZXJCb3VuZD9Uby5TYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRDpUby5TYW1wbGluZ0RlY2lzaW9uLk5PVF9SRUNPUkR9fXRvU3RyaW5nKCl7cmV0dXJuYFRyYWNlSWRSYXRpb0Jhc2VkeyR7dGhpcy5fcmF0aW99fWB9X25vcm1hbGl6ZShlKXtyZXR1cm4gdHlwZW9mIGUhPVwibnVtYmVyXCJ8fGlzTmFOKGUpPzA6ZT49MT8xOmU8PTA/MDplfV9hY2N1bXVsYXRlKGUpe2xldCB0PTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aC84O24rKyl7bGV0IGk9bio4LHM9cGFyc2VJbnQoZS5zbGljZShpLGkrOCksMTYpO3Q9KHRecyk+Pj4wfXJldHVybiB0fX07RW4uVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyPVNvfSk7dmFyIF9sPWwobW49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobW4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7bW4uaXNQbGFpbk9iamVjdD12b2lkIDA7dmFyIG9tPVwiW29iamVjdCBPYmplY3RdXCIsYW09XCJbb2JqZWN0IE51bGxdXCIsdW09XCJbb2JqZWN0IFVuZGVmaW5lZF1cIixjbT1GdW5jdGlvbi5wcm90b3R5cGUsdWw9Y20udG9TdHJpbmcsbG09dWwuY2FsbChPYmplY3QpLGRtPV9tKE9iamVjdC5nZXRQcm90b3R5cGVPZixPYmplY3QpLGNsPU9iamVjdC5wcm90b3R5cGUsbGw9Y2wuaGFzT3duUHJvcGVydHksS2U9U3ltYm9sP1N5bWJvbC50b1N0cmluZ1RhZzp2b2lkIDAsZGw9Y2wudG9TdHJpbmc7ZnVuY3Rpb24gX20ocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIoZSh0KSl9fWZ1bmN0aW9uIHBtKHIpe2lmKCFobShyKXx8Zm0ocikhPT1vbSlyZXR1cm4hMTtsZXQgZT1kbShyKTtpZihlPT09bnVsbClyZXR1cm4hMDtsZXQgdD1sbC5jYWxsKGUsXCJjb25zdHJ1Y3RvclwiKSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIHQ9PVwiZnVuY3Rpb25cIiYmdCBpbnN0YW5jZW9mIHQmJnVsLmNhbGwodCk9PT1sbX1tbi5pc1BsYWluT2JqZWN0PXBtO2Z1bmN0aW9uIGhtKHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09XCJvYmplY3RcIn1mdW5jdGlvbiBmbShyKXtyZXR1cm4gcj09bnVsbD9yPT09dm9pZCAwP3VtOmFtOktlJiZLZSBpbiBPYmplY3Qocik/RW0ocik6bW0ocil9ZnVuY3Rpb24gRW0ocil7bGV0IGU9bGwuY2FsbChyLEtlKSx0PXJbS2VdLG49ITE7dHJ5e3JbS2VdPXZvaWQgMCxuPSEwfWNhdGNoe31sZXQgaT1kbC5jYWxsKHIpO3JldHVybiBuJiYoZT9yW0tlXT10OmRlbGV0ZSByW0tlXSksaX1mdW5jdGlvbiBtbShyKXtyZXR1cm4gZGwuY2FsbChyKX19KTt2YXIgbWw9bChTbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShTbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtTbi5tZXJnZT12b2lkIDA7dmFyIHBsPV9sKCksZ209MjA7ZnVuY3Rpb24gVG0oLi4ucil7bGV0IGU9ci5zaGlmdCgpLHQ9bmV3IFdlYWtNYXA7Zm9yKDtyLmxlbmd0aD4wOyllPWZsKGUsci5zaGlmdCgpLDAsdCk7cmV0dXJuIGV9U24ubWVyZ2U9VG07ZnVuY3Rpb24gQW8ocil7cmV0dXJuIFRuKHIpP3Iuc2xpY2UoKTpyfWZ1bmN0aW9uIGZsKHIsZSx0PTAsbil7bGV0IGk7aWYoISh0PmdtKSl7aWYodCsrLGduKHIpfHxnbihlKXx8RWwoZSkpaT1BbyhlKTtlbHNlIGlmKFRuKHIpKXtpZihpPXIuc2xpY2UoKSxUbihlKSlmb3IobGV0IHM9MCxvPWUubGVuZ3RoO3M8bztzKyspaS5wdXNoKEFvKGVbc10pKTtlbHNlIGlmKEVyKGUpKXtsZXQgcz1PYmplY3Qua2V5cyhlKTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspe2xldCB1PXNbb107aVt1XT1BbyhlW3VdKX19fWVsc2UgaWYoRXIocikpaWYoRXIoZSkpe2lmKCFTbShyLGUpKXJldHVybiBlO2k9T2JqZWN0LmFzc2lnbih7fSxyKTtsZXQgcz1PYmplY3Qua2V5cyhlKTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspe2xldCB1PXNbb10sYz1lW3VdO2lmKGduKGMpKXR5cGVvZiBjPlwidVwiP2RlbGV0ZSBpW3VdOmlbdV09YztlbHNle2xldCBfPWlbdV0scD1jO2lmKGhsKHIsdSxuKXx8aGwoZSx1LG4pKWRlbGV0ZSBpW3VdO2Vsc2V7aWYoRXIoXykmJkVyKHApKXtsZXQgZj1uLmdldChfKXx8W10sTT1uLmdldChwKXx8W107Zi5wdXNoKHtvYmo6cixrZXk6dX0pLE0ucHVzaCh7b2JqOmUsa2V5OnV9KSxuLnNldChfLGYpLG4uc2V0KHAsTSl9aVt1XT1mbChpW3VdLGMsdCxuKX19fX1lbHNlIGk9ZTtyZXR1cm4gaX19ZnVuY3Rpb24gaGwocixlLHQpe2xldCBuPXQuZ2V0KHJbZV0pfHxbXTtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspe2xldCBvPW5baV07aWYoby5rZXk9PT1lJiZvLm9iaj09PXIpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gVG4ocil7cmV0dXJuIEFycmF5LmlzQXJyYXkocil9ZnVuY3Rpb24gRWwocil7cmV0dXJuIHR5cGVvZiByPT1cImZ1bmN0aW9uXCJ9ZnVuY3Rpb24gRXIocil7cmV0dXJuIWduKHIpJiYhVG4ocikmJiFFbChyKSYmdHlwZW9mIHI9PVwib2JqZWN0XCJ9ZnVuY3Rpb24gZ24ocil7cmV0dXJuIHR5cGVvZiByPT1cInN0cmluZ1wifHx0eXBlb2Ygcj09XCJudW1iZXJcInx8dHlwZW9mIHI9PVwiYm9vbGVhblwifHx0eXBlb2Ygcj5cInVcInx8ciBpbnN0YW5jZW9mIERhdGV8fHIgaW5zdGFuY2VvZiBSZWdFeHB8fHI9PT1udWxsfWZ1bmN0aW9uIFNtKHIsZSl7cmV0dXJuISghKDAscGwuaXNQbGFpbk9iamVjdCkocil8fCEoMCxwbC5pc1BsYWluT2JqZWN0KShlKSl9fSk7dmFyIGdsPWwobXQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobXQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7bXQuY2FsbFdpdGhUaW1lb3V0PW10LlRpbWVvdXRFcnJvcj12b2lkIDA7dmFyIEFuPWNsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxyLnByb3RvdHlwZSl9fTttdC5UaW1lb3V0RXJyb3I9QW47ZnVuY3Rpb24gQW0ocixlKXtsZXQgdCxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsbyl7dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byhuZXcgQW4oXCJPcGVyYXRpb24gdGltZWQgb3V0LlwiKSl9LGUpfSk7cmV0dXJuIFByb21pc2UucmFjZShbcixuXSkudGhlbihpPT4oY2xlYXJUaW1lb3V0KHQpLGkpLGk9Pnt0aHJvdyBjbGVhclRpbWVvdXQodCksaX0pfW10LmNhbGxXaXRoVGltZW91dD1BbX0pO3ZhciBTbD1sKGd0PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGd0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2d0LmlzVXJsSWdub3JlZD1ndC51cmxNYXRjaGVzPXZvaWQgMDtmdW5jdGlvbiBUbChyLGUpe3JldHVybiB0eXBlb2YgZT09XCJzdHJpbmdcIj9yPT09ZTohIXIubWF0Y2goZSl9Z3QudXJsTWF0Y2hlcz1UbDtmdW5jdGlvbiBPbShyLGUpe2lmKCFlKXJldHVybiExO2ZvcihsZXQgdCBvZiBlKWlmKFRsKHIsdCkpcmV0dXJuITA7cmV0dXJuITF9Z3QuaXNVcmxJZ25vcmVkPU9tfSk7dmFyIEFsPWwoT249PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoT24sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7T24uaXNXcmFwcGVkPXZvaWQgMDtmdW5jdGlvbiBSbShyKXtyZXR1cm4gdHlwZW9mIHI9PVwiZnVuY3Rpb25cIiYmdHlwZW9mIHIuX19vcmlnaW5hbD09XCJmdW5jdGlvblwiJiZ0eXBlb2Ygci5fX3Vud3JhcD09XCJmdW5jdGlvblwiJiZyLl9fd3JhcHBlZD09PSEwfU9uLmlzV3JhcHBlZD1SbX0pO3ZhciBPbD1sKFJuPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFJuLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1JuLkRlZmVycmVkPXZvaWQgMDt2YXIgT289Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9wcm9taXNlPW5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5fcmVzb2x2ZT1lLHRoaXMuX3JlamVjdD10fSl9Z2V0IHByb21pc2UoKXtyZXR1cm4gdGhpcy5fcHJvbWlzZX1yZXNvbHZlKGUpe3RoaXMuX3Jlc29sdmUoZSl9cmVqZWN0KGUpe3RoaXMuX3JlamVjdChlKX19O1JuLkRlZmVycmVkPU9vfSk7dmFyIFJsPWwoYm49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoYm4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Ym4uQmluZE9uY2VGdXR1cmU9dm9pZCAwO3ZhciBibT1PbCgpLFJvPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fY2FsbGJhY2s9ZSx0aGlzLl90aGF0PXQsdGhpcy5faXNDYWxsZWQ9ITEsdGhpcy5fZGVmZXJyZWQ9bmV3IGJtLkRlZmVycmVkfWdldCBpc0NhbGxlZCgpe3JldHVybiB0aGlzLl9pc0NhbGxlZH1nZXQgcHJvbWlzZSgpe3JldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlfWNhbGwoLi4uZSl7aWYoIXRoaXMuX2lzQ2FsbGVkKXt0aGlzLl9pc0NhbGxlZD0hMDt0cnl7UHJvbWlzZS5yZXNvbHZlKHRoaXMuX2NhbGxiYWNrLmNhbGwodGhpcy5fdGhhdCwuLi5lKSkudGhlbih0PT50aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHQpLHQ9PnRoaXMuX2RlZmVycmVkLnJlamVjdCh0KSl9Y2F0Y2godCl7dGhpcy5fZGVmZXJyZWQucmVqZWN0KHQpfX1yZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZX19O2JuLkJpbmRPbmNlRnV0dXJlPVJvfSk7dmFyIFBsPWwoUG49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoUG4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7UG4uX2V4cG9ydD12b2lkIDA7dmFyIGJsPShoKCksbShkKSksUG09ZHIoKTtmdW5jdGlvbiB5bShyLGUpe3JldHVybiBuZXcgUHJvbWlzZSh0PT57YmwuY29udGV4dC53aXRoKCgwLFBtLnN1cHByZXNzVHJhY2luZykoYmwuY29udGV4dC5hY3RpdmUoKSksKCk9PntyLmV4cG9ydChlLG49Pnt0KG4pfSl9KX0pfVBuLl9leHBvcnQ9eW19KTt2YXIgQT1sKFQ9PntcInVzZSBzdHJpY3RcIjt2YXIgdm09VCYmVC5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fSl9OmZ1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLHJbbl09ZVt0XX0pLFA9VCYmVC5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJnZtKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KFQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VC5pbnRlcm5hbD1ULmJhZ2dhZ2VVdGlscz12b2lkIDA7UChoYygpLFQpO1AoZmMoKSxUKTtQKFNjKCksVCk7UChRcygpLFQpO1AoWXMoKSxUKTtQKEZjKCksVCk7UCgkYygpLFQpO1AoWGMoKSxUKTtULmJhZ2dhZ2VVdGlscz0kcygpO1Aocm8oKSxUKTtQKEtjKCksVCk7UCh0bCgpLFQpO1AobmwoKSxUKTtQKGlsKCksVCk7UChobygpLFQpO1AoRW8oKSxUKTtQKG9sKCksVCk7UChhbCgpLFQpO1AoZHIoKSxUKTtQKGNvKCksVCk7UChRcigpLFQpO1AobWwoKSxUKTtQKFpzKCksVCk7UChnbCgpLFQpO1AoU2woKSxUKTtQKEFsKCksVCk7UChSbCgpLFQpO1AodG8oKSxUKTt2YXIgSW09UGwoKTtULmludGVybmFsPXtfZXhwb3J0OkltLl9leHBvcnR9fSk7dmFyIHlsPWwoeW49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoeW4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7eW4uRXhjZXB0aW9uRXZlbnROYW1lPXZvaWQgMDt5bi5FeGNlcHRpb25FdmVudE5hbWU9XCJleGNlcHRpb25cIn0pO3ZhciBQbz1sKHZuPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHZuLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZuLlNwYW49dm9pZCAwO3ZhciBoZT0oaCgpLG0oZCkpLFg9QSgpLHplPUFlKCksTW09eWwoKSxibz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbixpLHMsbyxhPVtdLHUsYyxfKXt0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5saW5rcz1bXSx0aGlzLmV2ZW50cz1bXSx0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50PTAsdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50PTAsdGhpcy5fZHJvcHBlZExpbmtzQ291bnQ9MCx0aGlzLnN0YXR1cz17Y29kZTpoZS5TcGFuU3RhdHVzQ29kZS5VTlNFVH0sdGhpcy5lbmRUaW1lPVswLDBdLHRoaXMuX2VuZGVkPSExLHRoaXMuX2R1cmF0aW9uPVstMSwtMV0sdGhpcy5uYW1lPW4sdGhpcy5fc3BhbkNvbnRleHQ9aSx0aGlzLnBhcmVudFNwYW5JZD1vLHRoaXMua2luZD1zLHRoaXMubGlua3M9YTtsZXQgcD1EYXRlLm5vdygpO3RoaXMuX3BlcmZvcm1hbmNlU3RhcnRUaW1lPVgub3RwZXJmb3JtYW5jZS5ub3coKSx0aGlzLl9wZXJmb3JtYW5jZU9mZnNldD1wLSh0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZSsoMCxYLmdldFRpbWVPcmlnaW4pKCkpLHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkPXUhPW51bGwsdGhpcy5zdGFydFRpbWU9dGhpcy5fZ2V0VGltZSh1Pz9wKSx0aGlzLnJlc291cmNlPWUucmVzb3VyY2UsdGhpcy5pbnN0cnVtZW50YXRpb25MaWJyYXJ5PWUuaW5zdHJ1bWVudGF0aW9uTGlicmFyeSx0aGlzLl9zcGFuTGltaXRzPWUuZ2V0U3BhbkxpbWl0cygpLF8hPW51bGwmJnRoaXMuc2V0QXR0cmlidXRlcyhfKSx0aGlzLl9zcGFuUHJvY2Vzc29yPWUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvcigpLHRoaXMuX3NwYW5Qcm9jZXNzb3Iub25TdGFydCh0aGlzLHQpLHRoaXMuX2F0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ9dGhpcy5fc3BhbkxpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0fHwwfXNwYW5Db250ZXh0KCl7cmV0dXJuIHRoaXMuX3NwYW5Db250ZXh0fXNldEF0dHJpYnV0ZShlLHQpe3JldHVybiB0PT1udWxsfHx0aGlzLl9pc1NwYW5FbmRlZCgpP3RoaXM6ZS5sZW5ndGg9PT0wPyhoZS5kaWFnLndhcm4oYEludmFsaWQgYXR0cmlidXRlIGtleTogJHtlfWApLHRoaXMpOigwLFguaXNBdHRyaWJ1dGVWYWx1ZSkodCk/T2JqZWN0LmtleXModGhpcy5hdHRyaWJ1dGVzKS5sZW5ndGg+PXRoaXMuX3NwYW5MaW1pdHMuYXR0cmlidXRlQ291bnRMaW1pdCYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmF0dHJpYnV0ZXMsZSk/KHRoaXMuX2Ryb3BwZWRBdHRyaWJ1dGVzQ291bnQrKyx0aGlzKToodGhpcy5hdHRyaWJ1dGVzW2VdPXRoaXMuX3RydW5jYXRlVG9TaXplKHQpLHRoaXMpOihoZS5kaWFnLndhcm4oYEludmFsaWQgYXR0cmlidXRlIHZhbHVlIHNldCBmb3Iga2V5OiAke2V9YCksdGhpcyl9c2V0QXR0cmlidXRlcyhlKXtmb3IobGV0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhlKSl0aGlzLnNldEF0dHJpYnV0ZSh0LG4pO3JldHVybiB0aGlzfWFkZEV2ZW50KGUsdCxuKXtpZih0aGlzLl9pc1NwYW5FbmRlZCgpKXJldHVybiB0aGlzO2lmKHRoaXMuX3NwYW5MaW1pdHMuZXZlbnRDb3VudExpbWl0PT09MClyZXR1cm4gaGUuZGlhZy53YXJuKFwiTm8gZXZlbnRzIGFsbG93ZWQuXCIpLHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrLHRoaXM7dGhpcy5ldmVudHMubGVuZ3RoPj10aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCYmKGhlLmRpYWcud2FybihcIkRyb3BwaW5nIGV4dHJhIGV2ZW50cy5cIiksdGhpcy5ldmVudHMuc2hpZnQoKSx0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQrKyksKDAsWC5pc1RpbWVJbnB1dCkodCkmJigoMCxYLmlzVGltZUlucHV0KShuKXx8KG49dCksdD12b2lkIDApO2xldCBpPSgwLFguc2FuaXRpemVBdHRyaWJ1dGVzKSh0KTtyZXR1cm4gdGhpcy5ldmVudHMucHVzaCh7bmFtZTplLGF0dHJpYnV0ZXM6aSx0aW1lOnRoaXMuX2dldFRpbWUobiksZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDowfSksdGhpc31zZXRTdGF0dXMoZSl7cmV0dXJuIHRoaXMuX2lzU3BhbkVuZGVkKCk/dGhpczoodGhpcy5zdGF0dXM9ZSx0aGlzKX11cGRhdGVOYW1lKGUpe3JldHVybiB0aGlzLl9pc1NwYW5FbmRlZCgpP3RoaXM6KHRoaXMubmFtZT1lLHRoaXMpfWVuZChlKXtpZih0aGlzLl9pc1NwYW5FbmRlZCgpKXtoZS5kaWFnLmVycm9yKGAke3RoaXMubmFtZX0gJHt0aGlzLl9zcGFuQ29udGV4dC50cmFjZUlkfS0ke3RoaXMuX3NwYW5Db250ZXh0LnNwYW5JZH0gLSBZb3UgY2FuIG9ubHkgY2FsbCBlbmQoKSBvbiBhIHNwYW4gb25jZS5gKTtyZXR1cm59dGhpcy5fZW5kZWQ9ITAsdGhpcy5lbmRUaW1lPXRoaXMuX2dldFRpbWUoZSksdGhpcy5fZHVyYXRpb249KDAsWC5oclRpbWVEdXJhdGlvbikodGhpcy5zdGFydFRpbWUsdGhpcy5lbmRUaW1lKSx0aGlzLl9kdXJhdGlvblswXTwwJiYoaGUuZGlhZy53YXJuKFwiSW5jb25zaXN0ZW50IHN0YXJ0IGFuZCBlbmQgdGltZSwgc3RhcnRUaW1lID4gZW5kVGltZS4gU2V0dGluZyBzcGFuIGR1cmF0aW9uIHRvIDBtcy5cIix0aGlzLnN0YXJ0VGltZSx0aGlzLmVuZFRpbWUpLHRoaXMuZW5kVGltZT10aGlzLnN0YXJ0VGltZS5zbGljZSgpLHRoaXMuX2R1cmF0aW9uPVswLDBdKSx0aGlzLl9zcGFuUHJvY2Vzc29yLm9uRW5kKHRoaXMpfV9nZXRUaW1lKGUpe2lmKHR5cGVvZiBlPT1cIm51bWJlclwiJiZlPFgub3RwZXJmb3JtYW5jZS5ub3coKSlyZXR1cm4oMCxYLmhyVGltZSkoZSt0aGlzLl9wZXJmb3JtYW5jZU9mZnNldCk7aWYodHlwZW9mIGU9PVwibnVtYmVyXCIpcmV0dXJuKDAsWC5taWxsaXNUb0hyVGltZSkoZSk7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuKDAsWC5taWxsaXNUb0hyVGltZSkoZS5nZXRUaW1lKCkpO2lmKCgwLFguaXNUaW1lSW5wdXRIclRpbWUpKGUpKXJldHVybiBlO2lmKHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkKXJldHVybigwLFgubWlsbGlzVG9IclRpbWUpKERhdGUubm93KCkpO2xldCB0PVgub3RwZXJmb3JtYW5jZS5ub3coKS10aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZTtyZXR1cm4oMCxYLmFkZEhyVGltZXMpKHRoaXMuc3RhcnRUaW1lLCgwLFgubWlsbGlzVG9IclRpbWUpKHQpKX1pc1JlY29yZGluZygpe3JldHVybiB0aGlzLl9lbmRlZD09PSExfXJlY29yZEV4Y2VwdGlvbihlLHQpe2xldCBuPXt9O3R5cGVvZiBlPT1cInN0cmluZ1wiP25bemUuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9NRVNTQUdFXT1lOmUmJihlLmNvZGU/blt6ZS5TZW1hbnRpY0F0dHJpYnV0ZXMuRVhDRVBUSU9OX1RZUEVdPWUuY29kZS50b1N0cmluZygpOmUubmFtZSYmKG5bemUuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9UWVBFXT1lLm5hbWUpLGUubWVzc2FnZSYmKG5bemUuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9NRVNTQUdFXT1lLm1lc3NhZ2UpLGUuc3RhY2smJihuW3plLlNlbWFudGljQXR0cmlidXRlcy5FWENFUFRJT05fU1RBQ0tUUkFDRV09ZS5zdGFjaykpLG5bemUuU2VtYW50aWNBdHRyaWJ1dGVzLkVYQ0VQVElPTl9UWVBFXXx8blt6ZS5TZW1hbnRpY0F0dHJpYnV0ZXMuRVhDRVBUSU9OX01FU1NBR0VdP3RoaXMuYWRkRXZlbnQoTW0uRXhjZXB0aW9uRXZlbnROYW1lLG4sdCk6aGUuZGlhZy53YXJuKGBGYWlsZWQgdG8gcmVjb3JkIGFuIGV4Y2VwdGlvbiAke2V9YCl9Z2V0IGR1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2R1cmF0aW9ufWdldCBlbmRlZCgpe3JldHVybiB0aGlzLl9lbmRlZH1nZXQgZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCgpe3JldHVybiB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50fWdldCBkcm9wcGVkRXZlbnRzQ291bnQoKXtyZXR1cm4gdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50fWdldCBkcm9wcGVkTGlua3NDb3VudCgpe3JldHVybiB0aGlzLl9kcm9wcGVkTGlua3NDb3VudH1faXNTcGFuRW5kZWQoKXtyZXR1cm4gdGhpcy5fZW5kZWQmJmhlLmRpYWcud2FybihgQ2FuIG5vdCBleGVjdXRlIHRoZSBvcGVyYXRpb24gb24gZW5kZWQgU3BhbiB7dHJhY2VJZDogJHt0aGlzLl9zcGFuQ29udGV4dC50cmFjZUlkfSwgc3BhbklkOiAke3RoaXMuX3NwYW5Db250ZXh0LnNwYW5JZH19YCksdGhpcy5fZW5kZWR9X3RydW5jYXRlVG9MaW1pdFV0aWwoZSx0KXtyZXR1cm4gZS5sZW5ndGg8PXQ/ZTplLnN1YnN0cigwLHQpfV90cnVuY2F0ZVRvU2l6ZShlKXtsZXQgdD10aGlzLl9hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0O3JldHVybiB0PD0wPyhoZS5kaWFnLndhcm4oYEF0dHJpYnV0ZSB2YWx1ZSBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBnb3QgJHt0fWApLGUpOnR5cGVvZiBlPT1cInN0cmluZ1wiP3RoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwoZSx0KTpBcnJheS5pc0FycmF5KGUpP2UubWFwKG49PnR5cGVvZiBuPT1cInN0cmluZ1wiP3RoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwobix0KTpuKTplfX07dm4uU3Bhbj1ib30pO3ZhciBncj1sKG1yPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1yLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO21yLlNhbXBsaW5nRGVjaXNpb249dm9pZCAwO3ZhciBMbTsoZnVuY3Rpb24ocil7cltyLk5PVF9SRUNPUkQ9MF09XCJOT1RfUkVDT1JEXCIscltyLlJFQ09SRD0xXT1cIlJFQ09SRFwiLHJbci5SRUNPUkRfQU5EX1NBTVBMRUQ9Ml09XCJSRUNPUkRfQU5EX1NBTVBMRURcIn0pKExtPW1yLlNhbXBsaW5nRGVjaXNpb258fChtci5TYW1wbGluZ0RlY2lzaW9uPXt9KSl9KTt2YXIgTW49bChJbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShJbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtJbi5BbHdheXNPZmZTYW1wbGVyPXZvaWQgMDt2YXIgTm09Z3IoKSx5bz1jbGFzc3tzaG91bGRTYW1wbGUoKXtyZXR1cm57ZGVjaXNpb246Tm0uU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JEfX10b1N0cmluZygpe3JldHVyblwiQWx3YXlzT2ZmU2FtcGxlclwifX07SW4uQWx3YXlzT2ZmU2FtcGxlcj15b30pO3ZhciBObj1sKExuPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KExuLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0xuLkFsd2F5c09uU2FtcGxlcj12b2lkIDA7dmFyIENtPWdyKCksdm89Y2xhc3N7c2hvdWxkU2FtcGxlKCl7cmV0dXJue2RlY2lzaW9uOkNtLlNhbXBsaW5nRGVjaXNpb24uUkVDT1JEX0FORF9TQU1QTEVEfX10b1N0cmluZygpe3JldHVyblwiQWx3YXlzT25TYW1wbGVyXCJ9fTtMbi5BbHdheXNPblNhbXBsZXI9dm99KTt2YXIgTG89bCh3bj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt3bi5QYXJlbnRCYXNlZFNhbXBsZXI9dm9pZCAwO3ZhciBDbj0oaCgpLG0oZCkpLHdtPUEoKSx2bD1NbigpLElvPU5uKCksTW89Y2xhc3N7Y29uc3RydWN0b3IoZSl7dmFyIHQsbixpLHM7dGhpcy5fcm9vdD1lLnJvb3QsdGhpcy5fcm9vdHx8KCgwLHdtLmdsb2JhbEVycm9ySGFuZGxlcikobmV3IEVycm9yKFwiUGFyZW50QmFzZWRTYW1wbGVyIG11c3QgaGF2ZSBhIHJvb3Qgc2FtcGxlciBjb25maWd1cmVkXCIpKSx0aGlzLl9yb290PW5ldyBJby5BbHdheXNPblNhbXBsZXIpLHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQ9KHQ9ZS5yZW1vdGVQYXJlbnRTYW1wbGVkKSE9PW51bGwmJnQhPT12b2lkIDA/dDpuZXcgSW8uQWx3YXlzT25TYW1wbGVyLHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQ9KG49ZS5yZW1vdGVQYXJlbnROb3RTYW1wbGVkKSE9PW51bGwmJm4hPT12b2lkIDA/bjpuZXcgdmwuQWx3YXlzT2ZmU2FtcGxlcix0aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQ9KGk9ZS5sb2NhbFBhcmVudFNhbXBsZWQpIT09bnVsbCYmaSE9PXZvaWQgMD9pOm5ldyBJby5BbHdheXNPblNhbXBsZXIsdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkPShzPWUubG9jYWxQYXJlbnROb3RTYW1wbGVkKSE9PW51bGwmJnMhPT12b2lkIDA/czpuZXcgdmwuQWx3YXlzT2ZmU2FtcGxlcn1zaG91bGRTYW1wbGUoZSx0LG4saSxzLG8pe2xldCBhPUNuLnRyYWNlLmdldFNwYW5Db250ZXh0KGUpO3JldHVybiFhfHwhKDAsQ24uaXNTcGFuQ29udGV4dFZhbGlkKShhKT90aGlzLl9yb290LnNob3VsZFNhbXBsZShlLHQsbixpLHMsbyk6YS5pc1JlbW90ZT9hLnRyYWNlRmxhZ3MmQ24uVHJhY2VGbGFncy5TQU1QTEVEP3RoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQuc2hvdWxkU2FtcGxlKGUsdCxuLGkscyxvKTp0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShlLHQsbixpLHMsbyk6YS50cmFjZUZsYWdzJkNuLlRyYWNlRmxhZ3MuU0FNUExFRD90aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQuc2hvdWxkU2FtcGxlKGUsdCxuLGkscyxvKTp0aGlzLl9sb2NhbFBhcmVudE5vdFNhbXBsZWQuc2hvdWxkU2FtcGxlKGUsdCxuLGkscyxvKX10b1N0cmluZygpe3JldHVybmBQYXJlbnRCYXNlZHtyb290PSR7dGhpcy5fcm9vdC50b1N0cmluZygpfSwgcmVtb3RlUGFyZW50U2FtcGxlZD0ke3RoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKX0sIHJlbW90ZVBhcmVudE5vdFNhbXBsZWQ9JHt0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnRvU3RyaW5nKCl9LCBsb2NhbFBhcmVudFNhbXBsZWQ9JHt0aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQudG9TdHJpbmcoKX0sIGxvY2FsUGFyZW50Tm90U2FtcGxlZD0ke3RoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpfX1gfX07d24uUGFyZW50QmFzZWRTYW1wbGVyPU1vfSk7dmFyIENvPWwoeG49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoeG4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7eG4uVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyPXZvaWQgMDt2YXIgeG09KGgoKSxtKGQpKSxJbD1ncigpLE5vPWNsYXNze2NvbnN0cnVjdG9yKGU9MCl7dGhpcy5fcmF0aW89ZSx0aGlzLl9yYXRpbz10aGlzLl9ub3JtYWxpemUoZSksdGhpcy5fdXBwZXJCb3VuZD1NYXRoLmZsb29yKHRoaXMuX3JhdGlvKjQyOTQ5NjcyOTUpfXNob3VsZFNhbXBsZShlLHQpe3JldHVybntkZWNpc2lvbjooMCx4bS5pc1ZhbGlkVHJhY2VJZCkodCkmJnRoaXMuX2FjY3VtdWxhdGUodCk8dGhpcy5fdXBwZXJCb3VuZD9JbC5TYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRDpJbC5TYW1wbGluZ0RlY2lzaW9uLk5PVF9SRUNPUkR9fXRvU3RyaW5nKCl7cmV0dXJuYFRyYWNlSWRSYXRpb0Jhc2VkeyR7dGhpcy5fcmF0aW99fWB9X25vcm1hbGl6ZShlKXtyZXR1cm4gdHlwZW9mIGUhPVwibnVtYmVyXCJ8fGlzTmFOKGUpPzA6ZT49MT8xOmU8PTA/MDplfV9hY2N1bXVsYXRlKGUpe2xldCB0PTA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aC84O24rKyl7bGV0IGk9bio4LHM9cGFyc2VJbnQoZS5zbGljZShpLGkrOCksMTYpO3Q9KHRecyk+Pj4wfXJldHVybiB0fX07eG4uVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyPU5vfSk7dmFyIERvPWwoU3Q9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoU3QsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7U3QuYnVpbGRTYW1wbGVyRnJvbUVudj1TdC5sb2FkRGVmYXVsdENvbmZpZz12b2lkIDA7dmFyIERuPShoKCksbShkKSksSD1BKCksTWw9TW4oKSx3bz1ObigpLHhvPUxvKCksTGw9Q28oKSxEbT0oMCxILmdldEVudikoKSxVbT1ILlRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT24sVHQ9MTtmdW5jdGlvbiBCbSgpe3JldHVybntzYW1wbGVyOkNsKERtKSxmb3JjZUZsdXNoVGltZW91dE1pbGxpczozZTQsZ2VuZXJhbExpbWl0czp7YXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDooMCxILmdldEVudikoKS5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsYXR0cmlidXRlQ291bnRMaW1pdDooMCxILmdldEVudikoKS5PVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVH0sc3BhbkxpbWl0czp7YXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDooMCxILmdldEVudikoKS5PVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxhdHRyaWJ1dGVDb3VudExpbWl0OigwLEguZ2V0RW52KSgpLk9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQsbGlua0NvdW50TGltaXQ6KDAsSC5nZXRFbnYpKCkuT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQsZXZlbnRDb3VudExpbWl0OigwLEguZ2V0RW52KSgpLk9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVCxhdHRyaWJ1dGVQZXJFdmVudENvdW50TGltaXQ6KDAsSC5nZXRFbnYpKCkuT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQsYXR0cmlidXRlUGVyTGlua0NvdW50TGltaXQ6KDAsSC5nZXRFbnYpKCkuT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVH19fVN0LmxvYWREZWZhdWx0Q29uZmlnPUJtO2Z1bmN0aW9uIENsKHI9KDAsSC5nZXRFbnYpKCkpe3N3aXRjaChyLk9URUxfVFJBQ0VTX1NBTVBMRVIpe2Nhc2UgSC5UcmFjZXNTYW1wbGVyVmFsdWVzLkFsd2F5c09uOnJldHVybiBuZXcgd28uQWx3YXlzT25TYW1wbGVyO2Nhc2UgSC5UcmFjZXNTYW1wbGVyVmFsdWVzLkFsd2F5c09mZjpyZXR1cm4gbmV3IE1sLkFsd2F5c09mZlNhbXBsZXI7Y2FzZSBILlRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbjpyZXR1cm4gbmV3IHhvLlBhcmVudEJhc2VkU2FtcGxlcih7cm9vdDpuZXcgd28uQWx3YXlzT25TYW1wbGVyfSk7Y2FzZSBILlRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPZmY6cmV0dXJuIG5ldyB4by5QYXJlbnRCYXNlZFNhbXBsZXIoe3Jvb3Q6bmV3IE1sLkFsd2F5c09mZlNhbXBsZXJ9KTtjYXNlIEguVHJhY2VzU2FtcGxlclZhbHVlcy5UcmFjZUlkUmF0aW86cmV0dXJuIG5ldyBMbC5UcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIoTmwocikpO2Nhc2UgSC5UcmFjZXNTYW1wbGVyVmFsdWVzLlBhcmVudEJhc2VkVHJhY2VJZFJhdGlvOnJldHVybiBuZXcgeG8uUGFyZW50QmFzZWRTYW1wbGVyKHtyb290Om5ldyBMbC5UcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIoTmwocikpfSk7ZGVmYXVsdDpyZXR1cm4gRG4uZGlhZy5lcnJvcihgT1RFTF9UUkFDRVNfU0FNUExFUiB2YWx1ZSBcIiR7ci5PVEVMX1RSQUNFU19TQU1QTEVSfSBpbnZhbGlkLCBkZWZhdWx0aW5nIHRvICR7VW19XCIuYCksbmV3IHdvLkFsd2F5c09uU2FtcGxlcn19U3QuYnVpbGRTYW1wbGVyRnJvbUVudj1DbDtmdW5jdGlvbiBObChyKXtpZihyLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPT09dm9pZCAwfHxyLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPT09XCJcIilyZXR1cm4gRG4uZGlhZy5lcnJvcihgT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgaXMgYmxhbmssIGRlZmF1bHRpbmcgdG8gJHtUdH0uYCksVHQ7bGV0IGU9TnVtYmVyKHIuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcpO3JldHVybiBpc05hTihlKT8oRG4uZGlhZy5lcnJvcihgT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9JHtyLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHfSB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBpbnZhbGlkLCBkZWZhdWx0aW5nIHRvICR7VHR9LmApLFR0KTplPDB8fGU+MT8oRG4uZGlhZy5lcnJvcihgT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9JHtyLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHfSB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBvdXQgb2YgcmFuZ2UgKFswLi4xXSksIGRlZmF1bHRpbmcgdG8gJHtUdH0uYCksVHQpOmV9fSk7dmFyIEJvPWwoQXQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoQXQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7QXQucmVjb25maWd1cmVMaW1pdHM9QXQubWVyZ2VDb25maWc9dm9pZCAwO3ZhciB3bD1EbygpLFVvPUEoKTtmdW5jdGlvbiBxbShyKXtsZXQgZT17c2FtcGxlcjooMCx3bC5idWlsZFNhbXBsZXJGcm9tRW52KSgpfSx0PSgwLHdsLmxvYWREZWZhdWx0Q29uZmlnKSgpLG49T2JqZWN0LmFzc2lnbih7fSx0LGUscik7cmV0dXJuIG4uZ2VuZXJhbExpbWl0cz1PYmplY3QuYXNzaWduKHt9LHQuZ2VuZXJhbExpbWl0cyxyLmdlbmVyYWxMaW1pdHN8fHt9KSxuLnNwYW5MaW1pdHM9T2JqZWN0LmFzc2lnbih7fSx0LnNwYW5MaW1pdHMsci5zcGFuTGltaXRzfHx7fSksbn1BdC5tZXJnZUNvbmZpZz1xbTtmdW5jdGlvbiBWbShyKXt2YXIgZSx0LG4saSxzLG8sYSx1LGMsXyxwLGY7bGV0IE09T2JqZWN0LmFzc2lnbih7fSxyLnNwYW5MaW1pdHMpLFI9KDAsVW8uZ2V0RW52V2l0aG91dERlZmF1bHRzKSgpO3JldHVybiBNLmF0dHJpYnV0ZUNvdW50TGltaXQ9KG89KHM9KGk9KHQ9KGU9ci5zcGFuTGltaXRzKT09PW51bGx8fGU9PT12b2lkIDA/dm9pZCAwOmUuYXR0cmlidXRlQ291bnRMaW1pdCkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6KG49ci5nZW5lcmFsTGltaXRzKT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uYXR0cmlidXRlQ291bnRMaW1pdCkhPT1udWxsJiZpIT09dm9pZCAwP2k6Ui5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJnMhPT12b2lkIDA/czpSLk9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJm8hPT12b2lkIDA/bzpVby5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxNLmF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ9KGY9KHA9KF89KHU9KGE9ci5zcGFuTGltaXRzKT09PW51bGx8fGE9PT12b2lkIDA/dm9pZCAwOmEuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkhPT1udWxsJiZ1IT09dm9pZCAwP3U6KGM9ci5nZW5lcmFsTGltaXRzKT09PW51bGx8fGM9PT12b2lkIDA/dm9pZCAwOmMuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkhPT1udWxsJiZfIT09dm9pZCAwP186Ui5PVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCkhPT1udWxsJiZwIT09dm9pZCAwP3A6Ui5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpIT09bnVsbCYmZiE9PXZvaWQgMD9mOlVvLkRFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxPYmplY3QuYXNzaWduKHt9LHIse3NwYW5MaW1pdHM6TX0pfUF0LnJlY29uZmlndXJlTGltaXRzPVZtfSk7dmFyIHhsPWwoVW49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoVW4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VW4uQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZT12b2lkIDA7dmFyIE90PShoKCksbShkKSksWWU9QSgpLHFvPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fZXhwb3J0ZXI9ZSx0aGlzLl9pc0V4cG9ydGluZz0hMSx0aGlzLl9maW5pc2hlZFNwYW5zPVtdLHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50PTA7bGV0IG49KDAsWWUuZ2V0RW52KSgpO3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZT10eXBlb2YgdD8ubWF4RXhwb3J0QmF0Y2hTaXplPT1cIm51bWJlclwiP3QubWF4RXhwb3J0QmF0Y2hTaXplOm4uT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFLHRoaXMuX21heFF1ZXVlU2l6ZT10eXBlb2YgdD8ubWF4UXVldWVTaXplPT1cIm51bWJlclwiP3QubWF4UXVldWVTaXplOm4uT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkUsdGhpcy5fc2NoZWR1bGVkRGVsYXlNaWxsaXM9dHlwZW9mIHQ/LnNjaGVkdWxlZERlbGF5TWlsbGlzPT1cIm51bWJlclwiP3Quc2NoZWR1bGVkRGVsYXlNaWxsaXM6bi5PVEVMX0JTUF9TQ0hFRFVMRV9ERUxBWSx0aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzPXR5cGVvZiB0Py5leHBvcnRUaW1lb3V0TWlsbGlzPT1cIm51bWJlclwiP3QuZXhwb3J0VGltZW91dE1pbGxpczpuLk9URUxfQlNQX0VYUE9SVF9USU1FT1VULHRoaXMuX3NodXRkb3duT25jZT1uZXcgWWUuQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sdGhpcyksdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplPnRoaXMuX21heFF1ZXVlU2l6ZSYmKE90LmRpYWcud2FybihcIkJhdGNoU3BhblByb2Nlc3NvcjogbWF4RXhwb3J0QmF0Y2hTaXplIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBtYXhRdWV1ZVNpemUsIHNldHRpbmcgbWF4RXhwb3J0QmF0Y2hTaXplIHRvIG1hdGNoIG1heFF1ZXVlU2l6ZVwiKSx0aGlzLl9tYXhFeHBvcnRCYXRjaFNpemU9dGhpcy5fbWF4UXVldWVTaXplKX1mb3JjZUZsdXNoKCl7cmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZD90aGlzLl9zaHV0ZG93bk9uY2UucHJvbWlzZTp0aGlzLl9mbHVzaEFsbCgpfW9uU3RhcnQoZSx0KXt9b25FbmQoZSl7dGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkfHxlLnNwYW5Db250ZXh0KCkudHJhY2VGbGFncyZPdC5UcmFjZUZsYWdzLlNBTVBMRUQmJnRoaXMuX2FkZFRvQnVmZmVyKGUpfXNodXRkb3duKCl7cmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCl9X3NodXRkb3duKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMub25TaHV0ZG93bigpKS50aGVuKCgpPT50aGlzLl9mbHVzaEFsbCgpKS50aGVuKCgpPT50aGlzLl9leHBvcnRlci5zaHV0ZG93bigpKX1fYWRkVG9CdWZmZXIoZSl7aWYodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGg+PXRoaXMuX21heFF1ZXVlU2l6ZSl7dGhpcy5fZHJvcHBlZFNwYW5zQ291bnQ9PT0wJiZPdC5kaWFnLmRlYnVnKFwibWF4UXVldWVTaXplIHJlYWNoZWQsIGRyb3BwaW5nIHNwYW5zXCIpLHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50Kys7cmV0dXJufXRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50PjAmJihPdC5kaWFnLndhcm4oYERyb3BwZWQgJHt0aGlzLl9kcm9wcGVkU3BhbnNDb3VudH0gc3BhbnMgYmVjYXVzZSBtYXhRdWV1ZVNpemUgcmVhY2hlZGApLHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50PTApLHRoaXMuX2ZpbmlzaGVkU3BhbnMucHVzaChlKSx0aGlzLl9tYXliZVN0YXJ0VGltZXIoKX1fZmx1c2hBbGwoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntsZXQgbj1bXSxpPU1hdGguY2VpbCh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aC90aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpO2ZvcihsZXQgcz0wLG89aTtzPG87cysrKW4ucHVzaCh0aGlzLl9mbHVzaE9uZUJhdGNoKCkpO1Byb21pc2UuYWxsKG4pLnRoZW4oKCk9PntlKCl9KS5jYXRjaCh0KX0pfV9mbHVzaE9uZUJhdGNoKCl7cmV0dXJuIHRoaXMuX2NsZWFyVGltZXIoKSx0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aD09PTA/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IFByb21pc2UoKGUsdCk9PntsZXQgbj1zZXRUaW1lb3V0KCgpPT57dChuZXcgRXJyb3IoXCJUaW1lb3V0XCIpKX0sdGhpcy5fZXhwb3J0VGltZW91dE1pbGxpcyk7T3QuY29udGV4dC53aXRoKCgwLFllLnN1cHByZXNzVHJhY2luZykoT3QuY29udGV4dC5hY3RpdmUoKSksKCk9PntsZXQgaT10aGlzLl9maW5pc2hlZFNwYW5zLnNwbGljZSgwLHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSkscz0oKT0+dGhpcy5fZXhwb3J0ZXIuZXhwb3J0KGksYT0+e3ZhciB1O2NsZWFyVGltZW91dChuKSxhLmNvZGU9PT1ZZS5FeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1M/ZSgpOnQoKHU9YS5lcnJvcikhPT1udWxsJiZ1IT09dm9pZCAwP3U6bmV3IEVycm9yKFwiQmF0Y2hTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWRcIikpfSksbz1pLm1hcChhPT5hLnJlc291cmNlKS5maWx0ZXIoYT0+YS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nKTtvLmxlbmd0aD09PTA/cygpOlByb21pc2UuYWxsKG8ubWFwKGE9Pnt2YXIgdTtyZXR1cm4odT1hLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpPT09bnVsbHx8dT09PXZvaWQgMD92b2lkIDA6dS5jYWxsKGEpfSkpLnRoZW4ocyxhPT57KDAsWWUuZ2xvYmFsRXJyb3JIYW5kbGVyKShhKSx0KGEpfSl9KX0pfV9tYXliZVN0YXJ0VGltZXIoKXtpZih0aGlzLl9pc0V4cG9ydGluZylyZXR1cm47bGV0IGU9KCk9Pnt0aGlzLl9pc0V4cG9ydGluZz0hMCx0aGlzLl9mbHVzaE9uZUJhdGNoKCkudGhlbigoKT0+e3RoaXMuX2lzRXhwb3J0aW5nPSExLHRoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoPjAmJih0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fbWF5YmVTdGFydFRpbWVyKCkpfSkuY2F0Y2godD0+e3RoaXMuX2lzRXhwb3J0aW5nPSExLCgwLFllLmdsb2JhbEVycm9ySGFuZGxlcikodCl9KX07aWYodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGg+PXRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSlyZXR1cm4gZSgpO3RoaXMuX3RpbWVyPT09dm9pZCAwJiYodGhpcy5fdGltZXI9c2V0VGltZW91dCgoKT0+ZSgpLHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzKSwoMCxZZS51bnJlZlRpbWVyKSh0aGlzLl90aW1lcikpfV9jbGVhclRpbWVyKCl7dGhpcy5fdGltZXIhPT12b2lkIDAmJihjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXZvaWQgMCl9fTtVbi5CYXRjaFNwYW5Qcm9jZXNzb3JCYXNlPXFvfSk7dmFyIERsPWwoQm49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoQm4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Qm4uQmF0Y2hTcGFuUHJvY2Vzc29yPXZvaWQgMDt2YXIgR209eGwoKSxWbz1jbGFzcyBleHRlbmRzIEdtLkJhdGNoU3BhblByb2Nlc3NvckJhc2V7b25TaHV0ZG93bigpe319O0JuLkJhdGNoU3BhblByb2Nlc3Nvcj1Wb30pO3ZhciBxbD1sKFZuPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFZuLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1ZuLlJhbmRvbUlkR2VuZXJhdG9yPXZvaWQgMDt2YXIgSG09OCxCbD0xNixHbz1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZ2VuZXJhdGVUcmFjZUlkPVVsKEJsKSx0aGlzLmdlbmVyYXRlU3BhbklkPVVsKEhtKX19O1ZuLlJhbmRvbUlkR2VuZXJhdG9yPUdvO3ZhciBxbj1CdWZmZXIuYWxsb2NVbnNhZmUoQmwpO2Z1bmN0aW9uIFVsKHIpe3JldHVybiBmdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8ci80O3QrKylxbi53cml0ZVVJbnQzMkJFKE1hdGgucmFuZG9tKCkqMioqMzI+Pj4wLHQqNCk7Zm9yKGxldCB0PTA7dDxyJiYhKHFuW3RdPjApO3QrKyl0PT09ci0xJiYocW5bci0xXT0xKTtyZXR1cm4gcW4udG9TdHJpbmcoXCJoZXhcIiwwLHIpfX19KTt2YXIgR2w9bChMZT0+e1widXNlIHN0cmljdFwiO3ZhciBqbT1MZSYmTGUuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihyLGUsdCxuKXtuPT09dm9pZCAwJiYobj10KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlW3RdfX0pfTpmdW5jdGlvbihyLGUsdCxuKXtuPT09dm9pZCAwJiYobj10KSxyW25dPWVbdF19KSxWbD1MZSYmTGUuX19leHBvcnRTdGFyfHxmdW5jdGlvbihyLGUpe2Zvcih2YXIgdCBpbiByKXQhPT1cImRlZmF1bHRcIiYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpJiZqbShlLHIsdCl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShMZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtWbChEbCgpLExlKTtWbChxbCgpLExlKX0pO3ZhciBHbj1sKFFlPT57XCJ1c2Ugc3RyaWN0XCI7dmFyIEZtPVFlJiZRZS5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fSl9OmZ1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLHJbbl09ZVt0XX0pLGttPVFlJiZRZS5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJkZtKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KFFlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2ttKEdsKCksUWUpfSk7dmFyIEhsPWwoam49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoam4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7am4uVHJhY2VyPXZvaWQgMDt2YXIgaj0oaCgpLG0oZCkpLEhuPUEoKSwkbT1QbygpLFhtPUJvKCksV209R24oKSxIbz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5fdHJhY2VyUHJvdmlkZXI9bjtsZXQgaT0oMCxYbS5tZXJnZUNvbmZpZykodCk7dGhpcy5fc2FtcGxlcj1pLnNhbXBsZXIsdGhpcy5fZ2VuZXJhbExpbWl0cz1pLmdlbmVyYWxMaW1pdHMsdGhpcy5fc3BhbkxpbWl0cz1pLnNwYW5MaW1pdHMsdGhpcy5faWRHZW5lcmF0b3I9dC5pZEdlbmVyYXRvcnx8bmV3IFdtLlJhbmRvbUlkR2VuZXJhdG9yLHRoaXMucmVzb3VyY2U9bi5yZXNvdXJjZSx0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnk9ZX1zdGFydFNwYW4oZSx0PXt9LG49ai5jb250ZXh0LmFjdGl2ZSgpKXt2YXIgaSxzLG87dC5yb290JiYobj1qLnRyYWNlLmRlbGV0ZVNwYW4obikpO2xldCBhPWoudHJhY2UuZ2V0U3BhbihuKTtpZigoMCxIbi5pc1RyYWNpbmdTdXBwcmVzc2VkKShuKSlyZXR1cm4gai5kaWFnLmRlYnVnKFwiSW5zdHJ1bWVudGF0aW9uIHN1cHByZXNzZWQsIHJldHVybmluZyBOb29wIFNwYW5cIiksai50cmFjZS53cmFwU3BhbkNvbnRleHQoai5JTlZBTElEX1NQQU5fQ09OVEVYVCk7bGV0IHU9YT8uc3BhbkNvbnRleHQoKSxjPXRoaXMuX2lkR2VuZXJhdG9yLmdlbmVyYXRlU3BhbklkKCksXyxwLGY7IXV8fCFqLnRyYWNlLmlzU3BhbkNvbnRleHRWYWxpZCh1KT9fPXRoaXMuX2lkR2VuZXJhdG9yLmdlbmVyYXRlVHJhY2VJZCgpOihfPXUudHJhY2VJZCxwPXUudHJhY2VTdGF0ZSxmPXUuc3BhbklkKTtsZXQgTT0oaT10LmtpbmQpIT09bnVsbCYmaSE9PXZvaWQgMD9pOmouU3BhbktpbmQuSU5URVJOQUwsUj0oKHM9dC5saW5rcykhPT1udWxsJiZzIT09dm9pZCAwP3M6W10pLm1hcChwdD0+KHtjb250ZXh0OnB0LmNvbnRleHQsYXR0cmlidXRlczooMCxIbi5zYW5pdGl6ZUF0dHJpYnV0ZXMpKHB0LmF0dHJpYnV0ZXMpfSkpLHc9KDAsSG4uc2FuaXRpemVBdHRyaWJ1dGVzKSh0LmF0dHJpYnV0ZXMpLFU9dGhpcy5fc2FtcGxlci5zaG91bGRTYW1wbGUobixfLGUsTSx3LFIpO3A9KG89VS50cmFjZVN0YXRlKSE9PW51bGwmJm8hPT12b2lkIDA/bzpwO2xldCBTPVUuZGVjaXNpb249PT1qLlNhbXBsaW5nRGVjaXNpb24uUkVDT1JEX0FORF9TQU1QTEVEP2ouVHJhY2VGbGFncy5TQU1QTEVEOmouVHJhY2VGbGFncy5OT05FLFRlPXt0cmFjZUlkOl8sc3BhbklkOmMsdHJhY2VGbGFnczpTLHRyYWNlU3RhdGU6cH07aWYoVS5kZWNpc2lvbj09PWouU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JEKXJldHVybiBqLmRpYWcuZGVidWcoXCJSZWNvcmRpbmcgaXMgb2ZmLCBwcm9wYWdhdGluZyBjb250ZXh0IGluIGEgbm9uLXJlY29yZGluZyBzcGFuXCIpLGoudHJhY2Uud3JhcFNwYW5Db250ZXh0KFRlKTtsZXQgU2U9KDAsSG4uc2FuaXRpemVBdHRyaWJ1dGVzKShPYmplY3QuYXNzaWduKHcsVS5hdHRyaWJ1dGVzKSk7cmV0dXJuIG5ldyAkbS5TcGFuKHRoaXMsbixlLFRlLE0sZixSLHQuc3RhcnRUaW1lLHZvaWQgMCxTZSl9c3RhcnRBY3RpdmVTcGFuKGUsdCxuLGkpe2xldCBzLG8sYTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuO2FyZ3VtZW50cy5sZW5ndGg9PT0yP2E9dDphcmd1bWVudHMubGVuZ3RoPT09Mz8ocz10LGE9bik6KHM9dCxvPW4sYT1pKTtsZXQgdT1vPz9qLmNvbnRleHQuYWN0aXZlKCksYz10aGlzLnN0YXJ0U3BhbihlLHMsdSksXz1qLnRyYWNlLnNldFNwYW4odSxjKTtyZXR1cm4gai5jb250ZXh0LndpdGgoXyxhLHZvaWQgMCxjKX1nZXRHZW5lcmFsTGltaXRzKCl7cmV0dXJuIHRoaXMuX2dlbmVyYWxMaW1pdHN9Z2V0U3BhbkxpbWl0cygpe3JldHVybiB0aGlzLl9zcGFuTGltaXRzfWdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IoKXtyZXR1cm4gdGhpcy5fdHJhY2VyUHJvdmlkZXIuZ2V0QWN0aXZlU3BhblByb2Nlc3NvcigpfX07am4uVHJhY2VyPUhvfSk7dmFyIGpsPWwoRm49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoRm4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Rm4uZGVmYXVsdFNlcnZpY2VOYW1lPXZvaWQgMDtmdW5jdGlvbiBLbSgpe3JldHVybmB1bmtub3duX3NlcnZpY2U6JHtwcm9jZXNzLmFyZ3YwfWB9Rm4uZGVmYXVsdFNlcnZpY2VOYW1lPUttfSk7dmFyIGpvPWwoUnQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoUnQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7UnQubm9ybWFsaXplVHlwZT1SdC5ub3JtYWxpemVBcmNoPXZvaWQgMDt2YXIgem09cj0+e3N3aXRjaChyKXtjYXNlXCJhcm1cIjpyZXR1cm5cImFybTMyXCI7Y2FzZVwicHBjXCI6cmV0dXJuXCJwcGMzMlwiO2Nhc2VcIng2NFwiOnJldHVyblwiYW1kNjRcIjtkZWZhdWx0OnJldHVybiByfX07UnQubm9ybWFsaXplQXJjaD16bTt2YXIgWW09cj0+e3N3aXRjaChyKXtjYXNlXCJzdW5vc1wiOnJldHVyblwic29sYXJpc1wiO2Nhc2VcIndpbjMyXCI6cmV0dXJuXCJ3aW5kb3dzXCI7ZGVmYXVsdDpyZXR1cm4gcn19O1J0Lm5vcm1hbGl6ZVR5cGU9WW19KTt2YXIgJG49bChrbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShrbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtrbi5leGVjQXN5bmM9dm9pZCAwO3ZhciBRbT16KFwiY2hpbGRfcHJvY2Vzc1wiKSxabT16KFwidXRpbFwiKTtrbi5leGVjQXN5bmM9Wm0ucHJvbWlzaWZ5KFFtLmV4ZWMpfSk7dmFyIEZsPWwoWG49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoWG4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7WG4uZ2V0TWFjaGluZUlkPXZvaWQgMDt2YXIgSm09JG4oKSxlZz0oaCgpLG0oZCkpO2FzeW5jIGZ1bmN0aW9uIHRnKCl7dHJ5e2xldCBlPShhd2FpdCgwLEptLmV4ZWNBc3luYykoJ2lvcmVnIC1yZDEgLWMgXCJJT1BsYXRmb3JtRXhwZXJ0RGV2aWNlXCInKSkuc3Rkb3V0LnNwbGl0KGBcbmApLmZpbmQobj0+bi5pbmNsdWRlcyhcIklPUGxhdGZvcm1VVUlEXCIpKTtpZighZSlyZXR1cm5cIlwiO2xldCB0PWUuc3BsaXQoJ1wiID0gXCInKTtpZih0Lmxlbmd0aD09PTIpcmV0dXJuIHRbMV0uc2xpY2UoMCwtMSl9Y2F0Y2gocil7ZWcuZGlhZy5kZWJ1ZyhgZXJyb3IgcmVhZGluZyBtYWNoaW5lIGlkOiAke3J9YCl9cmV0dXJuXCJcIn1Ybi5nZXRNYWNoaW5lSWQ9dGd9KTt2YXIga2w9bChXbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtXbi5nZXRNYWNoaW5lSWQ9dm9pZCAwO3ZhciByZz16KFwiZnNcIiksbmc9KGgoKSxtKGQpKTthc3luYyBmdW5jdGlvbiBpZygpe2xldCByPVtcIi9ldGMvbWFjaGluZS1pZFwiLFwiL3Zhci9saWIvZGJ1cy9tYWNoaW5lLWlkXCJdO2ZvcihsZXQgZSBvZiByKXRyeXtyZXR1cm4oYXdhaXQgcmcucHJvbWlzZXMucmVhZEZpbGUoZSx7ZW5jb2Rpbmc6XCJ1dGY4XCJ9KSkudHJpbSgpfWNhdGNoKHQpe25nLmRpYWcuZGVidWcoYGVycm9yIHJlYWRpbmcgbWFjaGluZSBpZDogJHt0fWApfXJldHVyblwiXCJ9V24uZ2V0TWFjaGluZUlkPWlnfSk7dmFyIFhsPWwoS249PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoS24sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7S24uZ2V0TWFjaGluZUlkPXZvaWQgMDt2YXIgc2c9eihcImZzXCIpLG9nPSRuKCksJGw9KGgoKSxtKGQpKTthc3luYyBmdW5jdGlvbiBhZygpe3RyeXtyZXR1cm4oYXdhaXQgc2cucHJvbWlzZXMucmVhZEZpbGUoXCIvZXRjL2hvc3RpZFwiLHtlbmNvZGluZzpcInV0ZjhcIn0pKS50cmltKCl9Y2F0Y2gocil7JGwuZGlhZy5kZWJ1ZyhgZXJyb3IgcmVhZGluZyBtYWNoaW5lIGlkOiAke3J9YCl9dHJ5e3JldHVybihhd2FpdCgwLG9nLmV4ZWNBc3luYykoXCJrZW52IC1xIHNtYmlvcy5zeXN0ZW0udXVpZFwiKSkuc3Rkb3V0LnRyaW0oKX1jYXRjaChyKXskbC5kaWFnLmRlYnVnKGBlcnJvciByZWFkaW5nIG1hY2hpbmUgaWQ6ICR7cn1gKX1yZXR1cm5cIlwifUtuLmdldE1hY2hpbmVJZD1hZ30pO3ZhciBLbD1sKHpuPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHpuLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3puLmdldE1hY2hpbmVJZD12b2lkIDA7dmFyIFdsPXooXCJwcm9jZXNzXCIpLHVnPSRuKCksY2c9KGgoKSxtKGQpKTthc3luYyBmdW5jdGlvbiBsZygpe2xldCByPVwiUVVFUlkgSEtFWV9MT0NBTF9NQUNISU5FXFxcXFNPRlRXQVJFXFxcXE1pY3Jvc29mdFxcXFxDcnlwdG9ncmFwaHkgL3YgTWFjaGluZUd1aWRcIixlPVwiJXdpbmRpciVcXFxcU3lzdGVtMzJcXFxcUkVHLmV4ZVwiO1dsLmFyY2g9PT1cImlhMzJcIiYmXCJQUk9DRVNTT1JfQVJDSElURVc2NDMyXCJpbiBXbC5lbnYmJihlPVwiJXdpbmRpciVcXFxcc3lzbmF0aXZlXFxcXGNtZC5leGUgL2MgXCIrZSk7dHJ5e2xldCBuPShhd2FpdCgwLHVnLmV4ZWNBc3luYykoYCR7ZX0gJHtyfWApKS5zdGRvdXQuc3BsaXQoXCJSRUdfU1pcIik7aWYobi5sZW5ndGg9PT0yKXJldHVybiBuWzFdLnRyaW0oKX1jYXRjaCh0KXtjZy5kaWFnLmRlYnVnKGBlcnJvciByZWFkaW5nIG1hY2hpbmUgaWQ6ICR7dH1gKX1yZXR1cm5cIlwifXpuLmdldE1hY2hpbmVJZD1sZ30pO3ZhciB6bD1sKFluPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFluLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1luLmdldE1hY2hpbmVJZD12b2lkIDA7dmFyIGRnPShoKCksbShkKSk7YXN5bmMgZnVuY3Rpb24gX2coKXtyZXR1cm4gZGcuZGlhZy5kZWJ1ZyhcImNvdWxkIG5vdCByZWFkIG1hY2hpbmUtaWQ6IHVuc3VwcG9ydGVkIHBsYXRmb3JtXCIpLFwiXCJ9WW4uZ2V0TWFjaGluZUlkPV9nfSk7dmFyIFlsPWwoT2U9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoT2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7T2UuZ2V0TWFjaGluZUlkPXZvaWQgMDt2YXIgcGc9eihcInByb2Nlc3NcIiksYnQ7T2UuZ2V0TWFjaGluZUlkPWJ0O3N3aXRjaChwZy5wbGF0Zm9ybSl7Y2FzZVwiZGFyd2luXCI6T2UuZ2V0TWFjaGluZUlkPWJ0PUZsKCkuZ2V0TWFjaGluZUlkO2JyZWFrO2Nhc2VcImxpbnV4XCI6T2UuZ2V0TWFjaGluZUlkPWJ0PWtsKCkuZ2V0TWFjaGluZUlkO2JyZWFrO2Nhc2VcImZyZWVic2RcIjpPZS5nZXRNYWNoaW5lSWQ9YnQ9WGwoKS5nZXRNYWNoaW5lSWQ7YnJlYWs7Y2FzZVwid2luMzJcIjpPZS5nZXRNYWNoaW5lSWQ9YnQ9S2woKS5nZXRNYWNoaW5lSWQ7YnJlYWs7ZGVmYXVsdDpPZS5nZXRNYWNoaW5lSWQ9YnQ9emwoKS5nZXRNYWNoaW5lSWR9fSk7dmFyICRvPWwoUW49PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoUW4sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7UW4uaG9zdERldGVjdG9yU3luYz12b2lkIDA7dmFyIEZvPUFlKCksaGc9WmUoKSxRbD16KFwib3NcIiksZmc9am8oKSxFZz1ZbCgpLGtvPWNsYXNze2RldGVjdChlKXtsZXQgdD17W0ZvLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLkhPU1RfTkFNRV06KDAsUWwuaG9zdG5hbWUpKCksW0ZvLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLkhPU1RfQVJDSF06KDAsZmcubm9ybWFsaXplQXJjaCkoKDAsUWwuYXJjaCkoKSl9O3JldHVybiBuZXcgaGcuUmVzb3VyY2UodCx0aGlzLl9nZXRBc3luY0F0dHJpYnV0ZXMoKSl9X2dldEFzeW5jQXR0cmlidXRlcygpe3JldHVybigwLEVnLmdldE1hY2hpbmVJZCkoKS50aGVuKGU9PntsZXQgdD17fTtyZXR1cm4gZSYmKHRbRm8uU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuSE9TVF9JRF09ZSksdH0pfX07UW4uaG9zdERldGVjdG9yU3luYz1uZXcga299KTt2YXIgWmw9bChabj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShabixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtabi5ob3N0RGV0ZWN0b3I9dm9pZCAwO3ZhciBtZz0kbygpLFhvPWNsYXNze2RldGVjdChlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1nLmhvc3REZXRlY3RvclN5bmMuZGV0ZWN0KGUpKX19O1puLmhvc3REZXRlY3Rvcj1uZXcgWG99KTt2YXIgS289bChKbj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShKbixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtKbi5vc0RldGVjdG9yU3luYz12b2lkIDA7dmFyIEpsPUFlKCksZ2c9WmUoKSxlZD16KFwib3NcIiksVGc9am8oKSxXbz1jbGFzc3tkZXRlY3QoZSl7bGV0IHQ9e1tKbC5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5PU19UWVBFXTooMCxUZy5ub3JtYWxpemVUeXBlKSgoMCxlZC5wbGF0Zm9ybSkoKSksW0psLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLk9TX1ZFUlNJT05dOigwLGVkLnJlbGVhc2UpKCl9O3JldHVybiBuZXcgZ2cuUmVzb3VyY2UodCl9fTtKbi5vc0RldGVjdG9yU3luYz1uZXcgV299KTt2YXIgdGQ9bChlaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtlaS5vc0RldGVjdG9yPXZvaWQgMDt2YXIgU2c9S28oKSx6bz1jbGFzc3tkZXRlY3QoZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShTZy5vc0RldGVjdG9yU3luYy5kZXRlY3QoZSkpfX07ZWkub3NEZXRlY3Rvcj1uZXcgem99KTt2YXIgUW89bCh0aT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt0aS5wcm9jZXNzRGV0ZWN0b3JTeW5jPXZvaWQgMDt2YXIgQWc9KGgoKSxtKGQpKSxSZT1BZSgpLE9nPVplKCksUmc9eihcIm9zXCIpLFlvPWNsYXNze2RldGVjdChlKXtsZXQgdD17W1JlLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlBST0NFU1NfUElEXTpwcm9jZXNzLnBpZCxbUmUuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuUFJPQ0VTU19FWEVDVVRBQkxFX05BTUVdOnByb2Nlc3MudGl0bGUsW1JlLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlBST0NFU1NfRVhFQ1VUQUJMRV9QQVRIXTpwcm9jZXNzLmV4ZWNQYXRoLFtSZS5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5QUk9DRVNTX0NPTU1BTkRfQVJHU106W3Byb2Nlc3MuYXJndlswXSwuLi5wcm9jZXNzLmV4ZWNBcmd2LC4uLnByb2Nlc3MuYXJndi5zbGljZSgxKV0sW1JlLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlBST0NFU1NfUlVOVElNRV9WRVJTSU9OXTpwcm9jZXNzLnZlcnNpb25zLm5vZGUsW1JlLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlBST0NFU1NfUlVOVElNRV9OQU1FXTpcIm5vZGVqc1wiLFtSZS5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5QUk9DRVNTX1JVTlRJTUVfREVTQ1JJUFRJT05dOlwiTm9kZS5qc1wifTtwcm9jZXNzLmFyZ3YubGVuZ3RoPjEmJih0W1JlLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlBST0NFU1NfQ09NTUFORF09cHJvY2Vzcy5hcmd2WzFdKTt0cnl7bGV0IG49UmcudXNlckluZm8oKTt0W1JlLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlBST0NFU1NfT1dORVJdPW4udXNlcm5hbWV9Y2F0Y2gobil7QWcuZGlhZy5kZWJ1ZyhgZXJyb3Igb2J0YWluaW5nIHByb2Nlc3Mgb3duZXI6ICR7bn1gKX1yZXR1cm4gbmV3IE9nLlJlc291cmNlKHQpfX07dGkucHJvY2Vzc0RldGVjdG9yU3luYz1uZXcgWW99KTt2YXIgcmQ9bChyaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtyaS5wcm9jZXNzRGV0ZWN0b3I9dm9pZCAwO3ZhciBiZz1RbygpLFpvPWNsYXNze2RldGVjdChlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJnLnByb2Nlc3NEZXRlY3RvclN5bmMuZGV0ZWN0KGUpKX19O3JpLnByb2Nlc3NEZXRlY3Rvcj1uZXcgWm99KTt2YXIgbmQ9bCh0ZT0+e1widXNlIHN0cmljdFwiO3ZhciBQZz10ZSYmdGUuX19jcmVhdGVCaW5kaW5nfHwoT2JqZWN0LmNyZWF0ZT9mdW5jdGlvbihyLGUsdCxuKXtuPT09dm9pZCAwJiYobj10KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlW3RdfX0pfTpmdW5jdGlvbihyLGUsdCxuKXtuPT09dm9pZCAwJiYobj10KSxyW25dPWVbdF19KSxKZT10ZSYmdGUuX19leHBvcnRTdGFyfHxmdW5jdGlvbihyLGUpe2Zvcih2YXIgdCBpbiByKXQhPT1cImRlZmF1bHRcIiYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpJiZQZyhlLHIsdCl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0ZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtKZShqbCgpLHRlKTtKZShabCgpLHRlKTtKZSh0ZCgpLHRlKTtKZSgkbygpLHRlKTtKZShLbygpLHRlKTtKZShyZCgpLHRlKTtKZShRbygpLHRlKX0pO3ZhciBKbz1sKGV0PT57XCJ1c2Ugc3RyaWN0XCI7dmFyIHlnPWV0JiZldC5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fSl9OmZ1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLHJbbl09ZVt0XX0pLHZnPWV0JiZldC5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJnlnKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGV0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZnKG5kKCksZXQpfSk7dmFyIFplPWwobmk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobmksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7bmkuUmVzb3VyY2U9dm9pZCAwO3ZhciBpZD0oaCgpLG0oZCkpLHR0PUFlKCksZWE9QSgpLElnPUpvKCksVHI9Y2xhc3Mgcntjb25zdHJ1Y3RvcihlLHQpe3ZhciBuO3RoaXMuX2F0dHJpYnV0ZXM9ZSx0aGlzLmFzeW5jQXR0cmlidXRlc1BlbmRpbmc9dCE9bnVsbCx0aGlzLl9zeW5jQXR0cmlidXRlcz0obj10aGlzLl9hdHRyaWJ1dGVzKSE9PW51bGwmJm4hPT12b2lkIDA/bjp7fSx0aGlzLl9hc3luY0F0dHJpYnV0ZXNQcm9taXNlPXQ/LnRoZW4oaT0+KHRoaXMuX2F0dHJpYnV0ZXM9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9hdHRyaWJ1dGVzLGkpLHRoaXMuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZz0hMSxpKSxpPT4oaWQuZGlhZy5kZWJ1ZyhcImEgcmVzb3VyY2UncyBhc3luYyBhdHRyaWJ1dGVzIHByb21pc2UgcmVqZWN0ZWQ6ICVzXCIsaSksdGhpcy5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nPSExLHt9KSl9c3RhdGljIGVtcHR5KCl7cmV0dXJuIHIuRU1QVFl9c3RhdGljIGRlZmF1bHQoKXtyZXR1cm4gbmV3IHIoe1t0dC5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5TRVJWSUNFX05BTUVdOigwLElnLmRlZmF1bHRTZXJ2aWNlTmFtZSkoKSxbdHQuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19MQU5HVUFHRV06ZWEuU0RLX0lORk9bdHQuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19MQU5HVUFHRV0sW3R0LlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlRFTEVNRVRSWV9TREtfTkFNRV06ZWEuU0RLX0lORk9bdHQuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19OQU1FXSxbdHQuU2VtYW50aWNSZXNvdXJjZUF0dHJpYnV0ZXMuVEVMRU1FVFJZX1NES19WRVJTSU9OXTplYS5TREtfSU5GT1t0dC5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5URUxFTUVUUllfU0RLX1ZFUlNJT05dfSl9Z2V0IGF0dHJpYnV0ZXMoKXt2YXIgZTtyZXR1cm4gdGhpcy5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nJiZpZC5kaWFnLmVycm9yKFwiQWNjZXNzaW5nIHJlc291cmNlIGF0dHJpYnV0ZXMgYmVmb3JlIGFzeW5jIGF0dHJpYnV0ZXMgc2V0dGxlZFwiKSwoZT10aGlzLl9hdHRyaWJ1dGVzKSE9PW51bGwmJmUhPT12b2lkIDA/ZTp7fX1hc3luYyB3YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKCl7dGhpcy5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nJiZhd2FpdCB0aGlzLl9hc3luY0F0dHJpYnV0ZXNQcm9taXNlfW1lcmdlKGUpe3ZhciB0O2lmKCFlKXJldHVybiB0aGlzO2xldCBuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9zeW5jQXR0cmlidXRlcyksKHQ9ZS5fc3luY0F0dHJpYnV0ZXMpIT09bnVsbCYmdCE9PXZvaWQgMD90OmUuYXR0cmlidXRlcyk7aWYoIXRoaXMuX2FzeW5jQXR0cmlidXRlc1Byb21pc2UmJiFlLl9hc3luY0F0dHJpYnV0ZXNQcm9taXNlKXJldHVybiBuZXcgcihuKTtsZXQgaT1Qcm9taXNlLmFsbChbdGhpcy5fYXN5bmNBdHRyaWJ1dGVzUHJvbWlzZSxlLl9hc3luY0F0dHJpYnV0ZXNQcm9taXNlXSkudGhlbigoW3Msb10pPT57dmFyIGE7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5fc3luY0F0dHJpYnV0ZXMpLHMpLChhPWUuX3N5bmNBdHRyaWJ1dGVzKSE9PW51bGwmJmEhPT12b2lkIDA/YTplLmF0dHJpYnV0ZXMpLG8pfSk7cmV0dXJuIG5ldyByKG4saSl9fTtuaS5SZXNvdXJjZT1UcjtUci5FTVBUWT1uZXcgVHIoe30pfSk7dmFyIG9kPWwoc2Q9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoc2QsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9KTt2YXIgdWQ9bChhZD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO3ZhciBsZD1sKGNkPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSk7dmFyIGRkPWwoaWk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoaWksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7aWkuYnJvd3NlckRldGVjdG9yPXZvaWQgMDt2YXIgTWc9cnQoKSx0YT1jbGFzc3tkZXRlY3QoZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShNZy5icm93c2VyRGV0ZWN0b3JTeW5jLmRldGVjdChlKSl9fTtpaS5icm93c2VyRGV0ZWN0b3I9bmV3IHRhfSk7dmFyIG5hPWwoc2k9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoc2ksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7c2kuZW52RGV0ZWN0b3JTeW5jPXZvaWQgMDt2YXIgTGc9KGgoKSxtKGQpKSxOZz1BKCksQ2c9QWUoKSx3Zz1aZSgpLHJhPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fTUFYX0xFTkdUSD0yNTUsdGhpcy5fQ09NTUFfU0VQQVJBVE9SPVwiLFwiLHRoaXMuX0xBQkVMX0tFWV9WQUxVRV9TUExJVFRFUj1cIj1cIix0aGlzLl9FUlJPUl9NRVNTQUdFX0lOVkFMSURfQ0hBUlM9XCJzaG91bGQgYmUgYSBBU0NJSSBzdHJpbmcgd2l0aCBhIGxlbmd0aCBncmVhdGVyIHRoYW4gMCBhbmQgbm90IGV4Y2VlZCBcIit0aGlzLl9NQVhfTEVOR1RIK1wiIGNoYXJhY3RlcnMuXCIsdGhpcy5fRVJST1JfTUVTU0FHRV9JTlZBTElEX1ZBTFVFPVwic2hvdWxkIGJlIGEgQVNDSUkgc3RyaW5nIHdpdGggYSBsZW5ndGggbm90IGV4Y2VlZCBcIit0aGlzLl9NQVhfTEVOR1RIK1wiIGNoYXJhY3RlcnMuXCJ9ZGV0ZWN0KGUpe2xldCB0PXt9LG49KDAsTmcuZ2V0RW52KSgpLGk9bi5PVEVMX1JFU09VUkNFX0FUVFJJQlVURVMscz1uLk9URUxfU0VSVklDRV9OQU1FO2lmKGkpdHJ5e2xldCBvPXRoaXMuX3BhcnNlUmVzb3VyY2VBdHRyaWJ1dGVzKGkpO09iamVjdC5hc3NpZ24odCxvKX1jYXRjaChvKXtMZy5kaWFnLmRlYnVnKGBFbnZEZXRlY3RvciBmYWlsZWQ6ICR7by5tZXNzYWdlfWApfXJldHVybiBzJiYodFtDZy5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5TRVJWSUNFX05BTUVdPXMpLG5ldyB3Zy5SZXNvdXJjZSh0KX1fcGFyc2VSZXNvdXJjZUF0dHJpYnV0ZXMoZSl7aWYoIWUpcmV0dXJue307bGV0IHQ9e30sbj1lLnNwbGl0KHRoaXMuX0NPTU1BX1NFUEFSQVRPUiwtMSk7Zm9yKGxldCBpIG9mIG4pe2xldCBzPWkuc3BsaXQodGhpcy5fTEFCRUxfS0VZX1ZBTFVFX1NQTElUVEVSLC0xKTtpZihzLmxlbmd0aCE9PTIpY29udGludWU7bGV0W28sYV09cztpZihvPW8udHJpbSgpLGE9YS50cmltKCkuc3BsaXQoL15cInxcIiQvKS5qb2luKFwiXCIpLCF0aGlzLl9pc1ZhbGlkQW5kTm90RW1wdHkobykpdGhyb3cgbmV3IEVycm9yKGBBdHRyaWJ1dGUga2V5ICR7dGhpcy5fRVJST1JfTUVTU0FHRV9JTlZBTElEX0NIQVJTfWApO2lmKCF0aGlzLl9pc1ZhbGlkKGEpKXRocm93IG5ldyBFcnJvcihgQXR0cmlidXRlIHZhbHVlICR7dGhpcy5fRVJST1JfTUVTU0FHRV9JTlZBTElEX1ZBTFVFfWApO3Rbb109ZGVjb2RlVVJJQ29tcG9uZW50KGEpfXJldHVybiB0fV9pc1ZhbGlkKGUpe3JldHVybiBlLmxlbmd0aDw9dGhpcy5fTUFYX0xFTkdUSCYmdGhpcy5faXNCYWdnYWdlT2N0ZXRTdHJpbmcoZSl9X2lzQmFnZ2FnZU9jdGV0U3RyaW5nKGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbj1lLmNoYXJDb2RlQXQodCk7aWYobjwzM3x8bj09PTQ0fHxuPT09NTl8fG49PT05Mnx8bj4xMjYpcmV0dXJuITF9cmV0dXJuITB9X2lzVmFsaWRBbmROb3RFbXB0eShlKXtyZXR1cm4gZS5sZW5ndGg+MCYmdGhpcy5faXNWYWxpZChlKX19O3NpLmVudkRldGVjdG9yU3luYz1uZXcgcmF9KTt2YXIgX2Q9bChvaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtvaS5lbnZEZXRlY3Rvcj12b2lkIDA7dmFyIHhnPW5hKCksaWE9Y2xhc3N7ZGV0ZWN0KGUpe3JldHVybiBQcm9taXNlLnJlc29sdmUoeGcuZW52RGV0ZWN0b3JTeW5jLmRldGVjdChlKSl9fTtvaS5lbnZEZXRlY3Rvcj1uZXcgaWF9KTt2YXIgcGQ9bCh1aT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1aSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt1aS5icm93c2VyRGV0ZWN0b3JTeW5jPXZvaWQgMDt2YXIgYWk9QWUoKSxzYT1ydCgpLERnPShoKCksbShkKSksb2E9Y2xhc3N7ZGV0ZWN0KGUpe2lmKCEodHlwZW9mIG5hdmlnYXRvcjxcInVcIikpcmV0dXJuIHNhLlJlc291cmNlLmVtcHR5KCk7bGV0IG49e1thaS5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5QUk9DRVNTX1JVTlRJTUVfTkFNRV06XCJicm93c2VyXCIsW2FpLlNlbWFudGljUmVzb3VyY2VBdHRyaWJ1dGVzLlBST0NFU1NfUlVOVElNRV9ERVNDUklQVElPTl06XCJXZWIgQnJvd3NlclwiLFthaS5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5QUk9DRVNTX1JVTlRJTUVfVkVSU0lPTl06bmF2aWdhdG9yLnVzZXJBZ2VudH07cmV0dXJuIHRoaXMuX2dldFJlc291cmNlQXR0cmlidXRlcyhuLGUpfV9nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoZSx0KXtyZXR1cm4gZVthaS5TZW1hbnRpY1Jlc291cmNlQXR0cmlidXRlcy5QUk9DRVNTX1JVTlRJTUVfVkVSU0lPTl09PT1cIlwiPyhEZy5kaWFnLmRlYnVnKFwiQnJvd3NlckRldGVjdG9yIGZhaWxlZDogVW5hYmxlIHRvIGZpbmQgcmVxdWlyZWQgYnJvd3NlciByZXNvdXJjZXMuIFwiKSxzYS5SZXNvdXJjZS5lbXB0eSgpKTpuZXcgc2EuUmVzb3VyY2UoT2JqZWN0LmFzc2lnbih7fSxlKSl9fTt1aS5icm93c2VyRGV0ZWN0b3JTeW5jPW5ldyBvYX0pO3ZhciBoZD1sKGZlPT57XCJ1c2Ugc3RyaWN0XCI7dmFyIFVnPWZlJiZmZS5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fSl9OmZ1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLHJbbl09ZVt0XX0pLGNpPWZlJiZmZS5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJlVnKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGZlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2NpKGRkKCksZmUpO2NpKF9kKCksZmUpO2NpKHBkKCksZmUpO2NpKG5hKCksZmUpfSk7dmFyIGZkPWwobGk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobGksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7bGkuaXNQcm9taXNlTGlrZT12b2lkIDA7dmFyIEJnPXI9PnIhPT1udWxsJiZ0eXBlb2Ygcj09XCJvYmplY3RcIiYmdHlwZW9mIHIudGhlbj09XCJmdW5jdGlvblwiO2xpLmlzUHJvbWlzZUxpa2U9Qmd9KTt2YXIgbWQ9bCh5dD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh5dCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt5dC5kZXRlY3RSZXNvdXJjZXNTeW5jPXl0LmRldGVjdFJlc291cmNlcz12b2lkIDA7dmFyIFNyPVplKCksUHQ9KGgoKSxtKGQpKSxxZz1mZCgpLFZnPWFzeW5jKHI9e30pPT57bGV0IGU9YXdhaXQgUHJvbWlzZS5hbGwoKHIuZGV0ZWN0b3JzfHxbXSkubWFwKGFzeW5jIHQ9Pnt0cnl7bGV0IG49YXdhaXQgdC5kZXRlY3Qocik7cmV0dXJuIFB0LmRpYWcuZGVidWcoYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSBmb3VuZCByZXNvdXJjZS5gLG4pLG59Y2F0Y2gobil7cmV0dXJuIFB0LmRpYWcuZGVidWcoYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSBmYWlsZWQ6ICR7bi5tZXNzYWdlfWApLFNyLlJlc291cmNlLmVtcHR5KCl9fSkpO3JldHVybiBFZChlKSxlLnJlZHVjZSgodCxuKT0+dC5tZXJnZShuKSxTci5SZXNvdXJjZS5lbXB0eSgpKX07eXQuZGV0ZWN0UmVzb3VyY2VzPVZnO3ZhciBHZz0ocj17fSk9Pnt2YXIgZTtsZXQgdD0oKGU9ci5kZXRlY3RvcnMpIT09bnVsbCYmZSE9PXZvaWQgMD9lOltdKS5tYXAoaT0+e3RyeXtsZXQgcz1pLmRldGVjdChyKSxvO2lmKCgwLHFnLmlzUHJvbWlzZUxpa2UpKHMpKXtsZXQgYT1hc3luYygpPT4oYXdhaXQgcykuYXR0cmlidXRlcztvPW5ldyBTci5SZXNvdXJjZSh7fSxhKCkpfWVsc2Ugbz1zO3JldHVybiBvLndhaXRGb3JBc3luY0F0dHJpYnV0ZXM/by53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKCkudGhlbigoKT0+UHQuZGlhZy5kZWJ1ZyhgJHtpLmNvbnN0cnVjdG9yLm5hbWV9IGZvdW5kIHJlc291cmNlLmAsbykpOlB0LmRpYWcuZGVidWcoYCR7aS5jb25zdHJ1Y3Rvci5uYW1lfSBmb3VuZCByZXNvdXJjZS5gLG8pLG99Y2F0Y2gocyl7cmV0dXJuIFB0LmRpYWcuZXJyb3IoYCR7aS5jb25zdHJ1Y3Rvci5uYW1lfSBmYWlsZWQ6ICR7cy5tZXNzYWdlfWApLFNyLlJlc291cmNlLmVtcHR5KCl9fSksbj10LnJlZHVjZSgoaSxzKT0+aS5tZXJnZShzKSxTci5SZXNvdXJjZS5lbXB0eSgpKTtyZXR1cm4gbi53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzJiZuLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMoKS50aGVuKCgpPT57RWQodCl9KSxufTt5dC5kZXRlY3RSZXNvdXJjZXNTeW5jPUdnO3ZhciBFZD1yPT57ci5mb3JFYWNoKGU9PntpZihPYmplY3Qua2V5cyhlLmF0dHJpYnV0ZXMpLmxlbmd0aD4wKXtsZXQgdD1KU09OLnN0cmluZ2lmeShlLmF0dHJpYnV0ZXMsbnVsbCw0KTtQdC5kaWFnLnZlcmJvc2UodCl9fSl9fSk7dmFyIHJ0PWwocmU9PntcInVzZSBzdHJpY3RcIjt2YXIgSGc9cmUmJnJlLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19KX06ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCkscltuXT1lW3RdfSksbnQ9cmUmJnJlLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQgaW4gcil0IT09XCJkZWZhdWx0XCImJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSYmSGcoZSxyLHQpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7bnQoWmUoKSxyZSk7bnQob2QoKSxyZSk7bnQoSm8oKSxyZSk7bnQodWQoKSxyZSk7bnQobGQoKSxyZSk7bnQoaGQoKSxyZSk7bnQobWQoKSxyZSl9KTt2YXIgZ2Q9bChkaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtkaS5NdWx0aVNwYW5Qcm9jZXNzb3I9dm9pZCAwO3ZhciBqZz1BKCksYWE9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fc3BhblByb2Nlc3NvcnM9ZX1mb3JjZUZsdXNoKCl7bGV0IGU9W107Zm9yKGxldCB0IG9mIHRoaXMuX3NwYW5Qcm9jZXNzb3JzKWUucHVzaCh0LmZvcmNlRmx1c2goKSk7cmV0dXJuIG5ldyBQcm9taXNlKHQ9PntQcm9taXNlLmFsbChlKS50aGVuKCgpPT57dCgpfSkuY2F0Y2gobj0+eygwLGpnLmdsb2JhbEVycm9ySGFuZGxlcikobnx8bmV3IEVycm9yKFwiTXVsdGlTcGFuUHJvY2Vzc29yOiBmb3JjZUZsdXNoIGZhaWxlZFwiKSksdCgpfSl9KX1vblN0YXJ0KGUsdCl7Zm9yKGxldCBuIG9mIHRoaXMuX3NwYW5Qcm9jZXNzb3JzKW4ub25TdGFydChlLHQpfW9uRW5kKGUpe2ZvcihsZXQgdCBvZiB0aGlzLl9zcGFuUHJvY2Vzc29ycyl0Lm9uRW5kKGUpfXNodXRkb3duKCl7bGV0IGU9W107Zm9yKGxldCB0IG9mIHRoaXMuX3NwYW5Qcm9jZXNzb3JzKWUucHVzaCh0LnNodXRkb3duKCkpO3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e1Byb21pc2UuYWxsKGUpLnRoZW4oKCk9Pnt0KCl9LG4pfSl9fTtkaS5NdWx0aVNwYW5Qcm9jZXNzb3I9YWF9KTt2YXIgY2E9bChfaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShfaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtfaS5Ob29wU3BhblByb2Nlc3Nvcj12b2lkIDA7dmFyIHVhPWNsYXNze29uU3RhcnQoZSx0KXt9b25FbmQoZSl7fXNodXRkb3duKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9fTtfaS5Ob29wU3BhblByb2Nlc3Nvcj11YX0pO3ZhciBTZD1sKGl0PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGl0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2l0LkJhc2ljVHJhY2VyUHJvdmlkZXI9aXQuRm9yY2VGbHVzaFN0YXRlPXZvaWQgMDt2YXIgdnQ9KGgoKSxtKGQpKSxNdD1BKCksVGQ9cnQoKSxGZz1sYSgpLGtnPURvKCksJGc9Z2QoKSxYZz1jYSgpLFdnPUduKCksS2c9Qm8oKSxJdDsoZnVuY3Rpb24ocil7cltyLnJlc29sdmVkPTBdPVwicmVzb2x2ZWRcIixyW3IudGltZW91dD0xXT1cInRpbWVvdXRcIixyW3IuZXJyb3I9Ml09XCJlcnJvclwiLHJbci51bnJlc29sdmVkPTNdPVwidW5yZXNvbHZlZFwifSkoSXQ9aXQuRm9yY2VGbHVzaFN0YXRlfHwoaXQuRm9yY2VGbHVzaFN0YXRlPXt9KSk7dmFyIEFyPWNsYXNze2NvbnN0cnVjdG9yKGU9e30pe3ZhciB0O3RoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycz1bXSx0aGlzLl90cmFjZXJzPW5ldyBNYXA7bGV0IG49KDAsTXQubWVyZ2UpKHt9LCgwLGtnLmxvYWREZWZhdWx0Q29uZmlnKSgpLCgwLEtnLnJlY29uZmlndXJlTGltaXRzKShlKSk7dGhpcy5yZXNvdXJjZT0odD1uLnJlc291cmNlKSE9PW51bGwmJnQhPT12b2lkIDA/dDpUZC5SZXNvdXJjZS5lbXB0eSgpLHRoaXMucmVzb3VyY2U9VGQuUmVzb3VyY2UuZGVmYXVsdCgpLm1lcmdlKHRoaXMucmVzb3VyY2UpLHRoaXMuX2NvbmZpZz1PYmplY3QuYXNzaWduKHt9LG4se3Jlc291cmNlOnRoaXMucmVzb3VyY2V9KTtsZXQgaT10aGlzLl9idWlsZEV4cG9ydGVyRnJvbUVudigpO2lmKGkhPT12b2lkIDApe2xldCBzPW5ldyBXZy5CYXRjaFNwYW5Qcm9jZXNzb3IoaSk7dGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yPXN9ZWxzZSB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3I9bmV3IFhnLk5vb3BTcGFuUHJvY2Vzc29yfWdldFRyYWNlcihlLHQsbil7bGV0IGk9YCR7ZX1AJHt0fHxcIlwifToke24/LnNjaGVtYVVybHx8XCJcIn1gO3JldHVybiB0aGlzLl90cmFjZXJzLmhhcyhpKXx8dGhpcy5fdHJhY2Vycy5zZXQoaSxuZXcgRmcuVHJhY2VyKHtuYW1lOmUsdmVyc2lvbjp0LHNjaGVtYVVybDpuPy5zY2hlbWFVcmx9LHRoaXMuX2NvbmZpZyx0aGlzKSksdGhpcy5fdHJhY2Vycy5nZXQoaSl9YWRkU3BhblByb2Nlc3NvcihlKXt0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMubGVuZ3RoPT09MCYmdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yLnNodXRkb3duKCkuY2F0Y2godD0+dnQuZGlhZy5lcnJvcihcIkVycm9yIHdoaWxlIHRyeWluZyB0byBzaHV0ZG93biBjdXJyZW50IHNwYW4gcHJvY2Vzc29yXCIsdCkpLHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycy5wdXNoKGUpLHRoaXMuYWN0aXZlU3BhblByb2Nlc3Nvcj1uZXcgJGcuTXVsdGlTcGFuUHJvY2Vzc29yKHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyl9Z2V0QWN0aXZlU3BhblByb2Nlc3Nvcigpe3JldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3J9cmVnaXN0ZXIoZT17fSl7dnQudHJhY2Uuc2V0R2xvYmFsVHJhY2VyUHJvdmlkZXIodGhpcyksZS5wcm9wYWdhdG9yPT09dm9pZCAwJiYoZS5wcm9wYWdhdG9yPXRoaXMuX2J1aWxkUHJvcGFnYXRvckZyb21FbnYoKSksZS5jb250ZXh0TWFuYWdlciYmdnQuY29udGV4dC5zZXRHbG9iYWxDb250ZXh0TWFuYWdlcihlLmNvbnRleHRNYW5hZ2VyKSxlLnByb3BhZ2F0b3ImJnZ0LnByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IoZS5wcm9wYWdhdG9yKX1mb3JjZUZsdXNoKCl7bGV0IGU9dGhpcy5fY29uZmlnLmZvcmNlRmx1c2hUaW1lb3V0TWlsbGlzLHQ9dGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLm1hcChuPT5uZXcgUHJvbWlzZShpPT57bGV0IHMsbz1zZXRUaW1lb3V0KCgpPT57aShuZXcgRXJyb3IoYFNwYW4gcHJvY2Vzc29yIGRpZCBub3QgY29tcGxldGVkIHdpdGhpbiB0aW1lb3V0IHBlcmlvZCBvZiAke2V9IG1zYCkpLHM9SXQudGltZW91dH0sZSk7bi5mb3JjZUZsdXNoKCkudGhlbigoKT0+e2NsZWFyVGltZW91dChvKSxzIT09SXQudGltZW91dCYmKHM9SXQucmVzb2x2ZWQsaShzKSl9KS5jYXRjaChhPT57Y2xlYXJUaW1lb3V0KG8pLHM9SXQuZXJyb3IsaShhKX0pfSkpO3JldHVybiBuZXcgUHJvbWlzZSgobixpKT0+e1Byb21pc2UuYWxsKHQpLnRoZW4ocz0+e2xldCBvPXMuZmlsdGVyKGE9PmEhPT1JdC5yZXNvbHZlZCk7by5sZW5ndGg+MD9pKG8pOm4oKX0pLmNhdGNoKHM9PmkoW3NdKSl9KX1zaHV0ZG93bigpe3JldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3Iuc2h1dGRvd24oKX1fZ2V0UHJvcGFnYXRvcihlKXt2YXIgdDtyZXR1cm4odD10aGlzLmNvbnN0cnVjdG9yLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnMuZ2V0KGUpKT09PW51bGx8fHQ9PT12b2lkIDA/dm9pZCAwOnQoKX1fZ2V0U3BhbkV4cG9ydGVyKGUpe3ZhciB0O3JldHVybih0PXRoaXMuY29uc3RydWN0b3IuX3JlZ2lzdGVyZWRFeHBvcnRlcnMuZ2V0KGUpKT09PW51bGx8fHQ9PT12b2lkIDA/dm9pZCAwOnQoKX1fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpe2xldCBlPUFycmF5LmZyb20obmV3IFNldCgoMCxNdC5nZXRFbnYpKCkuT1RFTF9QUk9QQUdBVE9SUykpLG49ZS5tYXAoaT0+e2xldCBzPXRoaXMuX2dldFByb3BhZ2F0b3IoaSk7cmV0dXJuIHN8fHZ0LmRpYWcud2FybihgUHJvcGFnYXRvciBcIiR7aX1cIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS5gKSxzfSkucmVkdWNlKChpLHMpPT4ocyYmaS5wdXNoKHMpLGkpLFtdKTtpZihuLmxlbmd0aCE9PTApcmV0dXJuIGUubGVuZ3RoPT09MT9uWzBdOm5ldyBNdC5Db21wb3NpdGVQcm9wYWdhdG9yKHtwcm9wYWdhdG9yczpufSl9X2J1aWxkRXhwb3J0ZXJGcm9tRW52KCl7bGV0IGU9KDAsTXQuZ2V0RW52KSgpLk9URUxfVFJBQ0VTX0VYUE9SVEVSO2lmKGU9PT1cIm5vbmVcInx8ZT09PVwiXCIpcmV0dXJuO2xldCB0PXRoaXMuX2dldFNwYW5FeHBvcnRlcihlKTtyZXR1cm4gdHx8dnQuZGlhZy5lcnJvcihgRXhwb3J0ZXIgXCIke2V9XCIgcmVxdWVzdGVkIHRocm91Z2ggZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdW5hdmFpbGFibGUuYCksdH19O2l0LkJhc2ljVHJhY2VyUHJvdmlkZXI9QXI7QXIuX3JlZ2lzdGVyZWRQcm9wYWdhdG9ycz1uZXcgTWFwKFtbXCJ0cmFjZWNvbnRleHRcIiwoKT0+bmV3IE10LlczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3JdLFtcImJhZ2dhZ2VcIiwoKT0+bmV3IE10LlczQ0JhZ2dhZ2VQcm9wYWdhdG9yXV0pO0FyLl9yZWdpc3RlcmVkRXhwb3J0ZXJzPW5ldyBNYXB9KTt2YXIgQWQ9bChwaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShwaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtwaS5Db25zb2xlU3BhbkV4cG9ydGVyPXZvaWQgMDt2YXIgZGE9QSgpLF9hPWNsYXNze2V4cG9ydChlLHQpe3JldHVybiB0aGlzLl9zZW5kU3BhbnMoZSx0KX1zaHV0ZG93bigpe3JldHVybiB0aGlzLl9zZW5kU3BhbnMoW10pLHRoaXMuZm9yY2VGbHVzaCgpfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9X2V4cG9ydEluZm8oZSl7dmFyIHQ7cmV0dXJue3RyYWNlSWQ6ZS5zcGFuQ29udGV4dCgpLnRyYWNlSWQscGFyZW50SWQ6ZS5wYXJlbnRTcGFuSWQsdHJhY2VTdGF0ZToodD1lLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSk9PT1udWxsfHx0PT09dm9pZCAwP3ZvaWQgMDp0LnNlcmlhbGl6ZSgpLG5hbWU6ZS5uYW1lLGlkOmUuc3BhbkNvbnRleHQoKS5zcGFuSWQsa2luZDplLmtpbmQsdGltZXN0YW1wOigwLGRhLmhyVGltZVRvTWljcm9zZWNvbmRzKShlLnN0YXJ0VGltZSksZHVyYXRpb246KDAsZGEuaHJUaW1lVG9NaWNyb3NlY29uZHMpKGUuZHVyYXRpb24pLGF0dHJpYnV0ZXM6ZS5hdHRyaWJ1dGVzLHN0YXR1czplLnN0YXR1cyxldmVudHM6ZS5ldmVudHMsbGlua3M6ZS5saW5rc319X3NlbmRTcGFucyhlLHQpe2ZvcihsZXQgbiBvZiBlKWNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8obikse2RlcHRoOjN9KTtpZih0KXJldHVybiB0KHtjb2RlOmRhLkV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTU30pfX07cGkuQ29uc29sZVNwYW5FeHBvcnRlcj1fYX0pO3ZhciBSZD1sKGhpPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGhpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2hpLkluTWVtb3J5U3BhbkV4cG9ydGVyPXZvaWQgMDt2YXIgT2Q9QSgpLHBhPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fZmluaXNoZWRTcGFucz1bXSx0aGlzLl9zdG9wcGVkPSExfWV4cG9ydChlLHQpe2lmKHRoaXMuX3N0b3BwZWQpcmV0dXJuIHQoe2NvZGU6T2QuRXhwb3J0UmVzdWx0Q29kZS5GQUlMRUQsZXJyb3I6bmV3IEVycm9yKFwiRXhwb3J0ZXIgaGFzIGJlZW4gc3RvcHBlZFwiKX0pO3RoaXMuX2ZpbmlzaGVkU3BhbnMucHVzaCguLi5lKSxzZXRUaW1lb3V0KCgpPT50KHtjb2RlOk9kLkV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTU30pLDApfXNodXRkb3duKCl7cmV0dXJuIHRoaXMuX3N0b3BwZWQ9ITAsdGhpcy5fZmluaXNoZWRTcGFucz1bXSx0aGlzLmZvcmNlRmx1c2goKX1mb3JjZUZsdXNoKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfXJlc2V0KCl7dGhpcy5fZmluaXNoZWRTcGFucz1bXX1nZXRGaW5pc2hlZFNwYW5zKCl7cmV0dXJuIHRoaXMuX2ZpbmlzaGVkU3BhbnN9fTtoaS5Jbk1lbW9yeVNwYW5FeHBvcnRlcj1wYX0pO3ZhciBQZD1sKGJkPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJkLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSk7dmFyIHlkPWwoZmk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZmksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7ZmkuU2ltcGxlU3BhblByb2Nlc3Nvcj12b2lkIDA7dmFyIHpnPShoKCksbShkKSksTHQ9QSgpLGhhPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2V4cG9ydGVyPWUsdGhpcy5fc2h1dGRvd25PbmNlPW5ldyBMdC5CaW5kT25jZUZ1dHVyZSh0aGlzLl9zaHV0ZG93bix0aGlzKSx0aGlzLl91bnJlc29sdmVkRXhwb3J0cz1uZXcgU2V0fWFzeW5jIGZvcmNlRmx1c2goKXthd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHRoaXMuX3VucmVzb2x2ZWRFeHBvcnRzKSksdGhpcy5fZXhwb3J0ZXIuZm9yY2VGbHVzaCYmYXdhaXQgdGhpcy5fZXhwb3J0ZXIuZm9yY2VGbHVzaCgpfW9uU3RhcnQoZSx0KXt9b25FbmQoZSl7dmFyIHQsbjtpZih0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWR8fCEoZS5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MmemcuVHJhY2VGbGFncy5TQU1QTEVEKSlyZXR1cm47bGV0IGk9KCk9Pkx0LmludGVybmFsLl9leHBvcnQodGhpcy5fZXhwb3J0ZXIsW2VdKS50aGVuKHM9Pnt2YXIgbztzLmNvZGUhPT1MdC5FeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MmJigwLEx0Lmdsb2JhbEVycm9ySGFuZGxlcikoKG89cy5lcnJvcikhPT1udWxsJiZvIT09dm9pZCAwP286bmV3IEVycm9yKGBTaW1wbGVTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWQgKHN0YXR1cyAke3N9KWApKX0pLmNhdGNoKHM9PnsoMCxMdC5nbG9iYWxFcnJvckhhbmRsZXIpKHMpfSk7aWYoZS5yZXNvdXJjZS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nKXtsZXQgcz0obj0odD1lLnJlc291cmNlKS53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uY2FsbCh0KS50aGVuKCgpPT4ocyE9bnVsbCYmdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuZGVsZXRlKHMpLGkoKSksbz0+KDAsTHQuZ2xvYmFsRXJyb3JIYW5kbGVyKShvKSk7cyE9bnVsbCYmdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuYWRkKHMpfWVsc2UgaSgpfXNodXRkb3duKCl7cmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCl9X3NodXRkb3duKCl7cmV0dXJuIHRoaXMuX2V4cG9ydGVyLnNodXRkb3duKCl9fTtmaS5TaW1wbGVTcGFuUHJvY2Vzc29yPWhhfSk7dmFyIElkPWwodmQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodmQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9KTt2YXIgTGQ9bChNZD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShNZCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO3ZhciBDZD1sKE5kPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5kLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSk7dmFyIHhkPWwod2Q9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkod2QsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9KTt2YXIgVWQ9bChEZD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShEZCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO3ZhciBsYT1sKEk9PntcInVzZSBzdHJpY3RcIjt2YXIgWWc9SSYmSS5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fSl9OmZ1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLHJbbl09ZVt0XX0pLEI9SSYmSS5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJllnKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7QihIbCgpLEkpO0IoU2QoKSxJKTtCKEduKCksSSk7QihBZCgpLEkpO0IoUmQoKSxJKTtCKFBkKCksSSk7Qih5ZCgpLEkpO0IoSWQoKSxJKTtCKGNhKCksSSk7QihNbigpLEkpO0IoTm4oKSxJKTtCKExvKCksSSk7QihDbygpLEkpO0IoZ3IoKSxJKTtCKFBvKCksSSk7QihMZCgpLEkpO0IoQ2QoKSxJKTtCKHhkKCksSSk7QihVZCgpLEkpfSk7dmFyIHN0PXt9O2ltcG9ydCphcyBuUCBmcm9tXCJAb3BlbnRlbGVtZXRyeS9hcGktbG9nc1wiO3ZhciBmYT1fYygoKT0+e2h0KHN0LG5QKX0pO3ZhciBxZD1sKE5lPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5lLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO05lLmRpc2FibGVJbnN0cnVtZW50YXRpb25zPU5lLmVuYWJsZUluc3RydW1lbnRhdGlvbnM9TmUucGFyc2VJbnN0cnVtZW50YXRpb25PcHRpb25zPXZvaWQgMDtmdW5jdGlvbiBCZChyPVtdKXtsZXQgZT1bXTtmb3IobGV0IHQ9MCxuPXIubGVuZ3RoO3Q8bjt0Kyspe2xldCBpPXJbdF07aWYoQXJyYXkuaXNBcnJheShpKSl7bGV0IHM9QmQoaSk7ZT1lLmNvbmNhdChzLmluc3RydW1lbnRhdGlvbnMpfWVsc2UgdHlwZW9mIGk9PVwiZnVuY3Rpb25cIj9lLnB1c2gobmV3IGkpOmkuaW5zdHJ1bWVudGF0aW9uTmFtZSYmZS5wdXNoKGkpfXJldHVybntpbnN0cnVtZW50YXRpb25zOmV9fU5lLnBhcnNlSW5zdHJ1bWVudGF0aW9uT3B0aW9ucz1CZDtmdW5jdGlvbiBRZyhyLGUsdCl7Zm9yKGxldCBuPTAsaT1yLmxlbmd0aDtuPGk7bisrKXtsZXQgcz1yW25dO2UmJnMuc2V0VHJhY2VyUHJvdmlkZXIoZSksdCYmcy5zZXRNZXRlclByb3ZpZGVyKHQpLHMuZ2V0Q29uZmlnKCkuZW5hYmxlZHx8cy5lbmFibGUoKX19TmUuZW5hYmxlSW5zdHJ1bWVudGF0aW9ucz1RZztmdW5jdGlvbiBaZyhyKXtyLmZvckVhY2goZT0+ZS5kaXNhYmxlKCkpfU5lLmRpc2FibGVJbnN0cnVtZW50YXRpb25zPVpnfSk7dmFyIEdkPWwoRWk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoRWksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7RWkucmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zPXZvaWQgMDt2YXIgVmQ9KGgoKSxtKGQpKSxFYT1xZCgpO2Z1bmN0aW9uIEpnKHIpe2xldHtpbnN0cnVtZW50YXRpb25zOmV9PSgwLEVhLnBhcnNlSW5zdHJ1bWVudGF0aW9uT3B0aW9ucykoci5pbnN0cnVtZW50YXRpb25zKSx0PXIudHJhY2VyUHJvdmlkZXJ8fFZkLnRyYWNlLmdldFRyYWNlclByb3ZpZGVyKCksbj1yLm1ldGVyUHJvdmlkZXJ8fFZkLm1ldHJpY3MuZ2V0TWV0ZXJQcm92aWRlcigpO3JldHVybigwLEVhLmVuYWJsZUluc3RydW1lbnRhdGlvbnMpKGUsdCxuKSwoKT0+eygwLEVhLmRpc2FibGVJbnN0cnVtZW50YXRpb25zKShlKX19RWkucmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zPUpnfSk7dmFyIGdhPWwoZ2k9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2ksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Z2kuTG9nUmVjb3JkPXZvaWQgMDt2YXIgZVQ9KGgoKSxtKGQpKSxPcj0oaCgpLG0oZCkpLG1pPUEoKSxtYT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMudG90YWxBdHRyaWJ1dGVzQ291bnQ9MCx0aGlzLl9pc1JlYWRvbmx5PSExO2xldHt0aW1lc3RhbXA6aSxvYnNlcnZlZFRpbWVzdGFtcDpzLHNldmVyaXR5TnVtYmVyOm8sc2V2ZXJpdHlUZXh0OmEsYm9keTp1LGF0dHJpYnV0ZXM6Yz17fSxjb250ZXh0Ol99PW4scD1EYXRlLm5vdygpO2lmKHRoaXMuaHJUaW1lPSgwLG1pLnRpbWVJbnB1dFRvSHJUaW1lKShpPz9wKSx0aGlzLmhyVGltZU9ic2VydmVkPSgwLG1pLnRpbWVJbnB1dFRvSHJUaW1lKShzPz9wKSxfKXtsZXQgZj1Pci50cmFjZS5nZXRTcGFuQ29udGV4dChfKTtmJiZPci5pc1NwYW5Db250ZXh0VmFsaWQoZikmJih0aGlzLnNwYW5Db250ZXh0PWYpfXRoaXMuc2V2ZXJpdHlOdW1iZXI9byx0aGlzLnNldmVyaXR5VGV4dD1hLHRoaXMuYm9keT11LHRoaXMucmVzb3VyY2U9ZS5yZXNvdXJjZSx0aGlzLmluc3RydW1lbnRhdGlvblNjb3BlPXQsdGhpcy5fbG9nUmVjb3JkTGltaXRzPWUubG9nUmVjb3JkTGltaXRzLHRoaXMuc2V0QXR0cmlidXRlcyhjKX1zZXQgc2V2ZXJpdHlUZXh0KGUpe3RoaXMuX2lzTG9nUmVjb3JkUmVhZG9ubHkoKXx8KHRoaXMuX3NldmVyaXR5VGV4dD1lKX1nZXQgc2V2ZXJpdHlUZXh0KCl7cmV0dXJuIHRoaXMuX3NldmVyaXR5VGV4dH1zZXQgc2V2ZXJpdHlOdW1iZXIoZSl7dGhpcy5faXNMb2dSZWNvcmRSZWFkb25seSgpfHwodGhpcy5fc2V2ZXJpdHlOdW1iZXI9ZSl9Z2V0IHNldmVyaXR5TnVtYmVyKCl7cmV0dXJuIHRoaXMuX3NldmVyaXR5TnVtYmVyfXNldCBib2R5KGUpe3RoaXMuX2lzTG9nUmVjb3JkUmVhZG9ubHkoKXx8KHRoaXMuX2JvZHk9ZSl9Z2V0IGJvZHkoKXtyZXR1cm4gdGhpcy5fYm9keX1nZXQgZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCgpe3JldHVybiB0aGlzLnRvdGFsQXR0cmlidXRlc0NvdW50LU9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcykubGVuZ3RofXNldEF0dHJpYnV0ZShlLHQpe3JldHVybiB0aGlzLl9pc0xvZ1JlY29yZFJlYWRvbmx5KCk/dGhpczp0PT09bnVsbD90aGlzOmUubGVuZ3RoPT09MD8oT3IuZGlhZy53YXJuKGBJbnZhbGlkIGF0dHJpYnV0ZSBrZXk6ICR7ZX1gKSx0aGlzKTohKDAsbWkuaXNBdHRyaWJ1dGVWYWx1ZSkodCkmJiEodHlwZW9mIHQ9PVwib2JqZWN0XCImJiFBcnJheS5pc0FycmF5KHQpJiZPYmplY3Qua2V5cyh0KS5sZW5ndGg+MCk/KE9yLmRpYWcud2FybihgSW52YWxpZCBhdHRyaWJ1dGUgdmFsdWUgc2V0IGZvciBrZXk6ICR7ZX1gKSx0aGlzKToodGhpcy50b3RhbEF0dHJpYnV0ZXNDb3VudCs9MSxPYmplY3Qua2V5cyh0aGlzLmF0dHJpYnV0ZXMpLmxlbmd0aD49dGhpcy5fbG9nUmVjb3JkTGltaXRzLmF0dHJpYnV0ZUNvdW50TGltaXQmJiFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hdHRyaWJ1dGVzLGUpP3RoaXM6KCgwLG1pLmlzQXR0cmlidXRlVmFsdWUpKHQpP3RoaXMuYXR0cmlidXRlc1tlXT10aGlzLl90cnVuY2F0ZVRvU2l6ZSh0KTp0aGlzLmF0dHJpYnV0ZXNbZV09dCx0aGlzKSl9c2V0QXR0cmlidXRlcyhlKXtmb3IobGV0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhlKSl0aGlzLnNldEF0dHJpYnV0ZSh0LG4pO3JldHVybiB0aGlzfXNldEJvZHkoZSl7cmV0dXJuIHRoaXMuYm9keT1lLHRoaXN9c2V0U2V2ZXJpdHlOdW1iZXIoZSl7cmV0dXJuIHRoaXMuc2V2ZXJpdHlOdW1iZXI9ZSx0aGlzfXNldFNldmVyaXR5VGV4dChlKXtyZXR1cm4gdGhpcy5zZXZlcml0eVRleHQ9ZSx0aGlzfV9tYWtlUmVhZG9ubHkoKXt0aGlzLl9pc1JlYWRvbmx5PSEwfV90cnVuY2F0ZVRvU2l6ZShlKXtsZXQgdD10aGlzLl9sb2dSZWNvcmRMaW1pdHMuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDtyZXR1cm4gdDw9MD8oT3IuZGlhZy53YXJuKGBBdHRyaWJ1dGUgdmFsdWUgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgZ290ICR7dH1gKSxlKTp0eXBlb2YgZT09XCJzdHJpbmdcIj90aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKGUsdCk6QXJyYXkuaXNBcnJheShlKT9lLm1hcChuPT50eXBlb2Ygbj09XCJzdHJpbmdcIj90aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKG4sdCk6bik6ZX1fdHJ1bmNhdGVUb0xpbWl0VXRpbChlLHQpe3JldHVybiBlLmxlbmd0aDw9dD9lOmUuc3Vic3RyaW5nKDAsdCl9X2lzTG9nUmVjb3JkUmVhZG9ubHkoKXtyZXR1cm4gdGhpcy5faXNSZWFkb25seSYmZVQuZGlhZy53YXJuKFwiQ2FuIG5vdCBleGVjdXRlIHRoZSBvcGVyYXRpb24gb24gZW1pdHRlZCBsb2cgcmVjb3JkXCIpLHRoaXMuX2lzUmVhZG9ubHl9fTtnaS5Mb2dSZWNvcmQ9bWF9KTt2YXIgSGQ9bChUaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShUaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtUaS5Mb2dnZXI9dm9pZCAwO3ZhciB0VD0oaCgpLG0oZCkpLHJUPWdhKCksVGE9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmluc3RydW1lbnRhdGlvblNjb3BlPWUsdGhpcy5fc2hhcmVkU3RhdGU9dH1lbWl0KGUpe2xldCB0PWUuY29udGV4dHx8dFQuY29udGV4dC5hY3RpdmUoKSxuPW5ldyByVC5Mb2dSZWNvcmQodGhpcy5fc2hhcmVkU3RhdGUsdGhpcy5pbnN0cnVtZW50YXRpb25TY29wZSxPYmplY3QuYXNzaWduKHtjb250ZXh0OnR9LGUpKTt0aGlzLl9zaGFyZWRTdGF0ZS5hY3RpdmVQcm9jZXNzb3Iub25FbWl0KG4sdCksbi5fbWFrZVJlYWRvbmx5KCl9fTtUaS5Mb2dnZXI9VGF9KTt2YXIgamQ9bChOdD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtOdC5yZWNvbmZpZ3VyZUxpbWl0cz1OdC5sb2FkRGVmYXVsdENvbmZpZz12b2lkIDA7dmFyIFJyPUEoKTtmdW5jdGlvbiBuVCgpe3JldHVybntmb3JjZUZsdXNoVGltZW91dE1pbGxpczozZTQsbG9nUmVjb3JkTGltaXRzOnthdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OigwLFJyLmdldEVudikoKS5PVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULGF0dHJpYnV0ZUNvdW50TGltaXQ6KDAsUnIuZ2V0RW52KSgpLk9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9DT1VOVF9MSU1JVH0saW5jbHVkZVRyYWNlQ29udGV4dDohMH19TnQubG9hZERlZmF1bHRDb25maWc9blQ7ZnVuY3Rpb24gaVQocil7dmFyIGUsdCxuLGkscyxvO2xldCBhPSgwLFJyLmdldEVudldpdGhvdXREZWZhdWx0cykoKTtyZXR1cm57YXR0cmlidXRlQ291bnRMaW1pdDoobj0odD0oZT1yLmF0dHJpYnV0ZUNvdW50TGltaXQpIT09bnVsbCYmZSE9PXZvaWQgMD9lOmEuT1RFTF9MT0dSRUNPUkRfQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJnQhPT12b2lkIDA/dDphLk9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUKSE9PW51bGwmJm4hPT12b2lkIDA/bjpSci5ERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OihvPShzPShpPXIuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkhPT1udWxsJiZpIT09dm9pZCAwP2k6YS5PVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSE9PW51bGwmJnMhPT12b2lkIDA/czphLk9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCkhPT1udWxsJiZvIT09dm9pZCAwP286UnIuREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUfX1OdC5yZWNvbmZpZ3VyZUxpbWl0cz1pVH0pO3ZhciBGZD1sKFNpPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFNpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1NpLk11bHRpTG9nUmVjb3JkUHJvY2Vzc29yPXZvaWQgMDt2YXIgc1Q9QSgpLFNhPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5wcm9jZXNzb3JzPWUsdGhpcy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcz10fWFzeW5jIGZvcmNlRmx1c2goKXtsZXQgZT10aGlzLmZvcmNlRmx1c2hUaW1lb3V0TWlsbGlzO2F3YWl0IFByb21pc2UuYWxsKHRoaXMucHJvY2Vzc29ycy5tYXAodD0+KDAsc1QuY2FsbFdpdGhUaW1lb3V0KSh0LmZvcmNlRmx1c2goKSxlKSkpfW9uRW1pdChlLHQpe3RoaXMucHJvY2Vzc29ycy5mb3JFYWNoKG49Pm4ub25FbWl0KGUsdCkpfWFzeW5jIHNodXRkb3duKCl7YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5wcm9jZXNzb3JzLm1hcChlPT5lLnNodXRkb3duKCkpKX19O1NpLk11bHRpTG9nUmVjb3JkUHJvY2Vzc29yPVNhfSk7dmFyIE9hPWwoQWk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoQWksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7QWkuTm9vcExvZ1JlY29yZFByb2Nlc3Nvcj12b2lkIDA7dmFyIEFhPWNsYXNze2ZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9b25FbWl0KGUsdCl7fXNodXRkb3duKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfX07QWkuTm9vcExvZ1JlY29yZFByb2Nlc3Nvcj1BYX0pO3ZhciBrZD1sKE9pPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KE9pLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO09pLkxvZ2dlclByb3ZpZGVyU2hhcmVkU3RhdGU9dm9pZCAwO3ZhciBvVD1PYSgpLFJhPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnJlc291cmNlPWUsdGhpcy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcz10LHRoaXMubG9nUmVjb3JkTGltaXRzPW4sdGhpcy5sb2dnZXJzPW5ldyBNYXAsdGhpcy5yZWdpc3RlcmVkTG9nUmVjb3JkUHJvY2Vzc29ycz1bXSx0aGlzLmFjdGl2ZVByb2Nlc3Nvcj1uZXcgb1QuTm9vcExvZ1JlY29yZFByb2Nlc3Nvcn19O09pLkxvZ2dlclByb3ZpZGVyU2hhcmVkU3RhdGU9UmF9KTt2YXIgV2Q9bChvdD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtvdC5Mb2dnZXJQcm92aWRlcj1vdC5ERUZBVUxUX0xPR0dFUl9OQU1FPXZvaWQgMDt2YXIgYnI9KGgoKSxtKGQpKSxhVD0oZmEoKSxtKHN0KSksdVQ9cnQoKSwkZD1BKCksY1Q9SGQoKSxYZD1qZCgpLGxUPUZkKCksZFQ9a2QoKTtvdC5ERUZBVUxUX0xPR0dFUl9OQU1FPVwidW5rbm93blwiO3ZhciBiYT1jbGFzc3tjb25zdHJ1Y3RvcihlPXt9KXtsZXR7cmVzb3VyY2U6dD11VC5SZXNvdXJjZS5kZWZhdWx0KCksbG9nUmVjb3JkTGltaXRzOm4sZm9yY2VGbHVzaFRpbWVvdXRNaWxsaXM6aX09KDAsJGQubWVyZ2UpKHt9LCgwLFhkLmxvYWREZWZhdWx0Q29uZmlnKSgpLGUpO3RoaXMuX3NoYXJlZFN0YXRlPW5ldyBkVC5Mb2dnZXJQcm92aWRlclNoYXJlZFN0YXRlKHQsaSwoMCxYZC5yZWNvbmZpZ3VyZUxpbWl0cykobikpLHRoaXMuX3NodXRkb3duT25jZT1uZXcgJGQuQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sdGhpcyl9Z2V0TG9nZ2VyKGUsdCxuKXtpZih0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpcmV0dXJuIGJyLmRpYWcud2FybihcIkEgc2h1dGRvd24gTG9nZ2VyUHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgYSBMb2dnZXJcIiksYVQuTk9PUF9MT0dHRVI7ZXx8YnIuZGlhZy53YXJuKFwiTG9nZ2VyIHJlcXVlc3RlZCB3aXRob3V0IGluc3RydW1lbnRhdGlvbiBzY29wZSBuYW1lLlwiKTtsZXQgaT1lfHxvdC5ERUZBVUxUX0xPR0dFUl9OQU1FLHM9YCR7aX1AJHt0fHxcIlwifToke24/LnNjaGVtYVVybHx8XCJcIn1gO3JldHVybiB0aGlzLl9zaGFyZWRTdGF0ZS5sb2dnZXJzLmhhcyhzKXx8dGhpcy5fc2hhcmVkU3RhdGUubG9nZ2Vycy5zZXQocyxuZXcgY1QuTG9nZ2VyKHtuYW1lOmksdmVyc2lvbjp0LHNjaGVtYVVybDpuPy5zY2hlbWFVcmx9LHRoaXMuX3NoYXJlZFN0YXRlKSksdGhpcy5fc2hhcmVkU3RhdGUubG9nZ2Vycy5nZXQocyl9YWRkTG9nUmVjb3JkUHJvY2Vzc29yKGUpe3RoaXMuX3NoYXJlZFN0YXRlLnJlZ2lzdGVyZWRMb2dSZWNvcmRQcm9jZXNzb3JzLmxlbmd0aD09PTAmJnRoaXMuX3NoYXJlZFN0YXRlLmFjdGl2ZVByb2Nlc3Nvci5zaHV0ZG93bigpLmNhdGNoKHQ9PmJyLmRpYWcuZXJyb3IoXCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBsb2cgcmVjb3JkIHByb2Nlc3NvclwiLHQpKSx0aGlzLl9zaGFyZWRTdGF0ZS5yZWdpc3RlcmVkTG9nUmVjb3JkUHJvY2Vzc29ycy5wdXNoKGUpLHRoaXMuX3NoYXJlZFN0YXRlLmFjdGl2ZVByb2Nlc3Nvcj1uZXcgbFQuTXVsdGlMb2dSZWNvcmRQcm9jZXNzb3IodGhpcy5fc2hhcmVkU3RhdGUucmVnaXN0ZXJlZExvZ1JlY29yZFByb2Nlc3NvcnMsdGhpcy5fc2hhcmVkU3RhdGUuZm9yY2VGbHVzaFRpbWVvdXRNaWxsaXMpfWZvcmNlRmx1c2goKXtyZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkPyhici5kaWFnLndhcm4oXCJpbnZhbGlkIGF0dGVtcHQgdG8gZm9yY2UgZmx1c2ggYWZ0ZXIgTG9nZ2VyUHJvdmlkZXIgc2h1dGRvd25cIiksdGhpcy5fc2h1dGRvd25PbmNlLnByb21pc2UpOnRoaXMuX3NoYXJlZFN0YXRlLmFjdGl2ZVByb2Nlc3Nvci5mb3JjZUZsdXNoKCl9c2h1dGRvd24oKXtyZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkPyhici5kaWFnLndhcm4oXCJzaHV0ZG93biBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgTG9nZ2VyUHJvdmlkZXJcIiksdGhpcy5fc2h1dGRvd25PbmNlLnByb21pc2UpOnRoaXMuX3NodXRkb3duT25jZS5jYWxsKCl9X3NodXRkb3duKCl7cmV0dXJuIHRoaXMuX3NoYXJlZFN0YXRlLmFjdGl2ZVByb2Nlc3Nvci5zaHV0ZG93bigpfX07b3QuTG9nZ2VyUHJvdmlkZXI9YmF9KTt2YXIgS2Q9bChSaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtSaS5Db25zb2xlTG9nUmVjb3JkRXhwb3J0ZXI9dm9pZCAwO3ZhciBfVD1BKCkscFQ9QSgpLFBhPWNsYXNze2V4cG9ydChlLHQpe3RoaXMuX3NlbmRMb2dSZWNvcmRzKGUsdCl9c2h1dGRvd24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9X2V4cG9ydEluZm8oZSl7dmFyIHQsbixpO3JldHVybnt0aW1lc3RhbXA6KDAsX1QuaHJUaW1lVG9NaWNyb3NlY29uZHMpKGUuaHJUaW1lKSx0cmFjZUlkOih0PWUuc3BhbkNvbnRleHQpPT09bnVsbHx8dD09PXZvaWQgMD92b2lkIDA6dC50cmFjZUlkLHNwYW5JZDoobj1lLnNwYW5Db250ZXh0KT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uc3BhbklkLHRyYWNlRmxhZ3M6KGk9ZS5zcGFuQ29udGV4dCk9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLnRyYWNlRmxhZ3Msc2V2ZXJpdHlUZXh0OmUuc2V2ZXJpdHlUZXh0LHNldmVyaXR5TnVtYmVyOmUuc2V2ZXJpdHlOdW1iZXIsYm9keTplLmJvZHksYXR0cmlidXRlczplLmF0dHJpYnV0ZXN9fV9zZW5kTG9nUmVjb3JkcyhlLHQpe2ZvcihsZXQgbiBvZiBlKWNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8obikse2RlcHRoOjN9KTt0Py4oe2NvZGU6cFQuRXhwb3J0UmVzdWx0Q29kZS5TVUNDRVNTfSl9fTtSaS5Db25zb2xlTG9nUmVjb3JkRXhwb3J0ZXI9UGF9KTt2YXIgemQ9bChiaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtiaS5TaW1wbGVMb2dSZWNvcmRQcm9jZXNzb3I9dm9pZCAwO3ZhciB5YT1BKCksdmE9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fZXhwb3J0ZXI9ZSx0aGlzLl9zaHV0ZG93bk9uY2U9bmV3IHlhLkJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLHRoaXMpfW9uRW1pdChlKXt0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWR8fHRoaXMuX2V4cG9ydGVyLmV4cG9ydChbZV0sdD0+e3ZhciBuO2lmKHQuY29kZSE9PXlhLkV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUyl7KDAseWEuZ2xvYmFsRXJyb3JIYW5kbGVyKSgobj10LmVycm9yKSE9PW51bGwmJm4hPT12b2lkIDA/bjpuZXcgRXJyb3IoYFNpbXBsZUxvZ1JlY29yZFByb2Nlc3NvcjogbG9nIHJlY29yZCBleHBvcnQgZmFpbGVkIChzdGF0dXMgJHt0fSlgKSk7cmV0dXJufX0pfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9c2h1dGRvd24oKXtyZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmNhbGwoKX1fc2h1dGRvd24oKXtyZXR1cm4gdGhpcy5fZXhwb3J0ZXIuc2h1dGRvd24oKX19O2JpLlNpbXBsZUxvZ1JlY29yZFByb2Nlc3Nvcj12YX0pO3ZhciBRZD1sKFBpPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFBpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1BpLkluTWVtb3J5TG9nUmVjb3JkRXhwb3J0ZXI9dm9pZCAwO3ZhciBZZD1BKCksSWE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9maW5pc2hlZExvZ1JlY29yZHM9W10sdGhpcy5fc3RvcHBlZD0hMX1leHBvcnQoZSx0KXtpZih0aGlzLl9zdG9wcGVkKXJldHVybiB0KHtjb2RlOllkLkV4cG9ydFJlc3VsdENvZGUuRkFJTEVELGVycm9yOm5ldyBFcnJvcihcIkV4cG9ydGVyIGhhcyBiZWVuIHN0b3BwZWRcIil9KTt0aGlzLl9maW5pc2hlZExvZ1JlY29yZHMucHVzaCguLi5lKSx0KHtjb2RlOllkLkV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTU30pfXNodXRkb3duKCl7cmV0dXJuIHRoaXMuX3N0b3BwZWQ9ITAsdGhpcy5yZXNldCgpLFByb21pc2UucmVzb2x2ZSgpfWdldEZpbmlzaGVkTG9nUmVjb3Jkcygpe3JldHVybiB0aGlzLl9maW5pc2hlZExvZ1JlY29yZHN9cmVzZXQoKXt0aGlzLl9maW5pc2hlZExvZ1JlY29yZHM9W119fTtQaS5Jbk1lbW9yeUxvZ1JlY29yZEV4cG9ydGVyPUlhfSk7dmFyIFpkPWwoeWk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoeWksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7eWkuQmF0Y2hMb2dSZWNvcmRQcm9jZXNzb3JCYXNlPXZvaWQgMDt2YXIgaFQ9KGgoKSxtKGQpKSxDdD1BKCksTWE9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt2YXIgbixpLHMsbzt0aGlzLl9leHBvcnRlcj1lLHRoaXMuX2ZpbmlzaGVkTG9nUmVjb3Jkcz1bXTtsZXQgYT0oMCxDdC5nZXRFbnYpKCk7dGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplPShuPXQ/Lm1heEV4cG9ydEJhdGNoU2l6ZSkhPT1udWxsJiZuIT09dm9pZCAwP246YS5PVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFLHRoaXMuX21heFF1ZXVlU2l6ZT0oaT10Py5tYXhRdWV1ZVNpemUpIT09bnVsbCYmaSE9PXZvaWQgMD9pOmEuT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFLHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzPShzPXQ/LnNjaGVkdWxlZERlbGF5TWlsbGlzKSE9PW51bGwmJnMhPT12b2lkIDA/czphLk9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWSx0aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzPShvPXQ/LmV4cG9ydFRpbWVvdXRNaWxsaXMpIT09bnVsbCYmbyE9PXZvaWQgMD9vOmEuT1RFTF9CTFJQX0VYUE9SVF9USU1FT1VULHRoaXMuX3NodXRkb3duT25jZT1uZXcgQ3QuQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sdGhpcyksdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplPnRoaXMuX21heFF1ZXVlU2l6ZSYmKGhULmRpYWcud2FybihcIkJhdGNoTG9nUmVjb3JkUHJvY2Vzc29yOiBtYXhFeHBvcnRCYXRjaFNpemUgbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvIG1heFF1ZXVlU2l6ZSwgc2V0dGluZyBtYXhFeHBvcnRCYXRjaFNpemUgdG8gbWF0Y2ggbWF4UXVldWVTaXplXCIpLHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZT10aGlzLl9tYXhRdWV1ZVNpemUpfW9uRW1pdChlKXt0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWR8fHRoaXMuX2FkZFRvQnVmZmVyKGUpfWZvcmNlRmx1c2goKXtyZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkP3RoaXMuX3NodXRkb3duT25jZS5wcm9taXNlOnRoaXMuX2ZsdXNoQWxsKCl9c2h1dGRvd24oKXtyZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmNhbGwoKX1hc3luYyBfc2h1dGRvd24oKXt0aGlzLm9uU2h1dGRvd24oKSxhd2FpdCB0aGlzLl9mbHVzaEFsbCgpLGF3YWl0IHRoaXMuX2V4cG9ydGVyLnNodXRkb3duKCl9X2FkZFRvQnVmZmVyKGUpe3RoaXMuX2ZpbmlzaGVkTG9nUmVjb3Jkcy5sZW5ndGg+PXRoaXMuX21heFF1ZXVlU2l6ZXx8KHRoaXMuX2ZpbmlzaGVkTG9nUmVjb3Jkcy5wdXNoKGUpLHRoaXMuX21heWJlU3RhcnRUaW1lcigpKX1fZmx1c2hBbGwoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntsZXQgbj1bXSxpPU1hdGguY2VpbCh0aGlzLl9maW5pc2hlZExvZ1JlY29yZHMubGVuZ3RoL3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSk7Zm9yKGxldCBzPTA7czxpO3MrKyluLnB1c2godGhpcy5fZmx1c2hPbmVCYXRjaCgpKTtQcm9taXNlLmFsbChuKS50aGVuKCgpPT57ZSgpfSkuY2F0Y2godCl9KX1fZmx1c2hPbmVCYXRjaCgpe3JldHVybiB0aGlzLl9jbGVhclRpbWVyKCksdGhpcy5fZmluaXNoZWRMb2dSZWNvcmRzLmxlbmd0aD09PTA/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IFByb21pc2UoKGUsdCk9PnsoMCxDdC5jYWxsV2l0aFRpbWVvdXQpKHRoaXMuX2V4cG9ydCh0aGlzLl9maW5pc2hlZExvZ1JlY29yZHMuc3BsaWNlKDAsdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplKSksdGhpcy5fZXhwb3J0VGltZW91dE1pbGxpcykudGhlbigoKT0+ZSgpKS5jYXRjaCh0KX0pfV9tYXliZVN0YXJ0VGltZXIoKXt0aGlzLl90aW1lcj09PXZvaWQgMCYmKHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoKCk9Pnt0aGlzLl9mbHVzaE9uZUJhdGNoKCkudGhlbigoKT0+e3RoaXMuX2ZpbmlzaGVkTG9nUmVjb3Jkcy5sZW5ndGg+MCYmKHRoaXMuX2NsZWFyVGltZXIoKSx0aGlzLl9tYXliZVN0YXJ0VGltZXIoKSl9KS5jYXRjaChlPT57KDAsQ3QuZ2xvYmFsRXJyb3JIYW5kbGVyKShlKX0pfSx0aGlzLl9zY2hlZHVsZWREZWxheU1pbGxpcyksKDAsQ3QudW5yZWZUaW1lcikodGhpcy5fdGltZXIpKX1fY2xlYXJUaW1lcigpe3RoaXMuX3RpbWVyIT09dm9pZCAwJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj12b2lkIDApfV9leHBvcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCh0LG4pPT57dGhpcy5fZXhwb3J0ZXIuZXhwb3J0KGUsaT0+e3ZhciBzO2lmKGkuY29kZSE9PUN0LkV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUyl7bigocz1pLmVycm9yKSE9PW51bGwmJnMhPT12b2lkIDA/czpuZXcgRXJyb3IoYEJhdGNoTG9nUmVjb3JkUHJvY2Vzc29yQmFzZTogbG9nIHJlY29yZCBleHBvcnQgZmFpbGVkIChzdGF0dXMgJHtpfSlgKSk7cmV0dXJufXQoaSl9KX0pfX07eWkuQmF0Y2hMb2dSZWNvcmRQcm9jZXNzb3JCYXNlPU1hfSk7dmFyIEpkPWwodmk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodmksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmkuQmF0Y2hMb2dSZWNvcmRQcm9jZXNzb3I9dm9pZCAwO3ZhciBmVD1aZCgpLExhPWNsYXNzIGV4dGVuZHMgZlQuQmF0Y2hMb2dSZWNvcmRQcm9jZXNzb3JCYXNle29uU2h1dGRvd24oKXt9fTt2aS5CYXRjaExvZ1JlY29yZFByb2Nlc3Nvcj1MYX0pO3ZhciBlXz1sKElpPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KElpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0lpLkJhdGNoTG9nUmVjb3JkUHJvY2Vzc29yPXZvaWQgMDt2YXIgRVQ9SmQoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSWksXCJCYXRjaExvZ1JlY29yZFByb2Nlc3NvclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFVC5CYXRjaExvZ1JlY29yZFByb2Nlc3Nvcn19KX0pO3ZhciB0Xz1sKE1pPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KE1pLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO01pLkJhdGNoTG9nUmVjb3JkUHJvY2Vzc29yPXZvaWQgMDt2YXIgbVQ9ZV8oKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTWksXCJCYXRjaExvZ1JlY29yZFByb2Nlc3NvclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtVC5CYXRjaExvZ1JlY29yZFByb2Nlc3Nvcn19KX0pO3ZhciByXz1sKFc9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoVyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtXLkJhdGNoTG9nUmVjb3JkUHJvY2Vzc29yPVcuSW5NZW1vcnlMb2dSZWNvcmRFeHBvcnRlcj1XLlNpbXBsZUxvZ1JlY29yZFByb2Nlc3Nvcj1XLkNvbnNvbGVMb2dSZWNvcmRFeHBvcnRlcj1XLk5vb3BMb2dSZWNvcmRQcm9jZXNzb3I9Vy5Mb2dSZWNvcmQ9Vy5Mb2dnZXJQcm92aWRlcj12b2lkIDA7dmFyIGdUPVdkKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFcsXCJMb2dnZXJQcm92aWRlclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnVC5Mb2dnZXJQcm92aWRlcn19KTt2YXIgVFQ9Z2EoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVyxcIkxvZ1JlY29yZFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBUVC5Mb2dSZWNvcmR9fSk7dmFyIFNUPU9hKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFcsXCJOb29wTG9nUmVjb3JkUHJvY2Vzc29yXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFNULk5vb3BMb2dSZWNvcmRQcm9jZXNzb3J9fSk7dmFyIEFUPUtkKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFcsXCJDb25zb2xlTG9nUmVjb3JkRXhwb3J0ZXJcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQVQuQ29uc29sZUxvZ1JlY29yZEV4cG9ydGVyfX0pO3ZhciBPVD16ZCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShXLFwiU2ltcGxlTG9nUmVjb3JkUHJvY2Vzc29yXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE9ULlNpbXBsZUxvZ1JlY29yZFByb2Nlc3Nvcn19KTt2YXIgUlQ9UWQoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVyxcIkluTWVtb3J5TG9nUmVjb3JkRXhwb3J0ZXJcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUlQuSW5NZW1vcnlMb2dSZWNvcmRFeHBvcnRlcn19KTt2YXIgYlQ9dF8oKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVyxcIkJhdGNoTG9nUmVjb3JkUHJvY2Vzc29yXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJULkJhdGNoTG9nUmVjb3JkUHJvY2Vzc29yfX0pfSk7dmFyIExpPWwoUHI9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoUHIsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7UHIuQWdncmVnYXRpb25UZW1wb3JhbGl0eT12b2lkIDA7dmFyIFBUOyhmdW5jdGlvbihyKXtyW3IuREVMVEE9MF09XCJERUxUQVwiLHJbci5DVU1VTEFUSVZFPTFdPVwiQ1VNVUxBVElWRVwifSkoUFQ9UHIuQWdncmVnYXRpb25UZW1wb3JhbGl0eXx8KFByLkFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHk9e30pKX0pO3ZhciB3dD1sKHlyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHlyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3lyLkRhdGFQb2ludFR5cGU9dm9pZCAwO3ZhciB5VDsoZnVuY3Rpb24ocil7cltyLkhJU1RPR1JBTT0wXT1cIkhJU1RPR1JBTVwiLHJbci5FWFBPTkVOVElBTF9ISVNUT0dSQU09MV09XCJFWFBPTkVOVElBTF9ISVNUT0dSQU1cIixyW3IuR0FVR0U9Ml09XCJHQVVHRVwiLHJbci5TVU09M109XCJTVU1cIn0pKHlUPXlyLkRhdGFQb2ludFR5cGV8fCh5ci5EYXRhUG9pbnRUeXBlPXt9KSl9KTt2YXIgRWU9bChMPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEwsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7TC5lcXVhbHNDYXNlSW5zZW5zaXRpdmU9TC5iaW5hcnlTZWFyY2hMQj1MLnNldEVxdWFscz1MLkZsYXRNYXA9TC5pc1Byb21pc2VBbGxTZXR0bGVkUmVqZWN0aW9uUmVzdWx0PUwuUHJvbWlzZUFsbFNldHRsZWQ9TC5jYWxsV2l0aFRpbWVvdXQ9TC5UaW1lb3V0RXJyb3I9TC5pbnN0cnVtZW50YXRpb25TY29wZUlkPUwuaGFzaEF0dHJpYnV0ZXM9TC5pc05vdE51bGxpc2g9dm9pZCAwO2Z1bmN0aW9uIHZUKHIpe3JldHVybiByIT1udWxsfUwuaXNOb3ROdWxsaXNoPXZUO2Z1bmN0aW9uIElUKHIpe2xldCBlPU9iamVjdC5rZXlzKHIpO3JldHVybiBlLmxlbmd0aD09PTA/XCJcIjooZT1lLnNvcnQoKSxKU09OLnN0cmluZ2lmeShlLm1hcCh0PT5bdCxyW3RdXSkpKX1MLmhhc2hBdHRyaWJ1dGVzPUlUO2Z1bmN0aW9uIE1UKHIpe3ZhciBlLHQ7cmV0dXJuYCR7ci5uYW1lfTokeyhlPXIudmVyc2lvbikhPT1udWxsJiZlIT09dm9pZCAwP2U6XCJcIn06JHsodD1yLnNjaGVtYVVybCkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6XCJcIn1gfUwuaW5zdHJ1bWVudGF0aW9uU2NvcGVJZD1NVDt2YXIgTmk9Y2xhc3MgciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHIucHJvdG90eXBlKX19O0wuVGltZW91dEVycm9yPU5pO2Z1bmN0aW9uIExUKHIsZSl7bGV0IHQsbj1uZXcgUHJvbWlzZShmdW5jdGlvbihzLG8pe3Q9c2V0VGltZW91dChmdW5jdGlvbigpe28obmV3IE5pKFwiT3BlcmF0aW9uIHRpbWVkIG91dC5cIikpfSxlKX0pO3JldHVybiBQcm9taXNlLnJhY2UoW3Isbl0pLnRoZW4oaT0+KGNsZWFyVGltZW91dCh0KSxpKSxpPT57dGhyb3cgY2xlYXJUaW1lb3V0KHQpLGl9KX1MLmNhbGxXaXRoVGltZW91dD1MVDthc3luYyBmdW5jdGlvbiBOVChyKXtyZXR1cm4gUHJvbWlzZS5hbGwoci5tYXAoYXN5bmMgZT0+e3RyeXtyZXR1cm57c3RhdHVzOlwiZnVsZmlsbGVkXCIsdmFsdWU6YXdhaXQgZX19Y2F0Y2godCl7cmV0dXJue3N0YXR1czpcInJlamVjdGVkXCIscmVhc29uOnR9fX0pKX1MLlByb21pc2VBbGxTZXR0bGVkPU5UO2Z1bmN0aW9uIENUKHIpe3JldHVybiByLnN0YXR1cz09PVwicmVqZWN0ZWRcIn1MLmlzUHJvbWlzZUFsbFNldHRsZWRSZWplY3Rpb25SZXN1bHQ9Q1Q7ZnVuY3Rpb24gd1QocixlKXtsZXQgdD1bXTtyZXR1cm4gci5mb3JFYWNoKG49Pnt0LnB1c2goLi4uZShuKSl9KSx0fUwuRmxhdE1hcD13VDtmdW5jdGlvbiB4VChyLGUpe2lmKHIuc2l6ZSE9PWUuc2l6ZSlyZXR1cm4hMTtmb3IobGV0IHQgb2YgcilpZighZS5oYXModCkpcmV0dXJuITE7cmV0dXJuITB9TC5zZXRFcXVhbHM9eFQ7ZnVuY3Rpb24gRFQocixlKXtsZXQgdD0wLG49ci5sZW5ndGgtMTtmb3IoO24tdD4xOyl7bGV0IGk9TWF0aC50cnVuYygobit0KS8yKTtyW2ldPD1lP3Q9aTpuPWktMX1yZXR1cm4gcltuXTw9ZT9uOnJbdF08PWU/dDotMX1MLmJpbmFyeVNlYXJjaExCPURUO2Z1bmN0aW9uIFVUKHIsZSl7cmV0dXJuIHIudG9Mb3dlckNhc2UoKT09PWUudG9Mb3dlckNhc2UoKX1MLmVxdWFsc0Nhc2VJbnNlbnNpdGl2ZT1VVH0pO3ZhciB4dD1sKHZyPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHZyLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZyLkFnZ3JlZ2F0b3JLaW5kPXZvaWQgMDt2YXIgQlQ7KGZ1bmN0aW9uKHIpe3Jbci5EUk9QPTBdPVwiRFJPUFwiLHJbci5TVU09MV09XCJTVU1cIixyW3IuTEFTVF9WQUxVRT0yXT1cIkxBU1RfVkFMVUVcIixyW3IuSElTVE9HUkFNPTNdPVwiSElTVE9HUkFNXCIscltyLkVYUE9ORU5USUFMX0hJU1RPR1JBTT00XT1cIkVYUE9ORU5USUFMX0hJU1RPR1JBTVwifSkoQlQ9dnIuQWdncmVnYXRvcktpbmR8fCh2ci5BZ2dyZWdhdG9yS2luZD17fSkpfSk7dmFyIG5fPWwoQ2k9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2ksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Q2kuRHJvcEFnZ3JlZ2F0b3I9dm9pZCAwO3ZhciBxVD14dCgpLE5hPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5raW5kPXFULkFnZ3JlZ2F0b3JLaW5kLkRST1B9Y3JlYXRlQWNjdW11bGF0aW9uKCl7fW1lcmdlKGUsdCl7fWRpZmYoZSx0KXt9dG9NZXRyaWNEYXRhKGUsdCxuLGkpe319O0NpLkRyb3BBZ2dyZWdhdG9yPU5hfSk7dmFyIGJlPWwobmU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkobmUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7bmUuaXNWYWxpZE5hbWU9bmUuaXNEZXNjcmlwdG9yQ29tcGF0aWJsZVdpdGg9bmUuY3JlYXRlSW5zdHJ1bWVudERlc2NyaXB0b3JXaXRoVmlldz1uZS5jcmVhdGVJbnN0cnVtZW50RGVzY3JpcHRvcj1uZS5JbnN0cnVtZW50VHlwZT12b2lkIDA7dmFyIGlfPShoKCksbShkKSksVlQ9RWUoKSxHVDsoZnVuY3Rpb24ocil7ci5DT1VOVEVSPVwiQ09VTlRFUlwiLHIuSElTVE9HUkFNPVwiSElTVE9HUkFNXCIsci5VUF9ET1dOX0NPVU5URVI9XCJVUF9ET1dOX0NPVU5URVJcIixyLk9CU0VSVkFCTEVfQ09VTlRFUj1cIk9CU0VSVkFCTEVfQ09VTlRFUlwiLHIuT0JTRVJWQUJMRV9HQVVHRT1cIk9CU0VSVkFCTEVfR0FVR0VcIixyLk9CU0VSVkFCTEVfVVBfRE9XTl9DT1VOVEVSPVwiT0JTRVJWQUJMRV9VUF9ET1dOX0NPVU5URVJcIn0pKEdUPW5lLkluc3RydW1lbnRUeXBlfHwobmUuSW5zdHJ1bWVudFR5cGU9e30pKTtmdW5jdGlvbiBIVChyLGUsdCl7dmFyIG4saSxzLG87cmV0dXJuIHNfKHIpfHxpXy5kaWFnLndhcm4oYEludmFsaWQgbWV0cmljIG5hbWU6IFwiJHtyfVwiLiBUaGUgbWV0cmljIG5hbWUgc2hvdWxkIGJlIGEgQVNDSUkgc3RyaW5nIHdpdGggYSBsZW5ndGggbm8gZ3JlYXRlciB0aGFuIDI1NSBjaGFyYWN0ZXJzLmApLHtuYW1lOnIsdHlwZTplLGRlc2NyaXB0aW9uOihuPXQ/LmRlc2NyaXB0aW9uKSE9PW51bGwmJm4hPT12b2lkIDA/bjpcIlwiLHVuaXQ6KGk9dD8udW5pdCkhPT1udWxsJiZpIT09dm9pZCAwP2k6XCJcIix2YWx1ZVR5cGU6KHM9dD8udmFsdWVUeXBlKSE9PW51bGwmJnMhPT12b2lkIDA/czppXy5WYWx1ZVR5cGUuRE9VQkxFLGFkdmljZToobz10Py5hZHZpY2UpIT09bnVsbCYmbyE9PXZvaWQgMD9vOnt9fX1uZS5jcmVhdGVJbnN0cnVtZW50RGVzY3JpcHRvcj1IVDtmdW5jdGlvbiBqVChyLGUpe3ZhciB0LG47cmV0dXJue25hbWU6KHQ9ci5uYW1lKSE9PW51bGwmJnQhPT12b2lkIDA/dDplLm5hbWUsZGVzY3JpcHRpb246KG49ci5kZXNjcmlwdGlvbikhPT1udWxsJiZuIT09dm9pZCAwP246ZS5kZXNjcmlwdGlvbix0eXBlOmUudHlwZSx1bml0OmUudW5pdCx2YWx1ZVR5cGU6ZS52YWx1ZVR5cGUsYWR2aWNlOmUuYWR2aWNlfX1uZS5jcmVhdGVJbnN0cnVtZW50RGVzY3JpcHRvcldpdGhWaWV3PWpUO2Z1bmN0aW9uIEZUKHIsZSl7cmV0dXJuKDAsVlQuZXF1YWxzQ2FzZUluc2Vuc2l0aXZlKShyLm5hbWUsZS5uYW1lKSYmci51bml0PT09ZS51bml0JiZyLnR5cGU9PT1lLnR5cGUmJnIudmFsdWVUeXBlPT09ZS52YWx1ZVR5cGV9bmUuaXNEZXNjcmlwdG9yQ29tcGF0aWJsZVdpdGg9RlQ7dmFyIGtUPS9eW2Etel1bYS16MC05Xy5cXC0vXXswLDI1NH0kL2k7ZnVuY3Rpb24gc18ocil7cmV0dXJuIHIubWF0Y2goa1QpIT1udWxsfW5lLmlzVmFsaWROYW1lPXNffSk7dmFyIG9fPWwoVXQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoVXQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VXQuSGlzdG9ncmFtQWdncmVnYXRvcj1VdC5IaXN0b2dyYW1BY2N1bXVsYXRpb249dm9pZCAwO3ZhciAkVD14dCgpLFhUPXd0KCksQ2E9YmUoKSxXVD1FZSgpO2Z1bmN0aW9uIEtUKHIpe2xldCBlPXIubWFwKCgpPT4wKTtyZXR1cm4gZS5wdXNoKDApLHtidWNrZXRzOntib3VuZGFyaWVzOnIsY291bnRzOmV9LHN1bTowLGNvdW50OjAsaGFzTWluTWF4OiExLG1pbjoxLzAsbWF4Oi0xLzB9fXZhciBEdD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbj0hMCxpPUtUKHQpKXt0aGlzLnN0YXJ0VGltZT1lLHRoaXMuX2JvdW5kYXJpZXM9dCx0aGlzLl9yZWNvcmRNaW5NYXg9bix0aGlzLl9jdXJyZW50PWl9cmVjb3JkKGUpe3RoaXMuX2N1cnJlbnQuY291bnQrPTEsdGhpcy5fY3VycmVudC5zdW0rPWUsdGhpcy5fcmVjb3JkTWluTWF4JiYodGhpcy5fY3VycmVudC5taW49TWF0aC5taW4oZSx0aGlzLl9jdXJyZW50Lm1pbiksdGhpcy5fY3VycmVudC5tYXg9TWF0aC5tYXgoZSx0aGlzLl9jdXJyZW50Lm1heCksdGhpcy5fY3VycmVudC5oYXNNaW5NYXg9ITApO2xldCB0PSgwLFdULmJpbmFyeVNlYXJjaExCKSh0aGlzLl9ib3VuZGFyaWVzLGUpO3RoaXMuX2N1cnJlbnQuYnVja2V0cy5jb3VudHNbdCsxXSs9MX1zZXRTdGFydFRpbWUoZSl7dGhpcy5zdGFydFRpbWU9ZX10b1BvaW50VmFsdWUoKXtyZXR1cm4gdGhpcy5fY3VycmVudH19O1V0Lkhpc3RvZ3JhbUFjY3VtdWxhdGlvbj1EdDt2YXIgd2E9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9ib3VuZGFyaWVzPWUsdGhpcy5fcmVjb3JkTWluTWF4PXQsdGhpcy5raW5kPSRULkFnZ3JlZ2F0b3JLaW5kLkhJU1RPR1JBTX1jcmVhdGVBY2N1bXVsYXRpb24oZSl7cmV0dXJuIG5ldyBEdChlLHRoaXMuX2JvdW5kYXJpZXMsdGhpcy5fcmVjb3JkTWluTWF4KX1tZXJnZShlLHQpe2xldCBuPWUudG9Qb2ludFZhbHVlKCksaT10LnRvUG9pbnRWYWx1ZSgpLHM9bi5idWNrZXRzLmNvdW50cyxvPWkuYnVja2V0cy5jb3VudHMsYT1uZXcgQXJyYXkocy5sZW5ndGgpO2ZvcihsZXQgXz0wO188cy5sZW5ndGg7XysrKWFbX109c1tfXStvW19dO2xldCB1PTEvMCxjPS0xLzA7cmV0dXJuIHRoaXMuX3JlY29yZE1pbk1heCYmKG4uaGFzTWluTWF4JiZpLmhhc01pbk1heD8odT1NYXRoLm1pbihuLm1pbixpLm1pbiksYz1NYXRoLm1heChuLm1heCxpLm1heCkpOm4uaGFzTWluTWF4Pyh1PW4ubWluLGM9bi5tYXgpOmkuaGFzTWluTWF4JiYodT1pLm1pbixjPWkubWF4KSksbmV3IER0KGUuc3RhcnRUaW1lLG4uYnVja2V0cy5ib3VuZGFyaWVzLHRoaXMuX3JlY29yZE1pbk1heCx7YnVja2V0czp7Ym91bmRhcmllczpuLmJ1Y2tldHMuYm91bmRhcmllcyxjb3VudHM6YX0sY291bnQ6bi5jb3VudCtpLmNvdW50LHN1bTpuLnN1bStpLnN1bSxoYXNNaW5NYXg6dGhpcy5fcmVjb3JkTWluTWF4JiYobi5oYXNNaW5NYXh8fGkuaGFzTWluTWF4KSxtaW46dSxtYXg6Y30pfWRpZmYoZSx0KXtsZXQgbj1lLnRvUG9pbnRWYWx1ZSgpLGk9dC50b1BvaW50VmFsdWUoKSxzPW4uYnVja2V0cy5jb3VudHMsbz1pLmJ1Y2tldHMuY291bnRzLGE9bmV3IEFycmF5KHMubGVuZ3RoKTtmb3IobGV0IHU9MDt1PHMubGVuZ3RoO3UrKylhW3VdPW9bdV0tc1t1XTtyZXR1cm4gbmV3IER0KHQuc3RhcnRUaW1lLG4uYnVja2V0cy5ib3VuZGFyaWVzLHRoaXMuX3JlY29yZE1pbk1heCx7YnVja2V0czp7Ym91bmRhcmllczpuLmJ1Y2tldHMuYm91bmRhcmllcyxjb3VudHM6YX0sY291bnQ6aS5jb3VudC1uLmNvdW50LHN1bTppLnN1bS1uLnN1bSxoYXNNaW5NYXg6ITEsbWluOjEvMCxtYXg6LTEvMH0pfXRvTWV0cmljRGF0YShlLHQsbixpKXtyZXR1cm57ZGVzY3JpcHRvcjplLGFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHk6dCxkYXRhUG9pbnRUeXBlOlhULkRhdGFQb2ludFR5cGUuSElTVE9HUkFNLGRhdGFQb2ludHM6bi5tYXAoKFtzLG9dKT0+e2xldCBhPW8udG9Qb2ludFZhbHVlKCksdT1lLnR5cGU9PT1DYS5JbnN0cnVtZW50VHlwZS5VUF9ET1dOX0NPVU5URVJ8fGUudHlwZT09PUNhLkluc3RydW1lbnRUeXBlLk9CU0VSVkFCTEVfR0FVR0V8fGUudHlwZT09PUNhLkluc3RydW1lbnRUeXBlLk9CU0VSVkFCTEVfVVBfRE9XTl9DT1VOVEVSO3JldHVybnthdHRyaWJ1dGVzOnMsc3RhcnRUaW1lOm8uc3RhcnRUaW1lLGVuZFRpbWU6aSx2YWx1ZTp7bWluOmEuaGFzTWluTWF4P2EubWluOnZvaWQgMCxtYXg6YS5oYXNNaW5NYXg/YS5tYXg6dm9pZCAwLHN1bTp1P3ZvaWQgMDphLnN1bSxidWNrZXRzOmEuYnVja2V0cyxjb3VudDphLmNvdW50fX19KX19fTtVdC5IaXN0b2dyYW1BZ2dyZWdhdG9yPXdhfSk7dmFyIGFfPWwod2k9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkod2ksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7d2kuQnVja2V0cz12b2lkIDA7dmFyIHhhPWNsYXNzIHJ7Y29uc3RydWN0b3IoZT1uZXcgRGEsdD0wLG49MCxpPTApe3RoaXMuYmFja2luZz1lLHRoaXMuaW5kZXhCYXNlPXQsdGhpcy5pbmRleFN0YXJ0PW4sdGhpcy5pbmRleEVuZD1pfWdldCBvZmZzZXQoKXtyZXR1cm4gdGhpcy5pbmRleFN0YXJ0fWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5iYWNraW5nLmxlbmd0aD09PTB8fHRoaXMuaW5kZXhFbmQ9PT10aGlzLmluZGV4U3RhcnQmJnRoaXMuYXQoMCk9PT0wPzA6dGhpcy5pbmRleEVuZC10aGlzLmluZGV4U3RhcnQrMX1jb3VudHMoKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOnRoaXMubGVuZ3RofSwoZSx0KT0+dGhpcy5hdCh0KSl9YXQoZSl7bGV0IHQ9dGhpcy5pbmRleEJhc2UtdGhpcy5pbmRleFN0YXJ0O3JldHVybiBlPHQmJihlKz10aGlzLmJhY2tpbmcubGVuZ3RoKSxlLT10LHRoaXMuYmFja2luZy5jb3VudEF0KGUpfWluY3JlbWVudEJ1Y2tldChlLHQpe3RoaXMuYmFja2luZy5pbmNyZW1lbnQoZSx0KX1kZWNyZW1lbnRCdWNrZXQoZSx0KXt0aGlzLmJhY2tpbmcuZGVjcmVtZW50KGUsdCl9dHJpbSgpe2ZvcihsZXQgZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKWlmKHRoaXMuYXQoZSkhPT0wKXt0aGlzLmluZGV4U3RhcnQrPWU7YnJlYWt9ZWxzZSBpZihlPT09dGhpcy5sZW5ndGgtMSl7dGhpcy5pbmRleFN0YXJ0PXRoaXMuaW5kZXhFbmQ9dGhpcy5pbmRleEJhc2U9MDtyZXR1cm59Zm9yKGxldCBlPXRoaXMubGVuZ3RoLTE7ZT49MDtlLS0paWYodGhpcy5hdChlKSE9PTApe3RoaXMuaW5kZXhFbmQtPXRoaXMubGVuZ3RoLWUtMTticmVha310aGlzLl9yb3RhdGUoKX1kb3duc2NhbGUoZSl7dGhpcy5fcm90YXRlKCk7bGV0IHQ9MSt0aGlzLmluZGV4RW5kLXRoaXMuaW5kZXhTdGFydCxuPTE8PGUsaT0wLHM9MDtmb3IobGV0IG89dGhpcy5pbmRleFN0YXJ0O288PXRoaXMuaW5kZXhFbmQ7KXtsZXQgYT1vJW47YTwwJiYoYSs9bik7Zm9yKGxldCB1PWE7dTxuJiZpPHQ7dSsrKXRoaXMuX3JlbG9jYXRlQnVja2V0KHMsaSksaSsrLG8rKztzKyt9dGhpcy5pbmRleFN0YXJ0Pj49ZSx0aGlzLmluZGV4RW5kPj49ZSx0aGlzLmluZGV4QmFzZT10aGlzLmluZGV4U3RhcnR9Y2xvbmUoKXtyZXR1cm4gbmV3IHIodGhpcy5iYWNraW5nLmNsb25lKCksdGhpcy5pbmRleEJhc2UsdGhpcy5pbmRleFN0YXJ0LHRoaXMuaW5kZXhFbmQpfV9yb3RhdGUoKXtsZXQgZT10aGlzLmluZGV4QmFzZS10aGlzLmluZGV4U3RhcnQ7ZSE9PTAmJihlPjA/KHRoaXMuYmFja2luZy5yZXZlcnNlKDAsdGhpcy5iYWNraW5nLmxlbmd0aCksdGhpcy5iYWNraW5nLnJldmVyc2UoMCxlKSx0aGlzLmJhY2tpbmcucmV2ZXJzZShlLHRoaXMuYmFja2luZy5sZW5ndGgpKToodGhpcy5iYWNraW5nLnJldmVyc2UoMCx0aGlzLmJhY2tpbmcubGVuZ3RoKSx0aGlzLmJhY2tpbmcucmV2ZXJzZSgwLHRoaXMuYmFja2luZy5sZW5ndGgrZSkpLHRoaXMuaW5kZXhCYXNlPXRoaXMuaW5kZXhTdGFydCl9X3JlbG9jYXRlQnVja2V0KGUsdCl7ZSE9PXQmJnRoaXMuaW5jcmVtZW50QnVja2V0KGUsdGhpcy5iYWNraW5nLmVtcHR5QnVja2V0KHQpKX19O3dpLkJ1Y2tldHM9eGE7dmFyIERhPWNsYXNzIHJ7Y29uc3RydWN0b3IoZT1bMF0pe3RoaXMuX2NvdW50cz1lfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fY291bnRzLmxlbmd0aH1jb3VudEF0KGUpe3JldHVybiB0aGlzLl9jb3VudHNbZV19Z3Jvd1RvKGUsdCxuKXtsZXQgaT1uZXcgQXJyYXkoZSkuZmlsbCgwKTtpLnNwbGljZShuLHRoaXMuX2NvdW50cy5sZW5ndGgtdCwuLi50aGlzLl9jb3VudHMuc2xpY2UodCkpLGkuc3BsaWNlKDAsdCwuLi50aGlzLl9jb3VudHMuc2xpY2UoMCx0KSksdGhpcy5fY291bnRzPWl9cmV2ZXJzZShlLHQpe2xldCBuPU1hdGguZmxvb3IoKGUrdCkvMiktZTtmb3IobGV0IGk9MDtpPG47aSsrKXtsZXQgcz10aGlzLl9jb3VudHNbZStpXTt0aGlzLl9jb3VudHNbZStpXT10aGlzLl9jb3VudHNbdC1pLTFdLHRoaXMuX2NvdW50c1t0LWktMV09c319ZW1wdHlCdWNrZXQoZSl7bGV0IHQ9dGhpcy5fY291bnRzW2VdO3JldHVybiB0aGlzLl9jb3VudHNbZV09MCx0fWluY3JlbWVudChlLHQpe3RoaXMuX2NvdW50c1tlXSs9dH1kZWNyZW1lbnQoZSx0KXt0aGlzLl9jb3VudHNbZV0+PXQ/dGhpcy5fY291bnRzW2VdLT10OnRoaXMuX2NvdW50c1tlXT0wfWNsb25lKCl7cmV0dXJuIG5ldyByKFsuLi50aGlzLl9jb3VudHNdKX19fSk7dmFyIEJhPWwoUT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShRLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1EuZ2V0U2lnbmlmaWNhbmQ9US5nZXROb3JtYWxCYXNlMj1RLk1JTl9WQUxVRT1RLk1BWF9OT1JNQUxfRVhQT05FTlQ9US5NSU5fTk9STUFMX0VYUE9ORU5UPVEuU0lHTklGSUNBTkRfV0lEVEg9dm9pZCAwO1EuU0lHTklGSUNBTkRfV0lEVEg9NTI7dmFyIHpUPTIxNDY0MzUwNzIsWVQ9MTA0ODU3NSxVYT0xMDIzO1EuTUlOX05PUk1BTF9FWFBPTkVOVD0tVWErMTtRLk1BWF9OT1JNQUxfRVhQT05FTlQ9VWE7US5NSU5fVkFMVUU9TWF0aC5wb3coMiwtMTAyMik7ZnVuY3Rpb24gUVQocil7bGV0IGU9bmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcig4KSk7cmV0dXJuIGUuc2V0RmxvYXQ2NCgwLHIpLCgoZS5nZXRVaW50MzIoMCkmelQpPj4yMCktVWF9US5nZXROb3JtYWxCYXNlMj1RVDtmdW5jdGlvbiBaVChyKXtsZXQgZT1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDgpKTtlLnNldEZsb2F0NjQoMCxyKTtsZXQgdD1lLmdldFVpbnQzMigwKSxuPWUuZ2V0VWludDMyKDQpO3JldHVybih0JllUKSpNYXRoLnBvdygyLDMyKStufVEuZ2V0U2lnbmlmaWNhbmQ9WlR9KTt2YXIgeGk9bChCdD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShCdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtCdC5uZXh0R3JlYXRlclNxdWFyZT1CdC5sZGV4cD12b2lkIDA7ZnVuY3Rpb24gSlQocixlKXtyZXR1cm4gcj09PTB8fHI9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl8fHI9PT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl8fE51bWJlci5pc05hTihyKT9yOnIqTWF0aC5wb3coMixlKX1CdC5sZGV4cD1KVDtmdW5jdGlvbiBlUyhyKXtyZXR1cm4gci0tLHJ8PXI+PjEscnw9cj4+MixyfD1yPj40LHJ8PXI+Pjgscnw9cj4+MTYscisrLHJ9QnQubmV4dEdyZWF0ZXJTcXVhcmU9ZVN9KTt2YXIgVWk9bChEaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShEaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtEaS5NYXBwaW5nRXJyb3I9dm9pZCAwO3ZhciBxYT1jbGFzcyBleHRlbmRzIEVycm9ye307RGkuTWFwcGluZ0Vycm9yPXFhfSk7dmFyIGNfPWwoQmk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoQmksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7QmkuRXhwb25lbnRNYXBwaW5nPXZvaWQgMDt2YXIgcXQ9QmEoKSx0Uz14aSgpLHVfPVVpKCksVmE9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fc2hpZnQ9LWV9bWFwVG9JbmRleChlKXtpZihlPHF0Lk1JTl9WQUxVRSlyZXR1cm4gdGhpcy5fbWluTm9ybWFsTG93ZXJCb3VuZGFyeUluZGV4KCk7bGV0IHQ9cXQuZ2V0Tm9ybWFsQmFzZTIoZSksbj10aGlzLl9yaWdodFNoaWZ0KHF0LmdldFNpZ25pZmljYW5kKGUpLTEscXQuU0lHTklGSUNBTkRfV0lEVEgpO3JldHVybiB0K24+PnRoaXMuX3NoaWZ0fWxvd2VyQm91bmRhcnkoZSl7bGV0IHQ9dGhpcy5fbWluTm9ybWFsTG93ZXJCb3VuZGFyeUluZGV4KCk7aWYoZTx0KXRocm93IG5ldyB1Xy5NYXBwaW5nRXJyb3IoYHVuZGVyZmxvdzogJHtlfSBpcyA8IG1pbmltdW0gbG93ZXIgYm91bmRhcnk6ICR7dH1gKTtsZXQgbj10aGlzLl9tYXhOb3JtYWxMb3dlckJvdW5kYXJ5SW5kZXgoKTtpZihlPm4pdGhyb3cgbmV3IHVfLk1hcHBpbmdFcnJvcihgb3ZlcmZsb3c6ICR7ZX0gaXMgPiBtYXhpbXVtIGxvd2VyIGJvdW5kYXJ5OiAke259YCk7cmV0dXJuIHRTLmxkZXhwKDEsZTw8dGhpcy5fc2hpZnQpfWdldCBzY2FsZSgpe3JldHVybiB0aGlzLl9zaGlmdD09PTA/MDotdGhpcy5fc2hpZnR9X21pbk5vcm1hbExvd2VyQm91bmRhcnlJbmRleCgpe2xldCBlPXF0Lk1JTl9OT1JNQUxfRVhQT05FTlQ+PnRoaXMuX3NoaWZ0O3JldHVybiB0aGlzLl9zaGlmdDwyJiZlLS0sZX1fbWF4Tm9ybWFsTG93ZXJCb3VuZGFyeUluZGV4KCl7cmV0dXJuIHF0Lk1BWF9OT1JNQUxfRVhQT05FTlQ+PnRoaXMuX3NoaWZ0fV9yaWdodFNoaWZ0KGUsdCl7cmV0dXJuIE1hdGguZmxvb3IoZSpNYXRoLnBvdygyLC10KSl9fTtCaS5FeHBvbmVudE1hcHBpbmc9VmF9KTt2YXIgX189bChxaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShxaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtxaS5Mb2dhcml0aG1NYXBwaW5nPXZvaWQgMDt2YXIgVnQ9QmEoKSxsXz14aSgpLGRfPVVpKCksR2E9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fc2NhbGU9ZSx0aGlzLl9zY2FsZUZhY3Rvcj1sXy5sZGV4cChNYXRoLkxPRzJFLGUpLHRoaXMuX2ludmVyc2VGYWN0b3I9bF8ubGRleHAoTWF0aC5MTjIsLWUpfW1hcFRvSW5kZXgoZSl7aWYoZTw9VnQuTUlOX1ZBTFVFKXJldHVybiB0aGlzLl9taW5Ob3JtYWxMb3dlckJvdW5kYXJ5SW5kZXgoKS0xO2lmKFZ0LmdldFNpZ25pZmljYW5kKGUpPT09MClyZXR1cm4oVnQuZ2V0Tm9ybWFsQmFzZTIoZSk8PHRoaXMuX3NjYWxlKS0xO2xldCB0PU1hdGguZmxvb3IoTWF0aC5sb2coZSkqdGhpcy5fc2NhbGVGYWN0b3IpLG49dGhpcy5fbWF4Tm9ybWFsTG93ZXJCb3VuZGFyeUluZGV4KCk7cmV0dXJuIHQ+PW4/bjp0fWxvd2VyQm91bmRhcnkoZSl7bGV0IHQ9dGhpcy5fbWF4Tm9ybWFsTG93ZXJCb3VuZGFyeUluZGV4KCk7aWYoZT49dCl7aWYoZT09PXQpcmV0dXJuIDIqTWF0aC5leHAoKGUtKDE8PHRoaXMuX3NjYWxlKSkvdGhpcy5fc2NhbGVGYWN0b3IpO3Rocm93IG5ldyBkXy5NYXBwaW5nRXJyb3IoYG92ZXJmbG93OiAke2V9IGlzID4gbWF4aW11bSBsb3dlciBib3VuZGFyeTogJHt0fWApfWxldCBuPXRoaXMuX21pbk5vcm1hbExvd2VyQm91bmRhcnlJbmRleCgpO2lmKGU8PW4pe2lmKGU9PT1uKXJldHVybiBWdC5NSU5fVkFMVUU7aWYoZT09PW4tMSlyZXR1cm4gTWF0aC5leHAoKGUrKDE8PHRoaXMuX3NjYWxlKSkvdGhpcy5fc2NhbGVGYWN0b3IpLzI7dGhyb3cgbmV3IGRfLk1hcHBpbmdFcnJvcihgb3ZlcmZsb3c6ICR7ZX0gaXMgPCBtaW5pbXVtIGxvd2VyIGJvdW5kYXJ5OiAke259YCl9cmV0dXJuIE1hdGguZXhwKGUqdGhpcy5faW52ZXJzZUZhY3Rvcil9Z2V0IHNjYWxlKCl7cmV0dXJuIHRoaXMuX3NjYWxlfV9taW5Ob3JtYWxMb3dlckJvdW5kYXJ5SW5kZXgoKXtyZXR1cm4gVnQuTUlOX05PUk1BTF9FWFBPTkVOVDw8dGhpcy5fc2NhbGV9X21heE5vcm1hbExvd2VyQm91bmRhcnlJbmRleCgpe3JldHVybihWdC5NQVhfTk9STUFMX0VYUE9ORU5UKzE8PHRoaXMuX3NjYWxlKS0xfX07cWkuTG9nYXJpdGhtTWFwcGluZz1HYX0pO3ZhciBmXz1sKFZpPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFZpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1ZpLmdldE1hcHBpbmc9dm9pZCAwO3ZhciByUz1jXygpLG5TPV9fKCksaVM9VWkoKSxwXz0tMTAsaF89MjAsc1M9QXJyYXkuZnJvbSh7bGVuZ3RoOjMxfSwocixlKT0+ZT4xMD9uZXcgblMuTG9nYXJpdGhtTWFwcGluZyhlLTEwKTpuZXcgclMuRXhwb25lbnRNYXBwaW5nKGUtMTApKTtmdW5jdGlvbiBvUyhyKXtpZihyPmhffHxyPHBfKXRocm93IG5ldyBpUy5NYXBwaW5nRXJyb3IoYGV4cGVjdGVkIHNjYWxlID49ICR7cF99ICYmIDw9ICR7aF99LCBnb3Q6ICR7cn1gKTtyZXR1cm4gc1NbcisxMF19VmkuZ2V0TWFwcGluZz1vU30pO3ZhciBnXz1sKEh0PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0h0LkV4cG9uZW50aWFsSGlzdG9ncmFtQWdncmVnYXRvcj1IdC5FeHBvbmVudGlhbEhpc3RvZ3JhbUFjY3VtdWxhdGlvbj12b2lkIDA7dmFyIGFTPXh0KCksdVM9d3QoKSxjUz0oaCgpLG0oZCkpLEhhPWJlKCksRV89YV8oKSxtXz1mXygpLGxTPXhpKCksR3Q9Y2xhc3Mgcntjb25zdHJ1Y3RvcihlLHQpe3RoaXMubG93PWUsdGhpcy5oaWdoPXR9c3RhdGljIGNvbWJpbmUoZSx0KXtyZXR1cm4gbmV3IHIoTWF0aC5taW4oZS5sb3csdC5sb3cpLE1hdGgubWF4KGUuaGlnaCx0LmhpZ2gpKX19LGRTPTIwLF9TPTE2MCxqYT0yLEdpPWNsYXNzIHJ7Y29uc3RydWN0b3IoZT1lLHQ9X1Msbj0hMCxpPTAscz0wLG89MCxhPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSx1PU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxjPW5ldyBFXy5CdWNrZXRzLF89bmV3IEVfLkJ1Y2tldHMscD0oMCxtXy5nZXRNYXBwaW5nKShkUykpe3RoaXMuc3RhcnRUaW1lPWUsdGhpcy5fbWF4U2l6ZT10LHRoaXMuX3JlY29yZE1pbk1heD1uLHRoaXMuX3N1bT1pLHRoaXMuX2NvdW50PXMsdGhpcy5femVyb0NvdW50PW8sdGhpcy5fbWluPWEsdGhpcy5fbWF4PXUsdGhpcy5fcG9zaXRpdmU9Yyx0aGlzLl9uZWdhdGl2ZT1fLHRoaXMuX21hcHBpbmc9cCx0aGlzLl9tYXhTaXplPGphJiYoY1MuZGlhZy53YXJuKGBFeHBvbmVudGlhbCBIaXN0b2dyYW0gTWF4IFNpemUgc2V0IHRvICR7dGhpcy5fbWF4U2l6ZX0sICAgICAgICAgICAgICAgICBjaGFuZ2luZyB0byB0aGUgbWluaW11bSBzaXplIG9mOiAke2phfWApLHRoaXMuX21heFNpemU9amEpfXJlY29yZChlKXt0aGlzLnVwZGF0ZUJ5SW5jcmVtZW50KGUsMSl9c2V0U3RhcnRUaW1lKGUpe3RoaXMuc3RhcnRUaW1lPWV9dG9Qb2ludFZhbHVlKCl7cmV0dXJue2hhc01pbk1heDp0aGlzLl9yZWNvcmRNaW5NYXgsbWluOnRoaXMubWluLG1heDp0aGlzLm1heCxzdW06dGhpcy5zdW0scG9zaXRpdmU6e29mZnNldDp0aGlzLnBvc2l0aXZlLm9mZnNldCxidWNrZXRDb3VudHM6dGhpcy5wb3NpdGl2ZS5jb3VudHMoKX0sbmVnYXRpdmU6e29mZnNldDp0aGlzLm5lZ2F0aXZlLm9mZnNldCxidWNrZXRDb3VudHM6dGhpcy5uZWdhdGl2ZS5jb3VudHMoKX0sY291bnQ6dGhpcy5jb3VudCxzY2FsZTp0aGlzLnNjYWxlLHplcm9Db3VudDp0aGlzLnplcm9Db3VudH19Z2V0IHN1bSgpe3JldHVybiB0aGlzLl9zdW19Z2V0IG1pbigpe3JldHVybiB0aGlzLl9taW59Z2V0IG1heCgpe3JldHVybiB0aGlzLl9tYXh9Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuX2NvdW50fWdldCB6ZXJvQ291bnQoKXtyZXR1cm4gdGhpcy5femVyb0NvdW50fWdldCBzY2FsZSgpe3JldHVybiB0aGlzLl9jb3VudD09PXRoaXMuX3plcm9Db3VudD8wOnRoaXMuX21hcHBpbmcuc2NhbGV9Z2V0IHBvc2l0aXZlKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aXZlfWdldCBuZWdhdGl2ZSgpe3JldHVybiB0aGlzLl9uZWdhdGl2ZX11cGRhdGVCeUluY3JlbWVudChlLHQpe2lmKGU+dGhpcy5fbWF4JiYodGhpcy5fbWF4PWUpLGU8dGhpcy5fbWluJiYodGhpcy5fbWluPWUpLHRoaXMuX2NvdW50Kz10LGU9PT0wKXt0aGlzLl96ZXJvQ291bnQrPXQ7cmV0dXJufXRoaXMuX3N1bSs9ZSp0LGU+MD90aGlzLl91cGRhdGVCdWNrZXRzKHRoaXMuX3Bvc2l0aXZlLGUsdCk6dGhpcy5fdXBkYXRlQnVja2V0cyh0aGlzLl9uZWdhdGl2ZSwtZSx0KX1tZXJnZShlKXt0aGlzLl9jb3VudD09PTA/KHRoaXMuX21pbj1lLm1pbix0aGlzLl9tYXg9ZS5tYXgpOmUuY291bnQhPT0wJiYoZS5taW48dGhpcy5taW4mJih0aGlzLl9taW49ZS5taW4pLGUubWF4PnRoaXMubWF4JiYodGhpcy5fbWF4PWUubWF4KSksdGhpcy5zdGFydFRpbWU9ZS5zdGFydFRpbWUsdGhpcy5fc3VtKz1lLnN1bSx0aGlzLl9jb3VudCs9ZS5jb3VudCx0aGlzLl96ZXJvQ291bnQrPWUuemVyb0NvdW50O2xldCB0PXRoaXMuX21pblNjYWxlKGUpO3RoaXMuX2Rvd25zY2FsZSh0aGlzLnNjYWxlLXQpLHRoaXMuX21lcmdlQnVja2V0cyh0aGlzLnBvc2l0aXZlLGUsZS5wb3NpdGl2ZSx0KSx0aGlzLl9tZXJnZUJ1Y2tldHModGhpcy5uZWdhdGl2ZSxlLGUubmVnYXRpdmUsdCl9ZGlmZihlKXt0aGlzLl9taW49MS8wLHRoaXMuX21heD0tMS8wLHRoaXMuX3N1bS09ZS5zdW0sdGhpcy5fY291bnQtPWUuY291bnQsdGhpcy5femVyb0NvdW50LT1lLnplcm9Db3VudDtsZXQgdD10aGlzLl9taW5TY2FsZShlKTt0aGlzLl9kb3duc2NhbGUodGhpcy5zY2FsZS10KSx0aGlzLl9kaWZmQnVja2V0cyh0aGlzLnBvc2l0aXZlLGUsZS5wb3NpdGl2ZSx0KSx0aGlzLl9kaWZmQnVja2V0cyh0aGlzLm5lZ2F0aXZlLGUsZS5uZWdhdGl2ZSx0KX1jbG9uZSgpe3JldHVybiBuZXcgcih0aGlzLnN0YXJ0VGltZSx0aGlzLl9tYXhTaXplLHRoaXMuX3JlY29yZE1pbk1heCx0aGlzLl9zdW0sdGhpcy5fY291bnQsdGhpcy5femVyb0NvdW50LHRoaXMuX21pbix0aGlzLl9tYXgsdGhpcy5wb3NpdGl2ZS5jbG9uZSgpLHRoaXMubmVnYXRpdmUuY2xvbmUoKSx0aGlzLl9tYXBwaW5nKX1fdXBkYXRlQnVja2V0cyhlLHQsbil7bGV0IGk9dGhpcy5fbWFwcGluZy5tYXBUb0luZGV4KHQpLHM9ITEsbz0wLGE9MDtpZihlLmxlbmd0aD09PTA/KGUuaW5kZXhTdGFydD1pLGUuaW5kZXhFbmQ9ZS5pbmRleFN0YXJ0LGUuaW5kZXhCYXNlPWUuaW5kZXhTdGFydCk6aTxlLmluZGV4U3RhcnQmJmUuaW5kZXhFbmQtaT49dGhpcy5fbWF4U2l6ZT8ocz0hMCxhPWksbz1lLmluZGV4RW5kKTppPmUuaW5kZXhFbmQmJmktZS5pbmRleFN0YXJ0Pj10aGlzLl9tYXhTaXplJiYocz0hMCxhPWUuaW5kZXhTdGFydCxvPWkpLHMpe2xldCB1PXRoaXMuX2NoYW5nZVNjYWxlKG8sYSk7dGhpcy5fZG93bnNjYWxlKHUpLGk9dGhpcy5fbWFwcGluZy5tYXBUb0luZGV4KHQpfXRoaXMuX2luY3JlbWVudEluZGV4QnkoZSxpLG4pfV9pbmNyZW1lbnRJbmRleEJ5KGUsdCxuKXtpZihuPT09MClyZXR1cm47aWYodDxlLmluZGV4U3RhcnQpe2xldCBzPWUuaW5kZXhFbmQtdDtzPj1lLmJhY2tpbmcubGVuZ3RoJiZ0aGlzLl9ncm93KGUscysxKSxlLmluZGV4U3RhcnQ9dH1lbHNlIGlmKHQ+ZS5pbmRleEVuZCl7bGV0IHM9dC1lLmluZGV4U3RhcnQ7cz49ZS5iYWNraW5nLmxlbmd0aCYmdGhpcy5fZ3JvdyhlLHMrMSksZS5pbmRleEVuZD10fWxldCBpPXQtZS5pbmRleEJhc2U7aTwwJiYoaSs9ZS5iYWNraW5nLmxlbmd0aCksZS5pbmNyZW1lbnRCdWNrZXQoaSxuKX1fZ3JvdyhlLHQpe2xldCBuPWUuYmFja2luZy5sZW5ndGgsaT1lLmluZGV4QmFzZS1lLmluZGV4U3RhcnQscz1uLWksbz0oMCxsUy5uZXh0R3JlYXRlclNxdWFyZSkodCk7bz50aGlzLl9tYXhTaXplJiYobz10aGlzLl9tYXhTaXplKTtsZXQgYT1vLWk7ZS5iYWNraW5nLmdyb3dUbyhvLHMsYSl9X2NoYW5nZVNjYWxlKGUsdCl7bGV0IG49MDtmb3IoO2UtdD49dGhpcy5fbWF4U2l6ZTspZT4+PTEsdD4+PTEsbisrO3JldHVybiBufV9kb3duc2NhbGUoZSl7aWYoZT09PTApcmV0dXJuO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoYGltcG9zc2libGUgY2hhbmdlIG9mIHNjYWxlOiAke3RoaXMuc2NhbGV9YCk7bGV0IHQ9dGhpcy5fbWFwcGluZy5zY2FsZS1lO3RoaXMuX3Bvc2l0aXZlLmRvd25zY2FsZShlKSx0aGlzLl9uZWdhdGl2ZS5kb3duc2NhbGUoZSksdGhpcy5fbWFwcGluZz0oMCxtXy5nZXRNYXBwaW5nKSh0KX1fbWluU2NhbGUoZSl7bGV0IHQ9TWF0aC5taW4odGhpcy5zY2FsZSxlLnNjYWxlKSxuPUd0LmNvbWJpbmUodGhpcy5faGlnaExvd0F0U2NhbGUodGhpcy5wb3NpdGl2ZSx0aGlzLnNjYWxlLHQpLHRoaXMuX2hpZ2hMb3dBdFNjYWxlKGUucG9zaXRpdmUsZS5zY2FsZSx0KSksaT1HdC5jb21iaW5lKHRoaXMuX2hpZ2hMb3dBdFNjYWxlKHRoaXMubmVnYXRpdmUsdGhpcy5zY2FsZSx0KSx0aGlzLl9oaWdoTG93QXRTY2FsZShlLm5lZ2F0aXZlLGUuc2NhbGUsdCkpO3JldHVybiBNYXRoLm1pbih0LXRoaXMuX2NoYW5nZVNjYWxlKG4uaGlnaCxuLmxvdyksdC10aGlzLl9jaGFuZ2VTY2FsZShpLmhpZ2gsaS5sb3cpKX1faGlnaExvd0F0U2NhbGUoZSx0LG4pe2lmKGUubGVuZ3RoPT09MClyZXR1cm4gbmV3IEd0KDAsLTEpO2xldCBpPXQtbjtyZXR1cm4gbmV3IEd0KGUuaW5kZXhTdGFydD4+aSxlLmluZGV4RW5kPj5pKX1fbWVyZ2VCdWNrZXRzKGUsdCxuLGkpe2xldCBzPW4ub2Zmc2V0LG89dC5zY2FsZS1pO2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSsrKXRoaXMuX2luY3JlbWVudEluZGV4QnkoZSxzK2E+Pm8sbi5hdChhKSl9X2RpZmZCdWNrZXRzKGUsdCxuLGkpe2xldCBzPW4ub2Zmc2V0LG89dC5zY2FsZS1pO2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSsrKXtsZXQgYz0ocythPj5vKS1lLmluZGV4QmFzZTtjPDAmJihjKz1lLmJhY2tpbmcubGVuZ3RoKSxlLmRlY3JlbWVudEJ1Y2tldChjLG4uYXQoYSkpfWUudHJpbSgpfX07SHQuRXhwb25lbnRpYWxIaXN0b2dyYW1BY2N1bXVsYXRpb249R2k7dmFyIEZhPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fbWF4U2l6ZT1lLHRoaXMuX3JlY29yZE1pbk1heD10LHRoaXMua2luZD1hUy5BZ2dyZWdhdG9yS2luZC5FWFBPTkVOVElBTF9ISVNUT0dSQU19Y3JlYXRlQWNjdW11bGF0aW9uKGUpe3JldHVybiBuZXcgR2koZSx0aGlzLl9tYXhTaXplLHRoaXMuX3JlY29yZE1pbk1heCl9bWVyZ2UoZSx0KXtsZXQgbj10LmNsb25lKCk7cmV0dXJuIG4ubWVyZ2UoZSksbn1kaWZmKGUsdCl7bGV0IG49dC5jbG9uZSgpO3JldHVybiBuLmRpZmYoZSksbn10b01ldHJpY0RhdGEoZSx0LG4saSl7cmV0dXJue2Rlc2NyaXB0b3I6ZSxhZ2dyZWdhdGlvblRlbXBvcmFsaXR5OnQsZGF0YVBvaW50VHlwZTp1Uy5EYXRhUG9pbnRUeXBlLkVYUE9ORU5USUFMX0hJU1RPR1JBTSxkYXRhUG9pbnRzOm4ubWFwKChbcyxvXSk9PntsZXQgYT1vLnRvUG9pbnRWYWx1ZSgpLHU9ZS50eXBlPT09SGEuSW5zdHJ1bWVudFR5cGUuVVBfRE9XTl9DT1VOVEVSfHxlLnR5cGU9PT1IYS5JbnN0cnVtZW50VHlwZS5PQlNFUlZBQkxFX0dBVUdFfHxlLnR5cGU9PT1IYS5JbnN0cnVtZW50VHlwZS5PQlNFUlZBQkxFX1VQX0RPV05fQ09VTlRFUjtyZXR1cm57YXR0cmlidXRlczpzLHN0YXJ0VGltZTpvLnN0YXJ0VGltZSxlbmRUaW1lOmksdmFsdWU6e21pbjphLmhhc01pbk1heD9hLm1pbjp2b2lkIDAsbWF4OmEuaGFzTWluTWF4P2EubWF4OnZvaWQgMCxzdW06dT92b2lkIDA6YS5zdW0scG9zaXRpdmU6e29mZnNldDphLnBvc2l0aXZlLm9mZnNldCxidWNrZXRDb3VudHM6YS5wb3NpdGl2ZS5idWNrZXRDb3VudHN9LG5lZ2F0aXZlOntvZmZzZXQ6YS5uZWdhdGl2ZS5vZmZzZXQsYnVja2V0Q291bnRzOmEubmVnYXRpdmUuYnVja2V0Q291bnRzfSxjb3VudDphLmNvdW50LHNjYWxlOmEuc2NhbGUsemVyb0NvdW50OmEuemVyb0NvdW50fX19KX19fTtIdC5FeHBvbmVudGlhbEhpc3RvZ3JhbUFnZ3JlZ2F0b3I9RmF9KTt2YXIgVF89bChGdD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShGdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtGdC5MYXN0VmFsdWVBZ2dyZWdhdG9yPUZ0Lkxhc3RWYWx1ZUFjY3VtdWxhdGlvbj12b2lkIDA7dmFyIHBTPXh0KCksSXI9QSgpLGhTPXd0KCksanQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0PTAsbj1bMCwwXSl7dGhpcy5zdGFydFRpbWU9ZSx0aGlzLl9jdXJyZW50PXQsdGhpcy5zYW1wbGVUaW1lPW59cmVjb3JkKGUpe3RoaXMuX2N1cnJlbnQ9ZSx0aGlzLnNhbXBsZVRpbWU9KDAsSXIubWlsbGlzVG9IclRpbWUpKERhdGUubm93KCkpfXNldFN0YXJ0VGltZShlKXt0aGlzLnN0YXJ0VGltZT1lfXRvUG9pbnRWYWx1ZSgpe3JldHVybiB0aGlzLl9jdXJyZW50fX07RnQuTGFzdFZhbHVlQWNjdW11bGF0aW9uPWp0O3ZhciBrYT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMua2luZD1wUy5BZ2dyZWdhdG9yS2luZC5MQVNUX1ZBTFVFfWNyZWF0ZUFjY3VtdWxhdGlvbihlKXtyZXR1cm4gbmV3IGp0KGUpfW1lcmdlKGUsdCl7bGV0IG49KDAsSXIuaHJUaW1lVG9NaWNyb3NlY29uZHMpKHQuc2FtcGxlVGltZSk+PSgwLElyLmhyVGltZVRvTWljcm9zZWNvbmRzKShlLnNhbXBsZVRpbWUpP3Q6ZTtyZXR1cm4gbmV3IGp0KGUuc3RhcnRUaW1lLG4udG9Qb2ludFZhbHVlKCksbi5zYW1wbGVUaW1lKX1kaWZmKGUsdCl7bGV0IG49KDAsSXIuaHJUaW1lVG9NaWNyb3NlY29uZHMpKHQuc2FtcGxlVGltZSk+PSgwLElyLmhyVGltZVRvTWljcm9zZWNvbmRzKShlLnNhbXBsZVRpbWUpP3Q6ZTtyZXR1cm4gbmV3IGp0KHQuc3RhcnRUaW1lLG4udG9Qb2ludFZhbHVlKCksbi5zYW1wbGVUaW1lKX10b01ldHJpY0RhdGEoZSx0LG4saSl7cmV0dXJue2Rlc2NyaXB0b3I6ZSxhZ2dyZWdhdGlvblRlbXBvcmFsaXR5OnQsZGF0YVBvaW50VHlwZTpoUy5EYXRhUG9pbnRUeXBlLkdBVUdFLGRhdGFQb2ludHM6bi5tYXAoKFtzLG9dKT0+KHthdHRyaWJ1dGVzOnMsc3RhcnRUaW1lOm8uc3RhcnRUaW1lLGVuZFRpbWU6aSx2YWx1ZTpvLnRvUG9pbnRWYWx1ZSgpfSkpfX19O0Z0Lkxhc3RWYWx1ZUFnZ3JlZ2F0b3I9a2F9KTt2YXIgU189bChrdD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShrdCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtrdC5TdW1BZ2dyZWdhdG9yPWt0LlN1bUFjY3VtdWxhdGlvbj12b2lkIDA7dmFyIGZTPXh0KCksRVM9d3QoKSxDZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbj0wLGk9ITEpe3RoaXMuc3RhcnRUaW1lPWUsdGhpcy5tb25vdG9uaWM9dCx0aGlzLl9jdXJyZW50PW4sdGhpcy5yZXNldD1pfXJlY29yZChlKXt0aGlzLm1vbm90b25pYyYmZTwwfHwodGhpcy5fY3VycmVudCs9ZSl9c2V0U3RhcnRUaW1lKGUpe3RoaXMuc3RhcnRUaW1lPWV9dG9Qb2ludFZhbHVlKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnR9fTtrdC5TdW1BY2N1bXVsYXRpb249Q2U7dmFyICRhPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMubW9ub3RvbmljPWUsdGhpcy5raW5kPWZTLkFnZ3JlZ2F0b3JLaW5kLlNVTX1jcmVhdGVBY2N1bXVsYXRpb24oZSl7cmV0dXJuIG5ldyBDZShlLHRoaXMubW9ub3RvbmljKX1tZXJnZShlLHQpe2xldCBuPWUudG9Qb2ludFZhbHVlKCksaT10LnRvUG9pbnRWYWx1ZSgpO3JldHVybiB0LnJlc2V0P25ldyBDZSh0LnN0YXJ0VGltZSx0aGlzLm1vbm90b25pYyxpLHQucmVzZXQpOm5ldyBDZShlLnN0YXJ0VGltZSx0aGlzLm1vbm90b25pYyxuK2kpfWRpZmYoZSx0KXtsZXQgbj1lLnRvUG9pbnRWYWx1ZSgpLGk9dC50b1BvaW50VmFsdWUoKTtyZXR1cm4gdGhpcy5tb25vdG9uaWMmJm4+aT9uZXcgQ2UodC5zdGFydFRpbWUsdGhpcy5tb25vdG9uaWMsaSwhMCk6bmV3IENlKHQuc3RhcnRUaW1lLHRoaXMubW9ub3RvbmljLGktbil9dG9NZXRyaWNEYXRhKGUsdCxuLGkpe3JldHVybntkZXNjcmlwdG9yOmUsYWdncmVnYXRpb25UZW1wb3JhbGl0eTp0LGRhdGFQb2ludFR5cGU6RVMuRGF0YVBvaW50VHlwZS5TVU0sZGF0YVBvaW50czpuLm1hcCgoW3Msb10pPT4oe2F0dHJpYnV0ZXM6cyxzdGFydFRpbWU6by5zdGFydFRpbWUsZW5kVGltZTppLHZhbHVlOm8udG9Qb2ludFZhbHVlKCl9KSksaXNNb25vdG9uaWM6dGhpcy5tb25vdG9uaWN9fX07a3QuU3VtQWdncmVnYXRvcj0kYX0pO3ZhciBBXz1sKGNlPT57XCJ1c2Ugc3RyaWN0XCI7dmFyIG1TPWNlJiZjZS5fX2NyZWF0ZUJpbmRpbmd8fChPYmplY3QuY3JlYXRlP2Z1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4se2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fSl9OmZ1bmN0aW9uKHIsZSx0LG4pe249PT12b2lkIDAmJihuPXQpLHJbbl09ZVt0XX0pLE1yPWNlJiZjZS5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJm1TKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGNlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO01yKG5fKCksY2UpO01yKG9fKCksY2UpO01yKGdfKCksY2UpO01yKFRfKCksY2UpO01yKFNfKCksY2UpfSk7dmFyIGtpPWwocT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShxLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3EuRGVmYXVsdEFnZ3JlZ2F0aW9uPXEuRXhwb25lbnRpYWxIaXN0b2dyYW1BZ2dyZWdhdGlvbj1xLkV4cGxpY2l0QnVja2V0SGlzdG9ncmFtQWdncmVnYXRpb249cS5IaXN0b2dyYW1BZ2dyZWdhdGlvbj1xLkxhc3RWYWx1ZUFnZ3JlZ2F0aW9uPXEuU3VtQWdncmVnYXRpb249cS5Ecm9wQWdncmVnYXRpb249cS5BZ2dyZWdhdGlvbj12b2lkIDA7dmFyIGdTPShoKCksbShkKSksYXQ9QV8oKSxQZT1iZSgpLG1lPWNsYXNze3N0YXRpYyBEcm9wKCl7cmV0dXJuIE9ffXN0YXRpYyBTdW0oKXtyZXR1cm4gUl99c3RhdGljIExhc3RWYWx1ZSgpe3JldHVybiBiX31zdGF0aWMgSGlzdG9ncmFtKCl7cmV0dXJuIFBffXN0YXRpYyBFeHBvbmVudGlhbEhpc3RvZ3JhbSgpe3JldHVybiBUU31zdGF0aWMgRGVmYXVsdCgpe3JldHVybiBTU319O3EuQWdncmVnYXRpb249bWU7dmFyIExyPWNsYXNzIHIgZXh0ZW5kcyBtZXtjcmVhdGVBZ2dyZWdhdG9yKGUpe3JldHVybiByLkRFRkFVTFRfSU5TVEFOQ0V9fTtxLkRyb3BBZ2dyZWdhdGlvbj1McjtMci5ERUZBVUxUX0lOU1RBTkNFPW5ldyBhdC5Ecm9wQWdncmVnYXRvcjt2YXIgJHQ9Y2xhc3MgciBleHRlbmRzIG1le2NyZWF0ZUFnZ3JlZ2F0b3IoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSBQZS5JbnN0cnVtZW50VHlwZS5DT1VOVEVSOmNhc2UgUGUuSW5zdHJ1bWVudFR5cGUuT0JTRVJWQUJMRV9DT1VOVEVSOmNhc2UgUGUuSW5zdHJ1bWVudFR5cGUuSElTVE9HUkFNOnJldHVybiByLk1PTk9UT05JQ19JTlNUQU5DRTtkZWZhdWx0OnJldHVybiByLk5PTl9NT05PVE9OSUNfSU5TVEFOQ0V9fX07cS5TdW1BZ2dyZWdhdGlvbj0kdDskdC5NT05PVE9OSUNfSU5TVEFOQ0U9bmV3IGF0LlN1bUFnZ3JlZ2F0b3IoITApOyR0Lk5PTl9NT05PVE9OSUNfSU5TVEFOQ0U9bmV3IGF0LlN1bUFnZ3JlZ2F0b3IoITEpO3ZhciBOcj1jbGFzcyByIGV4dGVuZHMgbWV7Y3JlYXRlQWdncmVnYXRvcihlKXtyZXR1cm4gci5ERUZBVUxUX0lOU1RBTkNFfX07cS5MYXN0VmFsdWVBZ2dyZWdhdGlvbj1OcjtOci5ERUZBVUxUX0lOU1RBTkNFPW5ldyBhdC5MYXN0VmFsdWVBZ2dyZWdhdG9yO3ZhciBDcj1jbGFzcyByIGV4dGVuZHMgbWV7Y3JlYXRlQWdncmVnYXRvcihlKXtyZXR1cm4gci5ERUZBVUxUX0lOU1RBTkNFfX07cS5IaXN0b2dyYW1BZ2dyZWdhdGlvbj1DcjtDci5ERUZBVUxUX0lOU1RBTkNFPW5ldyBhdC5IaXN0b2dyYW1BZ2dyZWdhdG9yKFswLDUsMTAsMjUsNTAsNzUsMTAwLDI1MCw1MDAsNzUwLDFlMywyNTAwLDVlMyw3NTAwLDFlNF0sITApO3ZhciBIaT1jbGFzcyBleHRlbmRzIG1le2NvbnN0cnVjdG9yKGUsdD0hMCl7aWYoc3VwZXIoKSx0aGlzLl9yZWNvcmRNaW5NYXg9dCxlPT09dm9pZCAwfHxlLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKFwiSGlzdG9ncmFtQWdncmVnYXRvciBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIGJvdW5kYXJpZXMuXCIpO2U9ZS5jb25jYXQoKSxlPWUuc29ydCgocyxvKT0+cy1vKTtsZXQgbj1lLmxhc3RJbmRleE9mKC0xLzApLGk9ZS5pbmRleE9mKDEvMCk7aT09PS0xJiYoaT12b2lkIDApLHRoaXMuX2JvdW5kYXJpZXM9ZS5zbGljZShuKzEsaSl9Y3JlYXRlQWdncmVnYXRvcihlKXtyZXR1cm4gbmV3IGF0Lkhpc3RvZ3JhbUFnZ3JlZ2F0b3IodGhpcy5fYm91bmRhcmllcyx0aGlzLl9yZWNvcmRNaW5NYXgpfX07cS5FeHBsaWNpdEJ1Y2tldEhpc3RvZ3JhbUFnZ3JlZ2F0aW9uPUhpO3ZhciBqaT1jbGFzcyBleHRlbmRzIG1le2NvbnN0cnVjdG9yKGU9MTYwLHQ9ITApe3N1cGVyKCksdGhpcy5fbWF4U2l6ZT1lLHRoaXMuX3JlY29yZE1pbk1heD10fWNyZWF0ZUFnZ3JlZ2F0b3IoZSl7cmV0dXJuIG5ldyBhdC5FeHBvbmVudGlhbEhpc3RvZ3JhbUFnZ3JlZ2F0b3IodGhpcy5fbWF4U2l6ZSx0aGlzLl9yZWNvcmRNaW5NYXgpfX07cS5FeHBvbmVudGlhbEhpc3RvZ3JhbUFnZ3JlZ2F0aW9uPWppO3ZhciBGaT1jbGFzcyBleHRlbmRzIG1le19yZXNvbHZlKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UgUGUuSW5zdHJ1bWVudFR5cGUuQ09VTlRFUjpjYXNlIFBlLkluc3RydW1lbnRUeXBlLlVQX0RPV05fQ09VTlRFUjpjYXNlIFBlLkluc3RydW1lbnRUeXBlLk9CU0VSVkFCTEVfQ09VTlRFUjpjYXNlIFBlLkluc3RydW1lbnRUeXBlLk9CU0VSVkFCTEVfVVBfRE9XTl9DT1VOVEVSOnJldHVybiBSXztjYXNlIFBlLkluc3RydW1lbnRUeXBlLk9CU0VSVkFCTEVfR0FVR0U6cmV0dXJuIGJfO2Nhc2UgUGUuSW5zdHJ1bWVudFR5cGUuSElTVE9HUkFNOnJldHVybiBlLmFkdmljZS5leHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM/bmV3IEhpKGUuYWR2aWNlLmV4cGxpY2l0QnVja2V0Qm91bmRhcmllcyk6UF99cmV0dXJuIGdTLmRpYWcud2FybihgVW5hYmxlIHRvIHJlY29nbml6ZSBpbnN0cnVtZW50IHR5cGU6ICR7ZS50eXBlfWApLE9ffWNyZWF0ZUFnZ3JlZ2F0b3IoZSl7cmV0dXJuIHRoaXMuX3Jlc29sdmUoZSkuY3JlYXRlQWdncmVnYXRvcihlKX19O3EuRGVmYXVsdEFnZ3JlZ2F0aW9uPUZpO3ZhciBPXz1uZXcgTHIsUl89bmV3ICR0LGJfPW5ldyBOcixQXz1uZXcgQ3IsVFM9bmV3IGppLFNTPW5ldyBGaX0pO3ZhciBYYT1sKFh0PT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1h0LkRFRkFVTFRfQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfU0VMRUNUT1I9WHQuREVGQVVMVF9BR0dSRUdBVElPTl9TRUxFQ1RPUj12b2lkIDA7dmFyIEFTPWtpKCksT1M9TGkoKSxSUz1yPT5BUy5BZ2dyZWdhdGlvbi5EZWZhdWx0KCk7WHQuREVGQVVMVF9BR0dSRUdBVElPTl9TRUxFQ1RPUj1SUzt2YXIgYlM9cj0+T1MuQWdncmVnYXRpb25UZW1wb3JhbGl0eS5DVU1VTEFUSVZFO1h0LkRFRkFVTFRfQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfU0VMRUNUT1I9YlN9KTt2YXIgS2E9bChYaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShYaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtYaS5NZXRyaWNSZWFkZXI9dm9pZCAwO3ZhciB5Xz0oaCgpLG0oZCkpLCRpPUVlKCksdl89WGEoKSxXYT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt2YXIgdCxuLGk7dGhpcy5fc2h1dGRvd249ITEsdGhpcy5fYWdncmVnYXRpb25TZWxlY3Rvcj0odD1lPy5hZ2dyZWdhdGlvblNlbGVjdG9yKSE9PW51bGwmJnQhPT12b2lkIDA/dDp2Xy5ERUZBVUxUX0FHR1JFR0FUSU9OX1NFTEVDVE9SLHRoaXMuX2FnZ3JlZ2F0aW9uVGVtcG9yYWxpdHlTZWxlY3Rvcj0obj1lPy5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5U2VsZWN0b3IpIT09bnVsbCYmbiE9PXZvaWQgMD9uOnZfLkRFRkFVTFRfQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfU0VMRUNUT1IsdGhpcy5fbWV0cmljUHJvZHVjZXJzPShpPWU/Lm1ldHJpY1Byb2R1Y2VycykhPT1udWxsJiZpIT09dm9pZCAwP2k6W119c2V0TWV0cmljUHJvZHVjZXIoZSl7aWYodGhpcy5fc2RrTWV0cmljUHJvZHVjZXIpdGhyb3cgbmV3IEVycm9yKFwiTWV0cmljUmVhZGVyIGNhbiBub3QgYmUgYm91bmQgdG8gYSBNZXRlclByb3ZpZGVyIGFnYWluLlwiKTt0aGlzLl9zZGtNZXRyaWNQcm9kdWNlcj1lLHRoaXMub25Jbml0aWFsaXplZCgpfXNlbGVjdEFnZ3JlZ2F0aW9uKGUpe3JldHVybiB0aGlzLl9hZ2dyZWdhdGlvblNlbGVjdG9yKGUpfXNlbGVjdEFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkoZSl7cmV0dXJuIHRoaXMuX2FnZ3JlZ2F0aW9uVGVtcG9yYWxpdHlTZWxlY3RvcihlKX1vbkluaXRpYWxpemVkKCl7fWFzeW5jIGNvbGxlY3QoZSl7aWYodGhpcy5fc2RrTWV0cmljUHJvZHVjZXI9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiTWV0cmljUmVhZGVyIGlzIG5vdCBib3VuZCB0byBhIE1ldHJpY1Byb2R1Y2VyXCIpO2lmKHRoaXMuX3NodXRkb3duKXRocm93IG5ldyBFcnJvcihcIk1ldHJpY1JlYWRlciBpcyBzaHV0ZG93blwiKTtsZXRbdCwuLi5uXT1hd2FpdCBQcm9taXNlLmFsbChbdGhpcy5fc2RrTWV0cmljUHJvZHVjZXIuY29sbGVjdCh7dGltZW91dE1pbGxpczplPy50aW1lb3V0TWlsbGlzfSksLi4udGhpcy5fbWV0cmljUHJvZHVjZXJzLm1hcChhPT5hLmNvbGxlY3Qoe3RpbWVvdXRNaWxsaXM6ZT8udGltZW91dE1pbGxpc30pKV0pLGk9dC5lcnJvcnMuY29uY2F0KCgwLCRpLkZsYXRNYXApKG4sYT0+YS5lcnJvcnMpKSxzPXQucmVzb3VyY2VNZXRyaWNzLnJlc291cmNlLG89dC5yZXNvdXJjZU1ldHJpY3Muc2NvcGVNZXRyaWNzLmNvbmNhdCgoMCwkaS5GbGF0TWFwKShuLGE9PmEucmVzb3VyY2VNZXRyaWNzLnNjb3BlTWV0cmljcykpO3JldHVybntyZXNvdXJjZU1ldHJpY3M6e3Jlc291cmNlOnMsc2NvcGVNZXRyaWNzOm99LGVycm9yczppfX1hc3luYyBzaHV0ZG93bihlKXtpZih0aGlzLl9zaHV0ZG93bil7eV8uZGlhZy5lcnJvcihcIkNhbm5vdCBjYWxsIHNodXRkb3duIHR3aWNlLlwiKTtyZXR1cm59ZT8udGltZW91dE1pbGxpcz09bnVsbD9hd2FpdCB0aGlzLm9uU2h1dGRvd24oKTphd2FpdCgwLCRpLmNhbGxXaXRoVGltZW91dCkodGhpcy5vblNodXRkb3duKCksZS50aW1lb3V0TWlsbGlzKSx0aGlzLl9zaHV0ZG93bj0hMH1hc3luYyBmb3JjZUZsdXNoKGUpe2lmKHRoaXMuX3NodXRkb3duKXt5Xy5kaWFnLndhcm4oXCJDYW5ub3QgZm9yY2VGbHVzaCBvbiBhbHJlYWR5IHNodXRkb3duIE1ldHJpY1JlYWRlci5cIik7cmV0dXJufWlmKGU/LnRpbWVvdXRNaWxsaXM9PW51bGwpe2F3YWl0IHRoaXMub25Gb3JjZUZsdXNoKCk7cmV0dXJufWF3YWl0KDAsJGkuY2FsbFdpdGhUaW1lb3V0KSh0aGlzLm9uRm9yY2VGbHVzaCgpLGUudGltZW91dE1pbGxpcyl9fTtYaS5NZXRyaWNSZWFkZXI9V2F9KTt2YXIgTF89bChLaT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShLaSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtLaS5QZXJpb2RpY0V4cG9ydGluZ01ldHJpY1JlYWRlcj12b2lkIDA7dmFyIElfPShoKCksbShkKSksV2k9QSgpLFBTPUthKCksTV89RWUoKSx5Uz0oaCgpLG0oZCkpLHphPWNsYXNzIGV4dGVuZHMgUFMuTWV0cmljUmVhZGVye2NvbnN0cnVjdG9yKGUpe3ZhciB0LG4saSxzO2lmKHN1cGVyKHthZ2dyZWdhdGlvblNlbGVjdG9yOih0PWUuZXhwb3J0ZXIuc2VsZWN0QWdncmVnYXRpb24pPT09bnVsbHx8dD09PXZvaWQgMD92b2lkIDA6dC5iaW5kKGUuZXhwb3J0ZXIpLGFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHlTZWxlY3Rvcjoobj1lLmV4cG9ydGVyLnNlbGVjdEFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5iaW5kKGUuZXhwb3J0ZXIpLG1ldHJpY1Byb2R1Y2VyczplLm1ldHJpY1Byb2R1Y2Vyc30pLGUuZXhwb3J0SW50ZXJ2YWxNaWxsaXMhPT12b2lkIDAmJmUuZXhwb3J0SW50ZXJ2YWxNaWxsaXM8PTApdGhyb3cgRXJyb3IoXCJleHBvcnRJbnRlcnZhbE1pbGxpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO2lmKGUuZXhwb3J0VGltZW91dE1pbGxpcyE9PXZvaWQgMCYmZS5leHBvcnRUaW1lb3V0TWlsbGlzPD0wKXRocm93IEVycm9yKFwiZXhwb3J0VGltZW91dE1pbGxpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO2lmKGUuZXhwb3J0VGltZW91dE1pbGxpcyE9PXZvaWQgMCYmZS5leHBvcnRJbnRlcnZhbE1pbGxpcyE9PXZvaWQgMCYmZS5leHBvcnRJbnRlcnZhbE1pbGxpczxlLmV4cG9ydFRpbWVvdXRNaWxsaXMpdGhyb3cgRXJyb3IoXCJleHBvcnRJbnRlcnZhbE1pbGxpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBleHBvcnRUaW1lb3V0TWlsbGlzXCIpO3RoaXMuX2V4cG9ydEludGVydmFsPShpPWUuZXhwb3J0SW50ZXJ2YWxNaWxsaXMpIT09bnVsbCYmaSE9PXZvaWQgMD9pOjZlNCx0aGlzLl9leHBvcnRUaW1lb3V0PShzPWUuZXhwb3J0VGltZW91dE1pbGxpcykhPT1udWxsJiZzIT09dm9pZCAwP3M6M2U0LHRoaXMuX2V4cG9ydGVyPWUuZXhwb3J0ZXJ9YXN5bmMgX3J1bk9uY2UoKXt0cnl7YXdhaXQoMCxNXy5jYWxsV2l0aFRpbWVvdXQpKHRoaXMuX2RvUnVuKCksdGhpcy5fZXhwb3J0VGltZW91dCl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIE1fLlRpbWVvdXRFcnJvcil7SV8uZGlhZy5lcnJvcihcIkV4cG9ydCB0b29rIGxvbmdlciB0aGFuICVzIG1pbGxpc2Vjb25kcyBhbmQgdGltZWQgb3V0LlwiLHRoaXMuX2V4cG9ydFRpbWVvdXQpO3JldHVybn0oMCxXaS5nbG9iYWxFcnJvckhhbmRsZXIpKGUpfX1hc3luYyBfZG9SdW4oKXt2YXIgZSx0O2xldHtyZXNvdXJjZU1ldHJpY3M6bixlcnJvcnM6aX09YXdhaXQgdGhpcy5jb2xsZWN0KHt0aW1lb3V0TWlsbGlzOnRoaXMuX2V4cG9ydFRpbWVvdXR9KTtpLmxlbmd0aD4wJiZJXy5kaWFnLmVycm9yKFwiUGVyaW9kaWNFeHBvcnRpbmdNZXRyaWNSZWFkZXI6IG1ldHJpY3MgY29sbGVjdGlvbiBlcnJvcnNcIiwuLi5pKTtsZXQgcz1hc3luYygpPT57bGV0IG89YXdhaXQgV2kuaW50ZXJuYWwuX2V4cG9ydCh0aGlzLl9leHBvcnRlcixuKTtpZihvLmNvZGUhPT1XaS5FeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MpdGhyb3cgbmV3IEVycm9yKGBQZXJpb2RpY0V4cG9ydGluZ01ldHJpY1JlYWRlcjogbWV0cmljcyBleHBvcnQgZmFpbGVkIChlcnJvciAke28uZXJyb3J9KWApfTtuLnJlc291cmNlLmFzeW5jQXR0cmlidXRlc1BlbmRpbmc/KHQ9KGU9bi5yZXNvdXJjZSkud2FpdEZvckFzeW5jQXR0cmlidXRlcyk9PT1udWxsfHx0PT09dm9pZCAwfHx0LmNhbGwoZSkudGhlbihzLG89PnlTLmRpYWcuZGVidWcoXCJFcnJvciB3aGlsZSByZXNvbHZpbmcgYXN5bmMgcG9ydGlvbiBvZiByZXNvdXJjZTogXCIsbykpOmF3YWl0IHMoKX1vbkluaXRpYWxpemVkKCl7dGhpcy5faW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKCk9Pnt0aGlzLl9ydW5PbmNlKCl9LHRoaXMuX2V4cG9ydEludGVydmFsKSwoMCxXaS51bnJlZlRpbWVyKSh0aGlzLl9pbnRlcnZhbCl9YXN5bmMgb25Gb3JjZUZsdXNoKCl7YXdhaXQgdGhpcy5fcnVuT25jZSgpLGF3YWl0IHRoaXMuX2V4cG9ydGVyLmZvcmNlRmx1c2goKX1hc3luYyBvblNodXRkb3duKCl7dGhpcy5faW50ZXJ2YWwmJmNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpLGF3YWl0IHRoaXMuX2V4cG9ydGVyLnNodXRkb3duKCl9fTtLaS5QZXJpb2RpY0V4cG9ydGluZ01ldHJpY1JlYWRlcj16YX0pO3ZhciBDXz1sKHppPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHppLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ppLkluTWVtb3J5TWV0cmljRXhwb3J0ZXI9dm9pZCAwO3ZhciBOXz1BKCksWWE9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5fc2h1dGRvd249ITEsdGhpcy5fbWV0cmljcz1bXSx0aGlzLl9hZ2dyZWdhdGlvblRlbXBvcmFsaXR5PWV9ZXhwb3J0KGUsdCl7aWYodGhpcy5fc2h1dGRvd24pe3NldFRpbWVvdXQoKCk9PnQoe2NvZGU6Tl8uRXhwb3J0UmVzdWx0Q29kZS5GQUlMRUR9KSwwKTtyZXR1cm59dGhpcy5fbWV0cmljcy5wdXNoKGUpLHNldFRpbWVvdXQoKCk9PnQoe2NvZGU6Tl8uRXhwb3J0UmVzdWx0Q29kZS5TVUNDRVNTfSksMCl9Z2V0TWV0cmljcygpe3JldHVybiB0aGlzLl9tZXRyaWNzfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9cmVzZXQoKXt0aGlzLl9tZXRyaWNzPVtdfXNlbGVjdEFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkoZSl7cmV0dXJuIHRoaXMuX2FnZ3JlZ2F0aW9uVGVtcG9yYWxpdHl9c2h1dGRvd24oKXtyZXR1cm4gdGhpcy5fc2h1dGRvd249ITAsUHJvbWlzZS5yZXNvbHZlKCl9fTt6aS5Jbk1lbW9yeU1ldHJpY0V4cG9ydGVyPVlhfSk7dmFyIHhfPWwoWWk9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoWWksXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7WWkuQ29uc29sZU1ldHJpY0V4cG9ydGVyPXZvaWQgMDt2YXIgd189QSgpLHZTPVhhKCksUWE9Y2xhc3Mgcntjb25zdHJ1Y3RvcihlKXt2YXIgdDt0aGlzLl9zaHV0ZG93bj0hMSx0aGlzLl90ZW1wb3JhbGl0eVNlbGVjdG9yPSh0PWU/LnRlbXBvcmFsaXR5U2VsZWN0b3IpIT09bnVsbCYmdCE9PXZvaWQgMD90OnZTLkRFRkFVTFRfQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfU0VMRUNUT1J9ZXhwb3J0KGUsdCl7aWYodGhpcy5fc2h1dGRvd24pe3NldEltbWVkaWF0ZSh0LHtjb2RlOndfLkV4cG9ydFJlc3VsdENvZGUuRkFJTEVEfSk7cmV0dXJufXJldHVybiByLl9zZW5kTWV0cmljcyhlLHQpfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9c2VsZWN0QWdncmVnYXRpb25UZW1wb3JhbGl0eShlKXtyZXR1cm4gdGhpcy5fdGVtcG9yYWxpdHlTZWxlY3RvcihlKX1zaHV0ZG93bigpe3JldHVybiB0aGlzLl9zaHV0ZG93bj0hMCxQcm9taXNlLnJlc29sdmUoKX1zdGF0aWMgX3NlbmRNZXRyaWNzKGUsdCl7Zm9yKGxldCBuIG9mIGUuc2NvcGVNZXRyaWNzKWZvcihsZXQgaSBvZiBuLm1ldHJpY3MpY29uc29sZS5kaXIoe2Rlc2NyaXB0b3I6aS5kZXNjcmlwdG9yLGRhdGFQb2ludFR5cGU6aS5kYXRhUG9pbnRUeXBlLGRhdGFQb2ludHM6aS5kYXRhUG9pbnRzfSk7dCh7Y29kZTp3Xy5FeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1N9KX19O1lpLkNvbnNvbGVNZXRyaWNFeHBvcnRlcj1RYX0pO3ZhciBEXz1sKFFpPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFFpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1FpLlZpZXdSZWdpc3RyeT12b2lkIDA7dmFyIFphPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVnaXN0ZXJlZFZpZXdzPVtdfWFkZFZpZXcoZSl7dGhpcy5fcmVnaXN0ZXJlZFZpZXdzLnB1c2goZSl9ZmluZFZpZXdzKGUsdCl7cmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRWaWV3cy5maWx0ZXIoaT0+dGhpcy5fbWF0Y2hJbnN0cnVtZW50KGkuaW5zdHJ1bWVudFNlbGVjdG9yLGUpJiZ0aGlzLl9tYXRjaE1ldGVyKGkubWV0ZXJTZWxlY3Rvcix0KSl9X21hdGNoSW5zdHJ1bWVudChlLHQpe3JldHVybihlLmdldFR5cGUoKT09PXZvaWQgMHx8dC50eXBlPT09ZS5nZXRUeXBlKCkpJiZlLmdldE5hbWVGaWx0ZXIoKS5tYXRjaCh0Lm5hbWUpJiZlLmdldFVuaXRGaWx0ZXIoKS5tYXRjaCh0LnVuaXQpfV9tYXRjaE1ldGVyKGUsdCl7cmV0dXJuIGUuZ2V0TmFtZUZpbHRlcigpLm1hdGNoKHQubmFtZSkmJih0LnZlcnNpb249PT12b2lkIDB8fGUuZ2V0VmVyc2lvbkZpbHRlcigpLm1hdGNoKHQudmVyc2lvbikpJiYodC5zY2hlbWFVcmw9PT12b2lkIDB8fGUuZ2V0U2NoZW1hVXJsRmlsdGVyKCkubWF0Y2godC5zY2hlbWFVcmwpKX19O1FpLlZpZXdSZWdpc3RyeT1aYX0pO3ZhciBaaT1sKEQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoRCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtELmlzT2JzZXJ2YWJsZUluc3RydW1lbnQ9RC5PYnNlcnZhYmxlVXBEb3duQ291bnRlckluc3RydW1lbnQ9RC5PYnNlcnZhYmxlR2F1Z2VJbnN0cnVtZW50PUQuT2JzZXJ2YWJsZUNvdW50ZXJJbnN0cnVtZW50PUQuT2JzZXJ2YWJsZUluc3RydW1lbnQ9RC5IaXN0b2dyYW1JbnN0cnVtZW50PUQuQ291bnRlckluc3RydW1lbnQ9RC5VcERvd25Db3VudGVySW5zdHJ1bWVudD1ELlN5bmNJbnN0cnVtZW50PXZvaWQgMDt2YXIgV3Q9KGgoKSxtKGQpKSxJUz1BKCksS3Q9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl93cml0YWJsZU1ldHJpY1N0b3JhZ2U9ZSx0aGlzLl9kZXNjcmlwdG9yPXR9X3JlY29yZChlLHQ9e30sbj1XdC5jb250ZXh0LmFjdGl2ZSgpKXtpZih0eXBlb2YgZSE9XCJudW1iZXJcIil7V3QuZGlhZy53YXJuKGBub24tbnVtYmVyIHZhbHVlIHByb3ZpZGVkIHRvIG1ldHJpYyAke3RoaXMuX2Rlc2NyaXB0b3IubmFtZX06ICR7ZX1gKTtyZXR1cm59dGhpcy5fZGVzY3JpcHRvci52YWx1ZVR5cGU9PT1XdC5WYWx1ZVR5cGUuSU5UJiYhTnVtYmVyLmlzSW50ZWdlcihlKSYmKFd0LmRpYWcud2FybihgSU5UIHZhbHVlIHR5cGUgY2Fubm90IGFjY2VwdCBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIGZvciAke3RoaXMuX2Rlc2NyaXB0b3IubmFtZX0sIGlnbm9yaW5nIHRoZSBmcmFjdGlvbmFsIGRpZ2l0cy5gKSxlPU1hdGgudHJ1bmMoZSksIU51bWJlci5pc0ludGVnZXIoZSkpfHx0aGlzLl93cml0YWJsZU1ldHJpY1N0b3JhZ2UucmVjb3JkKGUsdCxuLCgwLElTLm1pbGxpc1RvSHJUaW1lKShEYXRlLm5vdygpKSl9fTtELlN5bmNJbnN0cnVtZW50PUt0O3ZhciBKYT1jbGFzcyBleHRlbmRzIEt0e2FkZChlLHQsbil7dGhpcy5fcmVjb3JkKGUsdCxuKX19O0QuVXBEb3duQ291bnRlckluc3RydW1lbnQ9SmE7dmFyIGV1PWNsYXNzIGV4dGVuZHMgS3R7YWRkKGUsdCxuKXtpZihlPDApe1d0LmRpYWcud2FybihgbmVnYXRpdmUgdmFsdWUgcHJvdmlkZWQgdG8gY291bnRlciAke3RoaXMuX2Rlc2NyaXB0b3IubmFtZX06ICR7ZX1gKTtyZXR1cm59dGhpcy5fcmVjb3JkKGUsdCxuKX19O0QuQ291bnRlckluc3RydW1lbnQ9ZXU7dmFyIHR1PWNsYXNzIGV4dGVuZHMgS3R7cmVjb3JkKGUsdCxuKXtpZihlPDApe1d0LmRpYWcud2FybihgbmVnYXRpdmUgdmFsdWUgcHJvdmlkZWQgdG8gaGlzdG9ncmFtICR7dGhpcy5fZGVzY3JpcHRvci5uYW1lfTogJHtlfWApO3JldHVybn10aGlzLl9yZWNvcmQoZSx0LG4pfX07RC5IaXN0b2dyYW1JbnN0cnVtZW50PXR1O3ZhciB1dD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5fb2JzZXJ2YWJsZVJlZ2lzdHJ5PW4sdGhpcy5fZGVzY3JpcHRvcj1lLHRoaXMuX21ldHJpY1N0b3JhZ2VzPXR9YWRkQ2FsbGJhY2soZSl7dGhpcy5fb2JzZXJ2YWJsZVJlZ2lzdHJ5LmFkZENhbGxiYWNrKGUsdGhpcyl9cmVtb3ZlQ2FsbGJhY2soZSl7dGhpcy5fb2JzZXJ2YWJsZVJlZ2lzdHJ5LnJlbW92ZUNhbGxiYWNrKGUsdGhpcyl9fTtELk9ic2VydmFibGVJbnN0cnVtZW50PXV0O3ZhciBydT1jbGFzcyBleHRlbmRzIHV0e307RC5PYnNlcnZhYmxlQ291bnRlckluc3RydW1lbnQ9cnU7dmFyIG51PWNsYXNzIGV4dGVuZHMgdXR7fTtELk9ic2VydmFibGVHYXVnZUluc3RydW1lbnQ9bnU7dmFyIGl1PWNsYXNzIGV4dGVuZHMgdXR7fTtELk9ic2VydmFibGVVcERvd25Db3VudGVySW5zdHJ1bWVudD1pdTtmdW5jdGlvbiBNUyhyKXtyZXR1cm4gciBpbnN0YW5jZW9mIHV0fUQuaXNPYnNlcnZhYmxlSW5zdHJ1bWVudD1NU30pO3ZhciBVXz1sKEppPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEppLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0ppLk1ldGVyPXZvaWQgMDt2YXIgaWU9YmUoKSx6dD1aaSgpLHN1PWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX21ldGVyU2hhcmVkU3RhdGU9ZX1jcmVhdGVIaXN0b2dyYW0oZSx0KXtsZXQgbj0oMCxpZS5jcmVhdGVJbnN0cnVtZW50RGVzY3JpcHRvcikoZSxpZS5JbnN0cnVtZW50VHlwZS5ISVNUT0dSQU0sdCksaT10aGlzLl9tZXRlclNoYXJlZFN0YXRlLnJlZ2lzdGVyTWV0cmljU3RvcmFnZShuKTtyZXR1cm4gbmV3IHp0Lkhpc3RvZ3JhbUluc3RydW1lbnQoaSxuKX1jcmVhdGVDb3VudGVyKGUsdCl7bGV0IG49KDAsaWUuY3JlYXRlSW5zdHJ1bWVudERlc2NyaXB0b3IpKGUsaWUuSW5zdHJ1bWVudFR5cGUuQ09VTlRFUix0KSxpPXRoaXMuX21ldGVyU2hhcmVkU3RhdGUucmVnaXN0ZXJNZXRyaWNTdG9yYWdlKG4pO3JldHVybiBuZXcgenQuQ291bnRlckluc3RydW1lbnQoaSxuKX1jcmVhdGVVcERvd25Db3VudGVyKGUsdCl7bGV0IG49KDAsaWUuY3JlYXRlSW5zdHJ1bWVudERlc2NyaXB0b3IpKGUsaWUuSW5zdHJ1bWVudFR5cGUuVVBfRE9XTl9DT1VOVEVSLHQpLGk9dGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5yZWdpc3Rlck1ldHJpY1N0b3JhZ2Uobik7cmV0dXJuIG5ldyB6dC5VcERvd25Db3VudGVySW5zdHJ1bWVudChpLG4pfWNyZWF0ZU9ic2VydmFibGVHYXVnZShlLHQpe2xldCBuPSgwLGllLmNyZWF0ZUluc3RydW1lbnREZXNjcmlwdG9yKShlLGllLkluc3RydW1lbnRUeXBlLk9CU0VSVkFCTEVfR0FVR0UsdCksaT10aGlzLl9tZXRlclNoYXJlZFN0YXRlLnJlZ2lzdGVyQXN5bmNNZXRyaWNTdG9yYWdlKG4pO3JldHVybiBuZXcgenQuT2JzZXJ2YWJsZUdhdWdlSW5zdHJ1bWVudChuLGksdGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5vYnNlcnZhYmxlUmVnaXN0cnkpfWNyZWF0ZU9ic2VydmFibGVDb3VudGVyKGUsdCl7bGV0IG49KDAsaWUuY3JlYXRlSW5zdHJ1bWVudERlc2NyaXB0b3IpKGUsaWUuSW5zdHJ1bWVudFR5cGUuT0JTRVJWQUJMRV9DT1VOVEVSLHQpLGk9dGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5yZWdpc3RlckFzeW5jTWV0cmljU3RvcmFnZShuKTtyZXR1cm4gbmV3IHp0Lk9ic2VydmFibGVDb3VudGVySW5zdHJ1bWVudChuLGksdGhpcy5fbWV0ZXJTaGFyZWRTdGF0ZS5vYnNlcnZhYmxlUmVnaXN0cnkpfWNyZWF0ZU9ic2VydmFibGVVcERvd25Db3VudGVyKGUsdCl7bGV0IG49KDAsaWUuY3JlYXRlSW5zdHJ1bWVudERlc2NyaXB0b3IpKGUsaWUuSW5zdHJ1bWVudFR5cGUuT0JTRVJWQUJMRV9VUF9ET1dOX0NPVU5URVIsdCksaT10aGlzLl9tZXRlclNoYXJlZFN0YXRlLnJlZ2lzdGVyQXN5bmNNZXRyaWNTdG9yYWdlKG4pO3JldHVybiBuZXcgenQuT2JzZXJ2YWJsZVVwRG93bkNvdW50ZXJJbnN0cnVtZW50KG4saSx0aGlzLl9tZXRlclNoYXJlZFN0YXRlLm9ic2VydmFibGVSZWdpc3RyeSl9YWRkQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2soZSx0KXt0aGlzLl9tZXRlclNoYXJlZFN0YXRlLm9ic2VydmFibGVSZWdpc3RyeS5hZGRCYXRjaENhbGxiYWNrKGUsdCl9cmVtb3ZlQmF0Y2hPYnNlcnZhYmxlQ2FsbGJhY2soZSx0KXt0aGlzLl9tZXRlclNoYXJlZFN0YXRlLm9ic2VydmFibGVSZWdpc3RyeS5yZW1vdmVCYXRjaENhbGxiYWNrKGUsdCl9fTtKaS5NZXRlcj1zdX0pO3ZhciBhdT1sKGVzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGVzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2VzLk1ldHJpY1N0b3JhZ2U9dm9pZCAwO3ZhciBMUz1iZSgpLG91PWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2luc3RydW1lbnREZXNjcmlwdG9yPWV9Z2V0SW5zdHJ1bWVudERlc2NyaXB0b3IoKXtyZXR1cm4gdGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3J9dXBkYXRlRGVzY3JpcHRpb24oZSl7dGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3I9KDAsTFMuY3JlYXRlSW5zdHJ1bWVudERlc2NyaXB0b3IpKHRoaXMuX2luc3RydW1lbnREZXNjcmlwdG9yLm5hbWUsdGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3IudHlwZSx7ZGVzY3JpcHRpb246ZSx2YWx1ZVR5cGU6dGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3IudmFsdWVUeXBlLHVuaXQ6dGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3IudW5pdCxhZHZpY2U6dGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3IuYWR2aWNlfSl9fTtlcy5NZXRyaWNTdG9yYWdlPW91fSk7dmFyIHdyPWwoWXQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoWXQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7WXQuQXR0cmlidXRlSGFzaE1hcD1ZdC5IYXNoTWFwPXZvaWQgMDt2YXIgTlM9RWUoKSx0cz1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9oYXNoPWUsdGhpcy5fdmFsdWVNYXA9bmV3IE1hcCx0aGlzLl9rZXlNYXA9bmV3IE1hcH1nZXQoZSx0KXtyZXR1cm4gdD8/KHQ9dGhpcy5faGFzaChlKSksdGhpcy5fdmFsdWVNYXAuZ2V0KHQpfWdldE9yRGVmYXVsdChlLHQpe2xldCBuPXRoaXMuX2hhc2goZSk7aWYodGhpcy5fdmFsdWVNYXAuaGFzKG4pKXJldHVybiB0aGlzLl92YWx1ZU1hcC5nZXQobik7bGV0IGk9dCgpO3JldHVybiB0aGlzLl9rZXlNYXAuaGFzKG4pfHx0aGlzLl9rZXlNYXAuc2V0KG4sZSksdGhpcy5fdmFsdWVNYXAuc2V0KG4saSksaX1zZXQoZSx0LG4pe24/PyhuPXRoaXMuX2hhc2goZSkpLHRoaXMuX2tleU1hcC5oYXMobil8fHRoaXMuX2tleU1hcC5zZXQobixlKSx0aGlzLl92YWx1ZU1hcC5zZXQobix0KX1oYXMoZSx0KXtyZXR1cm4gdD8/KHQ9dGhpcy5faGFzaChlKSksdGhpcy5fdmFsdWVNYXAuaGFzKHQpfSprZXlzKCl7bGV0IGU9dGhpcy5fa2V5TWFwLmVudHJpZXMoKSx0PWUubmV4dCgpO2Zvcig7dC5kb25lIT09ITA7KXlpZWxkW3QudmFsdWVbMV0sdC52YWx1ZVswXV0sdD1lLm5leHQoKX0qZW50cmllcygpe2xldCBlPXRoaXMuX3ZhbHVlTWFwLmVudHJpZXMoKSx0PWUubmV4dCgpO2Zvcig7dC5kb25lIT09ITA7KXlpZWxkW3RoaXMuX2tleU1hcC5nZXQodC52YWx1ZVswXSksdC52YWx1ZVsxXSx0LnZhbHVlWzBdXSx0PWUubmV4dCgpfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX3ZhbHVlTWFwLnNpemV9fTtZdC5IYXNoTWFwPXRzO3ZhciB1dT1jbGFzcyBleHRlbmRzIHRze2NvbnN0cnVjdG9yKCl7c3VwZXIoTlMuaGFzaEF0dHJpYnV0ZXMpfX07WXQuQXR0cmlidXRlSGFzaE1hcD11dX0pO3ZhciBkdT1sKHJzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3JzLkRlbHRhTWV0cmljUHJvY2Vzc29yPXZvaWQgMDt2YXIgY3U9d3IoKSxsdT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9hZ2dyZWdhdG9yPWUsdGhpcy5fYWN0aXZlQ29sbGVjdGlvblN0b3JhZ2U9bmV3IGN1LkF0dHJpYnV0ZUhhc2hNYXAsdGhpcy5fY3VtdWxhdGl2ZU1lbW9TdG9yYWdlPW5ldyBjdS5BdHRyaWJ1dGVIYXNoTWFwfXJlY29yZChlLHQsbixpKXtsZXQgcz10aGlzLl9hY3RpdmVDb2xsZWN0aW9uU3RvcmFnZS5nZXRPckRlZmF1bHQodCwoKT0+dGhpcy5fYWdncmVnYXRvci5jcmVhdGVBY2N1bXVsYXRpb24oaSkpO3M/LnJlY29yZChlKX1iYXRjaEN1bXVsYXRlKGUsdCl7QXJyYXkuZnJvbShlLmVudHJpZXMoKSkuZm9yRWFjaCgoW24saSxzXSk9PntsZXQgbz10aGlzLl9hZ2dyZWdhdG9yLmNyZWF0ZUFjY3VtdWxhdGlvbih0KTtvPy5yZWNvcmQoaSk7bGV0IGE9bztpZih0aGlzLl9jdW11bGF0aXZlTWVtb1N0b3JhZ2UuaGFzKG4scykpe2xldCB1PXRoaXMuX2N1bXVsYXRpdmVNZW1vU3RvcmFnZS5nZXQobixzKTthPXRoaXMuX2FnZ3JlZ2F0b3IuZGlmZih1LG8pfWlmKHRoaXMuX2FjdGl2ZUNvbGxlY3Rpb25TdG9yYWdlLmhhcyhuLHMpKXtsZXQgdT10aGlzLl9hY3RpdmVDb2xsZWN0aW9uU3RvcmFnZS5nZXQobixzKTthPXRoaXMuX2FnZ3JlZ2F0b3IubWVyZ2UodSxhKX10aGlzLl9jdW11bGF0aXZlTWVtb1N0b3JhZ2Uuc2V0KG4sbyxzKSx0aGlzLl9hY3RpdmVDb2xsZWN0aW9uU3RvcmFnZS5zZXQobixhLHMpfSl9Y29sbGVjdCgpe2xldCBlPXRoaXMuX2FjdGl2ZUNvbGxlY3Rpb25TdG9yYWdlO3JldHVybiB0aGlzLl9hY3RpdmVDb2xsZWN0aW9uU3RvcmFnZT1uZXcgY3UuQXR0cmlidXRlSGFzaE1hcCxlfX07cnMuRGVsdGFNZXRyaWNQcm9jZXNzb3I9bHV9KTt2YXIgcHU9bChucz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShucyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtucy5UZW1wb3JhbE1ldHJpY1Byb2Nlc3Nvcj12b2lkIDA7dmFyIENTPUxpKCksd1M9d3IoKSxfdT1jbGFzcyBye2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fYWdncmVnYXRvcj1lLHRoaXMuX3VucmVwb3J0ZWRBY2N1bXVsYXRpb25zPW5ldyBNYXAsdGhpcy5fcmVwb3J0SGlzdG9yeT1uZXcgTWFwLHQuZm9yRWFjaChuPT57dGhpcy5fdW5yZXBvcnRlZEFjY3VtdWxhdGlvbnMuc2V0KG4sW10pfSl9YnVpbGRNZXRyaWNzKGUsdCxuLGkpe3RoaXMuX3N0YXNoQWNjdW11bGF0aW9ucyhuKTtsZXQgcz10aGlzLl9nZXRNZXJnZWRVbnJlcG9ydGVkQWNjdW11bGF0aW9ucyhlKSxvPXMsYTtpZih0aGlzLl9yZXBvcnRIaXN0b3J5LmhhcyhlKSl7bGV0IGM9dGhpcy5fcmVwb3J0SGlzdG9yeS5nZXQoZSksXz1jLmNvbGxlY3Rpb25UaW1lO2E9Yy5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5LGE9PT1DUy5BZ2dyZWdhdGlvblRlbXBvcmFsaXR5LkNVTVVMQVRJVkU/bz1yLm1lcmdlKGMuYWNjdW11bGF0aW9ucyxzLHRoaXMuX2FnZ3JlZ2F0b3IpOm89ci5jYWxpYnJhdGVTdGFydFRpbWUoYy5hY2N1bXVsYXRpb25zLHMsXyl9ZWxzZSBhPWUuc2VsZWN0QWdncmVnYXRpb25UZW1wb3JhbGl0eSh0LnR5cGUpO3RoaXMuX3JlcG9ydEhpc3Rvcnkuc2V0KGUse2FjY3VtdWxhdGlvbnM6byxjb2xsZWN0aW9uVGltZTppLGFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHk6YX0pO2xldCB1PXhTKG8pO2lmKHUubGVuZ3RoIT09MClyZXR1cm4gdGhpcy5fYWdncmVnYXRvci50b01ldHJpY0RhdGEodCxhLHUsaSl9X3N0YXNoQWNjdW11bGF0aW9ucyhlKXtsZXQgdD10aGlzLl91bnJlcG9ydGVkQWNjdW11bGF0aW9ucy5rZXlzKCk7Zm9yKGxldCBuIG9mIHQpe2xldCBpPXRoaXMuX3VucmVwb3J0ZWRBY2N1bXVsYXRpb25zLmdldChuKTtpPT09dm9pZCAwJiYoaT1bXSx0aGlzLl91bnJlcG9ydGVkQWNjdW11bGF0aW9ucy5zZXQobixpKSksaS5wdXNoKGUpfX1fZ2V0TWVyZ2VkVW5yZXBvcnRlZEFjY3VtdWxhdGlvbnMoZSl7bGV0IHQ9bmV3IHdTLkF0dHJpYnV0ZUhhc2hNYXAsbj10aGlzLl91bnJlcG9ydGVkQWNjdW11bGF0aW9ucy5nZXQoZSk7aWYodGhpcy5fdW5yZXBvcnRlZEFjY3VtdWxhdGlvbnMuc2V0KGUsW10pLG49PT12b2lkIDApcmV0dXJuIHQ7Zm9yKGxldCBpIG9mIG4pdD1yLm1lcmdlKHQsaSx0aGlzLl9hZ2dyZWdhdG9yKTtyZXR1cm4gdH1zdGF0aWMgbWVyZ2UoZSx0LG4pe2xldCBpPWUscz10LmVudHJpZXMoKSxvPXMubmV4dCgpO2Zvcig7by5kb25lIT09ITA7KXtsZXRbYSx1LGNdPW8udmFsdWU7aWYoZS5oYXMoYSxjKSl7bGV0IF89ZS5nZXQoYSxjKSxwPW4ubWVyZ2UoXyx1KTtpLnNldChhLHAsYyl9ZWxzZSBpLnNldChhLHUsYyk7bz1zLm5leHQoKX1yZXR1cm4gaX1zdGF0aWMgY2FsaWJyYXRlU3RhcnRUaW1lKGUsdCxuKXtmb3IobGV0W2ksc11vZiBlLmtleXMoKSl7bGV0IG89dC5nZXQoaSxzKTtvPy5zZXRTdGFydFRpbWUobil9cmV0dXJuIHR9fTtucy5UZW1wb3JhbE1ldHJpY1Byb2Nlc3Nvcj1fdTtmdW5jdGlvbiB4UyhyKXtyZXR1cm4gQXJyYXkuZnJvbShyLmVudHJpZXMoKSl9fSk7dmFyIEJfPWwoaXM9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7aXMuQXN5bmNNZXRyaWNTdG9yYWdlPXZvaWQgMDt2YXIgRFM9YXUoKSxVUz1kdSgpLEJTPXB1KCkscVM9d3IoKSxodT1jbGFzcyBleHRlbmRzIERTLk1ldHJpY1N0b3JhZ2V7Y29uc3RydWN0b3IoZSx0LG4saSl7c3VwZXIoZSksdGhpcy5fYXR0cmlidXRlc1Byb2Nlc3Nvcj1uLHRoaXMuX2RlbHRhTWV0cmljU3RvcmFnZT1uZXcgVVMuRGVsdGFNZXRyaWNQcm9jZXNzb3IodCksdGhpcy5fdGVtcG9yYWxNZXRyaWNTdG9yYWdlPW5ldyBCUy5UZW1wb3JhbE1ldHJpY1Byb2Nlc3Nvcih0LGkpfXJlY29yZChlLHQpe2xldCBuPW5ldyBxUy5BdHRyaWJ1dGVIYXNoTWFwO0FycmF5LmZyb20oZS5lbnRyaWVzKCkpLmZvckVhY2goKFtpLHNdKT0+e24uc2V0KHRoaXMuX2F0dHJpYnV0ZXNQcm9jZXNzb3IucHJvY2VzcyhpKSxzKX0pLHRoaXMuX2RlbHRhTWV0cmljU3RvcmFnZS5iYXRjaEN1bXVsYXRlKG4sdCl9Y29sbGVjdChlLHQpe2xldCBuPXRoaXMuX2RlbHRhTWV0cmljU3RvcmFnZS5jb2xsZWN0KCk7cmV0dXJuIHRoaXMuX3RlbXBvcmFsTWV0cmljU3RvcmFnZS5idWlsZE1ldHJpY3MoZSx0aGlzLl9pbnN0cnVtZW50RGVzY3JpcHRvcixuLHQpfX07aXMuQXN5bmNNZXRyaWNTdG9yYWdlPWh1fSk7dmFyIGpfPWwoWj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShaLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO1ouZ2V0Q29uZmxpY3RSZXNvbHV0aW9uUmVjaXBlPVouZ2V0RGVzY3JpcHRpb25SZXNvbHV0aW9uUmVjaXBlPVouZ2V0VHlwZUNvbmZsaWN0UmVzb2x1dGlvblJlY2lwZT1aLmdldFVuaXRDb25mbGljdFJlc29sdXRpb25SZWNpcGU9Wi5nZXRWYWx1ZVR5cGVDb25mbGljdFJlc29sdXRpb25SZWNpcGU9Wi5nZXRJbmNvbXBhdGliaWxpdHlEZXRhaWxzPXZvaWQgMDtmdW5jdGlvbiBWUyhyLGUpe2xldCB0PVwiXCI7cmV0dXJuIHIudW5pdCE9PWUudW5pdCYmKHQrPWBcdC0gVW5pdCAnJHtyLnVuaXR9JyBkb2VzIG5vdCBtYXRjaCAnJHtlLnVuaXR9J1xuYCksci50eXBlIT09ZS50eXBlJiYodCs9YFx0LSBUeXBlICcke3IudHlwZX0nIGRvZXMgbm90IG1hdGNoICcke2UudHlwZX0nXG5gKSxyLnZhbHVlVHlwZSE9PWUudmFsdWVUeXBlJiYodCs9YFx0LSBWYWx1ZSBUeXBlICcke3IudmFsdWVUeXBlfScgZG9lcyBub3QgbWF0Y2ggJyR7ZS52YWx1ZVR5cGV9J1xuYCksci5kZXNjcmlwdGlvbiE9PWUuZGVzY3JpcHRpb24mJih0Kz1gXHQtIERlc2NyaXB0aW9uICcke3IuZGVzY3JpcHRpb259JyBkb2VzIG5vdCBtYXRjaCAnJHtlLmRlc2NyaXB0aW9ufSdcbmApLHR9Wi5nZXRJbmNvbXBhdGliaWxpdHlEZXRhaWxzPVZTO2Z1bmN0aW9uIHFfKHIsZSl7cmV0dXJuYFx0LSB1c2UgdmFsdWVUeXBlICcke3IudmFsdWVUeXBlfScgb24gaW5zdHJ1bWVudCBjcmVhdGlvbiBvciB1c2UgYW4gaW5zdHJ1bWVudCBuYW1lIG90aGVyIHRoYW4gJyR7ZS5uYW1lfSdgfVouZ2V0VmFsdWVUeXBlQ29uZmxpY3RSZXNvbHV0aW9uUmVjaXBlPXFfO2Z1bmN0aW9uIFZfKHIsZSl7cmV0dXJuYFx0LSB1c2UgdW5pdCAnJHtyLnVuaXR9JyBvbiBpbnN0cnVtZW50IGNyZWF0aW9uIG9yIHVzZSBhbiBpbnN0cnVtZW50IG5hbWUgb3RoZXIgdGhhbiAnJHtlLm5hbWV9J2B9Wi5nZXRVbml0Q29uZmxpY3RSZXNvbHV0aW9uUmVjaXBlPVZfO2Z1bmN0aW9uIEdfKHIsZSl7bGV0IHQ9e25hbWU6ZS5uYW1lLHR5cGU6ZS50eXBlLHVuaXQ6ZS51bml0fSxuPUpTT04uc3RyaW5naWZ5KHQpO3JldHVybmBcdC0gY3JlYXRlIGEgbmV3IHZpZXcgd2l0aCBhIG5hbWUgb3RoZXIgdGhhbiAnJHtyLm5hbWV9JyBhbmQgSW5zdHJ1bWVudFNlbGVjdG9yICcke259J2B9Wi5nZXRUeXBlQ29uZmxpY3RSZXNvbHV0aW9uUmVjaXBlPUdfO2Z1bmN0aW9uIEhfKHIsZSl7bGV0IHQ9e25hbWU6ZS5uYW1lLHR5cGU6ZS50eXBlLHVuaXQ6ZS51bml0fSxuPUpTT04uc3RyaW5naWZ5KHQpO3JldHVybmBcdC0gY3JlYXRlIGEgbmV3IHZpZXcgd2l0aCBhIG5hbWUgb3RoZXIgdGhhbiAnJHtyLm5hbWV9JyBhbmQgSW5zdHJ1bWVudFNlbGVjdG9yICcke259J1xuICAgIFx0LSBPUiAtIGNyZWF0ZSBhIG5ldyB2aWV3IHdpdGggdGhlIG5hbWUgJHtyLm5hbWV9IGFuZCBkZXNjcmlwdGlvbiAnJHtyLmRlc2NyaXB0aW9ufScgYW5kIEluc3RydW1lbnRTZWxlY3RvciAke259XG4gICAgXHQtIE9SIC0gY3JlYXRlIGEgbmV3IHZpZXcgd2l0aCB0aGUgbmFtZSAke2UubmFtZX0gYW5kIGRlc2NyaXB0aW9uICcke3IuZGVzY3JpcHRpb259JyBhbmQgSW5zdHJ1bWVudFNlbGVjdG9yICR7bn1gfVouZ2V0RGVzY3JpcHRpb25SZXNvbHV0aW9uUmVjaXBlPUhfO2Z1bmN0aW9uIEdTKHIsZSl7cmV0dXJuIHIudmFsdWVUeXBlIT09ZS52YWx1ZVR5cGU/cV8ocixlKTpyLnVuaXQhPT1lLnVuaXQ/Vl8ocixlKTpyLnR5cGUhPT1lLnR5cGU/R18ocixlKTpyLmRlc2NyaXB0aW9uIT09ZS5kZXNjcmlwdGlvbj9IXyhyLGUpOlwiXCJ9Wi5nZXRDb25mbGljdFJlc29sdXRpb25SZWNpcGU9R1N9KTt2YXIga189bChvcz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvcyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtvcy5NZXRyaWNTdG9yYWdlUmVnaXN0cnk9dm9pZCAwO3ZhciBIUz1iZSgpLEZfPShoKCksbShkKSksc3M9al8oKSxmdT1jbGFzcyBye2NvbnN0cnVjdG9yKCl7dGhpcy5fc2hhcmVkUmVnaXN0cnk9bmV3IE1hcCx0aGlzLl9wZXJDb2xsZWN0b3JSZWdpc3RyeT1uZXcgTWFwfXN0YXRpYyBjcmVhdGUoKXtyZXR1cm4gbmV3IHJ9Z2V0U3RvcmFnZXMoZSl7bGV0IHQ9W107Zm9yKGxldCBpIG9mIHRoaXMuX3NoYXJlZFJlZ2lzdHJ5LnZhbHVlcygpKXQ9dC5jb25jYXQoaSk7bGV0IG49dGhpcy5fcGVyQ29sbGVjdG9yUmVnaXN0cnkuZ2V0KGUpO2lmKG4hPW51bGwpZm9yKGxldCBpIG9mIG4udmFsdWVzKCkpdD10LmNvbmNhdChpKTtyZXR1cm4gdH1yZWdpc3RlcihlKXt0aGlzLl9yZWdpc3RlclN0b3JhZ2UoZSx0aGlzLl9zaGFyZWRSZWdpc3RyeSl9cmVnaXN0ZXJGb3JDb2xsZWN0b3IoZSx0KXtsZXQgbj10aGlzLl9wZXJDb2xsZWN0b3JSZWdpc3RyeS5nZXQoZSk7bj09bnVsbCYmKG49bmV3IE1hcCx0aGlzLl9wZXJDb2xsZWN0b3JSZWdpc3RyeS5zZXQoZSxuKSksdGhpcy5fcmVnaXN0ZXJTdG9yYWdlKHQsbil9ZmluZE9yVXBkYXRlQ29tcGF0aWJsZVN0b3JhZ2UoZSl7bGV0IHQ9dGhpcy5fc2hhcmVkUmVnaXN0cnkuZ2V0KGUubmFtZSk7cmV0dXJuIHQ9PT12b2lkIDA/bnVsbDp0aGlzLl9maW5kT3JVcGRhdGVDb21wYXRpYmxlU3RvcmFnZShlLHQpfWZpbmRPclVwZGF0ZUNvbXBhdGlibGVDb2xsZWN0b3JTdG9yYWdlKGUsdCl7bGV0IG49dGhpcy5fcGVyQ29sbGVjdG9yUmVnaXN0cnkuZ2V0KGUpO2lmKG49PT12b2lkIDApcmV0dXJuIG51bGw7bGV0IGk9bi5nZXQodC5uYW1lKTtyZXR1cm4gaT09PXZvaWQgMD9udWxsOnRoaXMuX2ZpbmRPclVwZGF0ZUNvbXBhdGlibGVTdG9yYWdlKHQsaSl9X3JlZ2lzdGVyU3RvcmFnZShlLHQpe2xldCBuPWUuZ2V0SW5zdHJ1bWVudERlc2NyaXB0b3IoKSxpPXQuZ2V0KG4ubmFtZSk7aWYoaT09PXZvaWQgMCl7dC5zZXQobi5uYW1lLFtlXSk7cmV0dXJufWkucHVzaChlKX1fZmluZE9yVXBkYXRlQ29tcGF0aWJsZVN0b3JhZ2UoZSx0KXtsZXQgbj1udWxsO2ZvcihsZXQgaSBvZiB0KXtsZXQgcz1pLmdldEluc3RydW1lbnREZXNjcmlwdG9yKCk7KDAsSFMuaXNEZXNjcmlwdG9yQ29tcGF0aWJsZVdpdGgpKHMsZSk/KHMuZGVzY3JpcHRpb24hPT1lLmRlc2NyaXB0aW9uJiYoZS5kZXNjcmlwdGlvbi5sZW5ndGg+cy5kZXNjcmlwdGlvbi5sZW5ndGgmJmkudXBkYXRlRGVzY3JpcHRpb24oZS5kZXNjcmlwdGlvbiksRl8uZGlhZy53YXJuKFwiQSB2aWV3IG9yIGluc3RydW1lbnQgd2l0aCB0aGUgbmFtZSBcIixlLm5hbWUsYCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIGJ1dCBoYXMgYSBkaWZmZXJlbnQgZGVzY3JpcHRpb24gYW5kIGlzIGluY29tcGF0aWJsZSB3aXRoIGFub3RoZXIgcmVnaXN0ZXJlZCB2aWV3LlxuYCxgRGV0YWlsczpcbmAsKDAsc3MuZ2V0SW5jb21wYXRpYmlsaXR5RGV0YWlscykocyxlKSxgVGhlIGxvbmdlciBkZXNjcmlwdGlvbiB3aWxsIGJlIHVzZWQuXG5UbyByZXNvbHZlIHRoZSBjb25mbGljdDpgLCgwLHNzLmdldENvbmZsaWN0UmVzb2x1dGlvblJlY2lwZSkocyxlKSkpLG49aSk6Rl8uZGlhZy53YXJuKFwiQSB2aWV3IG9yIGluc3RydW1lbnQgd2l0aCB0aGUgbmFtZSBcIixlLm5hbWUsYCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgYW5kIGlzIGluY29tcGF0aWJsZSB3aXRoIGFub3RoZXIgcmVnaXN0ZXJlZCB2aWV3LlxuYCxgRGV0YWlsczpcbmAsKDAsc3MuZ2V0SW5jb21wYXRpYmlsaXR5RGV0YWlscykocyxlKSxgVG8gcmVzb2x2ZSB0aGUgY29uZmxpY3Q6XG5gLCgwLHNzLmdldENvbmZsaWN0UmVzb2x1dGlvblJlY2lwZSkocyxlKSl9cmV0dXJuIG59fTtvcy5NZXRyaWNTdG9yYWdlUmVnaXN0cnk9ZnV9KTt2YXIgJF89bChhcz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhcyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTthcy5NdWx0aU1ldHJpY1N0b3JhZ2U9dm9pZCAwO3ZhciBFdT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9iYWNraW5nU3RvcmFnZXM9ZX1yZWNvcmQoZSx0LG4saSl7dGhpcy5fYmFja2luZ1N0b3JhZ2VzLmZvckVhY2gocz0+e3MucmVjb3JkKGUsdCxuLGkpfSl9fTthcy5NdWx0aU1ldHJpY1N0b3JhZ2U9RXV9KTt2YXIgV189bChadD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShadCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtadC5CYXRjaE9ic2VydmFibGVSZXN1bHRJbXBsPVp0Lk9ic2VydmFibGVSZXN1bHRJbXBsPXZvaWQgMDt2YXIgUXQ9KGgoKSxtKGQpKSxYXz13cigpLGpTPVppKCksbXU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9pbnN0cnVtZW50TmFtZT1lLHRoaXMuX3ZhbHVlVHlwZT10LHRoaXMuX2J1ZmZlcj1uZXcgWF8uQXR0cmlidXRlSGFzaE1hcH1vYnNlcnZlKGUsdD17fSl7aWYodHlwZW9mIGUhPVwibnVtYmVyXCIpe1F0LmRpYWcud2Fybihgbm9uLW51bWJlciB2YWx1ZSBwcm92aWRlZCB0byBtZXRyaWMgJHt0aGlzLl9pbnN0cnVtZW50TmFtZX06ICR7ZX1gKTtyZXR1cm59dGhpcy5fdmFsdWVUeXBlPT09UXQuVmFsdWVUeXBlLklOVCYmIU51bWJlci5pc0ludGVnZXIoZSkmJihRdC5kaWFnLndhcm4oYElOVCB2YWx1ZSB0eXBlIGNhbm5vdCBhY2NlcHQgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBmb3IgJHt0aGlzLl9pbnN0cnVtZW50TmFtZX0sIGlnbm9yaW5nIHRoZSBmcmFjdGlvbmFsIGRpZ2l0cy5gKSxlPU1hdGgudHJ1bmMoZSksIU51bWJlci5pc0ludGVnZXIoZSkpfHx0aGlzLl9idWZmZXIuc2V0KHQsZSl9fTtadC5PYnNlcnZhYmxlUmVzdWx0SW1wbD1tdTt2YXIgZ3U9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9idWZmZXI9bmV3IE1hcH1vYnNlcnZlKGUsdCxuPXt9KXtpZighKDAsalMuaXNPYnNlcnZhYmxlSW5zdHJ1bWVudCkoZSkpcmV0dXJuO2xldCBpPXRoaXMuX2J1ZmZlci5nZXQoZSk7aWYoaT09bnVsbCYmKGk9bmV3IFhfLkF0dHJpYnV0ZUhhc2hNYXAsdGhpcy5fYnVmZmVyLnNldChlLGkpKSx0eXBlb2YgdCE9XCJudW1iZXJcIil7UXQuZGlhZy53YXJuKGBub24tbnVtYmVyIHZhbHVlIHByb3ZpZGVkIHRvIG1ldHJpYyAke2UuX2Rlc2NyaXB0b3IubmFtZX06ICR7dH1gKTtyZXR1cm59ZS5fZGVzY3JpcHRvci52YWx1ZVR5cGU9PT1RdC5WYWx1ZVR5cGUuSU5UJiYhTnVtYmVyLmlzSW50ZWdlcih0KSYmKFF0LmRpYWcud2FybihgSU5UIHZhbHVlIHR5cGUgY2Fubm90IGFjY2VwdCBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIGZvciAke2UuX2Rlc2NyaXB0b3IubmFtZX0sIGlnbm9yaW5nIHRoZSBmcmFjdGlvbmFsIGRpZ2l0cy5gKSx0PU1hdGgudHJ1bmModCksIU51bWJlci5pc0ludGVnZXIodCkpfHxpLnNldChuLHQpfX07WnQuQmF0Y2hPYnNlcnZhYmxlUmVzdWx0SW1wbD1ndX0pO3ZhciBZXz1sKHVzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHVzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3VzLk9ic2VydmFibGVSZWdpc3RyeT12b2lkIDA7dmFyIEZTPShoKCksbShkKSksS189WmkoKSx6Xz1XXygpLHhyPUVlKCksVHU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9jYWxsYmFja3M9W10sdGhpcy5fYmF0Y2hDYWxsYmFja3M9W119YWRkQ2FsbGJhY2soZSx0KXt0aGlzLl9maW5kQ2FsbGJhY2soZSx0KT49MHx8dGhpcy5fY2FsbGJhY2tzLnB1c2goe2NhbGxiYWNrOmUsaW5zdHJ1bWVudDp0fSl9cmVtb3ZlQ2FsbGJhY2soZSx0KXtsZXQgbj10aGlzLl9maW5kQ2FsbGJhY2soZSx0KTtuPDB8fHRoaXMuX2NhbGxiYWNrcy5zcGxpY2UobiwxKX1hZGRCYXRjaENhbGxiYWNrKGUsdCl7bGV0IG49bmV3IFNldCh0LmZpbHRlcihLXy5pc09ic2VydmFibGVJbnN0cnVtZW50KSk7aWYobi5zaXplPT09MCl7RlMuZGlhZy5lcnJvcihcIkJhdGNoT2JzZXJ2YWJsZUNhbGxiYWNrIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdmFsaWQgaW5zdHJ1bWVudHNcIix0KTtyZXR1cm59dGhpcy5fZmluZEJhdGNoQ2FsbGJhY2soZSxuKT49MHx8dGhpcy5fYmF0Y2hDYWxsYmFja3MucHVzaCh7Y2FsbGJhY2s6ZSxpbnN0cnVtZW50czpufSl9cmVtb3ZlQmF0Y2hDYWxsYmFjayhlLHQpe2xldCBuPW5ldyBTZXQodC5maWx0ZXIoS18uaXNPYnNlcnZhYmxlSW5zdHJ1bWVudCkpLGk9dGhpcy5fZmluZEJhdGNoQ2FsbGJhY2soZSxuKTtpPDB8fHRoaXMuX2JhdGNoQ2FsbGJhY2tzLnNwbGljZShpLDEpfWFzeW5jIG9ic2VydmUoZSx0KXtsZXQgbj10aGlzLl9vYnNlcnZlQ2FsbGJhY2tzKGUsdCksaT10aGlzLl9vYnNlcnZlQmF0Y2hDYWxsYmFja3MoZSx0KTtyZXR1cm4oYXdhaXQoMCx4ci5Qcm9taXNlQWxsU2V0dGxlZCkoWy4uLm4sLi4uaV0pKS5maWx0ZXIoeHIuaXNQcm9taXNlQWxsU2V0dGxlZFJlamVjdGlvblJlc3VsdCkubWFwKGE9PmEucmVhc29uKX1fb2JzZXJ2ZUNhbGxiYWNrcyhlLHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3MubWFwKGFzeW5jKHtjYWxsYmFjazpuLGluc3RydW1lbnQ6aX0pPT57bGV0IHM9bmV3IHpfLk9ic2VydmFibGVSZXN1bHRJbXBsKGkuX2Rlc2NyaXB0b3IubmFtZSxpLl9kZXNjcmlwdG9yLnZhbHVlVHlwZSksbz1Qcm9taXNlLnJlc29sdmUobihzKSk7dCE9bnVsbCYmKG89KDAseHIuY2FsbFdpdGhUaW1lb3V0KShvLHQpKSxhd2FpdCBvLGkuX21ldHJpY1N0b3JhZ2VzLmZvckVhY2goYT0+e2EucmVjb3JkKHMuX2J1ZmZlcixlKX0pfSl9X29ic2VydmVCYXRjaENhbGxiYWNrcyhlLHQpe3JldHVybiB0aGlzLl9iYXRjaENhbGxiYWNrcy5tYXAoYXN5bmMoe2NhbGxiYWNrOm4saW5zdHJ1bWVudHM6aX0pPT57bGV0IHM9bmV3IHpfLkJhdGNoT2JzZXJ2YWJsZVJlc3VsdEltcGwsbz1Qcm9taXNlLnJlc29sdmUobihzKSk7dCE9bnVsbCYmKG89KDAseHIuY2FsbFdpdGhUaW1lb3V0KShvLHQpKSxhd2FpdCBvLGkuZm9yRWFjaChhPT57bGV0IHU9cy5fYnVmZmVyLmdldChhKTt1IT1udWxsJiZhLl9tZXRyaWNTdG9yYWdlcy5mb3JFYWNoKGM9PntjLnJlY29yZCh1LGUpfSl9KX0pfV9maW5kQ2FsbGJhY2soZSx0KXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzLmZpbmRJbmRleChuPT5uLmNhbGxiYWNrPT09ZSYmbi5pbnN0cnVtZW50PT09dCl9X2ZpbmRCYXRjaENhbGxiYWNrKGUsdCl7cmV0dXJuIHRoaXMuX2JhdGNoQ2FsbGJhY2tzLmZpbmRJbmRleChuPT5uLmNhbGxiYWNrPT09ZSYmKDAseHIuc2V0RXF1YWxzKShuLmluc3RydW1lbnRzLHQpKX19O3VzLk9ic2VydmFibGVSZWdpc3RyeT1UdX0pO3ZhciBRXz1sKGNzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2NzLlN5bmNNZXRyaWNTdG9yYWdlPXZvaWQgMDt2YXIga1M9YXUoKSwkUz1kdSgpLFhTPXB1KCksU3U9Y2xhc3MgZXh0ZW5kcyBrUy5NZXRyaWNTdG9yYWdle2NvbnN0cnVjdG9yKGUsdCxuLGkpe3N1cGVyKGUpLHRoaXMuX2F0dHJpYnV0ZXNQcm9jZXNzb3I9bix0aGlzLl9kZWx0YU1ldHJpY1N0b3JhZ2U9bmV3ICRTLkRlbHRhTWV0cmljUHJvY2Vzc29yKHQpLHRoaXMuX3RlbXBvcmFsTWV0cmljU3RvcmFnZT1uZXcgWFMuVGVtcG9yYWxNZXRyaWNQcm9jZXNzb3IodCxpKX1yZWNvcmQoZSx0LG4saSl7dD10aGlzLl9hdHRyaWJ1dGVzUHJvY2Vzc29yLnByb2Nlc3ModCxuKSx0aGlzLl9kZWx0YU1ldHJpY1N0b3JhZ2UucmVjb3JkKGUsdCxuLGkpfWNvbGxlY3QoZSx0KXtsZXQgbj10aGlzLl9kZWx0YU1ldHJpY1N0b3JhZ2UuY29sbGVjdCgpO3JldHVybiB0aGlzLl90ZW1wb3JhbE1ldHJpY1N0b3JhZ2UuYnVpbGRNZXRyaWNzKGUsdGhpcy5faW5zdHJ1bWVudERlc2NyaXB0b3Isbix0KX19O2NzLlN5bmNNZXRyaWNTdG9yYWdlPVN1fSk7dmFyIE91PWwod2U9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkod2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7d2UuRmlsdGVyaW5nQXR0cmlidXRlc1Byb2Nlc3Nvcj13ZS5Ob29wQXR0cmlidXRlc1Byb2Nlc3Nvcj13ZS5BdHRyaWJ1dGVzUHJvY2Vzc29yPXZvaWQgMDt2YXIgRHI9Y2xhc3N7c3RhdGljIE5vb3AoKXtyZXR1cm4gV1N9fTt3ZS5BdHRyaWJ1dGVzUHJvY2Vzc29yPURyO3ZhciBscz1jbGFzcyBleHRlbmRzIERye3Byb2Nlc3MoZSx0KXtyZXR1cm4gZX19O3dlLk5vb3BBdHRyaWJ1dGVzUHJvY2Vzc29yPWxzO3ZhciBBdT1jbGFzcyBleHRlbmRzIERye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5fYWxsb3dlZEF0dHJpYnV0ZU5hbWVzPWV9cHJvY2VzcyhlLHQpe2xldCBuPXt9O3JldHVybiBPYmplY3Qua2V5cyhlKS5maWx0ZXIoaT0+dGhpcy5fYWxsb3dlZEF0dHJpYnV0ZU5hbWVzLmluY2x1ZGVzKGkpKS5mb3JFYWNoKGk9Pm5baV09ZVtpXSksbn19O3dlLkZpbHRlcmluZ0F0dHJpYnV0ZXNQcm9jZXNzb3I9QXU7dmFyIFdTPW5ldyBsc30pO3ZhciBaXz1sKGRzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGRzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2RzLk1ldGVyU2hhcmVkU3RhdGU9dm9pZCAwO3ZhciBLUz1iZSgpLHpTPVVfKCksWVM9RWUoKSxRUz1CXygpLFpTPWtfKCksSlM9JF8oKSxlQT1ZXygpLHRBPVFfKCksckE9T3UoKSxSdT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX21ldGVyUHJvdmlkZXJTaGFyZWRTdGF0ZT1lLHRoaXMuX2luc3RydW1lbnRhdGlvblNjb3BlPXQsdGhpcy5tZXRyaWNTdG9yYWdlUmVnaXN0cnk9bmV3IFpTLk1ldHJpY1N0b3JhZ2VSZWdpc3RyeSx0aGlzLm9ic2VydmFibGVSZWdpc3RyeT1uZXcgZUEuT2JzZXJ2YWJsZVJlZ2lzdHJ5LHRoaXMubWV0ZXI9bmV3IHpTLk1ldGVyKHRoaXMpfXJlZ2lzdGVyTWV0cmljU3RvcmFnZShlKXtsZXQgdD10aGlzLl9yZWdpc3Rlck1ldHJpY1N0b3JhZ2UoZSx0QS5TeW5jTWV0cmljU3RvcmFnZSk7cmV0dXJuIHQubGVuZ3RoPT09MT90WzBdOm5ldyBKUy5NdWx0aU1ldHJpY1N0b3JhZ2UodCl9cmVnaXN0ZXJBc3luY01ldHJpY1N0b3JhZ2UoZSl7cmV0dXJuIHRoaXMuX3JlZ2lzdGVyTWV0cmljU3RvcmFnZShlLFFTLkFzeW5jTWV0cmljU3RvcmFnZSl9YXN5bmMgY29sbGVjdChlLHQsbil7bGV0IGk9YXdhaXQgdGhpcy5vYnNlcnZhYmxlUmVnaXN0cnkub2JzZXJ2ZSh0LG4/LnRpbWVvdXRNaWxsaXMpLHM9dGhpcy5tZXRyaWNTdG9yYWdlUmVnaXN0cnkuZ2V0U3RvcmFnZXMoZSk7aWYocy5sZW5ndGg9PT0wKXJldHVybiBudWxsO2xldCBvPXMubWFwKGE9PmEuY29sbGVjdChlLHQpKS5maWx0ZXIoWVMuaXNOb3ROdWxsaXNoKTtyZXR1cm4gby5sZW5ndGg9PT0wP3tlcnJvcnM6aX06e3Njb3BlTWV0cmljczp7c2NvcGU6dGhpcy5faW5zdHJ1bWVudGF0aW9uU2NvcGUsbWV0cmljczpvfSxlcnJvcnM6aX19X3JlZ2lzdGVyTWV0cmljU3RvcmFnZShlLHQpe2xldCBpPXRoaXMuX21ldGVyUHJvdmlkZXJTaGFyZWRTdGF0ZS52aWV3UmVnaXN0cnkuZmluZFZpZXdzKGUsdGhpcy5faW5zdHJ1bWVudGF0aW9uU2NvcGUpLm1hcChzPT57bGV0IG89KDAsS1MuY3JlYXRlSW5zdHJ1bWVudERlc2NyaXB0b3JXaXRoVmlldykocyxlKSxhPXRoaXMubWV0cmljU3RvcmFnZVJlZ2lzdHJ5LmZpbmRPclVwZGF0ZUNvbXBhdGlibGVTdG9yYWdlKG8pO2lmKGEhPW51bGwpcmV0dXJuIGE7bGV0IHU9cy5hZ2dyZWdhdGlvbi5jcmVhdGVBZ2dyZWdhdG9yKG8pLGM9bmV3IHQobyx1LHMuYXR0cmlidXRlc1Byb2Nlc3Nvcix0aGlzLl9tZXRlclByb3ZpZGVyU2hhcmVkU3RhdGUubWV0cmljQ29sbGVjdG9ycyk7cmV0dXJuIHRoaXMubWV0cmljU3RvcmFnZVJlZ2lzdHJ5LnJlZ2lzdGVyKGMpLGN9KTtpZihpLmxlbmd0aD09PTApe2xldCBvPXRoaXMuX21ldGVyUHJvdmlkZXJTaGFyZWRTdGF0ZS5zZWxlY3RBZ2dyZWdhdGlvbnMoZS50eXBlKS5tYXAoKFthLHVdKT0+e2xldCBjPXRoaXMubWV0cmljU3RvcmFnZVJlZ2lzdHJ5LmZpbmRPclVwZGF0ZUNvbXBhdGlibGVDb2xsZWN0b3JTdG9yYWdlKGEsZSk7aWYoYyE9bnVsbClyZXR1cm4gYztsZXQgXz11LmNyZWF0ZUFnZ3JlZ2F0b3IoZSkscD1uZXcgdChlLF8sckEuQXR0cmlidXRlc1Byb2Nlc3Nvci5Ob29wKCksW2FdKTtyZXR1cm4gdGhpcy5tZXRyaWNTdG9yYWdlUmVnaXN0cnkucmVnaXN0ZXJGb3JDb2xsZWN0b3IoYSxwKSxwfSk7aT1pLmNvbmNhdChvKX1yZXR1cm4gaX19O2RzLk1ldGVyU2hhcmVkU3RhdGU9UnV9KTt2YXIgSl89bChfcz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShfcyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtfcy5NZXRlclByb3ZpZGVyU2hhcmVkU3RhdGU9dm9pZCAwO3ZhciBuQT1FZSgpLGlBPURfKCksc0E9Wl8oKSxidT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnJlc291cmNlPWUsdGhpcy52aWV3UmVnaXN0cnk9bmV3IGlBLlZpZXdSZWdpc3RyeSx0aGlzLm1ldHJpY0NvbGxlY3RvcnM9W10sdGhpcy5tZXRlclNoYXJlZFN0YXRlcz1uZXcgTWFwfWdldE1ldGVyU2hhcmVkU3RhdGUoZSl7bGV0IHQ9KDAsbkEuaW5zdHJ1bWVudGF0aW9uU2NvcGVJZCkoZSksbj10aGlzLm1ldGVyU2hhcmVkU3RhdGVzLmdldCh0KTtyZXR1cm4gbj09bnVsbCYmKG49bmV3IHNBLk1ldGVyU2hhcmVkU3RhdGUodGhpcyxlKSx0aGlzLm1ldGVyU2hhcmVkU3RhdGVzLnNldCh0LG4pKSxufXNlbGVjdEFnZ3JlZ2F0aW9ucyhlKXtsZXQgdD1bXTtmb3IobGV0IG4gb2YgdGhpcy5tZXRyaWNDb2xsZWN0b3JzKXQucHVzaChbbixuLnNlbGVjdEFnZ3JlZ2F0aW9uKGUpXSk7cmV0dXJuIHR9fTtfcy5NZXRlclByb3ZpZGVyU2hhcmVkU3RhdGU9YnV9KTt2YXIgZXA9bChwcz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShwcyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtwcy5NZXRyaWNDb2xsZWN0b3I9dm9pZCAwO3ZhciBvQT1BKCksUHU9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9zaGFyZWRTdGF0ZT1lLHRoaXMuX21ldHJpY1JlYWRlcj10fWFzeW5jIGNvbGxlY3QoZSl7bGV0IHQ9KDAsb0EubWlsbGlzVG9IclRpbWUpKERhdGUubm93KCkpLG49W10saT1bXSxzPUFycmF5LmZyb20odGhpcy5fc2hhcmVkU3RhdGUubWV0ZXJTaGFyZWRTdGF0ZXMudmFsdWVzKCkpLm1hcChhc3luYyBvPT57bGV0IGE9YXdhaXQgby5jb2xsZWN0KHRoaXMsdCxlKTthPy5zY29wZU1ldHJpY3MhPW51bGwmJm4ucHVzaChhLnNjb3BlTWV0cmljcyksYT8uZXJyb3JzIT1udWxsJiZpLnB1c2goLi4uYS5lcnJvcnMpfSk7cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHMpLHtyZXNvdXJjZU1ldHJpY3M6e3Jlc291cmNlOnRoaXMuX3NoYXJlZFN0YXRlLnJlc291cmNlLHNjb3BlTWV0cmljczpufSxlcnJvcnM6aX19YXN5bmMgZm9yY2VGbHVzaChlKXthd2FpdCB0aGlzLl9tZXRyaWNSZWFkZXIuZm9yY2VGbHVzaChlKX1hc3luYyBzaHV0ZG93bihlKXthd2FpdCB0aGlzLl9tZXRyaWNSZWFkZXIuc2h1dGRvd24oZSl9c2VsZWN0QWdncmVnYXRpb25UZW1wb3JhbGl0eShlKXtyZXR1cm4gdGhpcy5fbWV0cmljUmVhZGVyLnNlbGVjdEFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkoZSl9c2VsZWN0QWdncmVnYXRpb24oZSl7cmV0dXJuIHRoaXMuX21ldHJpY1JlYWRlci5zZWxlY3RBZ2dyZWdhdGlvbihlKX19O3BzLk1ldHJpY0NvbGxlY3Rvcj1QdX0pO3ZhciBycD1sKGZzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2ZzLk1ldGVyUHJvdmlkZXI9dm9pZCAwO3ZhciBocz0oaCgpLG0oZCkpLHRwPXJ0KCksYUE9Sl8oKSx1QT1lcCgpLHl1PWNsYXNze2NvbnN0cnVjdG9yKGUpe3ZhciB0O3RoaXMuX3NodXRkb3duPSExO2xldCBuPXRwLlJlc291cmNlLmRlZmF1bHQoKS5tZXJnZSgodD1lPy5yZXNvdXJjZSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6dHAuUmVzb3VyY2UuZW1wdHkoKSk7aWYodGhpcy5fc2hhcmVkU3RhdGU9bmV3IGFBLk1ldGVyUHJvdmlkZXJTaGFyZWRTdGF0ZShuKSxlPy52aWV3cyE9bnVsbCYmZS52aWV3cy5sZW5ndGg+MClmb3IobGV0IGkgb2YgZS52aWV3cyl0aGlzLl9zaGFyZWRTdGF0ZS52aWV3UmVnaXN0cnkuYWRkVmlldyhpKX1nZXRNZXRlcihlLHQ9XCJcIixuPXt9KXtyZXR1cm4gdGhpcy5fc2h1dGRvd24/KGhzLmRpYWcud2FybihcIkEgc2h1dGRvd24gTWV0ZXJQcm92aWRlciBjYW5ub3QgcHJvdmlkZSBhIE1ldGVyXCIpLCgwLGhzLmNyZWF0ZU5vb3BNZXRlcikoKSk6dGhpcy5fc2hhcmVkU3RhdGUuZ2V0TWV0ZXJTaGFyZWRTdGF0ZSh7bmFtZTplLHZlcnNpb246dCxzY2hlbWFVcmw6bi5zY2hlbWFVcmx9KS5tZXRlcn1hZGRNZXRyaWNSZWFkZXIoZSl7bGV0IHQ9bmV3IHVBLk1ldHJpY0NvbGxlY3Rvcih0aGlzLl9zaGFyZWRTdGF0ZSxlKTtlLnNldE1ldHJpY1Byb2R1Y2VyKHQpLHRoaXMuX3NoYXJlZFN0YXRlLm1ldHJpY0NvbGxlY3RvcnMucHVzaCh0KX1hc3luYyBzaHV0ZG93bihlKXtpZih0aGlzLl9zaHV0ZG93bil7aHMuZGlhZy53YXJuKFwic2h1dGRvd24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIE1ldGVyUHJvdmlkZXJcIik7cmV0dXJufXRoaXMuX3NodXRkb3duPSEwLGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX3NoYXJlZFN0YXRlLm1ldHJpY0NvbGxlY3RvcnMubWFwKHQ9PnQuc2h1dGRvd24oZSkpKX1hc3luYyBmb3JjZUZsdXNoKGUpe2lmKHRoaXMuX3NodXRkb3duKXtocy5kaWFnLndhcm4oXCJpbnZhbGlkIGF0dGVtcHQgdG8gZm9yY2UgZmx1c2ggYWZ0ZXIgTWV0ZXJQcm92aWRlciBzaHV0ZG93blwiKTtyZXR1cm59YXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fc2hhcmVkU3RhdGUubWV0cmljQ29sbGVjdG9ycy5tYXAodD0+dC5mb3JjZUZsdXNoKGUpKSl9fTtmcy5NZXRlclByb3ZpZGVyPXl1fSk7dmFyIEVzPWwoSnQ9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoSnQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7SnQuRXhhY3RQcmVkaWNhdGU9SnQuUGF0dGVyblByZWRpY2F0ZT12b2lkIDA7dmFyIGNBPS9bXFxeJFxcXFwuKz8oKVtcXF17fXxdL2csdnU9Y2xhc3Mgcntjb25zdHJ1Y3RvcihlKXtlPT09XCIqXCI/KHRoaXMuX21hdGNoQWxsPSEwLHRoaXMuX3JlZ2V4cD0vLiovKToodGhpcy5fbWF0Y2hBbGw9ITEsdGhpcy5fcmVnZXhwPW5ldyBSZWdFeHAoci5lc2NhcGVQYXR0ZXJuKGUpKSl9bWF0Y2goZSl7cmV0dXJuIHRoaXMuX21hdGNoQWxsPyEwOnRoaXMuX3JlZ2V4cC50ZXN0KGUpfXN0YXRpYyBlc2NhcGVQYXR0ZXJuKGUpe3JldHVybmBeJHtlLnJlcGxhY2UoY0EsXCJcXFxcJCZcIikucmVwbGFjZShcIipcIixcIi4qXCIpfSRgfXN0YXRpYyBoYXNXaWxkY2FyZChlKXtyZXR1cm4gZS5pbmNsdWRlcyhcIipcIil9fTtKdC5QYXR0ZXJuUHJlZGljYXRlPXZ1O3ZhciBJdT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9tYXRjaEFsbD1lPT09dm9pZCAwLHRoaXMuX3BhdHRlcm49ZX1tYXRjaChlKXtyZXR1cm4hISh0aGlzLl9tYXRjaEFsbHx8ZT09PXRoaXMuX3BhdHRlcm4pfX07SnQuRXhhY3RQcmVkaWNhdGU9SXV9KTt2YXIgaXA9bChtcz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtcyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTttcy5JbnN0cnVtZW50U2VsZWN0b3I9dm9pZCAwO3ZhciBucD1FcygpLE11PWNsYXNze2NvbnN0cnVjdG9yKGUpe3ZhciB0O3RoaXMuX25hbWVGaWx0ZXI9bmV3IG5wLlBhdHRlcm5QcmVkaWNhdGUoKHQ9ZT8ubmFtZSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6XCIqXCIpLHRoaXMuX3R5cGU9ZT8udHlwZSx0aGlzLl91bml0RmlsdGVyPW5ldyBucC5FeGFjdFByZWRpY2F0ZShlPy51bml0KX1nZXRUeXBlKCl7cmV0dXJuIHRoaXMuX3R5cGV9Z2V0TmFtZUZpbHRlcigpe3JldHVybiB0aGlzLl9uYW1lRmlsdGVyfWdldFVuaXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5fdW5pdEZpbHRlcn19O21zLkluc3RydW1lbnRTZWxlY3Rvcj1NdX0pO3ZhciBzcD1sKGdzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGdzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO2dzLk1ldGVyU2VsZWN0b3I9dm9pZCAwO3ZhciBMdT1FcygpLE51PWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX25hbWVGaWx0ZXI9bmV3IEx1LkV4YWN0UHJlZGljYXRlKGU/Lm5hbWUpLHRoaXMuX3ZlcnNpb25GaWx0ZXI9bmV3IEx1LkV4YWN0UHJlZGljYXRlKGU/LnZlcnNpb24pLHRoaXMuX3NjaGVtYVVybEZpbHRlcj1uZXcgTHUuRXhhY3RQcmVkaWNhdGUoZT8uc2NoZW1hVXJsKX1nZXROYW1lRmlsdGVyKCl7cmV0dXJuIHRoaXMuX25hbWVGaWx0ZXJ9Z2V0VmVyc2lvbkZpbHRlcigpe3JldHVybiB0aGlzLl92ZXJzaW9uRmlsdGVyfWdldFNjaGVtYVVybEZpbHRlcigpe3JldHVybiB0aGlzLl9zY2hlbWFVcmxGaWx0ZXJ9fTtncy5NZXRlclNlbGVjdG9yPU51fSk7dmFyIGFwPWwoVHM9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoVHMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VHMuVmlldz12b2lkIDA7dmFyIGxBPUVzKCksb3A9T3UoKSxkQT1pcCgpLF9BPXNwKCkscEE9a2koKTtmdW5jdGlvbiBoQShyKXtyZXR1cm4gci5pbnN0cnVtZW50TmFtZT09bnVsbCYmci5pbnN0cnVtZW50VHlwZT09bnVsbCYmci5pbnN0cnVtZW50VW5pdD09bnVsbCYmci5tZXRlck5hbWU9PW51bGwmJnIubWV0ZXJWZXJzaW9uPT1udWxsJiZyLm1ldGVyU2NoZW1hVXJsPT1udWxsfXZhciBDdT1jbGFzc3tjb25zdHJ1Y3RvcihlKXt2YXIgdDtpZihoQShlKSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIHZpZXcgd2l0aCBubyBzZWxlY3RvciBhcmd1bWVudHMgc3VwcGxpZWRcIik7aWYoZS5uYW1lIT1udWxsJiYoZT8uaW5zdHJ1bWVudE5hbWU9PW51bGx8fGxBLlBhdHRlcm5QcmVkaWNhdGUuaGFzV2lsZGNhcmQoZS5pbnN0cnVtZW50TmFtZSkpKXRocm93IG5ldyBFcnJvcihcIlZpZXdzIHdpdGggYSBzcGVjaWZpZWQgbmFtZSBtdXN0IGJlIGRlY2xhcmVkIHdpdGggYW4gaW5zdHJ1bWVudCBzZWxlY3RvciB0aGF0IHNlbGVjdHMgYXQgbW9zdCBvbmUgaW5zdHJ1bWVudCBwZXIgbWV0ZXIuXCIpO2UuYXR0cmlidXRlS2V5cyE9bnVsbD90aGlzLmF0dHJpYnV0ZXNQcm9jZXNzb3I9bmV3IG9wLkZpbHRlcmluZ0F0dHJpYnV0ZXNQcm9jZXNzb3IoZS5hdHRyaWJ1dGVLZXlzKTp0aGlzLmF0dHJpYnV0ZXNQcm9jZXNzb3I9b3AuQXR0cmlidXRlc1Byb2Nlc3Nvci5Ob29wKCksdGhpcy5uYW1lPWUubmFtZSx0aGlzLmRlc2NyaXB0aW9uPWUuZGVzY3JpcHRpb24sdGhpcy5hZ2dyZWdhdGlvbj0odD1lLmFnZ3JlZ2F0aW9uKSE9PW51bGwmJnQhPT12b2lkIDA/dDpwQS5BZ2dyZWdhdGlvbi5EZWZhdWx0KCksdGhpcy5pbnN0cnVtZW50U2VsZWN0b3I9bmV3IGRBLkluc3RydW1lbnRTZWxlY3Rvcih7bmFtZTplLmluc3RydW1lbnROYW1lLHR5cGU6ZS5pbnN0cnVtZW50VHlwZSx1bml0OmUuaW5zdHJ1bWVudFVuaXR9KSx0aGlzLm1ldGVyU2VsZWN0b3I9bmV3IF9BLk1ldGVyU2VsZWN0b3Ioe25hbWU6ZS5tZXRlck5hbWUsdmVyc2lvbjplLm1ldGVyVmVyc2lvbixzY2hlbWFVcmw6ZS5tZXRlclNjaGVtYVVybH0pfX07VHMuVmlldz1DdX0pO3ZhciB3dT1sKGc9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtnLlRpbWVvdXRFcnJvcj1nLlZpZXc9Zy5BZ2dyZWdhdGlvbj1nLlN1bUFnZ3JlZ2F0aW9uPWcuTGFzdFZhbHVlQWdncmVnYXRpb249Zy5IaXN0b2dyYW1BZ2dyZWdhdGlvbj1nLkRyb3BBZ2dyZWdhdGlvbj1nLkV4cG9uZW50aWFsSGlzdG9ncmFtQWdncmVnYXRpb249Zy5FeHBsaWNpdEJ1Y2tldEhpc3RvZ3JhbUFnZ3JlZ2F0aW9uPWcuRGVmYXVsdEFnZ3JlZ2F0aW9uPWcuTWV0ZXJQcm92aWRlcj1nLkluc3RydW1lbnRUeXBlPWcuQ29uc29sZU1ldHJpY0V4cG9ydGVyPWcuSW5NZW1vcnlNZXRyaWNFeHBvcnRlcj1nLlBlcmlvZGljRXhwb3J0aW5nTWV0cmljUmVhZGVyPWcuTWV0cmljUmVhZGVyPWcuRGF0YVBvaW50VHlwZT1nLkFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHk9dm9pZCAwO3ZhciBmQT1MaSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiQWdncmVnYXRpb25UZW1wb3JhbGl0eVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmQS5BZ2dyZWdhdGlvblRlbXBvcmFsaXR5fX0pO3ZhciBFQT13dCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiRGF0YVBvaW50VHlwZVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBFQS5EYXRhUG9pbnRUeXBlfX0pO3ZhciBtQT1LYSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiTWV0cmljUmVhZGVyXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG1BLk1ldHJpY1JlYWRlcn19KTt2YXIgZ0E9TF8oKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIlBlcmlvZGljRXhwb3J0aW5nTWV0cmljUmVhZGVyXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGdBLlBlcmlvZGljRXhwb3J0aW5nTWV0cmljUmVhZGVyfX0pO3ZhciBUQT1DXygpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiSW5NZW1vcnlNZXRyaWNFeHBvcnRlclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBUQS5Jbk1lbW9yeU1ldHJpY0V4cG9ydGVyfX0pO3ZhciBTQT14XygpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiQ29uc29sZU1ldHJpY0V4cG9ydGVyXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFNBLkNvbnNvbGVNZXRyaWNFeHBvcnRlcn19KTt2YXIgQUE9YmUoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIkluc3RydW1lbnRUeXBlXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEFBLkluc3RydW1lbnRUeXBlfX0pO3ZhciBPQT1ycCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiTWV0ZXJQcm92aWRlclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBPQS5NZXRlclByb3ZpZGVyfX0pO3ZhciB4ZT1raSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiRGVmYXVsdEFnZ3JlZ2F0aW9uXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHhlLkRlZmF1bHRBZ2dyZWdhdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIkV4cGxpY2l0QnVja2V0SGlzdG9ncmFtQWdncmVnYXRpb25cIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geGUuRXhwbGljaXRCdWNrZXRIaXN0b2dyYW1BZ2dyZWdhdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIkV4cG9uZW50aWFsSGlzdG9ncmFtQWdncmVnYXRpb25cIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geGUuRXhwb25lbnRpYWxIaXN0b2dyYW1BZ2dyZWdhdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIkRyb3BBZ2dyZWdhdGlvblwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB4ZS5Ecm9wQWdncmVnYXRpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGcsXCJIaXN0b2dyYW1BZ2dyZWdhdGlvblwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB4ZS5IaXN0b2dyYW1BZ2dyZWdhdGlvbn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIkxhc3RWYWx1ZUFnZ3JlZ2F0aW9uXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHhlLkxhc3RWYWx1ZUFnZ3JlZ2F0aW9ufX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShnLFwiU3VtQWdncmVnYXRpb25cIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geGUuU3VtQWdncmVnYXRpb259fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGcsXCJBZ2dyZWdhdGlvblwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB4ZS5BZ2dyZWdhdGlvbn19KTt2YXIgUkE9YXAoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIlZpZXdcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUkEuVmlld319KTt2YXIgYkE9RWUoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZyxcIlRpbWVvdXRFcnJvclwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBiQS5UaW1lb3V0RXJyb3J9fSl9KTt2YXIgdXA9bChTcz0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShTcyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtTcy5BYnN0cmFjdEFzeW5jSG9va3NDb250ZXh0TWFuYWdlcj12b2lkIDA7dmFyIFBBPXooXCJldmVudHNcIikseUE9W1wiYWRkTGlzdGVuZXJcIixcIm9uXCIsXCJvbmNlXCIsXCJwcmVwZW5kTGlzdGVuZXJcIixcInByZXBlbmRPbmNlTGlzdGVuZXJcIl0seHU9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9rT3RMaXN0ZW5lcnM9U3ltYm9sKFwiT3RMaXN0ZW5lcnNcIiksdGhpcy5fd3JhcHBlZD0hMX1iaW5kKGUsdCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQQS5FdmVudEVtaXR0ZXI/dGhpcy5fYmluZEV2ZW50RW1pdHRlcihlLHQpOnR5cGVvZiB0PT1cImZ1bmN0aW9uXCI/dGhpcy5fYmluZEZ1bmN0aW9uKGUsdCk6dH1fYmluZEZ1bmN0aW9uKGUsdCl7bGV0IG49dGhpcyxpPWZ1bmN0aW9uKC4uLnMpe3JldHVybiBuLndpdGgoZSwoKT0+dC5hcHBseSh0aGlzLHMpKX07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLFwibGVuZ3RoXCIse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiExLHZhbHVlOnQubGVuZ3RofSksaX1fYmluZEV2ZW50RW1pdHRlcihlLHQpe3JldHVybiB0aGlzLl9nZXRQYXRjaE1hcCh0KSE9PXZvaWQgMHx8KHRoaXMuX2NyZWF0ZVBhdGNoTWFwKHQpLHlBLmZvckVhY2goaT0+e3RbaV0hPT12b2lkIDAmJih0W2ldPXRoaXMuX3BhdGNoQWRkTGlzdGVuZXIodCx0W2ldLGUpKX0pLHR5cGVvZiB0LnJlbW92ZUxpc3RlbmVyPT1cImZ1bmN0aW9uXCImJih0LnJlbW92ZUxpc3RlbmVyPXRoaXMuX3BhdGNoUmVtb3ZlTGlzdGVuZXIodCx0LnJlbW92ZUxpc3RlbmVyKSksdHlwZW9mIHQub2ZmPT1cImZ1bmN0aW9uXCImJih0Lm9mZj10aGlzLl9wYXRjaFJlbW92ZUxpc3RlbmVyKHQsdC5vZmYpKSx0eXBlb2YgdC5yZW1vdmVBbGxMaXN0ZW5lcnM9PVwiZnVuY3Rpb25cIiYmKHQucmVtb3ZlQWxsTGlzdGVuZXJzPXRoaXMuX3BhdGNoUmVtb3ZlQWxsTGlzdGVuZXJzKHQsdC5yZW1vdmVBbGxMaXN0ZW5lcnMpKSksdH1fcGF0Y2hSZW1vdmVMaXN0ZW5lcihlLHQpe2xldCBuPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGkscyl7dmFyIG87bGV0IGE9KG89bi5fZ2V0UGF0Y2hNYXAoZSkpPT09bnVsbHx8bz09PXZvaWQgMD92b2lkIDA6b1tpXTtpZihhPT09dm9pZCAwKXJldHVybiB0LmNhbGwodGhpcyxpLHMpO2xldCB1PWEuZ2V0KHMpO3JldHVybiB0LmNhbGwodGhpcyxpLHV8fHMpfX1fcGF0Y2hSZW1vdmVBbGxMaXN0ZW5lcnMoZSx0KXtsZXQgbj10aGlzO3JldHVybiBmdW5jdGlvbihpKXtsZXQgcz1uLl9nZXRQYXRjaE1hcChlKTtyZXR1cm4gcyE9PXZvaWQgMCYmKGFyZ3VtZW50cy5sZW5ndGg9PT0wP24uX2NyZWF0ZVBhdGNoTWFwKGUpOnNbaV0hPT12b2lkIDAmJmRlbGV0ZSBzW2ldKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19X3BhdGNoQWRkTGlzdGVuZXIoZSx0LG4pe2xldCBpPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHMsbyl7aWYoaS5fd3JhcHBlZClyZXR1cm4gdC5jYWxsKHRoaXMscyxvKTtsZXQgYT1pLl9nZXRQYXRjaE1hcChlKTthPT09dm9pZCAwJiYoYT1pLl9jcmVhdGVQYXRjaE1hcChlKSk7bGV0IHU9YVtzXTt1PT09dm9pZCAwJiYodT1uZXcgV2Vha01hcCxhW3NdPXUpO2xldCBjPWkuYmluZChuLG8pO3Uuc2V0KG8sYyksaS5fd3JhcHBlZD0hMDt0cnl7cmV0dXJuIHQuY2FsbCh0aGlzLHMsYyl9ZmluYWxseXtpLl93cmFwcGVkPSExfX19X2NyZWF0ZVBhdGNoTWFwKGUpe2xldCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGVbdGhpcy5fa090TGlzdGVuZXJzXT10LHR9X2dldFBhdGNoTWFwKGUpe3JldHVybiBlW3RoaXMuX2tPdExpc3RlbmVyc119fTtTcy5BYnN0cmFjdEFzeW5jSG9va3NDb250ZXh0TWFuYWdlcj14dX0pO3ZhciBjcD1sKEFzPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEFzLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0FzLkFzeW5jTG9jYWxTdG9yYWdlQ29udGV4dE1hbmFnZXI9dm9pZCAwO3ZhciB2QT0oaCgpLG0oZCkpLElBPXooXCJhc3luY19ob29rc1wiKSxNQT11cCgpLER1PWNsYXNzIGV4dGVuZHMgTUEuQWJzdHJhY3RBc3luY0hvb2tzQ29udGV4dE1hbmFnZXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2FzeW5jTG9jYWxTdG9yYWdlPW5ldyBJQS5Bc3luY0xvY2FsU3RvcmFnZX1hY3RpdmUoKXt2YXIgZTtyZXR1cm4oZT10aGlzLl9hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpKSE9PW51bGwmJmUhPT12b2lkIDA/ZTp2QS5ST09UX0NPTlRFWFR9d2l0aChlLHQsbiwuLi5pKXtsZXQgcz1uPT1udWxsP3Q6dC5iaW5kKG4pO3JldHVybiB0aGlzLl9hc3luY0xvY2FsU3RvcmFnZS5ydW4oZSxzLC4uLmkpfWVuYWJsZSgpe3JldHVybiB0aGlzfWRpc2FibGUoKXtyZXR1cm4gdGhpcy5fYXN5bmNMb2NhbFN0b3JhZ2UuZGlzYWJsZSgpLHRoaXN9fTtBcy5Bc3luY0xvY2FsU3RvcmFnZUNvbnRleHRNYW5hZ2VyPUR1fSk7dmFyIFVyPWwoRGU9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoRGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7RGUudG9BbnlWYWx1ZT1EZS50b0tleVZhbHVlPURlLnRvQXR0cmlidXRlcz12b2lkIDA7ZnVuY3Rpb24gREEocil7cmV0dXJuIE9iamVjdC5rZXlzKHIpLm1hcChlPT5WdShlLHJbZV0pKX1EZS50b0F0dHJpYnV0ZXM9REE7ZnVuY3Rpb24gVnUocixlKXtyZXR1cm57a2V5OnIsdmFsdWU6R3UoZSl9fURlLnRvS2V5VmFsdWU9VnU7ZnVuY3Rpb24gR3Uocil7bGV0IGU9dHlwZW9mIHI7cmV0dXJuIGU9PT1cInN0cmluZ1wiP3tzdHJpbmdWYWx1ZTpyfTplPT09XCJudW1iZXJcIj9OdW1iZXIuaXNJbnRlZ2VyKHIpP3tpbnRWYWx1ZTpyfTp7ZG91YmxlVmFsdWU6cn06ZT09PVwiYm9vbGVhblwiP3tib29sVmFsdWU6cn06ciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/e2J5dGVzVmFsdWU6cn06QXJyYXkuaXNBcnJheShyKT97YXJyYXlWYWx1ZTp7dmFsdWVzOnIubWFwKEd1KX19OmU9PT1cIm9iamVjdFwiJiZyIT1udWxsP3trdmxpc3RWYWx1ZTp7dmFsdWVzOk9iamVjdC5lbnRyaWVzKHIpLm1hcCgoW3Qsbl0pPT5WdSh0LG4pKX19Ont9fURlLnRvQW55VmFsdWU9R3V9KTt2YXIgd3A9bChVZT0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShVZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtVZS50b090bHBTcGFuRXZlbnQ9VWUudG9PdGxwTGluaz1VZS5zZGtTcGFuVG9PdGxwU3Bhbj12b2lkIDA7dmFyIEh1PVVyKCk7ZnVuY3Rpb24gVUEocixlKXt2YXIgdDtsZXQgbj1yLnNwYW5Db250ZXh0KCksaT1yLnN0YXR1cztyZXR1cm57dHJhY2VJZDplLmVuY29kZVNwYW5Db250ZXh0KG4udHJhY2VJZCksc3BhbklkOmUuZW5jb2RlU3BhbkNvbnRleHQobi5zcGFuSWQpLHBhcmVudFNwYW5JZDplLmVuY29kZU9wdGlvbmFsU3BhbkNvbnRleHQoci5wYXJlbnRTcGFuSWQpLHRyYWNlU3RhdGU6KHQ9bi50cmFjZVN0YXRlKT09PW51bGx8fHQ9PT12b2lkIDA/dm9pZCAwOnQuc2VyaWFsaXplKCksbmFtZTpyLm5hbWUsa2luZDpyLmtpbmQ9PW51bGw/MDpyLmtpbmQrMSxzdGFydFRpbWVVbml4TmFubzplLmVuY29kZUhyVGltZShyLnN0YXJ0VGltZSksZW5kVGltZVVuaXhOYW5vOmUuZW5jb2RlSHJUaW1lKHIuZW5kVGltZSksYXR0cmlidXRlczooMCxIdS50b0F0dHJpYnV0ZXMpKHIuYXR0cmlidXRlcyksZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDpyLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQsZXZlbnRzOnIuZXZlbnRzLm1hcChzPT5DcChzLGUpKSxkcm9wcGVkRXZlbnRzQ291bnQ6ci5kcm9wcGVkRXZlbnRzQ291bnQsc3RhdHVzOntjb2RlOmkuY29kZSxtZXNzYWdlOmkubWVzc2FnZX0sbGlua3M6ci5saW5rcy5tYXAocz0+TnAocyxlKSksZHJvcHBlZExpbmtzQ291bnQ6ci5kcm9wcGVkTGlua3NDb3VudH19VWUuc2RrU3BhblRvT3RscFNwYW49VUE7ZnVuY3Rpb24gTnAocixlKXt2YXIgdDtyZXR1cm57YXR0cmlidXRlczpyLmF0dHJpYnV0ZXM/KDAsSHUudG9BdHRyaWJ1dGVzKShyLmF0dHJpYnV0ZXMpOltdLHNwYW5JZDplLmVuY29kZVNwYW5Db250ZXh0KHIuY29udGV4dC5zcGFuSWQpLHRyYWNlSWQ6ZS5lbmNvZGVTcGFuQ29udGV4dChyLmNvbnRleHQudHJhY2VJZCksdHJhY2VTdGF0ZToodD1yLmNvbnRleHQudHJhY2VTdGF0ZSk9PT1udWxsfHx0PT09dm9pZCAwP3ZvaWQgMDp0LnNlcmlhbGl6ZSgpLGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6ci5kcm9wcGVkQXR0cmlidXRlc0NvdW50fHwwfX1VZS50b090bHBMaW5rPU5wO2Z1bmN0aW9uIENwKHIsZSl7cmV0dXJue2F0dHJpYnV0ZXM6ci5hdHRyaWJ1dGVzPygwLEh1LnRvQXR0cmlidXRlcykoci5hdHRyaWJ1dGVzKTpbXSxuYW1lOnIubmFtZSx0aW1lVW5peE5hbm86ZS5lbmNvZGVIclRpbWUoci50aW1lKSxkcm9wcGVkQXR0cmlidXRlc0NvdW50OnIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudHx8MH19VWUudG9PdGxwU3BhbkV2ZW50PUNwfSk7dmFyIEJyPWwob2U9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkob2UsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7b2UuZ2V0T3RscEVuY29kZXI9b2UuZW5jb2RlQXNTdHJpbmc9b2UuZW5jb2RlQXNMb25nQml0cz1vZS50b0xvbmdCaXRzPW9lLmhyVGltZVRvTmFub3M9dm9pZCAwO3ZhciBicz1BKCksQkE9QmlnSW50KDFlOSk7ZnVuY3Rpb24ganUocil7cmV0dXJuIEJpZ0ludChyWzBdKSpCQStCaWdJbnQoclsxXSl9b2UuaHJUaW1lVG9OYW5vcz1qdTtmdW5jdGlvbiBEcChyKXtsZXQgZT1OdW1iZXIoQmlnSW50LmFzVWludE4oMzIscikpLHQ9TnVtYmVyKEJpZ0ludC5hc1VpbnROKDMyLHI+PkJpZ0ludCgzMikpKTtyZXR1cm57bG93OmUsaGlnaDp0fX1vZS50b0xvbmdCaXRzPURwO2Z1bmN0aW9uIEZ1KHIpe2xldCBlPWp1KHIpO3JldHVybiBEcChlKX1vZS5lbmNvZGVBc0xvbmdCaXRzPUZ1O2Z1bmN0aW9uIFVwKHIpe3JldHVybiBqdShyKS50b1N0cmluZygpfW9lLmVuY29kZUFzU3RyaW5nPVVwO3ZhciBxQT10eXBlb2YgQmlnSW50PFwidVwiP1VwOmJzLmhyVGltZVRvTmFub3NlY29uZHM7ZnVuY3Rpb24geHAocil7cmV0dXJuIHJ9ZnVuY3Rpb24gQnAocil7aWYociE9PXZvaWQgMClyZXR1cm4oMCxicy5oZXhUb0Jhc2U2NCkocil9dmFyIFZBPXtlbmNvZGVIclRpbWU6RnUsZW5jb2RlU3BhbkNvbnRleHQ6YnMuaGV4VG9CYXNlNjQsZW5jb2RlT3B0aW9uYWxTcGFuQ29udGV4dDpCcH07ZnVuY3Rpb24gR0Eocil7dmFyIGUsdDtpZihyPT09dm9pZCAwKXJldHVybiBWQTtsZXQgbj0oZT1yLnVzZUxvbmdCaXRzKSE9PW51bGwmJmUhPT12b2lkIDA/ZTohMCxpPSh0PXIudXNlSGV4KSE9PW51bGwmJnQhPT12b2lkIDA/dDohMTtyZXR1cm57ZW5jb2RlSHJUaW1lOm4/RnU6cUEsZW5jb2RlU3BhbkNvbnRleHQ6aT94cDpicy5oZXhUb0Jhc2U2NCxlbmNvZGVPcHRpb25hbFNwYW5Db250ZXh0Omk/eHA6QnB9fW9lLmdldE90bHBFbmNvZGVyPUdBfSk7dmFyIHlzPWwoUHM9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoUHMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7UHMuY3JlYXRlRXhwb3J0VHJhY2VTZXJ2aWNlUmVxdWVzdD12b2lkIDA7dmFyIEhBPVVyKCksakE9d3AoKSxGQT1CcigpO2Z1bmN0aW9uIGtBKHIsZSl7bGV0IHQ9KDAsRkEuZ2V0T3RscEVuY29kZXIpKGUpO3JldHVybntyZXNvdXJjZVNwYW5zOlhBKHIsdCl9fVBzLmNyZWF0ZUV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3Q9a0E7ZnVuY3Rpb24gJEEocil7bGV0IGU9bmV3IE1hcDtmb3IobGV0IHQgb2Ygcil7bGV0IG49ZS5nZXQodC5yZXNvdXJjZSk7bnx8KG49bmV3IE1hcCxlLnNldCh0LnJlc291cmNlLG4pKTtsZXQgaT1gJHt0Lmluc3RydW1lbnRhdGlvbkxpYnJhcnkubmFtZX1AJHt0Lmluc3RydW1lbnRhdGlvbkxpYnJhcnkudmVyc2lvbnx8XCJcIn06JHt0Lmluc3RydW1lbnRhdGlvbkxpYnJhcnkuc2NoZW1hVXJsfHxcIlwifWAscz1uLmdldChpKTtzfHwocz1bXSxuLnNldChpLHMpKSxzLnB1c2godCl9cmV0dXJuIGV9ZnVuY3Rpb24gWEEocixlKXtsZXQgdD0kQShyKSxuPVtdLGk9dC5lbnRyaWVzKCkscz1pLm5leHQoKTtmb3IoOyFzLmRvbmU7KXtsZXRbbyxhXT1zLnZhbHVlLHU9W10sYz1hLnZhbHVlcygpLF89Yy5uZXh0KCk7Zm9yKDshXy5kb25lOyl7bGV0IGY9Xy52YWx1ZTtpZihmLmxlbmd0aD4wKXtsZXR7bmFtZTpNLHZlcnNpb246UixzY2hlbWFVcmw6d309ZlswXS5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LFU9Zi5tYXAoUz0+KDAsakEuc2RrU3BhblRvT3RscFNwYW4pKFMsZSkpO3UucHVzaCh7c2NvcGU6e25hbWU6TSx2ZXJzaW9uOlJ9LHNwYW5zOlUsc2NoZW1hVXJsOnd9KX1fPWMubmV4dCgpfWxldCBwPXtyZXNvdXJjZTp7YXR0cmlidXRlczooMCxIQS50b0F0dHJpYnV0ZXMpKG8uYXR0cmlidXRlcyksZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDowfSxzY29wZVNwYW5zOnUsc2NoZW1hVXJsOnZvaWQgMH07bi5wdXNoKHApLHM9aS5uZXh0KCl9cmV0dXJuIG59fSk7dmFyIEdwPWwoTj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO04ucGFyc2VSZXRyeUFmdGVyVG9NaWxscz1OLmlzRXhwb3J0UmV0cnlhYmxlPU4uaW52YWxpZFRpbWVvdXQ9Ti5jb25maWd1cmVFeHBvcnRlclRpbWVvdXQ9Ti5hcHBlbmRSb290UGF0aFRvVXJsSWZOZWVkZWQ9Ti5hcHBlbmRSZXNvdXJjZVBhdGhUb1VybD1OLnBhcnNlSGVhZGVycz1OLkRFRkFVTFRfRVhQT1JUX0JBQ0tPRkZfTVVMVElQTElFUj1OLkRFRkFVTFRfRVhQT1JUX01BWF9CQUNLT0ZGPU4uREVGQVVMVF9FWFBPUlRfSU5JVElBTF9CQUNLT0ZGPU4uREVGQVVMVF9FWFBPUlRfTUFYX0FUVEVNUFRTPXZvaWQgMDt2YXIga3U9KGgoKSxtKGQpKSxxcD1BKCksVnA9MWU0O04uREVGQVVMVF9FWFBPUlRfTUFYX0FUVEVNUFRTPTU7Ti5ERUZBVUxUX0VYUE9SVF9JTklUSUFMX0JBQ0tPRkY9MWUzO04uREVGQVVMVF9FWFBPUlRfTUFYX0JBQ0tPRkY9NWUzO04uREVGQVVMVF9FWFBPUlRfQkFDS09GRl9NVUxUSVBMSUVSPTEuNTtmdW5jdGlvbiBXQShyPXt9KXtsZXQgZT17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXMocikuZm9yRWFjaCgoW3Qsbl0pPT57dHlwZW9mIG48XCJ1XCI/ZVt0XT1TdHJpbmcobik6a3UuZGlhZy53YXJuKGBIZWFkZXIgXCIke3R9XCIgaGFzIHdyb25nIHZhbHVlIGFuZCB3aWxsIGJlIGlnbm9yZWRgKX0pLGV9Ti5wYXJzZUhlYWRlcnM9V0E7ZnVuY3Rpb24gS0EocixlKXtyZXR1cm4gci5lbmRzV2l0aChcIi9cIil8fChyPXIrXCIvXCIpLHIrZX1OLmFwcGVuZFJlc291cmNlUGF0aFRvVXJsPUtBO2Z1bmN0aW9uIHpBKHIpe3RyeXtsZXQgZT1uZXcgVVJMKHIpO3JldHVybiBlLnBhdGhuYW1lPT09XCJcIiYmKGUucGF0aG5hbWU9ZS5wYXRobmFtZStcIi9cIiksZS50b1N0cmluZygpfWNhdGNoe3JldHVybiBrdS5kaWFnLndhcm4oYENvdWxkIG5vdCBwYXJzZSBleHBvcnQgVVJMOiAnJHtyfSdgKSxyfX1OLmFwcGVuZFJvb3RQYXRoVG9VcmxJZk5lZWRlZD16QTtmdW5jdGlvbiBZQShyKXtyZXR1cm4gdHlwZW9mIHI9PVwibnVtYmVyXCI/cjw9MD8kdShyLFZwKTpyOlFBKCl9Ti5jb25maWd1cmVFeHBvcnRlclRpbWVvdXQ9WUE7ZnVuY3Rpb24gUUEoKXt2YXIgcjtsZXQgZT1OdW1iZXIoKHI9KDAscXAuZ2V0RW52KSgpLk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfVElNRU9VVCkhPT1udWxsJiZyIT09dm9pZCAwP3I6KDAscXAuZ2V0RW52KSgpLk9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUKTtyZXR1cm4gZTw9MD8kdShlLFZwKTplfWZ1bmN0aW9uICR1KHIsZSl7cmV0dXJuIGt1LmRpYWcud2FybihcIlRpbWVvdXQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMFwiLHIpLGV9Ti5pbnZhbGlkVGltZW91dD0kdTtmdW5jdGlvbiBaQShyKXtyZXR1cm5bNDI5LDUwMiw1MDMsNTA0XS5pbmNsdWRlcyhyKX1OLmlzRXhwb3J0UmV0cnlhYmxlPVpBO2Z1bmN0aW9uIEpBKHIpe2lmKHI9PW51bGwpcmV0dXJuLTE7bGV0IGU9TnVtYmVyLnBhcnNlSW50KHIsMTApO2lmKE51bWJlci5pc0ludGVnZXIoZSkpcmV0dXJuIGU+MD9lKjFlMzotMTtsZXQgdD1uZXcgRGF0ZShyKS5nZXRUaW1lKCktRGF0ZS5ub3coKTtyZXR1cm4gdD49MD90OjB9Ti5wYXJzZVJldHJ5QWZ0ZXJUb01pbGxzPUpBfSk7dmFyIGpwPWwodnM9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkodnMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dnMuT1RMUEV4cG9ydGVyQmFzZT12b2lkIDA7dmFyIEhwPShoKCksbShkKSkscXI9QSgpLGVPPUdwKCksWHU9Y2xhc3N7Y29uc3RydWN0b3IoZT17fSl7dGhpcy5fc2VuZGluZ1Byb21pc2VzPVtdLHRoaXMudXJsPXRoaXMuZ2V0RGVmYXVsdFVybChlKSx0eXBlb2YgZS5ob3N0bmFtZT09XCJzdHJpbmdcIiYmKHRoaXMuaG9zdG5hbWU9ZS5ob3N0bmFtZSksdGhpcy5zaHV0ZG93bj10aGlzLnNodXRkb3duLmJpbmQodGhpcyksdGhpcy5fc2h1dGRvd25PbmNlPW5ldyBxci5CaW5kT25jZUZ1dHVyZSh0aGlzLl9zaHV0ZG93bix0aGlzKSx0aGlzLl9jb25jdXJyZW5jeUxpbWl0PXR5cGVvZiBlLmNvbmN1cnJlbmN5TGltaXQ9PVwibnVtYmVyXCI/ZS5jb25jdXJyZW5jeUxpbWl0OjMwLHRoaXMudGltZW91dE1pbGxpcz0oMCxlTy5jb25maWd1cmVFeHBvcnRlclRpbWVvdXQpKGUudGltZW91dE1pbGxpcyksdGhpcy5vbkluaXQoZSl9ZXhwb3J0KGUsdCl7aWYodGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkKXt0KHtjb2RlOnFyLkV4cG9ydFJlc3VsdENvZGUuRkFJTEVELGVycm9yOm5ldyBFcnJvcihcIkV4cG9ydGVyIGhhcyBiZWVuIHNodXRkb3duXCIpfSk7cmV0dXJufWlmKHRoaXMuX3NlbmRpbmdQcm9taXNlcy5sZW5ndGg+PXRoaXMuX2NvbmN1cnJlbmN5TGltaXQpe3Qoe2NvZGU6cXIuRXhwb3J0UmVzdWx0Q29kZS5GQUlMRUQsZXJyb3I6bmV3IEVycm9yKFwiQ29uY3VycmVudCBleHBvcnQgbGltaXQgcmVhY2hlZFwiKX0pO3JldHVybn10aGlzLl9leHBvcnQoZSkudGhlbigoKT0+e3Qoe2NvZGU6cXIuRXhwb3J0UmVzdWx0Q29kZS5TVUNDRVNTfSl9KS5jYXRjaChuPT57dCh7Y29kZTpxci5FeHBvcnRSZXN1bHRDb2RlLkZBSUxFRCxlcnJvcjpufSl9KX1fZXhwb3J0KGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3RyeXtIcC5kaWFnLmRlYnVnKFwiaXRlbXMgdG8gYmUgc2VudFwiLGUpLHRoaXMuc2VuZChlLHQsbil9Y2F0Y2goaSl7bihpKX19KX1zaHV0ZG93bigpe3JldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuY2FsbCgpfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fc2VuZGluZ1Byb21pc2VzKS50aGVuKCgpPT57fSl9X3NodXRkb3duKCl7cmV0dXJuIEhwLmRpYWcuZGVidWcoXCJzaHV0ZG93biBzdGFydGVkXCIpLHRoaXMub25TaHV0ZG93bigpLHRoaXMuZm9yY2VGbHVzaCgpfX07dnMuT1RMUEV4cG9ydGVyQmFzZT1YdX0pO3ZhciBYcD1sKChreSwkcCk9PntcInVzZSBzdHJpY3RcIjskcC5leHBvcnRzPW5PO2Z1bmN0aW9uIG5PKHIsZSl7Zm9yKHZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MCxpPTIscz0hMDtpPGFyZ3VtZW50cy5sZW5ndGg7KXRbbisrXT1hcmd1bWVudHNbaSsrXTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYSx1KXt0W25dPWZ1bmN0aW9uKF8pe2lmKHMpaWYocz0hMSxfKXUoXyk7ZWxzZXtmb3IodmFyIHA9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZj0wO2Y8cC5sZW5ndGg7KXBbZisrXT1hcmd1bWVudHNbZl07YS5hcHBseShudWxsLHApfX07dHJ5e3IuYXBwbHkoZXx8bnVsbCx0KX1jYXRjaChjKXtzJiYocz0hMSx1KGMpKX19KX19KTt2YXIgWXA9bCh6cD0+e1widXNlIHN0cmljdFwiO3ZhciBNcz16cDtNcy5sZW5ndGg9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYoIXQpcmV0dXJuIDA7Zm9yKHZhciBuPTA7LS10JTQ+MSYmZS5jaGFyQXQodCk9PT1cIj1cIjspKytuO3JldHVybiBNYXRoLmNlaWwoZS5sZW5ndGgqMykvNC1ufTt2YXIgbnI9bmV3IEFycmF5KDY0KSxLcD1uZXcgQXJyYXkoMTIzKTtmb3IobGU9MDtsZTw2NDspS3BbbnJbbGVdPWxlPDI2P2xlKzY1OmxlPDUyP2xlKzcxOmxlPDYyP2xlLTQ6bGUtNTl8NDNdPWxlKys7dmFyIGxlO01zLmVuY29kZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBpPW51bGwscz1bXSxvPTAsYT0wLHU7dDxuOyl7dmFyIGM9ZVt0KytdO3N3aXRjaChhKXtjYXNlIDA6c1tvKytdPW5yW2M+PjJdLHU9KGMmMyk8PDQsYT0xO2JyZWFrO2Nhc2UgMTpzW28rK109bnJbdXxjPj40XSx1PShjJjE1KTw8MixhPTI7YnJlYWs7Y2FzZSAyOnNbbysrXT1uclt1fGM+PjZdLHNbbysrXT1ucltjJjYzXSxhPTA7YnJlYWt9bz44MTkxJiYoKGl8fChpPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzKSksbz0wKX1yZXR1cm4gYSYmKHNbbysrXT1uclt1XSxzW28rK109NjEsYT09PTEmJihzW28rK109NjEpKSxpPyhvJiZpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcscy5zbGljZSgwLG8pKSksaS5qb2luKFwiXCIpKTpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzLnNsaWNlKDAsbykpfTt2YXIgV3A9XCJpbnZhbGlkIGVuY29kaW5nXCI7TXMuZGVjb2RlPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9bixzPTAsbyxhPTA7YTxlLmxlbmd0aDspe3ZhciB1PWUuY2hhckNvZGVBdChhKyspO2lmKHU9PT02MSYmcz4xKWJyZWFrO2lmKCh1PUtwW3VdKT09PXZvaWQgMCl0aHJvdyBFcnJvcihXcCk7c3dpdGNoKHMpe2Nhc2UgMDpvPXUscz0xO2JyZWFrO2Nhc2UgMTp0W24rK109bzw8MnwodSY0OCk+PjQsbz11LHM9MjticmVhaztjYXNlIDI6dFtuKytdPShvJjE1KTw8NHwodSY2MCk+PjIsbz11LHM9MzticmVhaztjYXNlIDM6dFtuKytdPShvJjMpPDw2fHUscz0wO2JyZWFrfX1pZihzPT09MSl0aHJvdyBFcnJvcihXcCk7cmV0dXJuIG4taX07TXMudGVzdD1mdW5jdGlvbihlKXtyZXR1cm4vXig/OltBLVphLXowLTkrL117NH0pKig/OltBLVphLXowLTkrL117Mn09PXxbQS1aYS16MC05Ky9dezN9PSk/JC8udGVzdChlKX19KTt2YXIgWnA9bCgoWHksUXApPT57XCJ1c2Ugc3RyaWN0XCI7UXAuZXhwb3J0cz1McztmdW5jdGlvbiBMcygpe3RoaXMuX2xpc3RlbmVycz17fX1Mcy5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0LG4pe3JldHVybih0aGlzLl9saXN0ZW5lcnNbZV18fCh0aGlzLl9saXN0ZW5lcnNbZV09W10pKS5wdXNoKHtmbjp0LGN0eDpufHx0aGlzfSksdGhpc307THMucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe2lmKGU9PT12b2lkIDApdGhpcy5fbGlzdGVuZXJzPXt9O2Vsc2UgaWYodD09PXZvaWQgMCl0aGlzLl9saXN0ZW5lcnNbZV09W107ZWxzZSBmb3IodmFyIG49dGhpcy5fbGlzdGVuZXJzW2VdLGk9MDtpPG4ubGVuZ3RoOyluW2ldLmZuPT09dD9uLnNwbGljZShpLDEpOisraTtyZXR1cm4gdGhpc307THMucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzW2VdO2lmKHQpe2Zvcih2YXIgbj1bXSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoOyluLnB1c2goYXJndW1lbnRzW2krK10pO2ZvcihpPTA7aTx0Lmxlbmd0aDspdFtpXS5mbi5hcHBseSh0W2krK10uY3R4LG4pfXJldHVybiB0aGlzfX0pO3ZhciBzaD1sKChXeSxpaCk9PntcInVzZSBzdHJpY3RcIjtpaC5leHBvcnRzPUpwKEpwKTtmdW5jdGlvbiBKcChyKXtyZXR1cm4gdHlwZW9mIEZsb2F0MzJBcnJheTxcInVcIj9mdW5jdGlvbigpe3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoWy0wXSksdD1uZXcgVWludDhBcnJheShlLmJ1ZmZlciksbj10WzNdPT09MTI4O2Z1bmN0aW9uIGkodSxjLF8pe2VbMF09dSxjW19dPXRbMF0sY1tfKzFdPXRbMV0sY1tfKzJdPXRbMl0sY1tfKzNdPXRbM119ZnVuY3Rpb24gcyh1LGMsXyl7ZVswXT11LGNbX109dFszXSxjW18rMV09dFsyXSxjW18rMl09dFsxXSxjW18rM109dFswXX1yLndyaXRlRmxvYXRMRT1uP2k6cyxyLndyaXRlRmxvYXRCRT1uP3M6aTtmdW5jdGlvbiBvKHUsYyl7cmV0dXJuIHRbMF09dVtjXSx0WzFdPXVbYysxXSx0WzJdPXVbYysyXSx0WzNdPXVbYyszXSxlWzBdfWZ1bmN0aW9uIGEodSxjKXtyZXR1cm4gdFszXT11W2NdLHRbMl09dVtjKzFdLHRbMV09dVtjKzJdLHRbMF09dVtjKzNdLGVbMF19ci5yZWFkRmxvYXRMRT1uP286YSxyLnJlYWRGbG9hdEJFPW4/YTpvfSgpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShuLGkscyxvKXt2YXIgYT1pPDA/MTowO2lmKGEmJihpPS1pKSxpPT09MCluKDEvaT4wPzA6MjE0NzQ4MzY0OCxzLG8pO2Vsc2UgaWYoaXNOYU4oaSkpbigyMTQzMjg5MzQ0LHMsbyk7ZWxzZSBpZihpPjM0MDI4MjM0NjYzODUyODg2ZTIyKW4oKGE8PDMxfDIxMzkwOTUwNDApPj4+MCxzLG8pO2Vsc2UgaWYoaTwxMTc1NDk0MzUwODIyMjg3NWUtNTQpbigoYTw8MzF8TWF0aC5yb3VuZChpLzE0MDEyOTg0NjQzMjQ4MTdlLTYwKSk+Pj4wLHMsbyk7ZWxzZXt2YXIgdT1NYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4yKSxjPU1hdGgucm91bmQoaSpNYXRoLnBvdygyLC11KSo4Mzg4NjA4KSY4Mzg4NjA3O24oKGE8PDMxfHUrMTI3PDwyM3xjKT4+PjAscyxvKX19ci53cml0ZUZsb2F0TEU9ZS5iaW5kKG51bGwsZWgpLHIud3JpdGVGbG9hdEJFPWUuYmluZChudWxsLHRoKTtmdW5jdGlvbiB0KG4saSxzKXt2YXIgbz1uKGkscyksYT0obz4+MzEpKjIrMSx1PW8+Pj4yMyYyNTUsYz1vJjgzODg2MDc7cmV0dXJuIHU9PT0yNTU/Yz9OYU46YSooMS8wKTp1PT09MD9hKjE0MDEyOTg0NjQzMjQ4MTdlLTYwKmM6YSpNYXRoLnBvdygyLHUtMTUwKSooYys4Mzg4NjA4KX1yLnJlYWRGbG9hdExFPXQuYmluZChudWxsLHJoKSxyLnJlYWRGbG9hdEJFPXQuYmluZChudWxsLG5oKX0oKSx0eXBlb2YgRmxvYXQ2NEFycmF5PFwidVwiP2Z1bmN0aW9uKCl7dmFyIGU9bmV3IEZsb2F0NjRBcnJheShbLTBdKSx0PW5ldyBVaW50OEFycmF5KGUuYnVmZmVyKSxuPXRbN109PT0xMjg7ZnVuY3Rpb24gaSh1LGMsXyl7ZVswXT11LGNbX109dFswXSxjW18rMV09dFsxXSxjW18rMl09dFsyXSxjW18rM109dFszXSxjW18rNF09dFs0XSxjW18rNV09dFs1XSxjW18rNl09dFs2XSxjW18rN109dFs3XX1mdW5jdGlvbiBzKHUsYyxfKXtlWzBdPXUsY1tfXT10WzddLGNbXysxXT10WzZdLGNbXysyXT10WzVdLGNbXyszXT10WzRdLGNbXys0XT10WzNdLGNbXys1XT10WzJdLGNbXys2XT10WzFdLGNbXys3XT10WzBdfXIud3JpdGVEb3VibGVMRT1uP2k6cyxyLndyaXRlRG91YmxlQkU9bj9zOmk7ZnVuY3Rpb24gbyh1LGMpe3JldHVybiB0WzBdPXVbY10sdFsxXT11W2MrMV0sdFsyXT11W2MrMl0sdFszXT11W2MrM10sdFs0XT11W2MrNF0sdFs1XT11W2MrNV0sdFs2XT11W2MrNl0sdFs3XT11W2MrN10sZVswXX1mdW5jdGlvbiBhKHUsYyl7cmV0dXJuIHRbN109dVtjXSx0WzZdPXVbYysxXSx0WzVdPXVbYysyXSx0WzRdPXVbYyszXSx0WzNdPXVbYys0XSx0WzJdPXVbYys1XSx0WzFdPXVbYys2XSx0WzBdPXVbYys3XSxlWzBdfXIucmVhZERvdWJsZUxFPW4/bzphLHIucmVhZERvdWJsZUJFPW4/YTpvfSgpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShuLGkscyxvLGEsdSl7dmFyIGM9bzwwPzE6MDtpZihjJiYobz0tbyksbz09PTApbigwLGEsdStpKSxuKDEvbz4wPzA6MjE0NzQ4MzY0OCxhLHUrcyk7ZWxzZSBpZihpc05hTihvKSluKDAsYSx1K2kpLG4oMjE0Njk1OTM2MCxhLHUrcyk7ZWxzZSBpZihvPjE3OTc2OTMxMzQ4NjIzMTU3ZTI5MiluKDAsYSx1K2kpLG4oKGM8PDMxfDIxNDY0MzUwNzIpPj4+MCxhLHUrcyk7ZWxzZXt2YXIgXztpZihvPDIyMjUwNzM4NTg1MDcyMDE0ZS0zMjQpXz1vLzVlLTMyNCxuKF8+Pj4wLGEsdStpKSxuKChjPDwzMXxfLzQyOTQ5NjcyOTYpPj4+MCxhLHUrcyk7ZWxzZXt2YXIgcD1NYXRoLmZsb29yKE1hdGgubG9nKG8pL01hdGguTE4yKTtwPT09MTAyNCYmKHA9MTAyMyksXz1vKk1hdGgucG93KDIsLXApLG4oXyo0NTAzNTk5NjI3MzcwNDk2Pj4+MCxhLHUraSksbigoYzw8MzF8cCsxMDIzPDwyMHxfKjEwNDg1NzYmMTA0ODU3NSk+Pj4wLGEsdStzKX19fXIud3JpdGVEb3VibGVMRT1lLmJpbmQobnVsbCxlaCwwLDQpLHIud3JpdGVEb3VibGVCRT1lLmJpbmQobnVsbCx0aCw0LDApO2Z1bmN0aW9uIHQobixpLHMsbyxhKXt2YXIgdT1uKG8sYStpKSxjPW4obyxhK3MpLF89KGM+PjMxKSoyKzEscD1jPj4+MjAmMjA0NyxmPTQyOTQ5NjcyOTYqKGMmMTA0ODU3NSkrdTtyZXR1cm4gcD09PTIwNDc/Zj9OYU46XyooMS8wKTpwPT09MD9fKjVlLTMyNCpmOl8qTWF0aC5wb3coMixwLTEwNzUpKihmKzQ1MDM1OTk2MjczNzA0OTYpfXIucmVhZERvdWJsZUxFPXQuYmluZChudWxsLHJoLDAsNCksci5yZWFkRG91YmxlQkU9dC5iaW5kKG51bGwsbmgsNCwwKX0oKSxyfWZ1bmN0aW9uIGVoKHIsZSx0KXtlW3RdPXImMjU1LGVbdCsxXT1yPj4+OCYyNTUsZVt0KzJdPXI+Pj4xNiYyNTUsZVt0KzNdPXI+Pj4yNH1mdW5jdGlvbiB0aChyLGUsdCl7ZVt0XT1yPj4+MjQsZVt0KzFdPXI+Pj4xNiYyNTUsZVt0KzJdPXI+Pj44JjI1NSxlW3QrM109ciYyNTV9ZnVuY3Rpb24gcmgocixlKXtyZXR1cm4ocltlXXxyW2UrMV08PDh8cltlKzJdPDwxNnxyW2UrM108PDI0KT4+PjB9ZnVuY3Rpb24gbmgocixlKXtyZXR1cm4ocltlXTw8MjR8cltlKzFdPDwxNnxyW2UrMl08PDh8cltlKzNdKT4+PjB9fSk7dmFyIG9oPWwoKGV4cG9ydHMsbW9kdWxlKT0+e1widXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPWlucXVpcmU7ZnVuY3Rpb24gaW5xdWlyZShtb2R1bGVOYW1lKXt0cnl7dmFyIG1vZD1ldmFsKFwicXVpcmVcIi5yZXBsYWNlKC9eLyxcInJlXCIpKShtb2R1bGVOYW1lKTtpZihtb2QmJihtb2QubGVuZ3RofHxPYmplY3Qua2V5cyhtb2QpLmxlbmd0aCkpcmV0dXJuIG1vZH1jYXRjaChyKXt9cmV0dXJuIG51bGx9fSk7dmFyIHVoPWwoYWg9PntcInVzZSBzdHJpY3RcIjt2YXIgS3U9YWg7S3UubGVuZ3RoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49MCxpPTA7aTxlLmxlbmd0aDsrK2kpbj1lLmNoYXJDb2RlQXQoaSksbjwxMjg/dCs9MTpuPDIwNDg/dCs9MjoobiY2NDUxMik9PT01NTI5NiYmKGUuY2hhckNvZGVBdChpKzEpJjY0NTEyKT09PTU2MzIwPygrK2ksdCs9NCk6dCs9MztyZXR1cm4gdH07S3UucmVhZD1mdW5jdGlvbihlLHQsbil7dmFyIGk9bi10O2lmKGk8MSlyZXR1cm5cIlwiO2Zvcih2YXIgcz1udWxsLG89W10sYT0wLHU7dDxuOyl1PWVbdCsrXSx1PDEyOD9vW2ErK109dTp1PjE5MSYmdTwyMjQ/b1thKytdPSh1JjMxKTw8NnxlW3QrK10mNjM6dT4yMzkmJnU8MzY1Pyh1PSgodSY3KTw8MTh8KGVbdCsrXSY2Myk8PDEyfChlW3QrK10mNjMpPDw2fGVbdCsrXSY2MyktNjU1MzYsb1thKytdPTU1Mjk2Kyh1Pj4xMCksb1thKytdPTU2MzIwKyh1JjEwMjMpKTpvW2ErK109KHUmMTUpPDwxMnwoZVt0KytdJjYzKTw8NnxlW3QrK10mNjMsYT44MTkxJiYoKHN8fChzPVtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxvKSksYT0wKTtyZXR1cm4gcz8oYSYmcy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLG8uc2xpY2UoMCxhKSkpLHMuam9pbihcIlwiKSk6U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsby5zbGljZSgwLGEpKX07S3Uud3JpdGU9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaT1uLHMsbyxhPTA7YTxlLmxlbmd0aDsrK2Epcz1lLmNoYXJDb2RlQXQoYSksczwxMjg/dFtuKytdPXM6czwyMDQ4Pyh0W24rK109cz4+NnwxOTIsdFtuKytdPXMmNjN8MTI4KToocyY2NDUxMik9PT01NTI5NiYmKChvPWUuY2hhckNvZGVBdChhKzEpKSY2NDUxMik9PT01NjMyMD8ocz02NTUzNisoKHMmMTAyMyk8PDEwKSsobyYxMDIzKSwrK2EsdFtuKytdPXM+PjE4fDI0MCx0W24rK109cz4+MTImNjN8MTI4LHRbbisrXT1zPj42JjYzfDEyOCx0W24rK109cyY2M3wxMjgpOih0W24rK109cz4+MTJ8MjI0LHRbbisrXT1zPj42JjYzfDEyOCx0W24rK109cyY2M3wxMjgpO3JldHVybiBuLWl9fSk7dmFyIGxoPWwoKHp5LGNoKT0+e1widXNlIHN0cmljdFwiO2NoLmV4cG9ydHM9aU87ZnVuY3Rpb24gaU8ocixlLHQpe3ZhciBuPXR8fDgxOTIsaT1uPj4+MSxzPW51bGwsbz1uO3JldHVybiBmdW5jdGlvbih1KXtpZih1PDF8fHU+aSlyZXR1cm4gcih1KTtvK3U+biYmKHM9cihuKSxvPTApO3ZhciBjPWUuY2FsbChzLG8sbys9dSk7cmV0dXJuIG8mNyYmKG89KG98NykrMSksY319fSk7dmFyIF9oPWwoKFl5LGRoKT0+e1widXNlIHN0cmljdFwiO2RoLmV4cG9ydHM9Vjt2YXIgVnI9cWUoKTtmdW5jdGlvbiBWKHIsZSl7dGhpcy5sbz1yPj4+MCx0aGlzLmhpPWU+Pj4wfXZhciBjdD1WLnplcm89bmV3IFYoMCwwKTtjdC50b051bWJlcj1mdW5jdGlvbigpe3JldHVybiAwfTtjdC56ekVuY29kZT1jdC56ekRlY29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtjdC5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gMX07dmFyIHNPPVYuemVyb0hhc2g9XCJcXDBcXDBcXDBcXDBcXDBcXDBcXDBcXDBcIjtWLmZyb21OdW1iZXI9ZnVuY3Rpb24oZSl7aWYoZT09PTApcmV0dXJuIGN0O3ZhciB0PWU8MDt0JiYoZT0tZSk7dmFyIG49ZT4+PjAsaT0oZS1uKS80Mjk0OTY3Mjk2Pj4+MDtyZXR1cm4gdCYmKGk9fmk+Pj4wLG49fm4+Pj4wLCsrbj40Mjk0OTY3Mjk1JiYobj0wLCsraT40Mjk0OTY3Mjk1JiYoaT0wKSkpLG5ldyBWKG4saSl9O1YuZnJvbT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09XCJudW1iZXJcIilyZXR1cm4gVi5mcm9tTnVtYmVyKGUpO2lmKFZyLmlzU3RyaW5nKGUpKWlmKFZyLkxvbmcpZT1Wci5Mb25nLmZyb21TdHJpbmcoZSk7ZWxzZSByZXR1cm4gVi5mcm9tTnVtYmVyKHBhcnNlSW50KGUsMTApKTtyZXR1cm4gZS5sb3d8fGUuaGlnaD9uZXcgVihlLmxvdz4+PjAsZS5oaWdoPj4+MCk6Y3R9O1YucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKCFlJiZ0aGlzLmhpPj4+MzEpe3ZhciB0PX50aGlzLmxvKzE+Pj4wLG49fnRoaXMuaGk+Pj4wO3JldHVybiB0fHwobj1uKzE+Pj4wKSwtKHQrbio0Mjk0OTY3Mjk2KX1yZXR1cm4gdGhpcy5sbyt0aGlzLmhpKjQyOTQ5NjcyOTZ9O1YucHJvdG90eXBlLnRvTG9uZz1mdW5jdGlvbihlKXtyZXR1cm4gVnIuTG9uZz9uZXcgVnIuTG9uZyh0aGlzLmxvfDAsdGhpcy5oaXwwLCEhZSk6e2xvdzp0aGlzLmxvfDAsaGlnaDp0aGlzLmhpfDAsdW5zaWduZWQ6ISFlfX07dmFyIEJlPVN0cmluZy5wcm90b3R5cGUuY2hhckNvZGVBdDtWLmZyb21IYXNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09c08/Y3Q6bmV3IFYoKEJlLmNhbGwoZSwwKXxCZS5jYWxsKGUsMSk8PDh8QmUuY2FsbChlLDIpPDwxNnxCZS5jYWxsKGUsMyk8PDI0KT4+PjAsKEJlLmNhbGwoZSw0KXxCZS5jYWxsKGUsNSk8PDh8QmUuY2FsbChlLDYpPDwxNnxCZS5jYWxsKGUsNyk8PDI0KT4+PjApfTtWLnByb3RvdHlwZS50b0hhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmxvJjI1NSx0aGlzLmxvPj4+OCYyNTUsdGhpcy5sbz4+PjE2JjI1NSx0aGlzLmxvPj4+MjQsdGhpcy5oaSYyNTUsdGhpcy5oaT4+PjgmMjU1LHRoaXMuaGk+Pj4xNiYyNTUsdGhpcy5oaT4+PjI0KX07Vi5wcm90b3R5cGUuenpFbmNvZGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmhpPj4zMTtyZXR1cm4gdGhpcy5oaT0oKHRoaXMuaGk8PDF8dGhpcy5sbz4+PjMxKV5lKT4+PjAsdGhpcy5sbz0odGhpcy5sbzw8MV5lKT4+PjAsdGhpc307Vi5wcm90b3R5cGUuenpEZWNvZGU9ZnVuY3Rpb24oKXt2YXIgZT0tKHRoaXMubG8mMSk7cmV0dXJuIHRoaXMubG89KCh0aGlzLmxvPj4+MXx0aGlzLmhpPDwzMSleZSk+Pj4wLHRoaXMuaGk9KHRoaXMuaGk+Pj4xXmUpPj4+MCx0aGlzfTtWLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxvLHQ9KHRoaXMubG8+Pj4yOHx0aGlzLmhpPDw0KT4+PjAsbj10aGlzLmhpPj4+MjQ7cmV0dXJuIG49PT0wP3Q9PT0wP2U8MTYzODQ/ZTwxMjg/MToyOmU8MjA5NzE1Mj8zOjQ6dDwxNjM4ND90PDEyOD81OjY6dDwyMDk3MTUyPzc6ODpuPDEyOD85OjEwfX0pO3ZhciBxZT1sKHp1PT57XCJ1c2Ugc3RyaWN0XCI7dmFyIEU9enU7RS5hc1Byb21pc2U9WHAoKTtFLmJhc2U2ND1ZcCgpO0UuRXZlbnRFbWl0dGVyPVpwKCk7RS5mbG9hdD1zaCgpO0UuaW5xdWlyZT1vaCgpO0UudXRmOD11aCgpO0UucG9vbD1saCgpO0UuTG9uZ0JpdHM9X2goKTtFLmlzTm9kZT0hISh0eXBlb2YgZ2xvYmFsPFwidVwiJiZnbG9iYWwmJmdsb2JhbC5wcm9jZXNzJiZnbG9iYWwucHJvY2Vzcy52ZXJzaW9ucyYmZ2xvYmFsLnByb2Nlc3MudmVyc2lvbnMubm9kZSk7RS5nbG9iYWw9RS5pc05vZGUmJmdsb2JhbHx8dHlwZW9mIHdpbmRvdzxcInVcIiYmd2luZG93fHx0eXBlb2Ygc2VsZjxcInVcIiYmc2VsZnx8enU7RS5lbXB0eUFycmF5PU9iamVjdC5mcmVlemU/T2JqZWN0LmZyZWV6ZShbXSk6W107RS5lbXB0eU9iamVjdD1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoe30pOnt9O0UuaXNJbnRlZ2VyPU51bWJlci5pc0ludGVnZXJ8fGZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09XCJudW1iZXJcIiYmaXNGaW5pdGUoZSkmJk1hdGguZmxvb3IoZSk9PT1lfTtFLmlzU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZT09XCJzdHJpbmdcInx8ZSBpbnN0YW5jZW9mIFN0cmluZ307RS5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmdHlwZW9mIGU9PVwib2JqZWN0XCJ9O0UuaXNzZXQ9RS5pc1NldD1mdW5jdGlvbihlLHQpe3ZhciBuPWVbdF07cmV0dXJuIG4hPW51bGwmJmUuaGFzT3duUHJvcGVydHkodCk/dHlwZW9mIG4hPVwib2JqZWN0XCJ8fChBcnJheS5pc0FycmF5KG4pP24ubGVuZ3RoOk9iamVjdC5rZXlzKG4pLmxlbmd0aCk+MDohMX07RS5CdWZmZXI9ZnVuY3Rpb24oKXt0cnl7dmFyIHI9RS5pbnF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjtyZXR1cm4gci5wcm90b3R5cGUudXRmOFdyaXRlP3I6bnVsbH1jYXRjaHtyZXR1cm4gbnVsbH19KCk7RS5fQnVmZmVyX2Zyb209bnVsbDtFLl9CdWZmZXJfYWxsb2NVbnNhZmU9bnVsbDtFLm5ld0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PVwibnVtYmVyXCI/RS5CdWZmZXI/RS5fQnVmZmVyX2FsbG9jVW5zYWZlKGUpOm5ldyBFLkFycmF5KGUpOkUuQnVmZmVyP0UuX0J1ZmZlcl9mcm9tKGUpOnR5cGVvZiBVaW50OEFycmF5PlwidVwiP2U6bmV3IFVpbnQ4QXJyYXkoZSl9O0UuQXJyYXk9dHlwZW9mIFVpbnQ4QXJyYXk8XCJ1XCI/VWludDhBcnJheTpBcnJheTtFLkxvbmc9RS5nbG9iYWwuZGNvZGVJTyYmRS5nbG9iYWwuZGNvZGVJTy5Mb25nfHxFLmdsb2JhbC5Mb25nfHxFLmlucXVpcmUoXCJsb25nXCIpO0Uua2V5MlJlPS9edHJ1ZXxmYWxzZXwwfDEkLztFLmtleTMyUmU9L14tPyg/OjB8WzEtOV1bMC05XSopJC87RS5rZXk2NFJlPS9eKD86W1xcXFx4MDAtXFxcXHhmZl17OH18LT8oPzowfFsxLTldWzAtOV0qKSkkLztFLmxvbmdUb0hhc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/RS5Mb25nQml0cy5mcm9tKGUpLnRvSGFzaCgpOkUuTG9uZ0JpdHMuemVyb0hhc2h9O0UubG9uZ0Zyb21IYXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49RS5Mb25nQml0cy5mcm9tSGFzaChlKTtyZXR1cm4gRS5Mb25nP0UuTG9uZy5mcm9tQml0cyhuLmxvLG4uaGksdCk6bi50b051bWJlcighIXQpfTtmdW5jdGlvbiBwaChyLGUsdCl7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLGk9MDtpPG4ubGVuZ3RoOysraSkocltuW2ldXT09PXZvaWQgMHx8IXQpJiYocltuW2ldXT1lW25baV1dKTtyZXR1cm4gcn1FLm1lcmdlPXBoO0UubGNGaXJzdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKStlLnN1YnN0cmluZygxKX07ZnVuY3Rpb24gaGgocil7ZnVuY3Rpb24gZSh0LG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIGUpKXJldHVybiBuZXcgZSh0LG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwibWVzc2FnZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdH19KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLGUpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwic3RhY2tcIix7dmFsdWU6bmV3IEVycm9yKCkuc3RhY2t8fFwiXCJ9KSxuJiZwaCh0aGlzLG4pfXJldHVybiBlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9LG5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiByfSxzZXQ6dm9pZCAwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSx0b1N0cmluZzp7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lK1wiOiBcIit0aGlzLm1lc3NhZ2V9LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfX0pLGV9RS5uZXdFcnJvcj1oaDtFLlByb3RvY29sRXJyb3I9aGgoXCJQcm90b2NvbEVycm9yXCIpO0Uub25lT2ZHZXR0ZXI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoOysrbil0W2Vbbl1dPTE7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBpPU9iamVjdC5rZXlzKHRoaXMpLHM9aS5sZW5ndGgtMTtzPi0xOy0tcylpZih0W2lbc11dPT09MSYmdGhpc1tpW3NdXSE9PXZvaWQgMCYmdGhpc1tpW3NdXSE9PW51bGwpcmV0dXJuIGlbc119fTtFLm9uZU9mU2V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoOysrbillW25dIT09dCYmZGVsZXRlIHRoaXNbZVtuXV19fTtFLnRvSlNPTk9wdGlvbnM9e2xvbmdzOlN0cmluZyxlbnVtczpTdHJpbmcsYnl0ZXM6U3RyaW5nLGpzb246ITB9O0UuX2NvbmZpZ3VyZT1mdW5jdGlvbigpe3ZhciByPUUuQnVmZmVyO2lmKCFyKXtFLl9CdWZmZXJfZnJvbT1FLl9CdWZmZXJfYWxsb2NVbnNhZmU9bnVsbDtyZXR1cm59RS5fQnVmZmVyX2Zyb209ci5mcm9tIT09VWludDhBcnJheS5mcm9tJiZyLmZyb218fGZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyByKHQsbil9LEUuX0J1ZmZlcl9hbGxvY1Vuc2FmZT1yLmFsbG9jVW5zYWZlfHxmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHIodCl9fX0pO3ZhciByYz1sKChaeSxnaCk9PntcInVzZSBzdHJpY3RcIjtnaC5leHBvcnRzPU87dmFyIGFlPXFlKCksWXUsTnM9YWUuTG9uZ0JpdHMsZmg9YWUuYmFzZTY0LEVoPWFlLnV0Zjg7ZnVuY3Rpb24gR3IocixlLHQpe3RoaXMuZm49cix0aGlzLmxlbj1lLHRoaXMubmV4dD12b2lkIDAsdGhpcy52YWw9dH1mdW5jdGlvbiBadSgpe31mdW5jdGlvbiBvTyhyKXt0aGlzLmhlYWQ9ci5oZWFkLHRoaXMudGFpbD1yLnRhaWwsdGhpcy5sZW49ci5sZW4sdGhpcy5uZXh0PXIuc3RhdGVzfWZ1bmN0aW9uIE8oKXt0aGlzLmxlbj0wLHRoaXMuaGVhZD1uZXcgR3IoWnUsMCwwKSx0aGlzLnRhaWw9dGhpcy5oZWFkLHRoaXMuc3RhdGVzPW51bGx9dmFyIG1oPWZ1bmN0aW9uKCl7cmV0dXJuIGFlLkJ1ZmZlcj9mdW5jdGlvbigpe3JldHVybihPLmNyZWF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgWXV9KSgpfTpmdW5jdGlvbigpe3JldHVybiBuZXcgT319O08uY3JlYXRlPW1oKCk7Ty5hbGxvYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGFlLkFycmF5KGUpfTthZS5BcnJheSE9PUFycmF5JiYoTy5hbGxvYz1hZS5wb29sKE8uYWxsb2MsYWUuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5KSk7Ty5wcm90b3R5cGUuX3B1c2g9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnRhaWw9dGhpcy50YWlsLm5leHQ9bmV3IEdyKGUsdCxuKSx0aGlzLmxlbis9dCx0aGlzfTtmdW5jdGlvbiBKdShyLGUsdCl7ZVt0XT1yJjI1NX1mdW5jdGlvbiBhTyhyLGUsdCl7Zm9yKDtyPjEyNzspZVt0KytdPXImMTI3fDEyOCxyPj4+PTc7ZVt0XT1yfWZ1bmN0aW9uIGVjKHIsZSl7dGhpcy5sZW49cix0aGlzLm5leHQ9dm9pZCAwLHRoaXMudmFsPWV9ZWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoR3IucHJvdG90eXBlKTtlYy5wcm90b3R5cGUuZm49YU87Ty5wcm90b3R5cGUudWludDMyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxlbis9KHRoaXMudGFpbD10aGlzLnRhaWwubmV4dD1uZXcgZWMoKGU9ZT4+PjApPDEyOD8xOmU8MTYzODQ/MjplPDIwOTcxNTI/MzplPDI2ODQzNTQ1Nj80OjUsZSkpLmxlbix0aGlzfTtPLnByb3RvdHlwZS5pbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gZTwwP3RoaXMuX3B1c2godGMsMTAsTnMuZnJvbU51bWJlcihlKSk6dGhpcy51aW50MzIoZSl9O08ucHJvdG90eXBlLnNpbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51aW50MzIoKGU8PDFeZT4+MzEpPj4+MCl9O2Z1bmN0aW9uIHRjKHIsZSx0KXtmb3IoO3IuaGk7KWVbdCsrXT1yLmxvJjEyN3wxMjgsci5sbz0oci5sbz4+Pjd8ci5oaTw8MjUpPj4+MCxyLmhpPj4+PTc7Zm9yKDtyLmxvPjEyNzspZVt0KytdPXIubG8mMTI3fDEyOCxyLmxvPXIubG8+Pj43O2VbdCsrXT1yLmxvfU8ucHJvdG90eXBlLnVpbnQ2ND1mdW5jdGlvbihlKXt2YXIgdD1Ocy5mcm9tKGUpO3JldHVybiB0aGlzLl9wdXNoKHRjLHQubGVuZ3RoKCksdCl9O08ucHJvdG90eXBlLmludDY0PU8ucHJvdG90eXBlLnVpbnQ2NDtPLnByb3RvdHlwZS5zaW50NjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9TnMuZnJvbShlKS56ekVuY29kZSgpO3JldHVybiB0aGlzLl9wdXNoKHRjLHQubGVuZ3RoKCksdCl9O08ucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goSnUsMSxlPzE6MCl9O2Z1bmN0aW9uIFF1KHIsZSx0KXtlW3RdPXImMjU1LGVbdCsxXT1yPj4+OCYyNTUsZVt0KzJdPXI+Pj4xNiYyNTUsZVt0KzNdPXI+Pj4yNH1PLnByb3RvdHlwZS5maXhlZDMyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wdXNoKFF1LDQsZT4+PjApfTtPLnByb3RvdHlwZS5zZml4ZWQzMj1PLnByb3RvdHlwZS5maXhlZDMyO08ucHJvdG90eXBlLmZpeGVkNjQ9ZnVuY3Rpb24oZSl7dmFyIHQ9TnMuZnJvbShlKTtyZXR1cm4gdGhpcy5fcHVzaChRdSw0LHQubG8pLl9wdXNoKFF1LDQsdC5oaSl9O08ucHJvdG90eXBlLnNmaXhlZDY0PU8ucHJvdG90eXBlLmZpeGVkNjQ7Ty5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3B1c2goYWUuZmxvYXQud3JpdGVGbG9hdExFLDQsZSl9O08ucHJvdG90eXBlLmRvdWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcHVzaChhZS5mbG9hdC53cml0ZURvdWJsZUxFLDgsZSl9O3ZhciB1Tz1hZS5BcnJheS5wcm90b3R5cGUuc2V0P2Z1bmN0aW9uKGUsdCxuKXt0LnNldChlLG4pfTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDsrK2kpdFtuK2ldPWVbaV19O08ucHJvdG90eXBlLmJ5dGVzPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoPj4+MDtpZighdClyZXR1cm4gdGhpcy5fcHVzaChKdSwxLDApO2lmKGFlLmlzU3RyaW5nKGUpKXt2YXIgbj1PLmFsbG9jKHQ9ZmgubGVuZ3RoKGUpKTtmaC5kZWNvZGUoZSxuLDApLGU9bn1yZXR1cm4gdGhpcy51aW50MzIodCkuX3B1c2godU8sdCxlKX07Ty5wcm90b3R5cGUuc3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PUVoLmxlbmd0aChlKTtyZXR1cm4gdD90aGlzLnVpbnQzMih0KS5fcHVzaChFaC53cml0ZSx0LGUpOnRoaXMuX3B1c2goSnUsMSwwKX07Ty5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlcz1uZXcgb08odGhpcyksdGhpcy5oZWFkPXRoaXMudGFpbD1uZXcgR3IoWnUsMCwwKSx0aGlzLmxlbj0wLHRoaXN9O08ucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVzPyh0aGlzLmhlYWQ9dGhpcy5zdGF0ZXMuaGVhZCx0aGlzLnRhaWw9dGhpcy5zdGF0ZXMudGFpbCx0aGlzLmxlbj10aGlzLnN0YXRlcy5sZW4sdGhpcy5zdGF0ZXM9dGhpcy5zdGF0ZXMubmV4dCk6KHRoaXMuaGVhZD10aGlzLnRhaWw9bmV3IEdyKFp1LDAsMCksdGhpcy5sZW49MCksdGhpc307Ty5wcm90b3R5cGUubGRlbGltPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oZWFkLHQ9dGhpcy50YWlsLG49dGhpcy5sZW47cmV0dXJuIHRoaXMucmVzZXQoKS51aW50MzIobiksbiYmKHRoaXMudGFpbC5uZXh0PWUubmV4dCx0aGlzLnRhaWw9dCx0aGlzLmxlbis9biksdGhpc307Ty5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuaGVhZC5uZXh0LHQ9dGhpcy5jb25zdHJ1Y3Rvci5hbGxvYyh0aGlzLmxlbiksbj0wO2U7KWUuZm4oZS52YWwsdCxuKSxuKz1lLmxlbixlPWUubmV4dDtyZXR1cm4gdH07Ty5fY29uZmlndXJlPWZ1bmN0aW9uKHIpe1l1PXIsTy5jcmVhdGU9bWgoKSxZdS5fY29uZmlndXJlKCl9fSk7dmFyIEFoPWwoKEp5LFNoKT0+e1widXNlIHN0cmljdFwiO1NoLmV4cG9ydHM9Z2U7dmFyIFRoPXJjKCk7KGdlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFRoLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWdlO3ZhciBWZT1xZSgpO2Z1bmN0aW9uIGdlKCl7VGguY2FsbCh0aGlzKX1nZS5fY29uZmlndXJlPWZ1bmN0aW9uKCl7Z2UuYWxsb2M9VmUuX0J1ZmZlcl9hbGxvY1Vuc2FmZSxnZS53cml0ZUJ5dGVzQnVmZmVyPVZlLkJ1ZmZlciYmVmUuQnVmZmVyLnByb3RvdHlwZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJlZlLkJ1ZmZlci5wcm90b3R5cGUuc2V0Lm5hbWU9PT1cInNldFwiP2Z1bmN0aW9uKGUsdCxuKXt0LnNldChlLG4pfTpmdW5jdGlvbihlLHQsbil7aWYoZS5jb3B5KWUuY29weSh0LG4sMCxlLmxlbmd0aCk7ZWxzZSBmb3IodmFyIGk9MDtpPGUubGVuZ3RoOyl0W24rK109ZVtpKytdfX07Z2UucHJvdG90eXBlLmJ5dGVzPWZ1bmN0aW9uKGUpe1ZlLmlzU3RyaW5nKGUpJiYoZT1WZS5fQnVmZmVyX2Zyb20oZSxcImJhc2U2NFwiKSk7dmFyIHQ9ZS5sZW5ndGg+Pj4wO3JldHVybiB0aGlzLnVpbnQzMih0KSx0JiZ0aGlzLl9wdXNoKGdlLndyaXRlQnl0ZXNCdWZmZXIsdCxlKSx0aGlzfTtmdW5jdGlvbiBjTyhyLGUsdCl7ci5sZW5ndGg8NDA/VmUudXRmOC53cml0ZShyLGUsdCk6ZS51dGY4V3JpdGU/ZS51dGY4V3JpdGUocix0KTplLndyaXRlKHIsdCl9Z2UucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1WZS5CdWZmZXIuYnl0ZUxlbmd0aChlKTtyZXR1cm4gdGhpcy51aW50MzIodCksdCYmdGhpcy5fcHVzaChjTyx0LGUpLHRoaXN9O2dlLl9jb25maWd1cmUoKX0pO3ZhciBzYz1sKChldix5aCk9PntcInVzZSBzdHJpY3RcIjt5aC5leHBvcnRzPXg7dmFyIGRlPXFlKCksaWMsYmg9ZGUuTG9uZ0JpdHMsbE89ZGUudXRmODtmdW5jdGlvbiBfZShyLGUpe3JldHVybiBSYW5nZUVycm9yKFwiaW5kZXggb3V0IG9mIHJhbmdlOiBcIityLnBvcytcIiArIFwiKyhlfHwxKStcIiA+IFwiK3IubGVuKX1mdW5jdGlvbiB4KHIpe3RoaXMuYnVmPXIsdGhpcy5wb3M9MCx0aGlzLmxlbj1yLmxlbmd0aH12YXIgT2g9dHlwZW9mIFVpbnQ4QXJyYXk8XCJ1XCI/ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG5ldyB4KGUpO3Rocm93IEVycm9yKFwiaWxsZWdhbCBidWZmZXJcIil9OmZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG5ldyB4KGUpO3Rocm93IEVycm9yKFwiaWxsZWdhbCBidWZmZXJcIil9LFBoPWZ1bmN0aW9uKCl7cmV0dXJuIGRlLkJ1ZmZlcj9mdW5jdGlvbih0KXtyZXR1cm4oeC5jcmVhdGU9ZnVuY3Rpb24oaSl7cmV0dXJuIGRlLkJ1ZmZlci5pc0J1ZmZlcihpKT9uZXcgaWMoaSk6T2goaSl9KSh0KX06T2h9O3guY3JlYXRlPVBoKCk7eC5wcm90b3R5cGUuX3NsaWNlPWRlLkFycmF5LnByb3RvdHlwZS5zdWJhcnJheXx8ZGUuQXJyYXkucHJvdG90eXBlLnNsaWNlO3gucHJvdG90eXBlLnVpbnQzMj1mdW5jdGlvbigpe3ZhciBlPTQyOTQ5NjcyOTU7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoZT0odGhpcy5idWZbdGhpcy5wb3NdJjEyNyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOHx8KGU9KGV8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDw3KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXx8KGU9KGV8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDwxNCk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOCl8fChlPShlfCh0aGlzLmJ1Zlt0aGlzLnBvc10mMTI3KTw8MjEpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpfHwoZT0oZXwodGhpcy5idWZbdGhpcy5wb3NdJjE1KTw8MjgpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpKXJldHVybiBlO2lmKCh0aGlzLnBvcys9NSk+dGhpcy5sZW4pdGhyb3cgdGhpcy5wb3M9dGhpcy5sZW4sX2UodGhpcywxMCk7cmV0dXJuIGV9fSgpO3gucHJvdG90eXBlLmludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWludDMyKCl8MH07eC5wcm90b3R5cGUuc2ludDMyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aW50MzIoKTtyZXR1cm4gZT4+PjFeLShlJjEpfDB9O2Z1bmN0aW9uIG5jKCl7dmFyIHI9bmV3IGJoKDAsMCksZT0wO2lmKHRoaXMubGVuLXRoaXMucG9zPjQpe2Zvcig7ZTw0OysrZSlpZihyLmxvPShyLmxvfCh0aGlzLmJ1Zlt0aGlzLnBvc10mMTI3KTw8ZSo3KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiByO2lmKHIubG89KHIubG98KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDwyOCk+Pj4wLHIuaGk9KHIuaGl8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPj40KT4+PjAsdGhpcy5idWZbdGhpcy5wb3MrK108MTI4KXJldHVybiByO2U9MH1lbHNle2Zvcig7ZTwzOysrZSl7aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IF9lKHRoaXMpO2lmKHIubG89KHIubG98KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDxlKjcpPj4+MCx0aGlzLmJ1Zlt0aGlzLnBvcysrXTwxMjgpcmV0dXJuIHJ9cmV0dXJuIHIubG89KHIubG98KHRoaXMuYnVmW3RoaXMucG9zKytdJjEyNyk8PGUqNyk+Pj4wLHJ9aWYodGhpcy5sZW4tdGhpcy5wb3M+NCl7Zm9yKDtlPDU7KytlKWlmKHIuaGk9KHIuaGl8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDxlKjcrMyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gcn1lbHNlIGZvcig7ZTw1OysrZSl7aWYodGhpcy5wb3M+PXRoaXMubGVuKXRocm93IF9lKHRoaXMpO2lmKHIuaGk9KHIuaGl8KHRoaXMuYnVmW3RoaXMucG9zXSYxMjcpPDxlKjcrMyk+Pj4wLHRoaXMuYnVmW3RoaXMucG9zKytdPDEyOClyZXR1cm4gcn10aHJvdyBFcnJvcihcImludmFsaWQgdmFyaW50IGVuY29kaW5nXCIpfXgucHJvdG90eXBlLmJvb2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aW50MzIoKSE9PTB9O2Z1bmN0aW9uIENzKHIsZSl7cmV0dXJuKHJbZS00XXxyW2UtM108PDh8cltlLTJdPDwxNnxyW2UtMV08PDI0KT4+PjB9eC5wcm90b3R5cGUuZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgX2UodGhpcyw0KTtyZXR1cm4gQ3ModGhpcy5idWYsdGhpcy5wb3MrPTQpfTt4LnByb3RvdHlwZS5zZml4ZWQzMj1mdW5jdGlvbigpe2lmKHRoaXMucG9zKzQ+dGhpcy5sZW4pdGhyb3cgX2UodGhpcyw0KTtyZXR1cm4gQ3ModGhpcy5idWYsdGhpcy5wb3MrPTQpfDB9O2Z1bmN0aW9uIFJoKCl7aWYodGhpcy5wb3MrOD50aGlzLmxlbil0aHJvdyBfZSh0aGlzLDgpO3JldHVybiBuZXcgYmgoQ3ModGhpcy5idWYsdGhpcy5wb3MrPTQpLENzKHRoaXMuYnVmLHRoaXMucG9zKz00KSl9eC5wcm90b3R5cGUuZmxvYXQ9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys0PnRoaXMubGVuKXRocm93IF9lKHRoaXMsNCk7dmFyIGU9ZGUuZmxvYXQucmVhZEZsb2F0TEUodGhpcy5idWYsdGhpcy5wb3MpO3JldHVybiB0aGlzLnBvcys9NCxlfTt4LnByb3RvdHlwZS5kb3VibGU9ZnVuY3Rpb24oKXtpZih0aGlzLnBvcys4PnRoaXMubGVuKXRocm93IF9lKHRoaXMsNCk7dmFyIGU9ZGUuZmxvYXQucmVhZERvdWJsZUxFKHRoaXMuYnVmLHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTgsZX07eC5wcm90b3R5cGUuYnl0ZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVpbnQzMigpLHQ9dGhpcy5wb3Msbj10aGlzLnBvcytlO2lmKG4+dGhpcy5sZW4pdGhyb3cgX2UodGhpcyxlKTtpZih0aGlzLnBvcys9ZSxBcnJheS5pc0FycmF5KHRoaXMuYnVmKSlyZXR1cm4gdGhpcy5idWYuc2xpY2UodCxuKTtpZih0PT09bil7dmFyIGk9ZGUuQnVmZmVyO3JldHVybiBpP2kuYWxsb2MoMCk6bmV3IHRoaXMuYnVmLmNvbnN0cnVjdG9yKDApfXJldHVybiB0aGlzLl9zbGljZS5jYWxsKHRoaXMuYnVmLHQsbil9O3gucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYnl0ZXMoKTtyZXR1cm4gbE8ucmVhZChlLDAsZS5sZW5ndGgpfTt4LnByb3RvdHlwZS5za2lwPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKXtpZih0aGlzLnBvcytlPnRoaXMubGVuKXRocm93IF9lKHRoaXMsZSk7dGhpcy5wb3MrPWV9ZWxzZSBkbyBpZih0aGlzLnBvcz49dGhpcy5sZW4pdGhyb3cgX2UodGhpcyk7d2hpbGUodGhpcy5idWZbdGhpcy5wb3MrK10mMTI4KTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuc2tpcFR5cGU9ZnVuY3Rpb24ocil7c3dpdGNoKHIpe2Nhc2UgMDp0aGlzLnNraXAoKTticmVhaztjYXNlIDE6dGhpcy5za2lwKDgpO2JyZWFrO2Nhc2UgMjp0aGlzLnNraXAodGhpcy51aW50MzIoKSk7YnJlYWs7Y2FzZSAzOmZvcig7KHI9dGhpcy51aW50MzIoKSY3KSE9PTQ7KXRoaXMuc2tpcFR5cGUocik7YnJlYWs7Y2FzZSA1OnRoaXMuc2tpcCg0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFwiaW52YWxpZCB3aXJlIHR5cGUgXCIrcitcIiBhdCBvZmZzZXQgXCIrdGhpcy5wb3MpfXJldHVybiB0aGlzfTt4Ll9jb25maWd1cmU9ZnVuY3Rpb24ocil7aWM9cix4LmNyZWF0ZT1QaCgpLGljLl9jb25maWd1cmUoKTt2YXIgZT1kZS5Mb25nP1widG9Mb25nXCI6XCJ0b051bWJlclwiO2RlLm1lcmdlKHgucHJvdG90eXBlLHtpbnQ2NDpmdW5jdGlvbigpe3JldHVybiBuYy5jYWxsKHRoaXMpW2VdKCExKX0sdWludDY0OmZ1bmN0aW9uKCl7cmV0dXJuIG5jLmNhbGwodGhpcylbZV0oITApfSxzaW50NjQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmMuY2FsbCh0aGlzKS56ekRlY29kZSgpW2VdKCExKX0sZml4ZWQ2NDpmdW5jdGlvbigpe3JldHVybiBSaC5jYWxsKHRoaXMpW2VdKCEwKX0sc2ZpeGVkNjQ6ZnVuY3Rpb24oKXtyZXR1cm4gUmguY2FsbCh0aGlzKVtlXSghMSl9fSl9fSk7dmFyIExoPWwoKHR2LE1oKT0+e1widXNlIHN0cmljdFwiO01oLmV4cG9ydHM9bHQ7dmFyIEloPXNjKCk7KGx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEloLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWx0O3ZhciB2aD1xZSgpO2Z1bmN0aW9uIGx0KHIpe0loLmNhbGwodGhpcyxyKX1sdC5fY29uZmlndXJlPWZ1bmN0aW9uKCl7dmguQnVmZmVyJiYobHQucHJvdG90eXBlLl9zbGljZT12aC5CdWZmZXIucHJvdG90eXBlLnNsaWNlKX07bHQucHJvdG90eXBlLnN0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMudWludDMyKCk7cmV0dXJuIHRoaXMuYnVmLnV0ZjhTbGljZT90aGlzLmJ1Zi51dGY4U2xpY2UodGhpcy5wb3MsdGhpcy5wb3M9TWF0aC5taW4odGhpcy5wb3MrZSx0aGlzLmxlbikpOnRoaXMuYnVmLnRvU3RyaW5nKFwidXRmLThcIix0aGlzLnBvcyx0aGlzLnBvcz1NYXRoLm1pbih0aGlzLnBvcytlLHRoaXMubGVuKSl9O2x0Ll9jb25maWd1cmUoKX0pO3ZhciBDaD1sKChydixOaCk9PntcInVzZSBzdHJpY3RcIjtOaC5leHBvcnRzPUhyO3ZhciBvYz1xZSgpOyhIci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvYy5FdmVudEVtaXR0ZXIucHJvdG90eXBlKSkuY29uc3RydWN0b3I9SHI7ZnVuY3Rpb24gSHIocixlLHQpe2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCIpdGhyb3cgVHlwZUVycm9yKFwicnBjSW1wbCBtdXN0IGJlIGEgZnVuY3Rpb25cIik7b2MuRXZlbnRFbWl0dGVyLmNhbGwodGhpcyksdGhpcy5ycGNJbXBsPXIsdGhpcy5yZXF1ZXN0RGVsaW1pdGVkPSEhZSx0aGlzLnJlc3BvbnNlRGVsaW1pdGVkPSEhdH1Ici5wcm90b3R5cGUucnBjQ2FsbD1mdW5jdGlvbiByKGUsdCxuLGkscyl7aWYoIWkpdGhyb3cgVHlwZUVycm9yKFwicmVxdWVzdCBtdXN0IGJlIHNwZWNpZmllZFwiKTt2YXIgbz10aGlzO2lmKCFzKXJldHVybiBvYy5hc1Byb21pc2UocixvLGUsdCxuLGkpO2lmKCFvLnJwY0ltcGwpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzKEVycm9yKFwiYWxyZWFkeSBlbmRlZFwiKSl9LDApO3JldHVybn10cnl7cmV0dXJuIG8ucnBjSW1wbChlLHRbby5yZXF1ZXN0RGVsaW1pdGVkP1wiZW5jb2RlRGVsaW1pdGVkXCI6XCJlbmNvZGVcIl0oaSkuZmluaXNoKCksZnVuY3Rpb24odSxjKXtpZih1KXJldHVybiBvLmVtaXQoXCJlcnJvclwiLHUsZSkscyh1KTtpZihjPT09bnVsbCl7by5lbmQoITApO3JldHVybn1pZighKGMgaW5zdGFuY2VvZiBuKSl0cnl7Yz1uW28ucmVzcG9uc2VEZWxpbWl0ZWQ/XCJkZWNvZGVEZWxpbWl0ZWRcIjpcImRlY29kZVwiXShjKX1jYXRjaChfKXtyZXR1cm4gby5lbWl0KFwiZXJyb3JcIixfLGUpLHMoXyl9cmV0dXJuIG8uZW1pdChcImRhdGFcIixjLGUpLHMobnVsbCxjKX0pfWNhdGNoKGEpe28uZW1pdChcImVycm9yXCIsYSxlKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cyhhKX0sMCk7cmV0dXJufX07SHIucHJvdG90eXBlLmVuZD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ycGNJbXBsJiYoZXx8dGhpcy5ycGNJbXBsKG51bGwsbnVsbCxudWxsKSx0aGlzLnJwY0ltcGw9bnVsbCx0aGlzLmVtaXQoXCJlbmRcIikub2ZmKCkpLHRoaXN9fSk7dmFyIHhoPWwod2g9PntcInVzZSBzdHJpY3RcIjt2YXIgZE89d2g7ZE8uU2VydmljZT1DaCgpfSk7dmFyIFVoPWwoKGl2LERoKT0+e1widXNlIHN0cmljdFwiO0RoLmV4cG9ydHM9e319KTt2YXIgVmg9bChxaD0+e1widXNlIHN0cmljdFwiO3ZhciBKPXFoO0ouYnVpbGQ9XCJtaW5pbWFsXCI7Si5Xcml0ZXI9cmMoKTtKLkJ1ZmZlcldyaXRlcj1BaCgpO0ouUmVhZGVyPXNjKCk7Si5CdWZmZXJSZWFkZXI9TGgoKTtKLnV0aWw9cWUoKTtKLnJwYz14aCgpO0oucm9vdHM9VWgoKTtKLmNvbmZpZ3VyZT1CaDtmdW5jdGlvbiBCaCgpe0oudXRpbC5fY29uZmlndXJlKCksSi5Xcml0ZXIuX2NvbmZpZ3VyZShKLkJ1ZmZlcldyaXRlciksSi5SZWFkZXIuX2NvbmZpZ3VyZShKLkJ1ZmZlclJlYWRlcil9QmgoKX0pO3ZhciBIaD1sKChvdixHaCk9PntcInVzZSBzdHJpY3RcIjtHaC5leHBvcnRzPVZoKCl9KTt2YXIgUWg9bChZaD0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShZaCxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO3ZhciBKaD1sKFpoPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KFpoLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSk7dmFyIHRmPWwoZWY9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZWYsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9KTt2YXIgcmY9bChGcj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShGcixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTtGci5FU3BhbktpbmQ9dm9pZCAwO3ZhciBMTzsoZnVuY3Rpb24ocil7cltyLlNQQU5fS0lORF9VTlNQRUNJRklFRD0wXT1cIlNQQU5fS0lORF9VTlNQRUNJRklFRFwiLHJbci5TUEFOX0tJTkRfSU5URVJOQUw9MV09XCJTUEFOX0tJTkRfSU5URVJOQUxcIixyW3IuU1BBTl9LSU5EX1NFUlZFUj0yXT1cIlNQQU5fS0lORF9TRVJWRVJcIixyW3IuU1BBTl9LSU5EX0NMSUVOVD0zXT1cIlNQQU5fS0lORF9DTElFTlRcIixyW3IuU1BBTl9LSU5EX1BST0RVQ0VSPTRdPVwiU1BBTl9LSU5EX1BST0RVQ0VSXCIscltyLlNQQU5fS0lORF9DT05TVU1FUj01XT1cIlNQQU5fS0lORF9DT05TVU1FUlwifSkoTE89RnIuRVNwYW5LaW5kfHwoRnIuRVNwYW5LaW5kPXt9KSl9KTt2YXIgc2Y9bChuZj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuZixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO3ZhciBsZj1sKEdlPT57XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KEdlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO0dlLnRvTWV0cmljPUdlLnRvU2NvcGVNZXRyaWNzPUdlLnRvUmVzb3VyY2VNZXRyaWNzPXZvaWQgMDt2YXIgb2Y9KGgoKSxtKGQpKSxvcj13dSgpLERzPVVyKCksTk89QnIoKTtmdW5jdGlvbiBDTyhyLGUpe2xldCB0PSgwLE5PLmdldE90bHBFbmNvZGVyKShlKTtyZXR1cm57cmVzb3VyY2U6e2F0dHJpYnV0ZXM6KDAsRHMudG9BdHRyaWJ1dGVzKShyLnJlc291cmNlLmF0dHJpYnV0ZXMpLGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6MH0sc2NoZW1hVXJsOnZvaWQgMCxzY29wZU1ldHJpY3M6dWYoci5zY29wZU1ldHJpY3MsdCl9fUdlLnRvUmVzb3VyY2VNZXRyaWNzPUNPO2Z1bmN0aW9uIHVmKHIsZSl7cmV0dXJuIEFycmF5LmZyb20oci5tYXAodD0+KHtzY29wZTp7bmFtZTp0LnNjb3BlLm5hbWUsdmVyc2lvbjp0LnNjb3BlLnZlcnNpb259LG1ldHJpY3M6dC5tZXRyaWNzLm1hcChuPT5jZihuLGUpKSxzY2hlbWFVcmw6dC5zY29wZS5zY2hlbWFVcmx9KSkpfUdlLnRvU2NvcGVNZXRyaWNzPXVmO2Z1bmN0aW9uIGNmKHIsZSl7bGV0IHQ9e25hbWU6ci5kZXNjcmlwdG9yLm5hbWUsZGVzY3JpcHRpb246ci5kZXNjcmlwdG9yLmRlc2NyaXB0aW9uLHVuaXQ6ci5kZXNjcmlwdG9yLnVuaXR9LG49VU8oci5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5KTtzd2l0Y2goci5kYXRhUG9pbnRUeXBlKXtjYXNlIG9yLkRhdGFQb2ludFR5cGUuU1VNOnQuc3VtPXthZ2dyZWdhdGlvblRlbXBvcmFsaXR5Om4saXNNb25vdG9uaWM6ci5pc01vbm90b25pYyxkYXRhUG9pbnRzOmFmKHIsZSl9O2JyZWFrO2Nhc2Ugb3IuRGF0YVBvaW50VHlwZS5HQVVHRTp0LmdhdWdlPXtkYXRhUG9pbnRzOmFmKHIsZSl9O2JyZWFrO2Nhc2Ugb3IuRGF0YVBvaW50VHlwZS5ISVNUT0dSQU06dC5oaXN0b2dyYW09e2FnZ3JlZ2F0aW9uVGVtcG9yYWxpdHk6bixkYXRhUG9pbnRzOnhPKHIsZSl9O2JyZWFrO2Nhc2Ugb3IuRGF0YVBvaW50VHlwZS5FWFBPTkVOVElBTF9ISVNUT0dSQU06dC5leHBvbmVudGlhbEhpc3RvZ3JhbT17YWdncmVnYXRpb25UZW1wb3JhbGl0eTpuLGRhdGFQb2ludHM6RE8ocixlKX07YnJlYWt9cmV0dXJuIHR9R2UudG9NZXRyaWM9Y2Y7ZnVuY3Rpb24gd08ocixlLHQpe2xldCBuPXthdHRyaWJ1dGVzOigwLERzLnRvQXR0cmlidXRlcykoci5hdHRyaWJ1dGVzKSxzdGFydFRpbWVVbml4TmFubzp0LmVuY29kZUhyVGltZShyLnN0YXJ0VGltZSksdGltZVVuaXhOYW5vOnQuZW5jb2RlSHJUaW1lKHIuZW5kVGltZSl9O3N3aXRjaChlKXtjYXNlIG9mLlZhbHVlVHlwZS5JTlQ6bi5hc0ludD1yLnZhbHVlO2JyZWFrO2Nhc2Ugb2YuVmFsdWVUeXBlLkRPVUJMRTpuLmFzRG91YmxlPXIudmFsdWU7YnJlYWt9cmV0dXJuIG59ZnVuY3Rpb24gYWYocixlKXtyZXR1cm4gci5kYXRhUG9pbnRzLm1hcCh0PT53Tyh0LHIuZGVzY3JpcHRvci52YWx1ZVR5cGUsZSkpfWZ1bmN0aW9uIHhPKHIsZSl7cmV0dXJuIHIuZGF0YVBvaW50cy5tYXAodD0+e2xldCBuPXQudmFsdWU7cmV0dXJue2F0dHJpYnV0ZXM6KDAsRHMudG9BdHRyaWJ1dGVzKSh0LmF0dHJpYnV0ZXMpLGJ1Y2tldENvdW50czpuLmJ1Y2tldHMuY291bnRzLGV4cGxpY2l0Qm91bmRzOm4uYnVja2V0cy5ib3VuZGFyaWVzLGNvdW50Om4uY291bnQsc3VtOm4uc3VtLG1pbjpuLm1pbixtYXg6bi5tYXgsc3RhcnRUaW1lVW5peE5hbm86ZS5lbmNvZGVIclRpbWUodC5zdGFydFRpbWUpLHRpbWVVbml4TmFubzplLmVuY29kZUhyVGltZSh0LmVuZFRpbWUpfX0pfWZ1bmN0aW9uIERPKHIsZSl7cmV0dXJuIHIuZGF0YVBvaW50cy5tYXAodD0+e2xldCBuPXQudmFsdWU7cmV0dXJue2F0dHJpYnV0ZXM6KDAsRHMudG9BdHRyaWJ1dGVzKSh0LmF0dHJpYnV0ZXMpLGNvdW50Om4uY291bnQsbWluOm4ubWluLG1heDpuLm1heCxzdW06bi5zdW0scG9zaXRpdmU6e29mZnNldDpuLnBvc2l0aXZlLm9mZnNldCxidWNrZXRDb3VudHM6bi5wb3NpdGl2ZS5idWNrZXRDb3VudHN9LG5lZ2F0aXZlOntvZmZzZXQ6bi5uZWdhdGl2ZS5vZmZzZXQsYnVja2V0Q291bnRzOm4ubmVnYXRpdmUuYnVja2V0Q291bnRzfSxzY2FsZTpuLnNjYWxlLHplcm9Db3VudDpuLnplcm9Db3VudCxzdGFydFRpbWVVbml4TmFubzplLmVuY29kZUhyVGltZSh0LnN0YXJ0VGltZSksdGltZVVuaXhOYW5vOmUuZW5jb2RlSHJUaW1lKHQuZW5kVGltZSl9fSl9ZnVuY3Rpb24gVU8ocil7c3dpdGNoKHIpe2Nhc2Ugb3IuQWdncmVnYXRpb25UZW1wb3JhbGl0eS5ERUxUQTpyZXR1cm4gMTtjYXNlIG9yLkFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkuQ1VNVUxBVElWRTpyZXR1cm4gMn19fSk7dmFyIGRmPWwoVXM9PntcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoVXMsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7VXMuY3JlYXRlRXhwb3J0TWV0cmljc1NlcnZpY2VSZXF1ZXN0PXZvaWQgMDt2YXIgQk89bGYoKTtmdW5jdGlvbiBxTyhyLGUpe3JldHVybntyZXNvdXJjZU1ldHJpY3M6ci5tYXAodD0+KDAsQk8udG9SZXNvdXJjZU1ldHJpY3MpKHQsZSkpfX1Vcy5jcmVhdGVFeHBvcnRNZXRyaWNzU2VydmljZVJlcXVlc3Q9cU99KTt2YXIgcGY9bChhcj0+e1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhcixcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTthci50b0xvZ0F0dHJpYnV0ZXM9YXIuY3JlYXRlRXhwb3J0TG9nc1NlcnZpY2VSZXF1ZXN0PXZvaWQgMDt2YXIgVk89QnIoKSxsYz1VcigpO2Z1bmN0aW9uIEdPKHIsZSl7bGV0IHQ9KDAsVk8uZ2V0T3RscEVuY29kZXIpKGUpO3JldHVybntyZXNvdXJjZUxvZ3M6ak8ocix0KX19YXIuY3JlYXRlRXhwb3J0TG9nc1NlcnZpY2VSZXF1ZXN0PUdPO2Z1bmN0aW9uIEhPKHIpe2xldCBlPW5ldyBNYXA7Zm9yKGxldCB0IG9mIHIpe2xldHtyZXNvdXJjZTpuLGluc3RydW1lbnRhdGlvblNjb3BlOntuYW1lOmksdmVyc2lvbjpzPVwiXCIsc2NoZW1hVXJsOm89XCJcIn19PXQsYT1lLmdldChuKTthfHwoYT1uZXcgTWFwLGUuc2V0KG4sYSkpO2xldCB1PWAke2l9QCR7c306JHtvfWAsYz1hLmdldCh1KTtjfHwoYz1bXSxhLnNldCh1LGMpKSxjLnB1c2godCl9cmV0dXJuIGV9ZnVuY3Rpb24gak8ocixlKXtsZXQgdD1ITyhyKTtyZXR1cm4gQXJyYXkuZnJvbSh0LChbbixpXSk9Pih7cmVzb3VyY2U6e2F0dHJpYnV0ZXM6KDAsbGMudG9BdHRyaWJ1dGVzKShuLmF0dHJpYnV0ZXMpLGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6MH0sc2NvcGVMb2dzOkFycmF5LmZyb20oaSwoWyxzXSk9PntsZXR7aW5zdHJ1bWVudGF0aW9uU2NvcGU6e25hbWU6byx2ZXJzaW9uOmEsc2NoZW1hVXJsOnV9fT1zWzBdO3JldHVybntzY29wZTp7bmFtZTpvLHZlcnNpb246YX0sbG9nUmVjb3JkczpzLm1hcChjPT5GTyhjLGUpKSxzY2hlbWFVcmw6dX19KSxzY2hlbWFVcmw6dm9pZCAwfSkpfWZ1bmN0aW9uIEZPKHIsZSl7dmFyIHQsbixpO3JldHVybnt0aW1lVW5peE5hbm86ZS5lbmNvZGVIclRpbWUoci5oclRpbWUpLG9ic2VydmVkVGltZVVuaXhOYW5vOmUuZW5jb2RlSHJUaW1lKHIuaHJUaW1lT2JzZXJ2ZWQpLHNldmVyaXR5TnVtYmVyOnIuc2V2ZXJpdHlOdW1iZXIsc2V2ZXJpdHlUZXh0OnIuc2V2ZXJpdHlUZXh0LGJvZHk6KDAsbGMudG9BbnlWYWx1ZSkoci5ib2R5KSxhdHRyaWJ1dGVzOl9mKHIuYXR0cmlidXRlcyksZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDpyLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQsZmxhZ3M6KHQ9ci5zcGFuQ29udGV4dCk9PT1udWxsfHx0PT09dm9pZCAwP3ZvaWQgMDp0LnRyYWNlRmxhZ3MsdHJhY2VJZDplLmVuY29kZU9wdGlvbmFsU3BhbkNvbnRleHQoKG49ci5zcGFuQ29udGV4dCk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLnRyYWNlSWQpLHNwYW5JZDplLmVuY29kZU9wdGlvbmFsU3BhbkNvbnRleHQoKGk9ci5zcGFuQ29udGV4dCk9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLnNwYW5JZCl9fWZ1bmN0aW9uIF9mKHIpe3JldHVybiBPYmplY3Qua2V5cyhyKS5tYXAoZT0+KDAsbGMudG9LZXlWYWx1ZSkoZSxyW2VdKSl9YXIudG9Mb2dBdHRyaWJ1dGVzPV9mfSk7dmFyIGhmPWwoRz0+e1widXNlIHN0cmljdFwiO3ZhciBrTz1HJiZHLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsbix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19KX06ZnVuY3Rpb24ocixlLHQsbil7bj09PXZvaWQgMCYmKG49dCkscltuXT1lW3RdfSksdXI9RyYmRy5fX2V4cG9ydFN0YXJ8fGZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0IGluIHIpdCE9PVwiZGVmYXVsdFwiJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCkmJmtPKGUscix0KX07T2JqZWN0LmRlZmluZVByb3BlcnR5KEcsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7Ry5jcmVhdGVFeHBvcnRMb2dzU2VydmljZVJlcXVlc3Q9Ry5jcmVhdGVFeHBvcnRNZXRyaWNzU2VydmljZVJlcXVlc3Q9Ry5jcmVhdGVFeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0PXZvaWQgMDt1cihRaCgpLEcpO3VyKEJyKCksRyk7dXIoSmgoKSxHKTt1cih0ZigpLEcpO3VyKHJmKCksRyk7dXIoc2YoKSxHKTt2YXIgJE89eXMoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRyxcImNyZWF0ZUV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3RcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gJE8uY3JlYXRlRXhwb3J0VHJhY2VTZXJ2aWNlUmVxdWVzdH19KTt2YXIgWE89ZGYoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRyxcImNyZWF0ZUV4cG9ydE1ldHJpY3NTZXJ2aWNlUmVxdWVzdFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBYTy5jcmVhdGVFeHBvcnRNZXRyaWNzU2VydmljZVJlcXVlc3R9fSk7dmFyIFdPPXBmKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KEcsXCJjcmVhdGVFeHBvcnRMb2dzU2VydmljZVJlcXVlc3RcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gV08uY3JlYXRlRXhwb3J0TG9nc1NlcnZpY2VSZXF1ZXN0fX0pfSk7dmFyIEM9WShsYSgpLDEpO2goKTtmYSgpO3ZhciBUZj1ZKEdkKCksMSksbHI9WShydCgpLDEpLFNmPVkocl8oKSwxKSxBZj1ZKHd1KCksMSksR3M9WShRcigpLDEpLE9mPVkoY3AoKSwxKSxIZT1ZKEEoKSwxKTtoKCk7dmFyIExBPVN5bWJvbC5mb3IoXCJAdmVyY2VsL3JlcXVlc3QtY29udGV4dFwiKTtmdW5jdGlvbiBzZSgpe3JldHVybiBnbG9iYWxUaGlzW0xBXT8uZ2V0KCl9dmFyIGxwPVwiaHR0cC5tZXRob2RcIixkcD1cImh0dHAudXJsXCIsT3M9XCJodHRwLmhvc3RcIixfcD1cImh0dHAuc2NoZW1lXCIsVXU9XCJodHRwLnN0YXR1c19jb2RlXCIscHA9XCJodHRwLnVzZXJfYWdlbnRcIixCdT1cImh0dHAucmVzcG9uc2VfY29udGVudF9sZW5ndGhfdW5jb21wcmVzc2VkXCIsaHA9XCJuZXQucGVlci5wb3J0XCIsZnA9XCJuZXQucGVlci5uYW1lXCIsRXA9XCJjbG91ZC5yZWdpb25cIjt2YXIgbXA9XCJkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWVcIixncD1cImRlcGxveW1lbnQuaWRcIjt2YXIgVHA9XCJwcm9jZXNzLnJ1bnRpbWUubmFtZVwiLFNwPVwidmNzLnJlZi5oZWFkLm5hbWVcIixBcD1cInZjcy5yZWYuaGVhZC5yZXZpc2lvblwiLE9wPVwidmNzLnJlcG9zaXRvcnkubmFtZVwiLFJwPVwidmNzLnJlcG9zaXRvcnkucmVmLnJldmlzaW9uXCI7dmFyIGJwPVwic2VydmljZS5uYW1lXCIsUHA9XCJzZXJ2aWNlLnZlcnNpb25cIjtmdW5jdGlvbiBxdShyKXtyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHIpLmZpbHRlcigoW2UsdF0pPT50IT09dm9pZCAwKSl9ZnVuY3Rpb24gdnAoe2F0dHJpYnV0ZXM6cixlbnY6ZT1wcm9jZXNzLmVudixydW50aW1lOnQsc2VydmljZU5hbWU6bn0pe2xldCBpPWUuVkVSQ0VMX0VOVnx8ZS5ORVhUX1BVQkxJQ19WRVJDRUxfRU5WLHM9ZS5WRVJDRUxfREVQTE9ZTUVOVF9JRCxvPWUuVkVSQ0VMX0dJVF9DT01NSVRfU0hBfHxlLk5FWFRfUFVCTElDX1ZFUkNFTF9HSVRfQ09NTUlUX1NIQSxhPWUuVkVSQ0VMX1JFR0lPTix1PWUuVkVSQ0VMX0dJVF9DT01NSVRfUkVGLGM9ZS5WRVJDRUxfVVJMfHxlLk5FWFRfUFVCTElDX1ZFUkNFTF9VUkx8fHZvaWQgMCxfPWUuVkVSQ0VMX0JSQU5DSF9VUkx8fGUuTkVYVF9QVUJMSUNfVkVSQ0VMX0JSQU5DSF9VUkx8fHZvaWQgMCxwPWUuVkVSQ0VMX0dJVF9SRVBPX1NMVUc7cmV0dXJuIHF1KHtbYnBdOm4sXCJub2RlLmNpXCI6ZS5DST8hMDp2b2lkIDAsXCJub2RlLmVudlwiOmUuTk9ERV9FTlYsW21wXTppLGVudjppLFtFcF06YSxcInZlcmNlbC5yZWdpb25cIjphLFtUcF06dCxcInZlcmNlbC5ydW50aW1lXCI6dCxbU3BdOnUsW0FwXTpvLFtPcF06cCxbUnBdOm8sXCJ2ZXJjZWwuc2hhXCI6byxcInZlcmNlbC5ob3N0XCI6YyxcInZlcmNlbC5icmFuY2hfaG9zdFwiOl8sW2dwXTpzLFwidmVyY2VsLmRlcGxveW1lbnRfaWRcIjpzLFtQcF06cyxcInZlcmNlbC5wcm9qZWN0X2lkXCI6ZS5WRVJDRUxfUFJPSkVDVF9JRHx8dm9pZCAwLC4uLnJ9KX1mdW5jdGlvbiBJcChyKXtyZXR1cm4gcj9yLnNwbGl0KFwiOjpcIikuYXQoLTEpOnZvaWQgMH1mdW5jdGlvbiBNcChyPXNlKCksZSl7aWYoIXIpcmV0dXJuO2xldCB0PWU/Q0EoZSxyLmhlYWRlcnMpOnZvaWQgMDtyZXR1cm4gcXUoe1tPc106ci5oZWFkZXJzLmhvc3QsW3BwXTpyLmhlYWRlcnNbXCJ1c2VyLWFnZW50XCJdLFwiaHR0cC5yZWZlcmVyXCI6ci5oZWFkZXJzLnJlZmVyZXIsXCJ2ZXJjZWwucmVxdWVzdF9pZFwiOklwKHIuaGVhZGVyc1tcIngtdmVyY2VsLWlkXCJdKSxcInZlcmNlbC5tYXRjaGVkX3BhdGhcIjpyLmhlYWRlcnNbXCJ4LW1hdGNoZWQtcGF0aFwiXSxcInZlcmNlbC5lZGdlX3JlZ2lvblwiOnByb2Nlc3MuZW52LlZFUkNFTF9SRUdJT04sLi4udH0pfXZhciBOQT17a2V5cyhyKXtyZXR1cm5bXX0sZ2V0KHIsZSl7cmV0dXJuIHJbZS50b0xvY2FsZUxvd2VyQ2FzZSgpXX19O2Z1bmN0aW9uIENBKHIsZSl7aWYodHlwZW9mIHI9PVwiZnVuY3Rpb25cIilyZXR1cm4gcihlLE5BKTtsZXQgdD17fTtmb3IobGV0W24saV1vZiBPYmplY3QuZW50cmllcyhyKSl7bGV0IHM9ZVtpLnRvTG9jYWxlTG93ZXJDYXNlKCldO3MhPT12b2lkIDAmJih0W25dPXMpfXJldHVybiB0fWgoKTtmdW5jdGlvbiBlcihyKXtyZXR1cm4ociZkLlRyYWNlRmxhZ3MuU0FNUExFRCkhPT0wfXZhciBScz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMucHJvY2Vzc29ycz1lO3RoaXMuYXR0cmlidXRlc0Zyb21IZWFkZXJzPXQ7dGhpcy5yb290U3Bhbklkcz1uZXcgTWFwO3RoaXMud2FpdFNwYW5FbmQ9bmV3IE1hcH1mb3JjZUZsdXNoKCl7cmV0dXJuIFByb21pc2UuYWxsKHRoaXMucHJvY2Vzc29ycy5tYXAoZT0+ZS5mb3JjZUZsdXNoKCkuY2F0Y2godD0+e2QuZGlhZy5lcnJvcihcIkB2ZXJjZWwvb3RlbDogZm9yY2VGbHVzaCBmYWlsZWQ6XCIsdCl9KSkpLnRoZW4oKCk9Pnt9KX1zaHV0ZG93bigpe3JldHVybiBQcm9taXNlLmFsbCh0aGlzLnByb2Nlc3NvcnMubWFwKGU9PmUuc2h1dGRvd24oKS5jYXRjaCgoKT0+e30pKSkudGhlbigoKT0+e30pfW9uU3RhcnQoZSx0KXtsZXR7dHJhY2VJZDpuLHNwYW5JZDppLHRyYWNlRmxhZ3M6c309ZS5zcGFuQ29udGV4dCgpLG89IWUucGFyZW50U3BhbklkfHwhdGhpcy5yb290U3Bhbklkcy5oYXMobik7aWYobz90aGlzLnJvb3RTcGFuSWRzLnNldChuLHtyb290U3BhbklkOmksb3BlbjpbXX0pOnRoaXMucm9vdFNwYW5JZHMuZ2V0KG4pPy5vcGVuLnB1c2goZSksbyYmZXIocykpe2xldCBhPXNlKCksdT1NcChhLHRoaXMuYXR0cmlidXRlc0Zyb21IZWFkZXJzKTt1JiZlLnNldEF0dHJpYnV0ZXModSksYSYmYS53YWl0VW50aWwoYXN5bmMoKT0+e2lmKHRoaXMucm9vdFNwYW5JZHMuaGFzKG4pKXtsZXQgYz1uZXcgUHJvbWlzZShwPT57dGhpcy53YWl0U3BhbkVuZC5zZXQobixwKX0pLF87YXdhaXQgUHJvbWlzZS5yYWNlKFtjLG5ldyBQcm9taXNlKHA9PntfPXNldFRpbWVvdXQoKCk9Pnt0aGlzLndhaXRTcGFuRW5kLmRlbGV0ZShuKSxwKHZvaWQgMCl9LDUwKX0pXSksXyYmY2xlYXJUaW1lb3V0KF8pfXJldHVybiB0aGlzLmZvcmNlRmx1c2goKX0pfWZvcihsZXQgYSBvZiB0aGlzLnByb2Nlc3NvcnMpYS5vblN0YXJ0KGUsdCl9b25FbmQoZSl7bGV0e3RyYWNlSWQ6dCxzcGFuSWQ6bix0cmFjZUZsYWdzOml9PWUuc3BhbkNvbnRleHQoKSxzPWVyKGkpLG89dGhpcy5yb290U3Bhbklkcy5nZXQodCksYT1vPy5yb290U3BhbklkPT09bjtpZihzKXtsZXQgdT14QShlKTt1JiZPYmplY3QuYXNzaWduKGUuYXR0cmlidXRlcyx1KX1pZihhKXtpZih0aGlzLnJvb3RTcGFuSWRzLmRlbGV0ZSh0KSxvLm9wZW4ubGVuZ3RoPjApe2ZvcihsZXQgdSBvZiBvLm9wZW4paWYoIXUuZW5kZWQmJnUuc3BhbkNvbnRleHQoKS5zcGFuSWQhPT1uKXRyeXt1LmVuZCgpfWNhdGNoKGMpe2QuZGlhZy5lcnJvcihcIkB2ZXJjZWwvb3RlbDogb25FbmQgZmFpbGVkOlwiLGMpfX19ZWxzZSBpZihvKWZvcihsZXQgdT0wO3U8by5vcGVuLmxlbmd0aDt1Kyspby5vcGVuW3VdPy5zcGFuQ29udGV4dCgpLnNwYW5JZD09PW4mJm8ub3Blbi5zcGxpY2UodSwxKTtmb3IobGV0IHUgb2YgdGhpcy5wcm9jZXNzb3JzKXUub25FbmQoZSk7aWYoYSl7bGV0IHU9dGhpcy53YWl0U3BhbkVuZC5nZXQodCk7dSYmKHRoaXMud2FpdFNwYW5FbmQuZGVsZXRlKHQpLHUoKSl9fX0sd0E9e1tkLlNwYW5LaW5kLklOVEVSTkFMXTpcImludGVybmFsXCIsW2QuU3BhbktpbmQuU0VSVkVSXTpcInNlcnZlclwiLFtkLlNwYW5LaW5kLkNMSUVOVF06XCJjbGllbnRcIixbZC5TcGFuS2luZC5QUk9EVUNFUl06XCJwcm9kdWNlclwiLFtkLlNwYW5LaW5kLkNPTlNVTUVSXTpcImNvbnN1bWVyXCJ9O2Z1bmN0aW9uIHhBKHIpe2xldHtraW5kOmUsYXR0cmlidXRlczp0fT1yLHtcIm9wZXJhdGlvbi5uYW1lXCI6bixcInJlc291cmNlLm5hbWVcIjppLFwic3Bhbi50eXBlXCI6cyxcIm5leHQuc3Bhbl90eXBlXCI6byxcImh0dHAubWV0aG9kXCI6YSxcImh0dHAucm91dGVcIjp1fT10O2lmKG4pcmV0dXJuO2xldCBjPWk/PyhhJiZ0eXBlb2YgYT09XCJzdHJpbmdcIiYmdSYmdHlwZW9mIHU9PVwic3RyaW5nXCI/YCR7YX0gJHt1fWA6dSk7aWYoci5raW5kPT09ZC5TcGFuS2luZC5TRVJWRVImJmEmJnUmJnR5cGVvZiBhPT1cInN0cmluZ1wiJiZ0eXBlb2YgdT09XCJzdHJpbmdcIilyZXR1cm57XCJvcGVyYXRpb24ubmFtZVwiOlwid2ViLnJlcXVlc3RcIixcInJlc291cmNlLm5hbWVcIjpjfTtsZXQgXz1yLmluc3RydW1lbnRhdGlvbkxpYnJhcnkubmFtZSxwPW8/P3M7aWYocCYmdHlwZW9mIHA9PVwic3RyaW5nXCIpe2xldCBmPUxwKF8scCk7cmV0dXJuIHU/e1wib3BlcmF0aW9uLm5hbWVcIjpmLFwicmVzb3VyY2UubmFtZVwiOmN9OntcIm9wZXJhdGlvbi5uYW1lXCI6Zn19cmV0dXJue1wib3BlcmF0aW9uLm5hbWVcIjpMcChfLGU9PT1kLlNwYW5LaW5kLklOVEVSTkFMP1wiXCI6d0FbZV0pfX1mdW5jdGlvbiBMcChyLGUpe2lmKCFyKXJldHVybiBlO2xldCB0PXIucmVwbGFjZSgvWyBALi9dL2csXCJfXCIpO3JldHVybiB0LnN0YXJ0c1dpdGgoXCJfXCIpJiYodD10LnNsaWNlKDEpKSxlP2Ake3R9LiR7ZX1gOnR9dmFyIGtwPVkoeXMoKSwxKTt2YXIgRnA9WShqcCgpLDEpO2goKTt2YXIgdHI9Y2xhc3MgZXh0ZW5kcyBGcC5PVExQRXhwb3J0ZXJCYXNle2NvbnN0cnVjdG9yKGU9e30pe3N1cGVyKGUpLGUuaGVhZGVycyYmKHRoaXMuX2hlYWRlcnM9ZS5oZWFkZXJzKX1vblNodXRkb3duKCl7ZC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsL290bHA6IG9uU2h1dGRvd25cIil9b25Jbml0KCl7ZC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsL290bHA6IG9uSW5pdFwiKX1zZW5kKGUsdCxuKXtpZih0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpe2QuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbC9vdGxwOiBTaHV0ZG93biBhbHJlYWR5IHN0YXJ0ZWQuIENhbm5vdCBzZW5kIG9iamVjdHNcIik7cmV0dXJufWxldCBpPXRoaXMuY29udmVydChlKSxzLG8sYTt0cnl7KHtib2R5OnMsY29udGVudFR5cGU6byxoZWFkZXJzOmF9PXRoaXMudG9NZXNzYWdlKGkpKX1jYXRjaChjKXtkLmRpYWcud2FybihcIkB2ZXJjZWwvb3RlbC9vdGxwOiBubyBwcm90b1wiLGMpO3JldHVybn1sZXQgdT1mZXRjaCh0aGlzLnVybCx7bWV0aG9kOlwiUE9TVFwiLGJvZHk6cyxoZWFkZXJzOnsuLi50aGlzLl9oZWFkZXJzLC4uLmEsXCJDb250ZW50LVR5cGVcIjpvLFwiVXNlci1BZ2VudFwiOlwiT1RlbC1PVExQLUV4cG9ydGVyLUphdmFTY3JpcHQvMC40Ni4wXCJ9LG5leHQ6e2ludGVybmFsOiEwfX0pLnRoZW4oYz0+e2QuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbC9vdGxwOiBvblN1Y2Nlc3NcIixjLnN0YXR1cyxjLnN0YXR1c1RleHQpLHQoKSxjLmFycmF5QnVmZmVyKCkuY2F0Y2goKCk9Pnt9KX0pLmNhdGNoKGM9PntkLmRpYWcuZXJyb3IoXCJAdmVyY2VsL290ZWwvb3RscDogb25FcnJvclwiLGMpLG4oYyl9KS5maW5hbGx5KCgpPT57bGV0IGM9dGhpcy5fc2VuZGluZ1Byb21pc2VzLmluZGV4T2YodSk7dGhpcy5fc2VuZGluZ1Byb21pc2VzLnNwbGljZShjLDEpfSk7dGhpcy5fc2VuZGluZ1Byb21pc2VzLnB1c2godSl9Z2V0RGVmYXVsdFVybChlKXt0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKX19O3ZhciB0Tz1cInYxL3RyYWNlc1wiLHJPPWBodHRwOi8vbG9jYWxob3N0OjQzMTgvJHt0T31gO2Z1bmN0aW9uIElzKHIpe3JldHVybiB0eXBlb2Ygci51cmw9PVwic3RyaW5nXCI/ci51cmw6ck99dmFyIHJyPWNsYXNze2NvbnN0cnVjdG9yKGU9e30pe3RoaXMuaW1wbD1uZXcgV3UoZSl9ZXhwb3J0KGUsdCl7dGhpcy5pbXBsLmV4cG9ydChlLHQpfXNodXRkb3duKCl7cmV0dXJuIHRoaXMuaW1wbC5zaHV0ZG93bigpfWZvcmNlRmx1c2goKXtyZXR1cm4gdGhpcy5pbXBsLmZvcmNlRmx1c2goKX19LFd1PWNsYXNzIGV4dGVuZHMgdHJ7Y29udmVydChlKXtyZXR1cm4oMCxrcC5jcmVhdGVFeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0KShlLHt1c2VIZXg6ITAsdXNlTG9uZ0JpdHM6ITF9KX10b01lc3NhZ2UoZSl7cmV0dXJue2JvZHk6SlNPTi5zdHJpbmdpZnkoZSksY29udGVudFR5cGU6XCJhcHBsaWNhdGlvbi9qc29uXCJ9fWdldERlZmF1bHRVcmwoZSl7cmV0dXJuIElzKGUpfX07dmFyICRoPVkoeXMoKSwxKTt2YXIgamg9WShIaCgpLDEpO2Z1bmN0aW9uIEZoKHIpe2xldCBlPW5ldyBqaC5Xcml0ZXI7cmV0dXJuIF9PKHIsZSksZS5maW5pc2goKX1mdW5jdGlvbiBfTyhyLGUpe2lmKHIucmVzb3VyY2VTcGFucyE9bnVsbCYmci5yZXNvdXJjZVNwYW5zLmxlbmd0aClmb3IobGV0IHQ9MDt0PHIucmVzb3VyY2VTcGFucy5sZW5ndGg7Kyt0KXBPKHIucmVzb3VyY2VTcGFuc1t0XSxlLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gZX1mdW5jdGlvbiBwTyhyLGUpe2lmKHIucmVzb3VyY2UhPW51bGwmJmhPKHIucmVzb3VyY2UsZS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksci5zY29wZVNwYW5zIT1udWxsJiZyLnNjb3BlU3BhbnMubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ci5zY29wZVNwYW5zLmxlbmd0aDsrK3QpZk8oci5zY29wZVNwYW5zW3RdLGUudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiByLnNjaGVtYVVybCE9bnVsbCYmZS51aW50MzIoMjYpLnN0cmluZyhyLnNjaGVtYVVybCksZX1mdW5jdGlvbiBoTyhyLGUpe2lmKHIuYXR0cmlidXRlcyE9bnVsbCYmci5hdHRyaWJ1dGVzLmxlbmd0aClmb3IobGV0IHQ9MDt0PHIuYXR0cmlidXRlcy5sZW5ndGg7Kyt0KWlyKHIuYXR0cmlidXRlc1t0XSxlLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gci5kcm9wcGVkQXR0cmlidXRlc0NvdW50IT1udWxsJiZlLnVpbnQzMigxNikudWludDMyKHIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCksZX1mdW5jdGlvbiBmTyhyLGUpe2lmKHIuc2NvcGUhPW51bGwmJmdPKHIuc2NvcGUsZS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksci5zcGFucyE9bnVsbCYmci5zcGFucy5sZW5ndGgpZm9yKGxldCB0PTA7dDxyLnNwYW5zLmxlbmd0aDsrK3QpVE8oci5zcGFuc1t0XSxlLnVpbnQzMigxOCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gci5zY2hlbWFVcmwhPW51bGwmJmUudWludDMyKDI2KS5zdHJpbmcoci5zY2hlbWFVcmwpLGV9ZnVuY3Rpb24gaXIocixlKXtyZXR1cm4gci5rZXkhPW51bGwmJmUudWludDMyKDEwKS5zdHJpbmcoci5rZXkpLHIudmFsdWUhPW51bGwmJmtoKHIudmFsdWUsZS51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksZX1mdW5jdGlvbiBraChyLGUpe3JldHVybiByLnN0cmluZ1ZhbHVlIT1udWxsJiZlLnVpbnQzMigxMCkuc3RyaW5nKHIuc3RyaW5nVmFsdWUpLHIuYm9vbFZhbHVlIT1udWxsJiZlLnVpbnQzMigxNikuYm9vbChyLmJvb2xWYWx1ZSksci5pbnRWYWx1ZSE9bnVsbCYmZS51aW50MzIoMjQpLmludDY0KHIuaW50VmFsdWUpLHIuZG91YmxlVmFsdWUhPW51bGwmJmUudWludDMyKDMzKS5kb3VibGUoci5kb3VibGVWYWx1ZSksci5hcnJheVZhbHVlIT1udWxsJiZFTyhyLmFycmF5VmFsdWUsZS51aW50MzIoNDIpLmZvcmsoKSkubGRlbGltKCksci5rdmxpc3RWYWx1ZSE9bnVsbCYmbU8oci5rdmxpc3RWYWx1ZSxlLnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKSxyLmJ5dGVzVmFsdWUhPW51bGwmJmUudWludDMyKDU4KS5ieXRlcyhyLmJ5dGVzVmFsdWUpLGV9ZnVuY3Rpb24gRU8ocixlKXtpZihyLnZhbHVlcyE9bnVsbCYmci52YWx1ZXMubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ci52YWx1ZXMubGVuZ3RoOysrdClraChyLnZhbHVlc1t0XSxlLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gZX1mdW5jdGlvbiBtTyhyLGUpe2lmKHIudmFsdWVzIT1udWxsJiZyLnZhbHVlcy5sZW5ndGgpZm9yKGxldCB0PTA7dDxyLnZhbHVlcy5sZW5ndGg7Kyt0KWlyKHIudmFsdWVzW3RdLGUudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiBlfWZ1bmN0aW9uIGdPKHIsZSl7aWYoci5uYW1lIT1udWxsJiZlLnVpbnQzMigxMCkuc3RyaW5nKHIubmFtZSksci52ZXJzaW9uIT1udWxsJiZlLnVpbnQzMigxOCkuc3RyaW5nKHIudmVyc2lvbiksci5hdHRyaWJ1dGVzIT1udWxsJiZyLmF0dHJpYnV0ZXMubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ci5hdHRyaWJ1dGVzLmxlbmd0aDsrK3QpaXIoci5hdHRyaWJ1dGVzW3RdLGUudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpO3JldHVybiByLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQhPW51bGwmJmUudWludDMyKDMyKS51aW50MzIoci5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSxlfWZ1bmN0aW9uIFRPKHIsZSl7aWYoci50cmFjZUlkIT1udWxsJiZlLnVpbnQzMigxMCkuYnl0ZXMoci50cmFjZUlkKSxyLnNwYW5JZCE9bnVsbCYmZS51aW50MzIoMTgpLmJ5dGVzKHIuc3BhbklkKSxyLnRyYWNlU3RhdGUhPW51bGwmJmUudWludDMyKDI2KS5zdHJpbmcoci50cmFjZVN0YXRlKSxyLnBhcmVudFNwYW5JZCE9bnVsbCYmZS51aW50MzIoMzQpLmJ5dGVzKHIucGFyZW50U3BhbklkKSxyLm5hbWUhPW51bGwmJmUudWludDMyKDQyKS5zdHJpbmcoci5uYW1lKSxyLmtpbmQhPW51bGwmJmUudWludDMyKDQ4KS5pbnQzMihyLmtpbmQpLHIuc3RhcnRUaW1lVW5peE5hbm8hPW51bGwmJmUudWludDMyKDU3KS5maXhlZDY0KHIuc3RhcnRUaW1lVW5peE5hbm8pLHIuZW5kVGltZVVuaXhOYW5vIT1udWxsJiZlLnVpbnQzMig2NSkuZml4ZWQ2NChyLmVuZFRpbWVVbml4TmFubyksci5hdHRyaWJ1dGVzIT1udWxsJiZyLmF0dHJpYnV0ZXMubGVuZ3RoKWZvcihsZXQgdD0wO3Q8ci5hdHRyaWJ1dGVzLmxlbmd0aDsrK3QpaXIoci5hdHRyaWJ1dGVzW3RdLGUudWludDMyKDc0KS5mb3JrKCkpLmxkZWxpbSgpO2lmKHIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCE9bnVsbCYmZS51aW50MzIoODApLnVpbnQzMihyLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLHIuZXZlbnRzIT1udWxsJiZyLmV2ZW50cy5sZW5ndGgpZm9yKGxldCB0PTA7dDxyLmV2ZW50cy5sZW5ndGg7Kyt0KUFPKHIuZXZlbnRzW3RdLGUudWludDMyKDkwKS5mb3JrKCkpLmxkZWxpbSgpO2lmKHIuZHJvcHBlZEV2ZW50c0NvdW50IT1udWxsJiZlLnVpbnQzMig5NikudWludDMyKHIuZHJvcHBlZEV2ZW50c0NvdW50KSxyLmxpbmtzIT1udWxsJiZyLmxpbmtzLmxlbmd0aClmb3IobGV0IHQ9MDt0PHIubGlua3MubGVuZ3RoOysrdClPTyhyLmxpbmtzW3RdLGUudWludDMyKDEwNikuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gci5kcm9wcGVkTGlua3NDb3VudCE9bnVsbCYmZS51aW50MzIoMTEyKS51aW50MzIoci5kcm9wcGVkTGlua3NDb3VudCksci5zdGF0dXMhPW51bGwmJlNPKHIuc3RhdHVzLGUudWludDMyKDEyMikuZm9yaygpKS5sZGVsaW0oKSxlfWZ1bmN0aW9uIFNPKHIsZSl7cmV0dXJuIHIubWVzc2FnZSE9bnVsbCYmZS51aW50MzIoMTgpLnN0cmluZyhyLm1lc3NhZ2UpLHIuY29kZSE9bnVsbCYmZS51aW50MzIoMjQpLmludDMyKHIuY29kZSksZX1mdW5jdGlvbiBBTyhyLGUpe2lmKHIudGltZVVuaXhOYW5vIT1udWxsJiZlLnVpbnQzMig5KS5maXhlZDY0KHIudGltZVVuaXhOYW5vKSxyLm5hbWUhPW51bGwmJmUudWludDMyKDE4KS5zdHJpbmcoci5uYW1lKSxyLmF0dHJpYnV0ZXMhPW51bGwmJnIuYXR0cmlidXRlcy5sZW5ndGgpZm9yKGxldCB0PTA7dDxyLmF0dHJpYnV0ZXMubGVuZ3RoOysrdClpcihyLmF0dHJpYnV0ZXNbdF0sZS51aW50MzIoMjYpLmZvcmsoKSkubGRlbGltKCk7cmV0dXJuIHIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCE9bnVsbCYmZS51aW50MzIoMzIpLnVpbnQzMihyLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLGV9ZnVuY3Rpb24gT08ocixlKXtpZihyLnRyYWNlSWQhPW51bGwmJmUudWludDMyKDEwKS5ieXRlcyhyLnRyYWNlSWQpLHIuc3BhbklkIT1udWxsJiZlLnVpbnQzMigxOCkuYnl0ZXMoci5zcGFuSWQpLHIudHJhY2VTdGF0ZSE9bnVsbCYmZS51aW50MzIoMjYpLnN0cmluZyhyLnRyYWNlU3RhdGUpLHIuYXR0cmlidXRlcyE9bnVsbCYmci5hdHRyaWJ1dGVzLmxlbmd0aClmb3IobGV0IHQ9MDt0PHIuYXR0cmlidXRlcy5sZW5ndGg7Kyt0KWlyKHIuYXR0cmlidXRlc1t0XSxlLnVpbnQzMigzNCkuZm9yaygpKS5sZGVsaW0oKTtyZXR1cm4gci5kcm9wcGVkQXR0cmlidXRlc0NvdW50IT1udWxsJiZlLnVpbnQzMig0MCkudWludDMyKHIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCksZX12YXIgZHQ9Y2xhc3N7Y29uc3RydWN0b3IoZT17fSl7dGhpcy5pbXBsPW5ldyBhYyhlKX1leHBvcnQoZSx0KXt0aGlzLmltcGwuZXhwb3J0KGUsdCl9c2h1dGRvd24oKXtyZXR1cm4gdGhpcy5pbXBsLnNodXRkb3duKCl9Zm9yY2VGbHVzaCgpe3JldHVybiB0aGlzLmltcGwuZm9yY2VGbHVzaCgpfX0sYWM9Y2xhc3MgZXh0ZW5kcyB0cntjb252ZXJ0KGUpe3JldHVybigwLCRoLmNyZWF0ZUV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3QpKGUsdm9pZCAwKX10b01lc3NhZ2UoZSl7cmV0dXJue2JvZHk6RmgoZSksY29udGVudFR5cGU6XCJhcHBsaWNhdGlvbi94LXByb3RvYnVmXCIsaGVhZGVyczp7YWNjZXB0OlwiYXBwbGljYXRpb24veC1wcm90b2J1ZlwifX19Z2V0RGVmYXVsdFVybChlKXtyZXR1cm4gSXMoZSl9fTtoKCk7ZnVuY3Rpb24gWGgocixlKXtyZXR1cm4gci5yZXBsYWNlKC9cXHsoPzx0ZW1wMT5bXnt9XSspXFx9L2csKHQsbik9PntsZXQgaT1lW25dO3JldHVybiBpIT09dm9pZCAwP1N0cmluZyhpKTp0fSl9dmFyIHNyPWNsYXNze2NvbnN0cnVjdG9yKGU9e30pe3RoaXMuaW5zdHJ1bWVudGF0aW9uTmFtZT1cIkB2ZXJjZWwvb3RlbC9mZXRjaFwiO3RoaXMuaW5zdHJ1bWVudGF0aW9uVmVyc2lvbj1cIjEuMC4wXCI7dGhpcy5jb25maWc9ZX1nZXRDb25maWcoKXtyZXR1cm4gdGhpcy5jb25maWd9c2V0Q29uZmlnKCl7fXNldFRyYWNlclByb3ZpZGVyKGUpe3RoaXMudHJhY2VyUHJvdmlkZXI9ZX1zZXRNZXRlclByb3ZpZGVyKCl7fXNob3VsZElnbm9yZShlLHQpe2xldCBuPXRoaXMuY29uZmlnLmlnbm9yZVVybHM/P1tdO2lmKHQ/Lm9wZW50ZWxlbWV0cnk/Lmlnbm9yZSE9PXZvaWQgMClyZXR1cm4gdC5vcGVudGVsZW1ldHJ5Lmlnbm9yZTtpZihuLmxlbmd0aD09PTApcmV0dXJuITE7bGV0IGk9ZS50b1N0cmluZygpO3JldHVybiBuLnNvbWUocz0+dHlwZW9mIHM9PVwic3RyaW5nXCI/cz09PVwiKlwiPyEwOmkuc3RhcnRzV2l0aChzKTpzLnRlc3QoaSkpfXNob3VsZFByb3BhZ2F0ZShlLHQpe2xldCBuPXByb2Nlc3MuZW52LlZFUkNFTF9VUkx8fHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX1ZFUkNFTF9VUkx8fG51bGwsaT1wcm9jZXNzLmVudi5WRVJDRUxfQlJBTkNIX1VSTHx8cHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfVkVSQ0VMX0JSQU5DSF9VUkx8fG51bGwscz10aGlzLmNvbmZpZy5wcm9wYWdhdGVDb250ZXh0VXJscz8/W10sbz10aGlzLmNvbmZpZy5kb250UHJvcGFnYXRlQ29udGV4dFVybHM/P1tdO2lmKHQ/Lm9wZW50ZWxlbWV0cnk/LnByb3BhZ2F0ZUNvbnRleHQpcmV0dXJuIHQub3BlbnRlbGVtZXRyeS5wcm9wYWdhdGVDb250ZXh0O2xldCBhPWUudG9TdHJpbmcoKTtyZXR1cm4gby5sZW5ndGg+MCYmby5zb21lKHU9PnR5cGVvZiB1PT1cInN0cmluZ1wiP3U9PT1cIipcIj8hMDphLnN0YXJ0c1dpdGgodSk6dS50ZXN0KGEpKT8hMTpuJiZlLnByb3RvY29sPT09XCJodHRwczpcIiYmKGUuaG9zdD09PW58fGUuaG9zdD09PWl8fGUuaG9zdD09PXNlKCk/LmhlYWRlcnMuaG9zdCl8fCFuJiZlLnByb3RvY29sPT09XCJodHRwOlwiJiZlLmhvc3RuYW1lPT09XCJsb2NhbGhvc3RcIj8hMDpzLnNvbWUodT0+dHlwZW9mIHU9PVwic3RyaW5nXCI/dT09PVwiKlwiPyEwOmEuc3RhcnRzV2l0aCh1KTp1LnRlc3QoYSkpfXN0YXJ0U3Bhbih7dHJhY2VyOmUsdXJsOnQsZmV0Y2hUeXBlOm4sbWV0aG9kOmk9XCJHRVRcIixuYW1lOnMsYXR0cmlidXRlczpvPXt9fSl7bGV0IGE9dGhpcy5jb25maWcucmVzb3VyY2VOYW1lVGVtcGxhdGUsdT17W2xwXTppLFtkcF06dC50b1N0cmluZygpLFtPc106dC5ob3N0LFtfcF06dC5wcm90b2NvbC5yZXBsYWNlKFwiOlwiLFwiXCIpLFtmcF06dC5ob3N0bmFtZSxbaHBdOnQucG9ydH0sYz1hP1hoKGEsdSk6UE8odC50b1N0cmluZygpKSxfPXM/P2Ake259ICR7aX0gJHt0LnRvU3RyaW5nKCl9YCxwPWQuY29udGV4dC5hY3RpdmUoKTtyZXR1cm4gZS5zdGFydFNwYW4oXyx7a2luZDpkLlNwYW5LaW5kLkNMSUVOVCxhdHRyaWJ1dGVzOnsuLi51LFwib3BlcmF0aW9uLm5hbWVcIjpgJHtufS4ke2l9YCxcImh0dHAuY2xpZW50Lm5hbWVcIjpuLFwicmVzb3VyY2UubmFtZVwiOmMsLi4ub319LHApfWluc3RydW1lbnRIdHRwKGUsdCl7bGV0e3RyYWNlclByb3ZpZGVyOm59PXRoaXM7aWYoIW4pcmV0dXJuO2xldCBpPW4uZ2V0VHJhY2VyKHRoaXMuaW5zdHJ1bWVudGF0aW9uTmFtZSx0aGlzLmluc3RydW1lbnRhdGlvblZlcnNpb24pLHthdHRyaWJ1dGVzRnJvbVJlcXVlc3RIZWFkZXJzOnMsYXR0cmlidXRlc0Zyb21SZXNwb25zZUhlYWRlcnM6b309dGhpcy5jb25maWcsYT1lLnJlcXVlc3QsdT1lLmdldCxjPV89PihwLGYsTSk9PntsZXQgUix3PXt9LFU7aWYodHlwZW9mIHA9PVwic3RyaW5nXCJ8fHAgaW5zdGFuY2VvZiBVUkw/KFI9bmV3IFVSTChwLnRvU3RyaW5nKCkpLHR5cGVvZiBmPT1cImZ1bmN0aW9uXCI/VT1mOmYmJnR5cGVvZiBNPT1cImZ1bmN0aW9uXCI/KHc9ZixVPU0pOmYmJih3PWYpKToodz1wLHR5cGVvZiBmPT1cImZ1bmN0aW9uXCImJihVPWYpLFI9dk8odyx0KSksdGhpcy5zaG91bGRJZ25vcmUoUikpcmV0dXJuIF8uYXBwbHkodGhpcyxbUix3LFVdKTtsZXQgUz10aGlzLnN0YXJ0U3Bhbih7dHJhY2VyOmksdXJsOlIsZmV0Y2hUeXBlOlwiaHR0cFwiLG1ldGhvZDp3Lm1ldGhvZHx8XCJHRVRcIn0pO2lmKCFTLmlzUmVjb3JkaW5nKCl8fCFlcihTLnNwYW5Db250ZXh0KCkudHJhY2VGbGFncykpcmV0dXJuIFMuZW5kKCksXy5hcHBseSh0aGlzLFtSLHcsVV0pO2lmKHRoaXMuc2hvdWxkUHJvcGFnYXRlKFIpKXtsZXQgVGU9ZC5jb250ZXh0LmFjdGl2ZSgpLFNlPWQudHJhY2Uuc2V0U3BhbihUZSxTKTtkLnByb3BhZ2F0aW9uLmluamVjdChTZSx3LmhlYWRlcnN8fHt9LGJPKX1zJiZ3cyhTLHMsdy5oZWFkZXJzfHx7fSxLaCk7dHJ5e2xldCBUZT1EYXRlLm5vdygpLFNlPV8uYXBwbHkodGhpcyxbUix3LFVdKTtyZXR1cm4gU2UucHJlcGVuZExpc3RlbmVyKFwicmVzcG9uc2VcIixLPT57bGV0IHB0PURhdGUubm93KCktVGU7Uy5zZXRBdHRyaWJ1dGUoXCJodHRwLnJlc3BvbnNlX3RpbWVcIixwdCksSy5zdGF0dXNDb2RlIT09dm9pZCAwPyhTLnNldEF0dHJpYnV0ZShVdSxLLnN0YXR1c0NvZGUpLEsuc3RhdHVzQ29kZT49NTAwJiZfdChTLGBTdGF0dXM6ICR7Sy5zdGF0dXNDb2RlfWApKTpfdChTLFwiUmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgdW5kZWZpbmVkXCIpLG8mJndzKFMsbyxLLmhlYWRlcnMsS2gpLFNlLmxpc3RlbmVyQ291bnQoXCJyZXNwb25zZVwiKTw9MSYmSy5yZXN1bWUoKSxLLm9uKFwiZW5kXCIsKCk9PntsZXQgJHIsSHM9Sy5zdGF0dXNDb2RlO0suYWJvcnRlZCYmIUsuY29tcGxldGU/JHI9e2NvZGU6ZC5TcGFuU3RhdHVzQ29kZS5FUlJPUn06SHMmJkhzPj0xMDAmJkhzPDUwMD8kcj17Y29kZTpkLlNwYW5TdGF0dXNDb2RlLlVOU0VUfTokcj17Y29kZTpkLlNwYW5TdGF0dXNDb2RlLkVSUk9SfSxTLnNldFN0YXR1cygkciksUy5pc1JlY29yZGluZygpJiYoSy5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0mJlMuc2V0QXR0cmlidXRlKEJ1LEsuaGVhZGVyc1tcImNvbnRlbnQtbGVuZ3RoXCJdKSxTLmVuZCgpKX0pfSksU2Uub24oXCJlcnJvclwiLEs9PntTLmlzUmVjb3JkaW5nKCkmJihfdChTLEspLFMuZW5kKCkpfSksU2Uub24oXCJjbG9zZVwiLCgpPT57Uy5pc1JlY29yZGluZygpJiZTLmVuZCgpfSksU2V9Y2F0Y2goVGUpe3Rocm93IF90KFMsVGUpLFMuZW5kKCksVGV9fTtlLnJlcXVlc3Q9YyhhKSxlLmdldD1jKHUpfWluc3RydW1lbnRGZXRjaCgpe2xldHt0cmFjZXJQcm92aWRlcjplfT10aGlzO2lmKCFlKXJldHVybjtsZXQgdD1lLmdldFRyYWNlcih0aGlzLmluc3RydW1lbnRhdGlvbk5hbWUsdGhpcy5pbnN0cnVtZW50YXRpb25WZXJzaW9uKSx7YXR0cmlidXRlc0Zyb21SZXF1ZXN0SGVhZGVyczpuLGF0dHJpYnV0ZXNGcm9tUmVzcG9uc2VIZWFkZXJzOml9PXRoaXMuY29uZmlnO3Byb2Nlc3MuZW52Lk5FWFRfT1RFTF9GRVRDSF9ESVNBQkxFRD1cIjFcIjtsZXQgcz1nbG9iYWxUaGlzLmZldGNoO3RoaXMub3JpZ2luYWxGZXRjaD1zO2xldCBvPWFzeW5jKGEsdSk9PntsZXQgYz11O2lmKGM/Lm5leHQ/LmludGVybmFsKXJldHVybiBzKGEsYyk7bGV0IF89bmV3IFJlcXVlc3QoYSBpbnN0YW5jZW9mIFJlcXVlc3Q/YS5jbG9uZSgpOmEsYykscD1uZXcgVVJMKF8udXJsKTtpZih0aGlzLnNob3VsZElnbm9yZShwLGMpKXJldHVybiBzKGEsYyk7bGV0IGY9dGhpcy5zdGFydFNwYW4oe3RyYWNlcjp0LHVybDpwLGZldGNoVHlwZTpcImZldGNoXCIsbWV0aG9kOl8ubWV0aG9kLG5hbWU6Yz8ub3BlbnRlbGVtZXRyeT8uc3Bhbk5hbWUsYXR0cmlidXRlczpjPy5vcGVudGVsZW1ldHJ5Py5hdHRyaWJ1dGVzfSk7aWYoIWYuaXNSZWNvcmRpbmcoKXx8IWVyKGYuc3BhbkNvbnRleHQoKS50cmFjZUZsYWdzKSlyZXR1cm4gZi5lbmQoKSxzKGEsYyk7aWYodGhpcy5zaG91bGRQcm9wYWdhdGUocCxjKSl7bGV0IE09ZC5jb250ZXh0LmFjdGl2ZSgpLFI9ZC50cmFjZS5zZXRTcGFuKE0sZik7ZC5wcm9wYWdhdGlvbi5pbmplY3QoUixfLmhlYWRlcnMsUk8pfW4mJndzKGYsbixfLmhlYWRlcnMsV2gpO3RyeXtsZXQgTT1EYXRlLm5vdygpO2M/LmJvZHkmJmMuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhJiZfLmhlYWRlcnMuZGVsZXRlKFwiY29udGVudC10eXBlXCIpO2xldCBSPWF3YWl0IHMoYSx7Li4uYyxoZWFkZXJzOl8uaGVhZGVyc30pLHc9RGF0ZS5ub3coKS1NO3JldHVybiBmLnNldEF0dHJpYnV0ZShVdSxSLnN0YXR1cyksZi5zZXRBdHRyaWJ1dGUoXCJodHRwLnJlc3BvbnNlX3RpbWVcIix3KSxpJiZ3cyhmLGksUi5oZWFkZXJzLFdoKSxSLnN0YXR1cz49NTAwJiZfdChmLGBTdGF0dXM6ICR7Ui5zdGF0dXN9ICgke1Iuc3RhdHVzVGV4dH0pYCksUi5ib2R5P3lPKFIpLnRoZW4oVT0+e2YuaXNSZWNvcmRpbmcoKSYmKGYuc2V0QXR0cmlidXRlKEJ1LFUpLGYuZW5kKCkpfSxVPT57Zi5pc1JlY29yZGluZygpJiYoX3QoZixVKSxmLmVuZCgpKX0pOmYuZW5kKCksUn1jYXRjaChNKXt0aHJvdyBfdChmLE0pLGYuZW5kKCksTX19O2dsb2JhbFRoaXMuZmV0Y2g9b31lbmFibGUoKXt0aGlzLmRpc2FibGUoKSx0aGlzLmluc3RydW1lbnRGZXRjaCgpO3RyeXtsZXQgZT16KFwibm9kZTpodHRwXCIpLHQ9eihcIm5vZGU6aHR0cHNcIik7dGhpcy5pbnN0cnVtZW50SHR0cChlLFwiaHR0cDpcIiksdGhpcy5pbnN0cnVtZW50SHR0cCh0LFwiaHR0cHM6XCIpfWNhdGNoe319ZGlzYWJsZSgpe3RoaXMub3JpZ2luYWxGZXRjaCYmKGdsb2JhbFRoaXMuZmV0Y2g9dGhpcy5vcmlnaW5hbEZldGNoKX19LFJPPXtzZXQocixlLHQpe3Iuc2V0KGUsdCl9fSxXaD17Z2V0KHIsZSl7bGV0IHQ9ci5nZXQoZSk7aWYodCE9PW51bGwpcmV0dXJuIHQuaW5jbHVkZXMoXCIsXCIpP3Quc3BsaXQoXCIsXCIpLm1hcChuPT5uLnRyaW1TdGFydCgpKTp0fSxrZXlzKHIpe2xldCBlPVtdO3JldHVybiByLmZvckVhY2goKHQsbik9PntlLnB1c2gobil9KSxlfX0sYk89e3NldChyLGUsdCl7cltlLnRvTG93ZXJDYXNlKCldPXR9fSxLaD17Z2V0KHIsZSl7cmV0dXJuIHJbZS50b0xvd2VyQ2FzZSgpXX0sa2V5cyhyKXtyZXR1cm4gT2JqZWN0LmtleXMocil9fTtmdW5jdGlvbiBQTyhyKXtsZXQgZT1yLmluZGV4T2YoXCI/XCIpO3JldHVybiBlPT09LTE/cjpyLnN1YnN0cmluZygwLGUpfWZ1bmN0aW9uIHlPKHIpe2xldCBlPTAsbj1yLmNsb25lKCkuYm9keT8uZ2V0UmVhZGVyKCk7aWYoIW4pcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtsZXQgaT0oKT0+bi5yZWFkKCkudGhlbigoe2RvbmU6cyx2YWx1ZTpvfSk9PntpZighcylyZXR1cm4gZSs9by5ieXRlTGVuZ3RoLGkoKX0pO3JldHVybiBpKCkudGhlbigoKT0+ZSl9ZnVuY3Rpb24gX3QocixlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipci5yZWNvcmRFeGNlcHRpb24oZSksci5zZXRTdGF0dXMoe2NvZGU6ZC5TcGFuU3RhdHVzQ29kZS5FUlJPUixtZXNzYWdlOmUubWVzc2FnZX0pO2Vsc2V7bGV0IHQ9U3RyaW5nKGUpO3Iuc2V0U3RhdHVzKHtjb2RlOmQuU3BhblN0YXR1c0NvZGUuRVJST1IsbWVzc2FnZTp0fSl9fWZ1bmN0aW9uIHdzKHIsZSx0LG4pe2ZvcihsZXRbaSxzXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtsZXQgbz1uLmdldCh0LHMpO28hPT12b2lkIDAmJnIuc2V0QXR0cmlidXRlKGksbyl9fWZ1bmN0aW9uIHZPKHIsZSl7aWYoci5zb2NrZXRQYXRoKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb25zdHJ1Y3QgYSBuZXR3b3JrIFVSTDogb3B0aW9ucy5zb2NrZXRQYXRoIGlzIHNwZWNpZmllZCwgaW5kaWNhdGluZyBhIFVuaXggZG9tYWluIHNvY2tldC5cIik7bGV0IHQ9ci5wcm90b2NvbD8/ZTt0JiYhdC5lbmRzV2l0aChcIjpcIikmJih0Kz1cIjpcIik7bGV0IG49ci5ob3N0bmFtZSxpPXIucG9ydD8/ci5kZWZhdWx0UG9ydDtpZighbiYmci5ob3N0KXtsZXQgYz1yLmhvc3Quc3BsaXQoXCI6XCIpO249Y1swXTtsZXQgXz1jWzFdO2lmKGMubGVuZ3RoPjEmJl8mJmk9PT12b2lkIDApe2xldCBwPXBhcnNlSW50KF8sMTApO2lzTmFOKHApfHwoaT1wKX19bnx8KG49XCJsb2NhbGhvc3RcIik7bGV0IHM7aWYoaSE9PXZvaWQgMCYmaSE9PVwiXCIpe2xldCBjPXBhcnNlSW50KFN0cmluZyhpKSwxMCk7aXNOYU4oYyk/cz10PT09XCJodHRwczpcIj80NDM6ODA6cz1jfWVsc2Ugcz10PT09XCJodHRwczpcIj80NDM6ODA7bGV0IG89ci5wYXRofHxcIi9cIixhPWAke3R9Ly8ke259OiR7c31gLHU9bmV3IFVSTChvLGEpO2lmKHIuYXV0aCl7bGV0IGM9ci5hdXRoLnNwbGl0KFwiOlwiKTt1LnVzZXJuYW1lPWRlY29kZVVSSUNvbXBvbmVudChjWzBdfHxcIlwiKSxjLmxlbmd0aD4xJiYodS5wYXNzd29yZD1kZWNvZGVVUklDb21wb25lbnQoY1sxXXx8XCJcIikpfXJldHVybiB1fWgoKTt2YXIgemg9WShBKCksMSksSU89XCIwMFwiLHVjPVwidHJhY2VwYXJlbnRcIixjYz1cInRyYWNlc3RhdGVcIixqcj1jbGFzc3tmaWVsZHMoKXtyZXR1cm5bdWMsY2NdfWluamVjdChlLHQsbil7bGV0IGk9ZC50cmFjZS5nZXRTcGFuQ29udGV4dChlKTtpZighaXx8KDAsemguaXNUcmFjaW5nU3VwcHJlc3NlZCkoZSl8fCEoMCxkLmlzU3BhbkNvbnRleHRWYWxpZCkoaSkpcmV0dXJuO2xldCBzPWAke0lPfS0ke2kudHJhY2VJZH0tJHtpLnNwYW5JZH0tMCR7TnVtYmVyKGkudHJhY2VGbGFnc3x8MCkudG9TdHJpbmcoMTYpfWA7bi5zZXQodCx1YyxzKSxpLnRyYWNlU3RhdGUmJm4uc2V0KHQsY2MsaS50cmFjZVN0YXRlLnNlcmlhbGl6ZSgpKX1leHRyYWN0KGUsdCxuKXtsZXQgaT1uLmdldCh0LHVjKTtpZighaSlyZXR1cm4gZTtsZXQgcz1BcnJheS5pc0FycmF5KGkpP2lbMF06aTtpZih0eXBlb2YgcyE9XCJzdHJpbmdcIilyZXR1cm4gZTtsZXQgbz1NTyhzKTtpZighbylyZXR1cm4gZTtvLmlzUmVtb3RlPSEwO2xldCBhPW4uZ2V0KHQsY2MpO2lmKGEpe2xldCB1PUFycmF5LmlzQXJyYXkoYSk/YS5qb2luKFwiLFwiKTphO28udHJhY2VTdGF0ZT0oMCxkLmNyZWF0ZVRyYWNlU3RhdGUpKHR5cGVvZiB1PT1cInN0cmluZ1wiP3U6dm9pZCAwKX1yZXR1cm4gZC50cmFjZS5zZXRTcGFuQ29udGV4dChlLG8pfX07ZnVuY3Rpb24gTU8ocil7bGV0W2UsdCxuLGksc109ci5zcGxpdChcIi1cIik7cmV0dXJuIWV8fCF0fHwhbnx8IWl8fGUubGVuZ3RoIT09Mnx8dC5sZW5ndGghPT0zMnx8bi5sZW5ndGghPT0xNnx8aS5sZW5ndGghPT0yfHxlPT09XCIwMFwiJiZzP251bGw6e3RyYWNlSWQ6dCxzcGFuSWQ6bix0cmFjZUZsYWdzOnBhcnNlSW50KGksMTYpfX1oKCk7dmFyIHhzPWNsYXNze2ZpZWxkcygpe3JldHVybltdfWluamVjdCgpe31leHRyYWN0KGUpe2xldCB0PXNlKCk7aWYoIXQ/LnRlbGVtZXRyeSlyZXR1cm4gZC5kaWFnLndhcm4oXCJAdmVyY2VsL290ZWw6IFZlcmNlbCB0ZWxlbWV0cnkgZXh0ZW5zaW9uIG5vdCBmb3VuZC5cIiksZTtsZXR7cm9vdFNwYW5Db250ZXh0Om59PXQudGVsZW1ldHJ5O3JldHVybiBuPyhkLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IEV4dHJhY3RlZCByb290IFNwYW5Db250ZXh0IGZyb20gVmVyY2VsIHJlcXVlc3QgY29udGV4dC5cIixuKSxkLnRyYWNlLnNldFNwYW5Db250ZXh0KGUsey4uLm4saXNSZW1vdGU6ITAsdHJhY2VGbGFnczpuLnRyYWNlRmxhZ3N8fGQuVHJhY2VGbGFncy5TQU1QTEVEfSkpOmV9fTtoKCk7dmFyIEJzPVkoQSgpLDEpLGZmPVkoaGYoKSwxKTt2YXIgcXM9Y2xhc3N7ZXhwb3J0KGUsdCl7bGV0IG49c2UoKTtpZighbj8udGVsZW1ldHJ5KXtkLmRpYWcud2FybihcIkB2ZXJjZWwvb3RlbDogbm8gdGVsZW1ldHJ5IGNvbnRleHQgZm91bmRcIiksdCh7Y29kZTpCcy5FeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MsZXJyb3I6dm9pZCAwfSk7cmV0dXJufXRyeXtsZXQgaT0oMCxmZi5jcmVhdGVFeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0KShlLHt1c2VIZXg6ITAsdXNlTG9uZ0JpdHM6ITF9KTtuLnRlbGVtZXRyeS5yZXBvcnRTcGFucyhpKSx0KHtjb2RlOkJzLkV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUyxlcnJvcjp2b2lkIDB9KX1jYXRjaChpKXt0KHtjb2RlOkJzLkV4cG9ydFJlc3VsdENvZGUuRkFJTEVELGVycm9yOmkgaW5zdGFuY2VvZiBFcnJvcj9pOm5ldyBFcnJvcihTdHJpbmcoaSkpfSl9fXNodXRkb3duKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpfWZvcmNlRmx1c2goKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9fTtoKCk7ZnVuY3Rpb24gZGMoKXtyZXR1cm4hIXNlKCk/LnRlbGVtZXRyeT8udHJhY2VEcmFpbnM/Lmxlbmd0aH12YXIgRWY9ITEsa3I9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5wcm9jZXNzb3I9ZX1mb3JjZUZsdXNoKCl7cmV0dXJuIHRoaXMucHJvY2Vzc29yLmZvcmNlRmx1c2goKX1zaHV0ZG93bigpe3JldHVybiB0aGlzLnByb2Nlc3Nvci5zaHV0ZG93bigpfW9uU3RhcnQoZSx0KXtpZihkYygpKXtFZnx8KEVmPSEwLGQuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbDogc2tpcHBpbmcgYXV0b21hdGljIGV4cG9ydGVyIGR1ZSB0byBjb25maWd1cmVkIHRyYWNlIGRyYWluc1wiKSk7cmV0dXJufXRoaXMucHJvY2Vzc29yLm9uU3RhcnQoZSx0KX1vbkVuZChlKXtkYygpfHx0aGlzLnByb2Nlc3Nvci5vbkVuZChlKX19O3ZhciBLTz17QUxMOmQuRGlhZ0xvZ0xldmVsLkFMTCxWRVJCT1NFOmQuRGlhZ0xvZ0xldmVsLlZFUkJPU0UsREVCVUc6ZC5EaWFnTG9nTGV2ZWwuREVCVUcsSU5GTzpkLkRpYWdMb2dMZXZlbC5JTkZPLFdBUk46ZC5EaWFnTG9nTGV2ZWwuV0FSTixFUlJPUjpkLkRpYWdMb2dMZXZlbC5FUlJPUixOT05FOmQuRGlhZ0xvZ0xldmVsLk5PTkV9LFZzPWNsYXNze2NvbnN0cnVjdG9yKGU9e30pe3RoaXMuY29uZmlndXJhdGlvbj1lfXN0YXJ0KCl7bGV0IGU9ek8oKSx0PXRoaXMuY29uZmlndXJhdGlvbixuPXByb2Nlc3MuZW52Lk5FWFRfUlVOVElNRXx8XCJub2RlanNcIixpPSEhZS5PVEVMX1NES19ESVNBQkxFRDtpZihwcm9jZXNzLmVudi5PVEVMX0xPR19MRVZFTCYmZC5kaWFnLnNldExvZ2dlcihuZXcgZC5EaWFnQ29uc29sZUxvZ2dlcix7bG9nTGV2ZWw6S09bcHJvY2Vzcy5lbnYuT1RFTF9MT0dfTEVWRUwudG9VcHBlckNhc2UoKV19KSxpKXJldHVybjtsZXQgcz10LmlkR2VuZXJhdG9yPz9uZXcgQy5SYW5kb21JZEdlbmVyYXRvcixvPXQuY29udGV4dE1hbmFnZXI/P25ldyBPZi5Bc3luY0xvY2FsU3RvcmFnZUNvbnRleHRNYW5hZ2VyO28uZW5hYmxlKCksdGhpcy5jb250ZXh0TWFuYWdlcj1vO2xldCBhPWUuT1RFTF9TRVJWSUNFX05BTUV8fHQuc2VydmljZU5hbWV8fFwiYXBwXCIsdT1uZXcgbHIuUmVzb3VyY2UodnAoe2F0dHJpYnV0ZXM6dC5hdHRyaWJ1dGVzLHJ1bnRpbWU6bixzZXJ2aWNlTmFtZTphfSkpLGM9dC5yZXNvdXJjZURldGVjdG9ycz8/W2xyLmVudkRldGVjdG9yU3luY107aWYodC5hdXRvRGV0ZWN0UmVzb3VyY2VzPz8hMCl7bGV0IFM9e2RldGVjdG9yczpjfTt1PXUubWVyZ2UoKDAsbHIuZGV0ZWN0UmVzb3VyY2VzU3luYykoUykpfWxldCBwPVFPKHQucHJvcGFnYXRvcnMsdCxlKSxmPVpPKHQudHJhY2VTYW1wbGVyLGUpLE09Sk8odC5zcGFuUHJvY2Vzc29ycyx0LGUpO00ubGVuZ3RoPT09MCYmZC5kaWFnLndhcm4oXCJAdmVyY2VsL290ZWw6IE5vIHNwYW4gcHJvY2Vzc29ycyBjb25maWd1cmVkLiBObyBzcGFucyB3aWxsIGJlIGV4cG9ydGVkLlwiKTtsZXQgUj10LnNwYW5MaW1pdHMsdz1uZXcgQy5CYXNpY1RyYWNlclByb3ZpZGVyKHtyZXNvdXJjZTp1LGlkR2VuZXJhdG9yOnMsc2FtcGxlcjpmLHNwYW5MaW1pdHM6Un0pO2lmKHcuYWRkU3BhblByb2Nlc3NvcihuZXcgUnMoTSx0LmF0dHJpYnV0ZXNGcm9tSGVhZGVycykpLHcucmVnaXN0ZXIoe2NvbnRleHRNYW5hZ2VyOm8scHJvcGFnYXRvcjpuZXcgSGUuQ29tcG9zaXRlUHJvcGFnYXRvcih7cHJvcGFnYXRvcnM6cH0pfSksdGhpcy50cmFjZXJQcm92aWRlcj13LHQubG9nUmVjb3JkUHJvY2Vzc29yKXtsZXQgUz1uZXcgU2YuTG9nZ2VyUHJvdmlkZXIoe3Jlc291cmNlOnV9KTt0aGlzLmxvZ2dlclByb3ZpZGVyPVMsUy5hZGRMb2dSZWNvcmRQcm9jZXNzb3IodC5sb2dSZWNvcmRQcm9jZXNzb3IpLHN0LmxvZ3Muc2V0R2xvYmFsTG9nZ2VyUHJvdmlkZXIoUyl9aWYodC5tZXRyaWNSZWFkZXJ8fHQudmlld3Mpe2xldCBTPW5ldyBBZi5NZXRlclByb3ZpZGVyKHtyZXNvdXJjZTp1LHZpZXdzOnQudmlld3M/P1tdfSk7dC5tZXRyaWNSZWFkZXImJlMuYWRkTWV0cmljUmVhZGVyKHQubWV0cmljUmVhZGVyKSxkLm1ldHJpY3Muc2V0R2xvYmFsTWV0ZXJQcm92aWRlcihTKSx0aGlzLm1ldGVyUHJvdmlkZXI9U31sZXQgVT1ZTyh0Lmluc3RydW1lbnRhdGlvbnMsdC5pbnN0cnVtZW50YXRpb25Db25maWcpO3RoaXMuZGlzYWJsZUluc3RydW1lbnRhdGlvbnM9KDAsVGYucmVnaXN0ZXJJbnN0cnVtZW50YXRpb25zKSh7aW5zdHJ1bWVudGF0aW9uczpVfSksZC5kaWFnLmluZm8oXCJAdmVyY2VsL290ZWw6IHN0YXJ0ZWRcIixhLG4pfWFzeW5jIHNodXRkb3duKCl7bGV0IGU9W107dGhpcy50cmFjZXJQcm92aWRlciYmZS5wdXNoKHRoaXMudHJhY2VyUHJvdmlkZXIuc2h1dGRvd24oKSksdGhpcy5sb2dnZXJQcm92aWRlciYmZS5wdXNoKHRoaXMubG9nZ2VyUHJvdmlkZXIuc2h1dGRvd24oKSksdGhpcy5tZXRlclByb3ZpZGVyJiZlLnB1c2godGhpcy5tZXRlclByb3ZpZGVyLnNodXRkb3duKCkpLGQuZGlhZy5pbmZvKFwiQHZlcmNlbC9vdGVsOiBzaHV0dGluZyBkb3duXCIsZS5sZW5ndGgscHJvY2Vzcy5lbnYuTkVYVF9SVU5USU1FKSxhd2FpdCBQcm9taXNlLmFsbChlKSx0aGlzLmNvbnRleHRNYW5hZ2VyJiZ0aGlzLmNvbnRleHRNYW5hZ2VyLmRpc2FibGUoKTtsZXR7ZGlzYWJsZUluc3RydW1lbnRhdGlvbnM6dH09dGhpczt0JiZ0KCl9fTtmdW5jdGlvbiB6Tygpe2xldCByPSgwLEdzLnBhcnNlRW52aXJvbm1lbnQpKHByb2Nlc3MuZW52KTtyZXR1cm57Li4uR3MuREVGQVVMVF9FTlZJUk9OTUVOVCwuLi5yfX1mdW5jdGlvbiBZTyhyLGUpe3JldHVybihyPz9bXCJhdXRvXCJdKS5tYXAodD0+dD09PVwiYXV0b1wiPyhkLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSBpbnN0cnVtZW50YXRpb25zOiBmZXRjaFwiLGU/LmZldGNoKSxbbmV3IHNyKGU/LmZldGNoKV0pOnQ9PT1cImZldGNoXCI/KGQuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbDogQ29uZmlndXJlIGluc3RydW1lbnRhdGlvbnM6IGZldGNoXCIsZT8uZmV0Y2gpLG5ldyBzcihlPy5mZXRjaCkpOnQpLmZsYXQoKX1mdW5jdGlvbiBRTyhyLGUsdCl7bGV0IG49cHJvY2Vzcy5lbnYuT1RFTF9QUk9QQUdBVE9SUyYmdC5PVEVMX1BST1BBR0FUT1JTJiZ0Lk9URUxfUFJPUEFHQVRPUlMubGVuZ3RoPjA/dC5PVEVMX1BST1BBR0FUT1JTOnZvaWQgMDtyZXR1cm4ocj8/bj8/W1wiYXV0b1wiXSkubWFwKGk9PntpZihpPT09XCJub25lXCIpcmV0dXJuW107aWYoaT09PVwiYXV0b1wiKXtsZXQgcz1bXTtyZXR1cm4gcy5wdXNoKHtuYW1lOlwidHJhY2Vjb250ZXh0XCIscHJvcGFnYXRvcjpuZXcganJ9KSxzLnB1c2goe25hbWU6XCJiYWdnYWdlXCIscHJvcGFnYXRvcjpuZXcgSGUuVzNDQmFnZ2FnZVByb3BhZ2F0b3J9KSxzLnB1c2goe25hbWU6XCJ2ZXJjZWwtcnVudGltZVwiLHByb3BhZ2F0b3I6bmV3IHhzfSksZC5kaWFnLmRlYnVnKGBAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSBwcm9wYWdhdG9yczogJHtzLm1hcChvPT5vLm5hbWUpLmpvaW4oXCIsIFwiKX1gKSxzLm1hcChvPT5vLnByb3BhZ2F0b3IpfWlmKGk9PT1cInRyYWNlY29udGV4dFwiKXJldHVybiBkLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSBwcm9wYWdhdG9yOiB0cmFjZWNvbnRleHRcIiksbmV3IGpyO2lmKGk9PT1cImJhZ2dhZ2VcIilyZXR1cm4gZC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsOiBDb25maWd1cmUgcHJvcGFnYXRvcjogYmFnZ2FnZVwiKSxuZXcgSGUuVzNDQmFnZ2FnZVByb3BhZ2F0b3I7aWYodHlwZW9mIGk9PVwic3RyaW5nXCIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHByb3BhZ2F0b3I6IFwiJHtpfVwiYCk7cmV0dXJuIGl9KS5mbGF0KCl9dmFyIG1mPVwiYWx3YXlzX29uXCIsY3I9MTtmdW5jdGlvbiBaTyhyLGUpe2lmKHImJnR5cGVvZiByIT1cInN0cmluZ1wiKXJldHVybiByO2xldCB0PXImJnIhPT1cImF1dG9cIj9yOmUuT1RFTF9UUkFDRVNfU0FNUExFUnx8bWY7c3dpdGNoKGQuZGlhZy5kZWJ1ZyhcIkB2ZXJjZWwvb3RlbDogQ29uZmlndXJlIHNhbXBsZXI6IFwiLHQpLHQpe2Nhc2VcImFsd2F5c19vblwiOnJldHVybiBuZXcgQy5BbHdheXNPblNhbXBsZXI7Y2FzZVwiYWx3YXlzX29mZlwiOnJldHVybiBuZXcgQy5BbHdheXNPZmZTYW1wbGVyO2Nhc2VcInBhcmVudGJhc2VkX2Fsd2F5c19vblwiOnJldHVybiBuZXcgQy5QYXJlbnRCYXNlZFNhbXBsZXIoe3Jvb3Q6bmV3IEMuQWx3YXlzT25TYW1wbGVyfSk7Y2FzZVwicGFyZW50YmFzZWRfYWx3YXlzX29mZlwiOnJldHVybiBuZXcgQy5QYXJlbnRCYXNlZFNhbXBsZXIoe3Jvb3Q6bmV3IEMuQWx3YXlzT2ZmU2FtcGxlcn0pO2Nhc2VcInRyYWNlaWRyYXRpb1wiOnJldHVybiBuZXcgQy5UcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIoZ2YoZSkpO2Nhc2VcInBhcmVudGJhc2VkX3RyYWNlaWRyYXRpb1wiOnJldHVybiBuZXcgQy5QYXJlbnRCYXNlZFNhbXBsZXIoe3Jvb3Q6bmV3IEMuVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKGdmKGUpKX0pO2RlZmF1bHQ6cmV0dXJuIGQuZGlhZy5lcnJvcihgQHZlcmNlbC9vdGVsOiBPVEVMX1RSQUNFU19TQU1QTEVSIHZhbHVlIFwiJHtTdHJpbmcoZS5PVEVMX1RSQUNFU19TQU1QTEVSKX0gaW52YWxpZCwgZGVmYXVsdGluZyB0byAke21mfVwiLmApLG5ldyBDLkFsd2F5c09uU2FtcGxlcn19ZnVuY3Rpb24gZ2Yocil7aWYoci5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRz09PXZvaWQgMHx8ci5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRz09PVwiXCIpcmV0dXJuIGQuZGlhZy5lcnJvcihgQHZlcmNlbC9vdGVsOiBPVEVMX1RSQUNFU19TQU1QTEVSX0FSRyBpcyBibGFuaywgZGVmYXVsdGluZyB0byAke2NyfS5gKSxjcjtkLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSBzYW1wbGVyIHByb2JhYmlsaXR5OiBcIixyLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHKTtsZXQgZT1OdW1iZXIoci5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyk7cmV0dXJuIGlzTmFOKGUpPyhkLmRpYWcuZXJyb3IoYEB2ZXJjZWwvb3RlbDogT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9JHtyLk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHfSB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBpbnZhbGlkLCBkZWZhdWx0aW5nIHRvICR7Y3J9LmApLGNyKTplPDB8fGU+MT8oZC5kaWFnLmVycm9yKGBAdmVyY2VsL290ZWw6IE9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPSR7ci5PVEVMX1RSQUNFU19TQU1QTEVSX0FSR30gd2FzIGdpdmVuLCBidXQgaXQgaXMgb3V0IG9mIHJhbmdlIChbMC4uMV0pLCBkZWZhdWx0aW5nIHRvICR7Y3J9LmApLGNyKTplfWZ1bmN0aW9uIEpPKHIsZSx0KXtyZXR1cm5bLi4uKHI/P1tcImF1dG9cIl0pLmZsYXRNYXAobj0+e2lmKG49PT1cImF1dG9cIil7bGV0IGk9W25ldyBDLkJhdGNoU3BhblByb2Nlc3NvcihuZXcgcXMpXTtpZihwcm9jZXNzLmVudi5WRVJDRUxfT1RFTF9FTkRQT0lOVFMpe2xldCBzPXByb2Nlc3MuZW52LlZFUkNFTF9PVEVMX0VORFBPSU5UU19QT1JUfHxcIjQzMThcIixvPXByb2Nlc3MuZW52LlZFUkNFTF9PVEVMX0VORFBPSU5UU19QUk9UT0NPTHx8XCJodHRwL3Byb3RvYnVmXCI7ZC5kaWFnLmRlYnVnKFwiQHZlcmNlbC9vdGVsOiBDb25maWd1cmUgdmVyY2VsIG90ZWwgY29sbGVjdG9yIG9uIHBvcnQ6IFwiLHMsbyk7bGV0IGE9e3VybDpgaHR0cDovL2xvY2FsaG9zdDoke3N9L3YxL3RyYWNlc2AsaGVhZGVyczp7fX0sdT1vPT09XCJodHRwL3Byb3RvYnVmXCI/bmV3IGR0KGEpOm5ldyBycihhKTtpLnB1c2gobmV3IGtyKG5ldyBDLkJhdGNoU3BhblByb2Nlc3Nvcih1KSkpfWVsc2UoIWUudHJhY2VFeHBvcnRlcnx8ZS50cmFjZUV4cG9ydGVyPT09XCJhdXRvXCJ8fHQuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVHx8dC5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQpJiZpLnB1c2gobmV3IGtyKG5ldyBDLkJhdGNoU3BhblByb2Nlc3NvcihlUih0KSkpKTtyZXR1cm4gaX1yZXR1cm4gbn0pLmZpbHRlcihuUiksLi4uZS50cmFjZUV4cG9ydGVyJiZlLnRyYWNlRXhwb3J0ZXIhPT1cImF1dG9cIj9bbmV3IEMuQmF0Y2hTcGFuUHJvY2Vzc29yKGUudHJhY2VFeHBvcnRlcildOltdXX1mdW5jdGlvbiBlUihyKXtsZXQgZT1wcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1BST1RPQ09MPz9wcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfUFJPVE9DT0w/P1wiaHR0cC9wcm90b2J1ZlwiLHQ9clIociksbj17Li4uSGUuYmFnZ2FnZVV0aWxzLnBhcnNlS2V5UGFpcnNJbnRvUmVjb3JkKHIuT1RFTF9FWFBPUlRFUl9PVExQX0hFQURFUlMpLC4uLkhlLmJhZ2dhZ2VVdGlscy5wYXJzZUtleVBhaXJzSW50b1JlY29yZChyLk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfSEVBREVSUyl9O3N3aXRjaChkLmRpYWcuZGVidWcoXCJAdmVyY2VsL290ZWw6IENvbmZpZ3VyZSB0cmFjZSBleHBvcnRlcjogXCIsZSx0LGBoZWFkZXJzOiAke09iamVjdC5rZXlzKG4pLmpvaW4oXCIsXCIpfHxcIjxub25lPlwifWApLGUpe2Nhc2VcImh0dHAvanNvblwiOnJldHVybiBuZXcgcnIoe3VybDp0LGhlYWRlcnM6bn0pO2Nhc2VcImh0dHAvcHJvdG9idWZcIjpyZXR1cm4gbmV3IGR0KHt1cmw6dCxoZWFkZXJzOm59KTtkZWZhdWx0OnJldHVybiBkLmRpYWcud2FybihgQHZlcmNlbC9vdGVsOiBVbnN1cHBvcnRlZCBPVExQIHRyYWNlcyBwcm90b2NvbDogJHtlfS4gVXNpbmcgaHR0cC9wcm90b2J1Zi5gKSxuZXcgZHR9fXZhciBSZj1cInYxL3RyYWNlc1wiLHRSPWBodHRwOi8vbG9jYWxob3N0OjQzMTgvJHtSZn1gO2Z1bmN0aW9uIHJSKHIpe2xldCBlPXIuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVDtpZihlJiZ0eXBlb2YgZT09XCJzdHJpbmdcIilyZXR1cm4gZTtsZXQgdD1yLk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVDtyZXR1cm4gdCYmdHlwZW9mIHQ9PVwic3RyaW5nXCI/YCR7dH0vJHtSZn1gOnRSfWZ1bmN0aW9uIG5SKHIpe3JldHVybiByIT1udWxsfWZ1bmN0aW9uIEp2KHIpe2xldCBlO3I/dHlwZW9mIHI9PVwic3RyaW5nXCI/ZT17c2VydmljZU5hbWU6cn06ZT1yOmU9e30sbmV3IFZzKGUpLnN0YXJ0KCl9ZXhwb3J0e3NyIGFzIEZldGNoSW5zdHJ1bWVudGF0aW9uLHJyIGFzIE9UTFBIdHRwSnNvblRyYWNlRXhwb3J0ZXIsZHQgYXMgT1RMUEh0dHBQcm90b1RyYWNlRXhwb3J0ZXIsSnYgYXMgcmVnaXN0ZXJPVGVsfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(instrument)/../../node_modules/.pnpm/@vercel+otel@1.14.1_@opentelemetry+api-logs@0.215.0_@opentelemetry+api@1.9.1_@opentelemetry+i_cg5k2nxojpu32vf3gjf7mfe5za/node_modules/@vercel/otel/dist/node/index.js\n"); + +/***/ }) + +}; +; \ No newline at end of file diff --git a/superlog/apps/sample/.next/server/webpack-runtime.js b/superlog/apps/sample/.next/server/webpack-runtime.js new file mode 100644 index 0000000000000000000000000000000000000000..d53d8a38e58bfe42b55fd796364c7994dd0c90a3 --- /dev/null +++ b/superlog/apps/sample/.next/server/webpack-runtime.js @@ -0,0 +1,150 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({}); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks and sibling chunks for the entrypoint +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/startup entrypoint */ +/******/ (() => { +/******/ __webpack_require__.X = (result, chunkIds, fn) => { +/******/ // arguments: chunkIds, moduleId are deprecated +/******/ var moduleId = chunkIds; +/******/ if(!fn) chunkIds = result, fn = () => (__webpack_require__(__webpack_require__.s = moduleId)); +/******/ chunkIds.map(__webpack_require__.e, __webpack_require__) +/******/ var r = fn(); +/******/ return r === undefined ? result : r; +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/require chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded chunks +/******/ // "1" means "loaded", otherwise not loaded yet +/******/ var installedChunks = { +/******/ "webpack-runtime": 1 +/******/ }; +/******/ +/******/ // no on chunks loaded +/******/ +/******/ var installChunk = (chunk) => { +/******/ var moreModules = chunk.modules, chunkIds = chunk.ids, runtime = chunk.runtime; +/******/ for(var moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) runtime(__webpack_require__); +/******/ for(var i = 0; i < chunkIds.length; i++) +/******/ installedChunks[chunkIds[i]] = 1; +/******/ +/******/ }; +/******/ +/******/ // require() chunk loading for javascript +/******/ __webpack_require__.f.require = (chunkId, promises) => { +/******/ // "1" is the signal for "already loaded" +/******/ if(!installedChunks[chunkId]) { +/******/ if("webpack-runtime" != chunkId) { +/******/ installChunk(require("./" + __webpack_require__.u(chunkId))); +/******/ } else installedChunks[chunkId] = 1; +/******/ } +/******/ }; +/******/ +/******/ module.exports = __webpack_require__; +/******/ __webpack_require__.C = installChunk; +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ +/******/ })() + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJpZ25vcmVMaXN0IjpbMF0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZXMiOlsid2VicGFjay1pbnRlcm5hbDovL25leHRqcy93ZWJwYWNrLXJ1bnRpbWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhpcyBzb3VyY2Ugd2FzIGdlbmVyYXRlZCBieSBOZXh0LmpzIGJhc2VkIG9mZiBvZiB0aGUgZ2VuZXJhdGVkIFdlYnBhY2sgcnVudGltZS5cbi8vIFRoZSBtYXBwaW5ncyBhcmUgaW5jb3JyZWN0LlxuLy8gVG8gZ2V0IHRoZSBjb3JyZWN0IGxpbmUvY29sdW1uIG1hcHBpbmdzLCB0dXJuIG9mZiBzb3VyY2VtYXBzIGluIHlvdXIgZGVidWdnZXIuXG5cbi8qKioqKiovICgoKSA9PiB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0XCJ1c2Ugc3RyaWN0XCI7XG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHt9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0dmFyIHRocmV3ID0gdHJ1ZTtcbi8qKioqKiovIFx0XHR0cnkge1xuLyoqKioqKi8gXHRcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFx0XHR0aHJldyA9IGZhbHNlO1xuLyoqKioqKi8gXHRcdH0gZmluYWxseSB7XG4vKioqKioqLyBcdFx0XHRpZih0aHJldykgZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi9cbi8qKioqKiovIFx0KCgpID0+IHtcbi8qKioqKiovIFx0XHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcbi8qKioqKiovIFx0XHRcdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcbi8qKioqKiovIFx0XHRcdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG4vKioqKioqLyBcdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcbi8qKioqKiovIFx0XHRcdFx0fVxuLyoqKioqKi8gXHRcdFx0fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0pKCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvZW5zdXJlIGNodW5rICovXG4vKioqKioqLyBcdCgoKSA9PiB7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mID0ge307XG4vKioqKioqLyBcdFx0Ly8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLyoqKioqKi8gXHRcdC8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZSA9IChjaHVua0lkKSA9PiB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcbi8qKioqKiovIFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuLyoqKioqKi8gXHRcdFx0XHRyZXR1cm4gcHJvbWlzZXM7XG4vKioqKioqLyBcdFx0XHR9LCBbXSkpO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0pKCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUgKi9cbi8qKioqKiovIFx0KCgpID0+IHtcbi8qKioqKiovIFx0XHQvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3MgYW5kIHNpYmxpbmcgY2h1bmtzIGZvciB0aGUgZW50cnlwb2ludFxuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG4vKioqKioqLyBcdFx0XHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcbi8qKioqKiovIFx0XHRcdHJldHVybiBcIlwiICsgY2h1bmtJZCArIFwiLmpzXCI7XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0fSkoKTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQgKi9cbi8qKioqKiovIFx0KCgpID0+IHtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpXG4vKioqKioqLyBcdH0pKCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0ICovXG4vKioqKioqLyBcdCgoKSA9PiB7XG4vKioqKioqLyBcdFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG4vKioqKioqLyBcdFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0XHR9XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdH0pKCk7XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvc3RhcnR1cCBlbnRyeXBvaW50ICovXG4vKioqKioqLyBcdCgoKSA9PiB7XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5YID0gKHJlc3VsdCwgY2h1bmtJZHMsIGZuKSA9PiB7XG4vKioqKioqLyBcdFx0XHQvLyBhcmd1bWVudHM6IGNodW5rSWRzLCBtb2R1bGVJZCBhcmUgZGVwcmVjYXRlZFxuLyoqKioqKi8gXHRcdFx0dmFyIG1vZHVsZUlkID0gY2h1bmtJZHM7XG4vKioqKioqLyBcdFx0XHRpZighZm4pIGNodW5rSWRzID0gcmVzdWx0LCBmbiA9ICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IG1vZHVsZUlkKSk7XG4vKioqKioqLyBcdFx0XHRjaHVua0lkcy5tYXAoX193ZWJwYWNrX3JlcXVpcmVfXy5lLCBfX3dlYnBhY2tfcmVxdWlyZV9fKVxuLyoqKioqKi8gXHRcdFx0dmFyIHIgPSBmbigpO1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIHIgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHI7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9KSgpO1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL3JlcXVpcmUgY2h1bmsgbG9hZGluZyAqL1xuLyoqKioqKi8gXHQoKCkgPT4ge1xuLyoqKioqKi8gXHRcdC8vIG5vIGJhc2VVUklcbi8qKioqKiovIFx0XHRcbi8qKioqKiovIFx0XHQvLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGNodW5rc1xuLyoqKioqKi8gXHRcdC8vIFwiMVwiIG1lYW5zIFwibG9hZGVkXCIsIG90aGVyd2lzZSBub3QgbG9hZGVkIHlldFxuLyoqKioqKi8gXHRcdHZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG4vKioqKioqLyBcdFx0XHRcIndlYnBhY2stcnVudGltZVwiOiAxXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XHRcbi8qKioqKiovIFx0XHQvLyBubyBvbiBjaHVua3MgbG9hZGVkXG4vKioqKioqLyBcdFx0XG4vKioqKioqLyBcdFx0dmFyIGluc3RhbGxDaHVuayA9IChjaHVuaykgPT4ge1xuLyoqKioqKi8gXHRcdFx0dmFyIG1vcmVNb2R1bGVzID0gY2h1bmsubW9kdWxlcywgY2h1bmtJZHMgPSBjaHVuay5pZHMsIHJ1bnRpbWUgPSBjaHVuay5ydW50aW1lO1xuLyoqKioqKi8gXHRcdFx0Zm9yKHZhciBtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuLyoqKioqKi8gXHRcdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuLyoqKioqKi8gXHRcdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHRcdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspXG4vKioqKioqLyBcdFx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkc1tpXV0gPSAxO1xuLyoqKioqKi8gXHRcdFxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFx0XG4vKioqKioqLyBcdFx0Ly8gcmVxdWlyZSgpIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmYucmVxdWlyZSA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuLyoqKioqKi8gXHRcdFx0Ly8gXCIxXCIgaXMgdGhlIHNpZ25hbCBmb3IgXCJhbHJlYWR5IGxvYWRlZFwiXG4vKioqKioqLyBcdFx0XHRpZighaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG4vKioqKioqLyBcdFx0XHRcdGlmKFwid2VicGFjay1ydW50aW1lXCIgIT0gY2h1bmtJZCkge1xuLyoqKioqKi8gXHRcdFx0XHRcdGluc3RhbGxDaHVuayhyZXF1aXJlKFwiLi9cIiArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSkpO1xuLyoqKioqKi8gXHRcdFx0XHR9IGVsc2UgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMTtcbi8qKioqKiovIFx0XHRcdH1cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHRcdFxuLyoqKioqKi8gXHRcdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXztcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLkMgPSBpbnN0YWxsQ2h1bms7XG4vKioqKioqLyBcdFx0XG4vKioqKioqLyBcdFx0Ly8gbm8gSE1SXG4vKioqKioqLyBcdFx0XG4vKioqKioqLyBcdFx0Ly8gbm8gSE1SIG1hbmlmZXN0XG4vKioqKioqLyBcdH0pKCk7XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFxuLyoqKioqKi8gfSkoKVxuIl19 +; \ No newline at end of file diff --git a/superlog/apps/sample/.next/static/chunks/polyfills.js b/superlog/apps/sample/.next/static/chunks/polyfills.js new file mode 100644 index 0000000000000000000000000000000000000000..ab422b94a4fbe76275d31c0bf7ef334768b39cae --- /dev/null +++ b/superlog/apps/sample/.next/static/chunks/polyfills.js @@ -0,0 +1 @@ +!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var r,n,o=function(t){return t&&t.Math===Math&&t},i=o("object"==typeof globalThis&&globalThis)||o("object"==typeof window&&window)||o("object"==typeof self&&self)||o("object"==typeof t&&t)||o("object"==typeof t&&t)||function(){return this}()||Function("return this")(),a=function(t){try{return!!t()}catch(t){return!0}},u=!a(function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}),s=!a(function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}),c=Function.prototype.call,f=s?c.bind(c):function(){return c.apply(c,arguments)},l={}.propertyIsEnumerable,h=Object.getOwnPropertyDescriptor,p=h&&!l.call({1:2},1)?function(t){var e=h(this,t);return!!e&&e.enumerable}:l,v={f:p},d=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},g=Function.prototype,y=g.call,m=s&&g.bind.bind(y,y),b=s?m:function(t){return function(){return y.apply(t,arguments)}},w=b({}.toString),S=b("".slice),E=function(t){return S(w(t),8,-1)},O=Object,x=b("".split),R=a(function(){return!O("z").propertyIsEnumerable(0)})?function(t){return"String"===E(t)?x(t,""):O(t)}:O,P=function(t){return null==t},A=TypeError,j=function(t){if(P(t))throw new A("Can't call method on "+t);return t},k=function(t){return R(j(t))},I="object"==typeof document&&document.all,T=void 0===I&&void 0!==I?function(t){return"function"==typeof t||t===I}:function(t){return"function"==typeof t},M=function(t){return"object"==typeof t?null!==t:T(t)},L=function(t,e){return arguments.length<2?T(r=i[t])?r:void 0:i[t]&&i[t][e];var r},U=b({}.isPrototypeOf),N=i.navigator,C=N&&N.userAgent,_=C?String(C):"",F=i.process,B=i.Deno,D=F&&F.versions||B&&B.version,z=D&&D.v8;z&&(n=(r=z.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!n&&_&&(!(r=_.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=_.match(/Chrome\/(\d+)/))&&(n=+r[1]);var W=n,q=i.String,H=!!Object.getOwnPropertySymbols&&!a(function(){var t=Symbol("symbol detection");return!q(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&W&&W<41}),$=H&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,K=Object,G=$?function(t){return"symbol"==typeof t}:function(t){var e=L("Symbol");return T(e)&&U(e.prototype,K(t))},V=String,Y=function(t){try{return V(t)}catch(t){return"Object"}},X=TypeError,J=function(t){if(T(t))return t;throw new X(Y(t)+" is not a function")},Q=function(t,e){var r=t[e];return P(r)?void 0:J(r)},Z=TypeError,tt=Object.defineProperty,et=function(t,e){try{tt(i,t,{value:e,configurable:!0,writable:!0})}catch(r){i[t]=e}return e},rt=e(function(t){var e="__core-js_shared__",r=t.exports=i[e]||et(e,{});(r.versions||(r.versions=[])).push({version:"3.38.1",mode:"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.38.1/LICENSE",source:"https://github.com/zloirock/core-js"})}),nt=function(t,e){return rt[t]||(rt[t]=e||{})},ot=Object,it=function(t){return ot(j(t))},at=b({}.hasOwnProperty),ut=Object.hasOwn||function(t,e){return at(it(t),e)},st=0,ct=Math.random(),ft=b(1..toString),lt=function(t){return"Symbol("+(void 0===t?"":t)+")_"+ft(++st+ct,36)},ht=i.Symbol,pt=nt("wks"),vt=$?ht.for||ht:ht&&ht.withoutSetter||lt,dt=function(t){return ut(pt,t)||(pt[t]=H&&ut(ht,t)?ht[t]:vt("Symbol."+t)),pt[t]},gt=TypeError,yt=dt("toPrimitive"),mt=function(t,e){if(!M(t)||G(t))return t;var r,n=Q(t,yt);if(n){if(void 0===e&&(e="default"),r=f(n,t,e),!M(r)||G(r))return r;throw new gt("Can't convert object to primitive value")}return void 0===e&&(e="number"),function(t,e){var r,n;if("string"===e&&T(r=t.toString)&&!M(n=f(r,t)))return n;if(T(r=t.valueOf)&&!M(n=f(r,t)))return n;if("string"!==e&&T(r=t.toString)&&!M(n=f(r,t)))return n;throw new Z("Can't convert object to primitive value")}(t,e)},bt=function(t){var e=mt(t,"string");return G(e)?e:e+""},wt=i.document,St=M(wt)&&M(wt.createElement),Et=function(t){return St?wt.createElement(t):{}},Ot=!u&&!a(function(){return 7!==Object.defineProperty(Et("div"),"a",{get:function(){return 7}}).a}),xt=Object.getOwnPropertyDescriptor,Rt={f:u?xt:function(t,e){if(t=k(t),e=bt(e),Ot)try{return xt(t,e)}catch(t){}if(ut(t,e))return d(!f(v.f,t,e),t[e])}},Pt=u&&a(function(){return 42!==Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype}),At=String,jt=TypeError,kt=function(t){if(M(t))return t;throw new jt(At(t)+" is not an object")},It=TypeError,Tt=Object.defineProperty,Mt=Object.getOwnPropertyDescriptor,Lt="enumerable",Ut="configurable",Nt="writable",Ct={f:u?Pt?function(t,e,r){if(kt(t),e=bt(e),kt(r),"function"==typeof t&&"prototype"===e&&"value"in r&&Nt in r&&!r[Nt]){var n=Mt(t,e);n&&n[Nt]&&(t[e]=r.value,r={configurable:Ut in r?r[Ut]:n[Ut],enumerable:Lt in r?r[Lt]:n[Lt],writable:!1})}return Tt(t,e,r)}:Tt:function(t,e,r){if(kt(t),e=bt(e),kt(r),Ot)try{return Tt(t,e,r)}catch(t){}if("get"in r||"set"in r)throw new It("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},_t=u?function(t,e,r){return Ct.f(t,e,d(1,r))}:function(t,e,r){return t[e]=r,t},Ft=Function.prototype,Bt=u&&Object.getOwnPropertyDescriptor,Dt=ut(Ft,"name"),zt={EXISTS:Dt,PROPER:Dt&&"something"===function(){}.name,CONFIGURABLE:Dt&&(!u||u&&Bt(Ft,"name").configurable)},Wt=b(Function.toString);T(rt.inspectSource)||(rt.inspectSource=function(t){return Wt(t)});var qt,Ht,$t,Kt=rt.inspectSource,Gt=i.WeakMap,Vt=T(Gt)&&/native code/.test(String(Gt)),Yt=nt("keys"),Xt=function(t){return Yt[t]||(Yt[t]=lt(t))},Jt={},Qt="Object already initialized",Zt=i.TypeError;if(Vt||rt.state){var te=rt.state||(rt.state=new(0,i.WeakMap));te.get=te.get,te.has=te.has,te.set=te.set,qt=function(t,e){if(te.has(t))throw new Zt(Qt);return e.facade=t,te.set(t,e),e},Ht=function(t){return te.get(t)||{}},$t=function(t){return te.has(t)}}else{var ee=Xt("state");Jt[ee]=!0,qt=function(t,e){if(ut(t,ee))throw new Zt(Qt);return e.facade=t,_t(t,ee,e),e},Ht=function(t){return ut(t,ee)?t[ee]:{}},$t=function(t){return ut(t,ee)}}var re,ne={set:qt,get:Ht,has:$t,enforce:function(t){return $t(t)?Ht(t):qt(t,{})},getterFor:function(t){return function(e){var r;if(!M(e)||(r=Ht(e)).type!==t)throw new Zt("Incompatible receiver, "+t+" required");return r}}},oe=e(function(t){var e=zt.CONFIGURABLE,r=ne.enforce,n=ne.get,o=String,i=Object.defineProperty,s=b("".slice),c=b("".replace),f=b([].join),l=u&&!a(function(){return 8!==i(function(){},"length",{value:8}).length}),h=String(String).split("String"),p=t.exports=function(t,n,a){"Symbol("===s(o(n),0,7)&&(n="["+c(o(n),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),a&&a.getter&&(n="get "+n),a&&a.setter&&(n="set "+n),(!ut(t,"name")||e&&t.name!==n)&&(u?i(t,"name",{value:n,configurable:!0}):t.name=n),l&&a&&ut(a,"arity")&&t.length!==a.arity&&i(t,"length",{value:a.arity});try{a&&ut(a,"constructor")&&a.constructor?u&&i(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var p=r(t);return ut(p,"source")||(p.source=f(h,"string"==typeof n?n:"")),t};Function.prototype.toString=p(function(){return T(this)&&n(this).source||Kt(this)},"toString")}),ie=function(t,e,r,n){n||(n={});var o=n.enumerable,i=void 0!==n.name?n.name:e;if(T(r)&&oe(r,i,n),n.global)o?t[e]=r:et(e,r);else{try{n.unsafe?t[e]&&(o=!0):delete t[e]}catch(t){}o?t[e]=r:Ct.f(t,e,{value:r,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return t},ae=Math.ceil,ue=Math.floor,se=Math.trunc||function(t){var e=+t;return(e>0?ue:ae)(e)},ce=function(t){var e=+t;return e!=e||0===e?0:se(e)},fe=Math.max,le=Math.min,he=function(t,e){var r=ce(t);return r<0?fe(r+e,0):le(r,e)},pe=Math.min,ve=function(t){var e=ce(t);return e>0?pe(e,9007199254740991):0},de=function(t){return ve(t.length)},ge=function(t){return function(e,r,n){var o=k(e),i=de(o);if(0===i)return!t&&-1;var a,u=he(n,i);if(t&&r!=r){for(;i>u;)if((a=o[u++])!=a)return!0}else for(;i>u;u++)if((t||u in o)&&o[u]===r)return t||u||0;return!t&&-1}},ye={includes:ge(!0),indexOf:ge(!1)},me=ye.indexOf,be=b([].push),we=function(t,e){var r,n=k(t),o=0,i=[];for(r in n)!ut(Jt,r)&&ut(n,r)&&be(i,r);for(;e.length>o;)ut(n,r=e[o++])&&(~me(i,r)||be(i,r));return i},Se=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Ee=Se.concat("length","prototype"),Oe={f:Object.getOwnPropertyNames||function(t){return we(t,Ee)}},xe={f:Object.getOwnPropertySymbols},Re=b([].concat),Pe=L("Reflect","ownKeys")||function(t){var e=Oe.f(kt(t)),r=xe.f;return r?Re(e,r(t)):e},Ae=function(t,e,r){for(var n=Pe(e),o=Ct.f,i=Rt.f,a=0;aa;)Ct.f(t,r=o[a++],n[r]);return t},Be={f:Fe},De=L("document","documentElement"),ze="prototype",We="script",qe=Xt("IE_PROTO"),He=function(){},$e=function(t){return"<"+We+">"+t+""},Ke=function(t){t.write($e("")),t.close();var e=t.parentWindow.Object;return t=null,e},Ge=function(){try{re=new ActiveXObject("htmlfile")}catch(t){}var t,e,r;Ge="undefined"!=typeof document?document.domain&&re?Ke(re):(e=Et("iframe"),r="java"+We+":",e.style.display="none",De.appendChild(e),e.src=String(r),(t=e.contentWindow.document).open(),t.write($e("document.F=Object")),t.close(),t.F):Ke(re);for(var n=Se.length;n--;)delete Ge[ze][Se[n]];return Ge()};Jt[qe]=!0;var Ve=Object.create||function(t,e){var r;return null!==t?(He[ze]=kt(t),r=new He,He[ze]=null,r[qe]=t):r=Ge(),void 0===e?r:Be.f(r,e)},Ye=Ct.f,Xe=dt("unscopables"),Je=Array.prototype;void 0===Je[Xe]&&Ye(Je,Xe,{configurable:!0,value:Ve(null)});var Qe=function(t){Je[Xe][t]=!0};Ce({target:"Array",proto:!0},{at:function(t){var e=it(this),r=de(e),n=ce(t),o=n>=0?n:r+n;return o<0||o>=r?void 0:e[o]}}),Qe("at");var Ze=function(t,e){return b(i[t].prototype[e])},tr=(Ze("Array","at"),TypeError),er=function(t,e){if(!delete t[e])throw new tr("Cannot delete property "+Y(e)+" of "+Y(t))},rr=Math.min,nr=[].copyWithin||function(t,e){var r=it(this),n=de(r),o=he(t,n),i=he(e,n),a=arguments.length>2?arguments[2]:void 0,u=rr((void 0===a?n:he(a,n))-i,n-o),s=1;for(i0;)i in r?r[o]=r[i]:er(r,o),o+=s,i+=s;return r};Ce({target:"Array",proto:!0},{copyWithin:nr}),Qe("copyWithin"),Ze("Array","copyWithin"),Ce({target:"Array",proto:!0},{fill:function(t){for(var e=it(this),r=de(e),n=arguments.length,o=he(n>1?arguments[1]:void 0,r),i=n>2?arguments[2]:void 0,a=void 0===i?r:he(i,r);a>o;)e[o++]=t;return e}}),Qe("fill"),Ze("Array","fill");var or=function(t){if("Function"===E(t))return b(t)},ir=or(or.bind),ar=function(t,e){return J(t),void 0===e?t:s?ir(t,e):function(){return t.apply(e,arguments)}},ur=Array.isArray||function(t){return"Array"===E(t)},sr={};sr[dt("toStringTag")]="z";var cr="[object z]"===String(sr),fr=dt("toStringTag"),lr=Object,hr="Arguments"===E(function(){return arguments}()),pr=cr?E:function(t){var e,r,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=lr(t),fr))?r:hr?E(e):"Object"===(n=E(e))&&T(e.callee)?"Arguments":n},vr=function(){},dr=L("Reflect","construct"),gr=/^\s*(?:class|function)\b/,yr=b(gr.exec),mr=!gr.test(vr),br=function(t){if(!T(t))return!1;try{return dr(vr,[],t),!0}catch(t){return!1}},wr=function(t){if(!T(t))return!1;switch(pr(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return mr||!!yr(gr,Kt(t))}catch(t){return!0}};wr.sham=!0;var Sr=!dr||a(function(){var t;return br(br.call)||!br(Object)||!br(function(){t=!0})||t})?wr:br,Er=dt("species"),Or=Array,xr=function(t,e){return new(function(t){var e;return ur(t)&&(Sr(e=t.constructor)&&(e===Or||ur(e.prototype))||M(e)&&null===(e=e[Er]))&&(e=void 0),void 0===e?Or:e}(t))(0===e?0:e)},Rr=b([].push),Pr=function(t){var e=1===t,r=2===t,n=3===t,o=4===t,i=6===t,a=7===t,u=5===t||i;return function(s,c,f,l){for(var h,p,v=it(s),d=R(v),g=de(d),y=ar(c,f),m=0,b=l||xr,w=e?b(s,g):r||a?b(s,0):void 0;g>m;m++)if((u||m in d)&&(p=y(h=d[m],m,v),t))if(e)w[m]=p;else if(p)switch(t){case 3:return!0;case 5:return h;case 6:return m;case 2:Rr(w,h)}else switch(t){case 4:return!1;case 7:Rr(w,h)}return i?-1:n||o?o:w}},Ar={forEach:Pr(0),map:Pr(1),filter:Pr(2),some:Pr(3),every:Pr(4),find:Pr(5),findIndex:Pr(6),filterReject:Pr(7)},jr=Ar.find,kr="find",Ir=!0;kr in[]&&Array(1)[kr](function(){Ir=!1}),Ce({target:"Array",proto:!0,forced:Ir},{find:function(t){return jr(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe(kr),Ze("Array","find");var Tr=Ar.findIndex,Mr="findIndex",Lr=!0;Mr in[]&&Array(1)[Mr](function(){Lr=!1}),Ce({target:"Array",proto:!0,forced:Lr},{findIndex:function(t){return Tr(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe(Mr),Ze("Array","findIndex");var Ur=TypeError,Nr=function(t){if(t>9007199254740991)throw Ur("Maximum allowed index exceeded");return t},Cr=function(t,e,r,n,o,i,a,u){for(var s,c,f=o,l=0,h=!!a&&ar(a,u);l0&&ur(s)?(c=de(s),f=Cr(t,e,s,c,f,i-1)-1):(Nr(f+1),t[f]=s),f++),l++;return f},_r=Cr;Ce({target:"Array",proto:!0},{flatMap:function(t){var e,r=it(this),n=de(r);return J(t),(e=xr(r,0)).length=_r(e,r,r,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}}),Qe("flatMap"),Ze("Array","flatMap"),Ce({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=it(this),r=de(e),n=xr(e,0);return n.length=_r(n,e,e,r,0,void 0===t?1:ce(t)),n}}),Qe("flat"),Ze("Array","flat");var Fr,Br,Dr,zr=String,Wr=function(t){if("Symbol"===pr(t))throw new TypeError("Cannot convert a Symbol value to a string");return zr(t)},qr=b("".charAt),Hr=b("".charCodeAt),$r=b("".slice),Kr=function(t){return function(e,r){var n,o,i=Wr(j(e)),a=ce(r),u=i.length;return a<0||a>=u?t?"":void 0:(n=Hr(i,a))<55296||n>56319||a+1===u||(o=Hr(i,a+1))<56320||o>57343?t?qr(i,a):n:t?$r(i,a,a+2):o-56320+(n-55296<<10)+65536}},Gr={codeAt:Kr(!1),charAt:Kr(!0)},Vr=!a(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),Yr=Xt("IE_PROTO"),Xr=Object,Jr=Xr.prototype,Qr=Vr?Xr.getPrototypeOf:function(t){var e=it(t);if(ut(e,Yr))return e[Yr];var r=e.constructor;return T(r)&&e instanceof r?r.prototype:e instanceof Xr?Jr:null},Zr=dt("iterator"),tn=!1;[].keys&&("next"in(Dr=[].keys())?(Br=Qr(Qr(Dr)))!==Object.prototype&&(Fr=Br):tn=!0);var en=!M(Fr)||a(function(){var t={};return Fr[Zr].call(t)!==t});en&&(Fr={}),T(Fr[Zr])||ie(Fr,Zr,function(){return this});var rn={IteratorPrototype:Fr,BUGGY_SAFARI_ITERATORS:tn},nn=Ct.f,on=dt("toStringTag"),an=function(t,e,r){t&&!r&&(t=t.prototype),t&&!ut(t,on)&&nn(t,on,{configurable:!0,value:e})},un={},sn=rn.IteratorPrototype,cn=function(){return this},fn=function(t,e,r,n){var o=e+" Iterator";return t.prototype=Ve(sn,{next:d(+!n,r)}),an(t,o,!1),un[o]=cn,t},ln=function(t,e,r){try{return b(J(Object.getOwnPropertyDescriptor(t,e)[r]))}catch(t){}},hn=String,pn=TypeError,vn=function(t){if(function(t){return M(t)||null===t}(t))return t;throw new pn("Can't set "+hn(t)+" as a prototype")},dn=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,r={};try{(t=ln(Object.prototype,"__proto__","set"))(r,[]),e=r instanceof Array}catch(t){}return function(r,n){return j(r),vn(n),M(r)?(e?t(r,n):r.__proto__=n,r):r}}():void 0),gn=zt.PROPER,yn=zt.CONFIGURABLE,mn=rn.IteratorPrototype,bn=rn.BUGGY_SAFARI_ITERATORS,wn=dt("iterator"),Sn="keys",En="values",On="entries",xn=function(){return this},Rn=function(t,e,r,n,o,i,a){fn(r,e,n);var u,s,c,l=function(t){if(t===o&&g)return g;if(!bn&&t&&t in v)return v[t];switch(t){case Sn:case En:case On:return function(){return new r(this,t)}}return function(){return new r(this)}},h=e+" Iterator",p=!1,v=t.prototype,d=v[wn]||v["@@iterator"]||o&&v[o],g=!bn&&d||l(o),y="Array"===e&&v.entries||d;if(y&&(u=Qr(y.call(new t)))!==Object.prototype&&u.next&&(Qr(u)!==mn&&(dn?dn(u,mn):T(u[wn])||ie(u,wn,xn)),an(u,h,!0)),gn&&o===En&&d&&d.name!==En&&(yn?_t(v,"name",En):(p=!0,g=function(){return f(d,this)})),o)if(s={values:l(En),keys:i?g:l(Sn),entries:l(On)},a)for(c in s)(bn||p||!(c in v))&&ie(v,c,s[c]);else Ce({target:e,proto:!0,forced:bn||p},s);return v[wn]!==g&&ie(v,wn,g,{name:o}),un[e]=g,s},Pn=function(t,e){return{value:t,done:e}},An=Gr.charAt,jn="String Iterator",kn=ne.set,In=ne.getterFor(jn);Rn(String,"String",function(t){kn(this,{type:jn,string:Wr(t),index:0})},function(){var t,e=In(this),r=e.string,n=e.index;return n>=r.length?Pn(void 0,!0):(t=An(r,n),e.index+=t.length,Pn(t,!1))});var Tn=function(t,e,r){var n,o;kt(t);try{if(!(n=Q(t,"return"))){if("throw"===e)throw r;return r}n=f(n,t)}catch(t){o=!0,n=t}if("throw"===e)throw r;if(o)throw n;return kt(n),r},Mn=function(t,e,r,n){try{return n?e(kt(r)[0],r[1]):e(r)}catch(e){Tn(t,"throw",e)}},Ln=dt("iterator"),Un=Array.prototype,Nn=function(t){return void 0!==t&&(un.Array===t||Un[Ln]===t)},Cn=function(t,e,r){u?Ct.f(t,e,d(0,r)):t[e]=r},_n=dt("iterator"),Fn=function(t){if(!P(t))return Q(t,_n)||Q(t,"@@iterator")||un[pr(t)]},Bn=TypeError,Dn=function(t,e){var r=arguments.length<2?Fn(t):e;if(J(r))return kt(f(r,t));throw new Bn(Y(t)+" is not iterable")},zn=Array,Wn=function(t){var e=it(t),r=Sr(this),n=arguments.length,o=n>1?arguments[1]:void 0,i=void 0!==o;i&&(o=ar(o,n>2?arguments[2]:void 0));var a,u,s,c,l,h,p=Fn(e),v=0;if(!p||this===zn&&Nn(p))for(a=de(e),u=r?new this(a):zn(a);a>v;v++)h=i?o(e[v],v):e[v],Cn(u,v,h);else for(u=r?new this:[],l=(c=Dn(e,p)).next;!(s=f(l,c)).done;v++)h=i?Mn(c,o,[s.value,v],!0):s.value,Cn(u,v,h);return u.length=v,u},qn=dt("iterator"),Hn=!1;try{var $n=0,Kn={next:function(){return{done:!!$n++}},return:function(){Hn=!0}};Kn[qn]=function(){return this},Array.from(Kn,function(){throw 2})}catch(t){}var Gn=function(t,e){try{if(!e&&!Hn)return!1}catch(t){return!1}var r=!1;try{var n={};n[qn]=function(){return{next:function(){return{done:r=!0}}}},t(n)}catch(t){}return r},Vn=!Gn(function(t){Array.from(t)});Ce({target:"Array",stat:!0,forced:Vn},{from:Wn});var Yn=i,Xn=ye.includes,Jn=a(function(){return!Array(1).includes()});Ce({target:"Array",proto:!0,forced:Jn},{includes:function(t){return Xn(this,t,arguments.length>1?arguments[1]:void 0)}}),Qe("includes"),Ze("Array","includes");var Qn=Ct.f,Zn="Array Iterator",to=ne.set,eo=ne.getterFor(Zn),ro=Rn(Array,"Array",function(t,e){to(this,{type:Zn,target:k(t),index:0,kind:e})},function(){var t=eo(this),e=t.target,r=t.index++;if(!e||r>=e.length)return t.target=null,Pn(void 0,!0);switch(t.kind){case"keys":return Pn(r,!1);case"values":return Pn(e[r],!1)}return Pn([r,e[r]],!1)},"values"),no=un.Arguments=un.Array;if(Qe("keys"),Qe("values"),Qe("entries"),u&&"values"!==no.name)try{Qn(no,"name",{value:"values"})}catch(t){}cr||ie(Object.prototype,"toString",cr?{}.toString:function(){return"[object "+pr(this)+"]"},{unsafe:!0}),Ze("Array","values");var oo=Array,io=a(function(){function t(){}return!(oo.of.call(t)instanceof t)});Ce({target:"Array",stat:!0,forced:io},{of:function(){for(var t=0,e=arguments.length,r=new(Sr(this)?this:oo)(e);e>t;)Cn(r,t,arguments[t++]);return r.length=e,r}});var ao=dt("hasInstance"),uo=Function.prototype;ao in uo||Ct.f(uo,ao,{value:oe(function(t){if(!T(this)||!M(t))return!1;var e=this.prototype;return M(e)?U(e,t):t instanceof this},ao)}),dt("hasInstance");var so=function(t,e,r){return r.get&&oe(r.get,e,{getter:!0}),r.set&&oe(r.set,e,{setter:!0}),Ct.f(t,e,r)},co=zt.EXISTS,fo=Function.prototype,lo=b(fo.toString),ho=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,po=b(ho.exec);u&&!co&&so(fo,"name",{configurable:!0,get:function(){try{return po(ho,lo(this))[1]}catch(t){return""}}});var vo=b([].slice),go=Oe.f,yo="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],mo={f:function(t){return yo&&"Window"===E(t)?function(t){try{return go(t)}catch(t){return vo(yo)}}(t):go(k(t))}},bo=a(function(){if("function"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,"a",{value:8})}}),wo=Object.isExtensible,So=a(function(){wo(1)})||bo?function(t){return!!M(t)&&(!bo||"ArrayBuffer"!==E(t))&&(!wo||wo(t))}:wo,Eo=!a(function(){return Object.isExtensible(Object.preventExtensions({}))}),Oo=e(function(t){var e=Ct.f,r=!1,n=lt("meta"),o=0,i=function(t){e(t,n,{value:{objectID:"O"+o++,weakData:{}}})},a=t.exports={enable:function(){a.enable=function(){},r=!0;var t=Oe.f,e=b([].splice),o={};o[n]=1,t(o).length&&(Oe.f=function(r){for(var o=t(r),i=0,a=o.length;ii;i++)if((u=y(t[i]))&&U(Po,u))return u;return new Ro(!1)}n=Dn(t,o)}for(s=h?t.next:n.next;!(c=f(s,n)).done;){try{u=y(c.value)}catch(t){Tn(n,"throw",t)}if("object"==typeof u&&u&&U(Po,u))return u}return new Ro(!1)},jo=TypeError,ko=function(t,e){if(U(e,t))return t;throw new jo("Incorrect invocation")},Io=function(t,e,r){var n,o;return dn&&T(n=e.constructor)&&n!==r&&M(o=n.prototype)&&o!==r.prototype&&dn(t,o),t},To=function(t,e,r){var n=-1!==t.indexOf("Map"),o=-1!==t.indexOf("Weak"),u=n?"set":"add",s=i[t],c=s&&s.prototype,f=s,l={},h=function(t){var e=b(c[t]);ie(c,t,"add"===t?function(t){return e(this,0===t?0:t),this}:"delete"===t?function(t){return!(o&&!M(t))&&e(this,0===t?0:t)}:"get"===t?function(t){return o&&!M(t)?void 0:e(this,0===t?0:t)}:"has"===t?function(t){return!(o&&!M(t))&&e(this,0===t?0:t)}:function(t,r){return e(this,0===t?0:t,r),this})};if(Ue(t,!T(s)||!(o||c.forEach&&!a(function(){(new s).entries().next()}))))f=r.getConstructor(e,t,n,u),Oo.enable();else if(Ue(t,!0)){var p=new f,v=p[u](o?{}:-0,1)!==p,d=a(function(){p.has(1)}),g=Gn(function(t){new s(t)}),y=!o&&a(function(){for(var t=new s,e=5;e--;)t[u](e,e);return!t.has(-0)});g||((f=e(function(t,e){ko(t,c);var r=Io(new s,t,f);return P(e)||Ao(e,r[u],{that:r,AS_ENTRIES:n}),r})).prototype=c,c.constructor=f),(d||y)&&(h("delete"),h("has"),n&&h("get")),(y||v)&&h(u),o&&c.clear&&delete c.clear}return l[t]=f,Ce({global:!0,constructor:!0,forced:f!==s},l),an(f,t),o||r.setStrong(f,t,n),f},Mo=function(t,e,r){for(var n in e)ie(t,n,e[n],r);return t},Lo=dt("species"),Uo=function(t){var e=L(t);u&&e&&!e[Lo]&&so(e,Lo,{configurable:!0,get:function(){return this}})},No=Oo.fastKey,Co=ne.set,_o=ne.getterFor,Fo={getConstructor:function(t,e,r,n){var o=t(function(t,o){ko(t,i),Co(t,{type:e,index:Ve(null),first:null,last:null,size:0}),u||(t.size=0),P(o)||Ao(o,t[n],{that:t,AS_ENTRIES:r})}),i=o.prototype,a=_o(e),s=function(t,e,r){var n,o,i=a(t),s=c(t,e);return s?s.value=r:(i.last=s={index:o=No(e,!0),key:e,value:r,previous:n=i.last,next:null,removed:!1},i.first||(i.first=s),n&&(n.next=s),u?i.size++:t.size++,"F"!==o&&(i.index[o]=s)),t},c=function(t,e){var r,n=a(t),o=No(e);if("F"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key===e)return r};return Mo(i,{clear:function(){for(var t=a(this),e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=null),e=e.next;t.first=t.last=null,t.index=Ve(null),u?t.size=0:this.size=0},delete:function(t){var e=this,r=a(e),n=c(e,t);if(n){var o=n.next,i=n.previous;delete r.index[n.index],n.removed=!0,i&&(i.next=o),o&&(o.previous=i),r.first===n&&(r.first=o),r.last===n&&(r.last=i),u?r.size--:e.size--}return!!n},forEach:function(t){for(var e,r=a(this),n=ar(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:r.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!c(this,t)}}),Mo(i,r?{get:function(t){var e=c(this,t);return e&&e.value},set:function(t,e){return s(this,0===t?0:t,e)}}:{add:function(t){return s(this,t=0===t?0:t,t)}}),u&&so(i,"size",{configurable:!0,get:function(){return a(this).size}}),o},setStrong:function(t,e,r){var n=e+" Iterator",o=_o(e),i=_o(n);Rn(t,e,function(t,e){Co(this,{type:n,target:t,state:o(t),kind:e,last:null})},function(){for(var t=i(this),e=t.kind,r=t.last;r&&r.removed;)r=r.previous;return t.target&&(t.last=r=r?r.next:t.state.first)?Pn("keys"===e?r.key:"values"===e?r.value:[r.key,r.value],!1):(t.target=null,Pn(void 0,!0))},r?"entries":"values",!r,!0),Uo(e)}};To("Map",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Fo);var Bo=Map.prototype,Do={Map:Map,set:b(Bo.set),get:b(Bo.get),has:b(Bo.has),remove:b(Bo.delete),proto:Bo},zo=Do.Map,Wo=Do.has,qo=Do.get,Ho=Do.set,$o=b([].push),Ko=a(function(){return 1!==zo.groupBy("ab",function(t){return t}).get("a").length});Ce({target:"Map",stat:!0,forced:Ko},{groupBy:function(t,e){j(t),J(e);var r=new zo,n=0;return Ao(t,function(t){var o=e(t,n++);Wo(r,o)?$o(qo(r,o),t):Ho(r,o,[t])}),r}});var Go={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Vo=Et("span").classList,Yo=Vo&&Vo.constructor&&Vo.constructor.prototype,Xo=Yo===Object.prototype?void 0:Yo,Jo=dt("iterator"),Qo=ro.values,Zo=function(t,e){if(t){if(t[Jo]!==Qo)try{_t(t,Jo,Qo)}catch(e){t[Jo]=Qo}if(an(t,e,!0),Go[e])for(var r in ro)if(t[r]!==ro[r])try{_t(t,r,ro[r])}catch(e){t[r]=ro[r]}}};for(var ti in Go)Zo(i[ti]&&i[ti].prototype,ti);Zo(Xo,"DOMTokenList");var ei=function(t,e,r){return function(n){var o=it(n),i=arguments.length,a=i>1?arguments[1]:void 0,u=void 0!==a,s=u?ar(a,i>2?arguments[2]:void 0):void 0,c=new t,f=0;return Ao(o,function(t){var n=u?s(t,f++):t;r?e(c,kt(n)[0],n[1]):e(c,n)}),c}};Ce({target:"Map",stat:!0,forced:!0},{from:ei(Do.Map,Do.set,!0)});var ri=function(t,e,r){return function(){for(var n=new t,o=arguments.length,i=0;i1?arguments[1]:void 0);return!1!==di(e,function(t,n){if(!r(t,n,e))return!1},!0)}});var gi=Do.Map,yi=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{filter:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new gi;return di(e,function(t,o){r(t,o,e)&&yi(n,o,t)}),n}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{find:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=di(e,function(t,n){if(r(t,n,e))return{value:t}},!0);return n&&n.value}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{findKey:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=di(e,function(t,n){if(r(t,n,e))return{key:n}},!0);return n&&n.key}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{includes:function(t){return!0===di(oi(this),function(e){if((r=e)===(n=t)||r!=r&&n!=n)return!0;var r,n},!0)}});var mi=Do.Map;Ce({target:"Map",stat:!0,forced:!0},{keyBy:function(t,e){var r=new(T(this)?this:mi);J(e);var n=J(r.set);return Ao(t,function(t){f(n,r,e(t),t)}),r}}),Ce({target:"Map",proto:!0,real:!0,forced:!0},{keyOf:function(t){var e=di(oi(this),function(e,r){if(e===t)return{key:r}},!0);return e&&e.key}});var bi=Do.Map,wi=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{mapKeys:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new bi;return di(e,function(t,o){wi(n,r(t,o,e),t)}),n}});var Si=Do.Map,Ei=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{mapValues:function(t){var e=oi(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new Si;return di(e,function(t,o){Ei(n,o,r(t,o,e))}),n}});var Oi=Do.set;Ce({target:"Map",proto:!0,real:!0,arity:1,forced:!0},{merge:function(t){for(var e=oi(this),r=arguments.length,n=0;n1?arguments[1]:void 0);return!0===di(e,function(t,n){if(r(t,n,e))return!0},!0)}});var Ri=TypeError,Pi=Do.get,Ai=Do.has,ji=Do.set;Ce({target:"Map",proto:!0,real:!0,forced:!0},{update:function(t,e){var r=oi(this),n=arguments.length;J(e);var o=Ai(r,t);if(!o&&n<3)throw new Ri("Updating absent value");var i=o?Pi(r,t):J(n>2?arguments[2]:void 0)(t,r);return ji(r,t,e(i,t,r)),r}});var ki=TypeError,Ii=function(t,e){var r,n=kt(this),o=J(n.get),i=J(n.has),a=J(n.set),u=arguments.length>2?arguments[2]:void 0;if(!T(e)&&!T(u))throw new ki("At least one callback required");return f(i,n,t)?(r=f(o,n,t),T(e)&&(r=e(r),f(a,n,t,r))):T(u)&&(r=u(),f(a,n,t,r)),r};Ce({target:"Map",proto:!0,real:!0,forced:!0},{upsert:Ii}),Ce({target:"Map",proto:!0,real:!0,name:"upsert",forced:!0},{updateOrInsert:Ii});var Ti=b(1..valueOf),Mi="\t\n\v\f\r                 \u2028\u2029\ufeff",Li=b("".replace),Ui=RegExp("^["+Mi+"]+"),Ni=RegExp("(^|[^"+Mi+"])["+Mi+"]+$"),Ci=function(t){return function(e){var r=Wr(j(e));return 1&t&&(r=Li(r,Ui,"")),2&t&&(r=Li(r,Ni,"$1")),r}},_i={start:Ci(1),end:Ci(2),trim:Ci(3)},Fi=Oe.f,Bi=Rt.f,Di=Ct.f,zi=_i.trim,Wi="Number",qi=i[Wi],Hi=qi.prototype,$i=i.TypeError,Ki=b("".slice),Gi=b("".charCodeAt),Vi=Ue(Wi,!qi(" 0o1")||!qi("0b1")||qi("+0x1")),Yi=function(t){var e,r=arguments.length<1?0:qi(function(t){var e=mt(t,"number");return"bigint"==typeof e?e:function(t){var e,r,n,o,i,a,u,s,c=mt(t,"number");if(G(c))throw new $i("Cannot convert a Symbol value to a number");if("string"==typeof c&&c.length>2)if(c=zi(c),43===(e=Gi(c,0))||45===e){if(88===(r=Gi(c,2))||120===r)return NaN}else if(48===e){switch(Gi(c,1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+c}for(a=(i=Ki(c,2)).length,u=0;uo)return NaN;return parseInt(i,n)}return+c}(e)}(t));return U(Hi,e=this)&&a(function(){Ti(e)})?Io(Object(r),this,Yi):r};Yi.prototype=Hi,Vi&&(Hi.constructor=Yi),Ce({global:!0,constructor:!0,wrap:!0,forced:Vi},{Number:Yi}),Vi&&function(t,e){for(var r,n=u?Fi(e):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),o=0;n.length>o;o++)ut(e,r=n[o])&&!ut(t,r)&&Di(t,r,Bi(e,r))}(Yn[Wi],qi),Ce({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{EPSILON:Math.pow(2,-52)});var Xi=i.isFinite;Ce({target:"Number",stat:!0},{isFinite:Number.isFinite||function(t){return"number"==typeof t&&Xi(t)}});var Ji=Math.floor,Qi=Number.isInteger||function(t){return!M(t)&&isFinite(t)&&Ji(t)===t};Ce({target:"Number",stat:!0},{isInteger:Qi}),Ce({target:"Number",stat:!0},{isNaN:function(t){return t!=t}});var Zi=Math.abs;Ce({target:"Number",stat:!0},{isSafeInteger:function(t){return Qi(t)&&Zi(t)<=9007199254740991}}),Ce({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991}),Ce({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MIN_SAFE_INTEGER:-9007199254740991});var ta=_i.trim,ea=b("".charAt),ra=i.parseFloat,na=i.Symbol,oa=na&&na.iterator,ia=1/ra(Mi+"-0")!=-Infinity||oa&&!a(function(){ra(Object(oa))})?function(t){var e=ta(Wr(t)),r=ra(e);return 0===r&&"-"===ea(e,0)?-0:r}:ra;Ce({target:"Number",stat:!0,forced:Number.parseFloat!==ia},{parseFloat:ia});var aa=_i.trim,ua=i.parseInt,sa=i.Symbol,ca=sa&&sa.iterator,fa=/^[+-]?0x/i,la=b(fa.exec),ha=8!==ua(Mi+"08")||22!==ua(Mi+"0x16")||ca&&!a(function(){ua(Object(ca))})?function(t,e){var r=aa(Wr(t));return ua(r,e>>>0||(la(fa,r)?16:10))}:ua;Ce({target:"Number",stat:!0,forced:Number.parseInt!==ha},{parseInt:ha});var pa=b(v.f),va=b([].push),da=u&&a(function(){var t=Object.create(null);return t[2]=2,!pa(t,2)}),ga=function(t){return function(e){for(var r,n=k(e),o=_e(n),i=da&&null===Qr(n),a=o.length,s=0,c=[];a>s;)r=o[s++],u&&!(i?r in n:pa(n,r))||va(c,t?[r,n[r]]:n[r]);return c}},ya={entries:ga(!0),values:ga(!1)},ma=ya.entries;Ce({target:"Object",stat:!0},{entries:function(t){return ma(t)}}),Ce({target:"Object",stat:!0,sham:!u},{getOwnPropertyDescriptors:function(t){for(var e,r,n=k(t),o=Rt.f,i=Pe(n),a={},u=0;i.length>u;)void 0!==(r=o(n,e=i[u++]))&&Cn(a,e,r);return a}});var ba=a(function(){_e(1)});Ce({target:"Object",stat:!0,forced:ba},{keys:function(t){return _e(it(t))}});var wa=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e};Ce({target:"Object",stat:!0},{is:wa});var Sa=ya.values;Ce({target:"Object",stat:!0},{values:function(t){return Sa(t)}}),Ce({target:"Object",stat:!0},{hasOwn:ut});var Ea=Function.prototype,Oa=Ea.apply,xa=Ea.call,Ra="object"==typeof Reflect&&Reflect.apply||(s?xa.bind(Oa):function(){return xa.apply(Oa,arguments)}),Pa=!a(function(){Reflect.apply(function(){})});Ce({target:"Reflect",stat:!0,forced:Pa},{apply:function(t,e,r){return Ra(J(t),e,kt(r))}});var Aa=Function,ja=b([].concat),ka=b([].join),Ia={},Ta=s?Aa.bind:function(t){var e=J(this),r=e.prototype,n=vo(arguments,1),o=function(){var r=ja(n,vo(arguments));return this instanceof o?function(t,e,r){if(!ut(Ia,e)){for(var n=[],o=0;ob)","g");return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")}),gs=Oe.f,ys=ne.enforce,ms=dt("match"),bs=i.RegExp,ws=bs.prototype,Ss=i.SyntaxError,Es=b(ws.exec),Os=b("".charAt),xs=b("".replace),Rs=b("".indexOf),Ps=b("".slice),As=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,js=/a/g,ks=/a/g,Is=new bs(js)!==js,Ts=cs.MISSED_STICKY,Ms=cs.UNSUPPORTED_Y,Ls=u&&(!Is||Ts||ps||ds||a(function(){return ks[ms]=!1,bs(js)!==js||bs(ks)===ks||"/a/i"!==String(bs(js,"i"))}));if(Ue("RegExp",Ls)){for(var Us=function(t,e){var r,n,o,i,a,u,s=U(ws,this),c=es(t),f=void 0===e,l=[],h=t;if(!s&&c&&f&&t.constructor===Us)return t;if((c||U(ws,t))&&(t=t.source,f&&(e=os(h))),t=void 0===t?"":Wr(t),e=void 0===e?"":Wr(e),h=t,ps&&"dotAll"in js&&(n=!!e&&Rs(e,"s")>-1)&&(e=xs(e,/s/g,"")),r=e,Ts&&"sticky"in js&&(o=!!e&&Rs(e,"y")>-1)&&Ms&&(e=xs(e,/y/g,"")),ds&&(i=function(t){for(var e,r=t.length,n=0,o="",i=[],a=Ve(null),u=!1,s=!1,c=0,f="";n<=r;n++){if("\\"===(e=Os(t,n)))e+=Os(t,++n);else if("]"===e)u=!1;else if(!u)switch(!0){case"["===e:u=!0;break;case"("===e:if(o+=e,"?:"===Ps(t,n+1,n+3))continue;Es(As,Ps(t,n+1))&&(n+=2,s=!0),c++;continue;case">"===e&&s:if(""===f||ut(a,f))throw new Ss("Invalid capture group name");a[f]=!0,i[i.length]=[f,c],s=!1,f="";continue}s?f+=e:o+=e}return[o,i]}(t),t=i[0],l=i[1]),a=Io(bs(t,e),s?this:ws,Us),(n||o||l.length)&&(u=ys(a),n&&(u.dotAll=!0,u.raw=Us(function(t){for(var e,r=t.length,n=0,o="",i=!1;n<=r;n++)"\\"!==(e=Os(t,n))?i||"."!==e?("["===e?i=!0:"]"===e&&(i=!1),o+=e):o+="[\\s\\S]":o+=e+Os(t,++n);return o}(t),r)),o&&(u.sticky=!0),l.length&&(u.groups=l)),t!==h)try{_t(a,"source",""===h?"(?:)":h)}catch(t){}return a},Ns=gs(bs),Cs=0;Ns.length>Cs;)ls(Us,bs,Ns[Cs++]);ws.constructor=Us,Us.prototype=ws,ie(i,"RegExp",Us,{constructor:!0})}Uo("RegExp");var _s=zt.PROPER,Fs="toString",Bs=RegExp.prototype,Ds=Bs[Fs];(a(function(){return"/a/b"!==Ds.call({source:"a",flags:"b"})})||_s&&Ds.name!==Fs)&&ie(Bs,Fs,function(){var t=kt(this);return"/"+Wr(t.source)+"/"+Wr(os(t))},{unsafe:!0});var zs=ne.get,Ws=RegExp.prototype,qs=TypeError;u&&ps&&so(Ws,"dotAll",{configurable:!0,get:function(){if(this!==Ws){if("RegExp"===E(this))return!!zs(this).dotAll;throw new qs("Incompatible receiver, RegExp required")}}});var Hs=ne.get,$s=nt("native-string-replace",String.prototype.replace),Ks=RegExp.prototype.exec,Gs=Ks,Vs=b("".charAt),Ys=b("".indexOf),Xs=b("".replace),Js=b("".slice),Qs=function(){var t=/a/,e=/b*/g;return f(Ks,t,"a"),f(Ks,e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),Zs=cs.BROKEN_CARET,tc=void 0!==/()??/.exec("")[1];(Qs||tc||Zs||ps||ds)&&(Gs=function(t){var e,r,n,o,i,a,u,s=this,c=Hs(s),l=Wr(t),h=c.raw;if(h)return h.lastIndex=s.lastIndex,e=f(Gs,h,l),s.lastIndex=h.lastIndex,e;var p=c.groups,v=Zs&&s.sticky,d=f(rs,s),g=s.source,y=0,m=l;if(v&&(d=Xs(d,"y",""),-1===Ys(d,"g")&&(d+="g"),m=Js(l,s.lastIndex),s.lastIndex>0&&(!s.multiline||s.multiline&&"\n"!==Vs(l,s.lastIndex-1))&&(g="(?: "+g+")",m=" "+m,y++),r=new RegExp("^(?:"+g+")",d)),tc&&(r=new RegExp("^"+g+"$(?!\\s)",d)),Qs&&(n=s.lastIndex),o=f(Ks,v?r:s,m),v?o?(o.input=Js(o.input,y),o[0]=Js(o[0],y),o.index=s.lastIndex,s.lastIndex+=o[0].length):s.lastIndex=0:Qs&&o&&(s.lastIndex=s.global?o.index+o[0].length:n),tc&&o&&o.length>1&&f($s,o[0],r,function(){for(i=1;i]*>)/g,Oc=/\$([$&'`]|\d{1,2})/g,xc=function(t,e,r,n,o,i){var a=r+t.length,u=n.length,s=Oc;return void 0!==o&&(o=it(o),s=Ec),wc(i,s,function(i,s){var c;switch(bc(s,0)){case"$":return"$";case"&":return t;case"`":return Sc(e,0,r);case"'":return Sc(e,a);case"<":c=o[Sc(s,1,-1)];break;default:var f=+s;if(0===f)return i;if(f>u){var l=mc(f/10);return 0===l?i:l<=u?void 0===n[l-1]?bc(s,1):n[l-1]+bc(s,1):i}c=n[f-1]}return void 0===c?"":c})},Rc=dt("replace"),Pc=Math.max,Ac=Math.min,jc=b([].concat),kc=b([].push),Ic=b("".indexOf),Tc=b("".slice),Mc="$0"==="a".replace(/./,"$0"),Lc=!!/./[Rc]&&""===/./[Rc]("a","$0"),Uc=!a(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")});pc("replace",function(t,e,r){var n=Lc?"$":"$0";return[function(t,r){var n=j(this),o=P(t)?void 0:Q(t,Rc);return o?f(o,t,n,r):f(e,Wr(n),t,r)},function(t,o){var i=kt(this),a=Wr(t);if("string"==typeof o&&-1===Ic(o,n)&&-1===Ic(o,"$<")){var u=r(e,i,a,o);if(u.done)return u.value}var s=T(o);s||(o=Wr(o));var c,f=i.global;f&&(c=i.unicode,i.lastIndex=0);for(var l,h=[];null!==(l=yc(i,a))&&(kc(h,l),f);)""===Wr(l[0])&&(i.lastIndex=dc(a,ve(i.lastIndex),c));for(var p,v="",d=0,g=0;g=d&&(v+=Tc(a,d,b)+y,d=b+m.length)}return v+Tc(a,d)}]},!Uc||!Mc||Lc),pc("search",function(t,e,r){return[function(e){var r=j(this),n=P(e)?void 0:Q(e,t);return n?f(n,e,r):new RegExp(e)[t](Wr(r))},function(t){var n=kt(this),o=Wr(t),i=r(e,n,o);if(i.done)return i.value;var a=n.lastIndex;wa(a,0)||(n.lastIndex=0);var u=yc(n,o);return wa(n.lastIndex,a)||(n.lastIndex=a),null===u?-1:u.index}]});var Nc=dt("species"),Cc=function(t,e){var r,n=kt(t).constructor;return void 0===n||P(r=kt(n)[Nc])?e:La(r)},_c=cs.UNSUPPORTED_Y,Fc=Math.min,Bc=b([].push),Dc=b("".slice),zc=!a(function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2!==r.length||"a"!==r[0]||"b"!==r[1]}),Wc="c"==="abbc".split(/(b)*/)[1]||4!=="test".split(/(?:)/,-1).length||2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length;pc("split",function(t,e,r){var n="0".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:f(e,this,t,r)}:e;return[function(e,r){var o=j(this),i=P(e)?void 0:Q(e,t);return i?f(i,e,o,r):f(n,Wr(o),e,r)},function(t,o){var i=kt(this),a=Wr(t);if(!Wc){var u=r(n,i,a,o,n!==e);if(u.done)return u.value}var s=Cc(i,RegExp),c=i.unicode,f=new s(_c?"^(?:"+i.source+")":i,(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.unicode?"u":"")+(_c?"g":"y")),l=void 0===o?4294967295:o>>>0;if(0===l)return[];if(0===a.length)return null===yc(f,a)?[a]:[];for(var h=0,p=0,v=[];p0;(n>>>=1)&&(e+=e))1&n&&(r+=e);return r},Kc=b($c),Gc=b("".slice),Vc=Math.ceil,Yc=function(t){return function(e,r,n){var o,i,a=Wr(j(e)),u=ve(r),s=a.length,c=void 0===n?" ":Wr(n);return u<=s||""===c?a:((i=Kc(c,Vc((o=u-s)/c.length))).length>o&&(i=Gc(i,0,o)),t?a+i:i+a)}},Xc={start:Yc(!1),end:Yc(!0)},Jc=Xc.start,Qc=Array,Zc=RegExp.escape,tf=b("".charAt),ef=b("".charCodeAt),rf=b(1.1.toString),nf=b([].join),of=/^[0-9a-z]/i,af=/^[$()*+./?[\\\]^{|}]/,uf=RegExp("^[!\"#%&',\\-:;<=>@`~"+Mi+"]"),sf=b(of.exec),cf={"\t":"t","\n":"n","\v":"v","\f":"f","\r":"r"},ff=function(t){var e=rf(ef(t,0),16);return e.length<3?"\\x"+Jc(e,2,"0"):"\\u"+Jc(e,4,"0")},lf=!Zc||"\\x61b"!==Zc("ab");Ce({target:"RegExp",stat:!0,forced:lf},{escape:function(t){!function(t){if("string"==typeof t)return t;throw new qc("Argument is not a string")}(t);for(var e=t.length,r=Qc(e),n=0;n=56320||n+1>=e||56320!=(64512&ef(t,n+1))?r[n]=ff(o):(r[n]=o,r[++n]=tf(t,n))}}return nf(r,"")}}),To("Set",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Fo);var hf=Set.prototype,pf={Set:Set,add:b(hf.add),has:b(hf.has),remove:b(hf.delete),proto:hf},vf=pf.has,df=function(t){return vf(t),t},gf=pf.Set,yf=pf.proto,mf=b(yf.forEach),bf=b(yf.keys),wf=bf(new gf).next,Sf=function(t,e,r){return r?ci({iterator:bf(t),next:wf},e):mf(t,e)},Ef=pf.Set,Of=pf.add,xf=function(t){var e=new Ef;return Sf(t,function(t){Of(e,t)}),e},Rf=ln(pf.proto,"size","get")||function(t){return t.size},Pf="Invalid size",Af=RangeError,jf=TypeError,kf=Math.max,If=function(t,e){this.set=t,this.size=kf(e,0),this.has=J(t.has),this.keys=J(t.keys)};If.prototype={getIterator:function(){return{iterator:t=kt(f(this.keys,this.set)),next:t.next,done:!1};var t},includes:function(t){return f(this.has,this.set,t)}};var Tf=function(t){kt(t);var e=+t.size;if(e!=e)throw new jf(Pf);var r=ce(e);if(r<0)throw new Af(Pf);return new If(t,r)},Mf=pf.has,Lf=pf.remove,Uf=function(t){var e=df(this),r=Tf(t),n=xf(e);return Rf(e)<=r.size?Sf(e,function(t){r.includes(t)&&Lf(n,t)}):ci(r.getIterator(),function(t){Mf(e,t)&&Lf(n,t)}),n},Nf=function(t){return{size:t,has:function(){return!1},keys:function(){return{next:function(){return{done:!0}}}}}},Cf=function(t){var e=L("Set");try{(new e)[t](Nf(0));try{return(new e)[t](Nf(-1)),!1}catch(t){return!0}}catch(t){return!1}};Ce({target:"Set",proto:!0,real:!0,forced:!Cf("difference")},{difference:Uf});var _f=pf.Set,Ff=pf.add,Bf=pf.has,Df=function(t){var e=df(this),r=Tf(t),n=new _f;return Rf(e)>r.size?ci(r.getIterator(),function(t){Bf(e,t)&&Ff(n,t)}):Sf(e,function(t){r.includes(t)&&Ff(n,t)}),n},zf=!Cf("intersection")||a(function(){return"3,2"!==String(Array.from(new Set([1,2,3]).intersection(new Set([3,2]))))});Ce({target:"Set",proto:!0,real:!0,forced:zf},{intersection:Df});var Wf=pf.has,qf=function(t){var e=df(this),r=Tf(t);if(Rf(e)<=r.size)return!1!==Sf(e,function(t){if(r.includes(t))return!1},!0);var n=r.getIterator();return!1!==ci(n,function(t){if(Wf(e,t))return Tn(n,"normal",!1)})};Ce({target:"Set",proto:!0,real:!0,forced:!Cf("isDisjointFrom")},{isDisjointFrom:qf});var Hf=function(t){var e=df(this),r=Tf(t);return!(Rf(e)>r.size)&&!1!==Sf(e,function(t){if(!r.includes(t))return!1},!0)};Ce({target:"Set",proto:!0,real:!0,forced:!Cf("isSubsetOf")},{isSubsetOf:Hf});var $f=pf.has,Kf=function(t){var e=df(this),r=Tf(t);if(Rf(e)1?arguments[1]:void 0);return!1!==Sf(e,function(t){if(!r(t,t,e))return!1},!0)}});var el=dt("iterator"),rl=Object,nl=L("Set"),ol=function(t){return function(t){return M(t)&&"number"==typeof t.size&&T(t.has)&&T(t.keys)}(t)?t:function(t){if(P(t))return!1;var e=rl(t);return void 0!==e[el]||"@@iterator"in e||ut(un,pr(e))}(t)?new nl(t):t};Ce({target:"Set",proto:!0,real:!0,forced:!0},{difference:function(t){return f(Uf,this,ol(t))}});var il=pf.Set,al=pf.add;Ce({target:"Set",proto:!0,real:!0,forced:!0},{filter:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new il;return Sf(e,function(t){r(t,t,e)&&al(n,t)}),n}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{find:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=Sf(e,function(t){if(r(t,t,e))return{value:t}},!0);return n&&n.value}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{intersection:function(t){return f(Df,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{isDisjointFrom:function(t){return f(qf,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{isSubsetOf:function(t){return f(Hf,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{isSupersetOf:function(t){return f(Kf,this,ol(t))}});var ul=b([].join),sl=b([].push);Ce({target:"Set",proto:!0,real:!0,forced:!0},{join:function(t){var e=df(this),r=void 0===t?",":Wr(t),n=[];return Sf(e,function(t){sl(n,t)}),ul(n,r)}});var cl=pf.Set,fl=pf.add;Ce({target:"Set",proto:!0,real:!0,forced:!0},{map:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0),n=new cl;return Sf(e,function(t){fl(n,r(t,t,e))}),n}});var ll=TypeError;Ce({target:"Set",proto:!0,real:!0,forced:!0},{reduce:function(t){var e=df(this),r=arguments.length<2,n=r?void 0:arguments[1];if(J(t),Sf(e,function(o){r?(r=!1,n=o):n=t(n,o,o,e)}),r)throw new ll("Reduce of empty set with no initial value");return n}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{some:function(t){var e=df(this),r=ar(t,arguments.length>1?arguments[1]:void 0);return!0===Sf(e,function(t){if(r(t,t,e))return!0},!0)}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{symmetricDifference:function(t){return f(Xf,this,ol(t))}}),Ce({target:"Set",proto:!0,real:!0,forced:!0},{union:function(t){return f(Qf,this,ol(t))}});var hl=dt("species"),pl=dt("isConcatSpreadable"),vl=W>=51||!a(function(){var t=[];return t[pl]=!1,t.concat()[0]!==t}),dl=function(t){if(!M(t))return!1;var e=t[pl];return void 0!==e?!!e:ur(t)},gl=!(vl&&(W>=51||!a(function(){var t=[];return(t.constructor={})[hl]=function(){return{foo:1}},1!==t.concat(Boolean).foo})));Ce({target:"Array",proto:!0,arity:1,forced:gl},{concat:function(t){var e,r,n,o,i,a=it(this),u=xr(a,0),s=0;for(e=-1,n=arguments.length;e1?arguments[1]:void 0,n=e.length,o=void 0===r?n:ip(ve(r),n),i=Wr(t);return op(e,o-i.length,o)===i}}),Ze("String","endsWith");var sp=RangeError,cp=String.fromCharCode,fp=String.fromCodePoint,lp=b([].join);Ce({target:"String",stat:!0,arity:1,forced:!!fp&&1!==fp.length},{fromCodePoint:function(t){for(var e,r=[],n=arguments.length,o=0;n>o;){if(e=+arguments[o++],he(e,1114111)!==e)throw new sp(e+" is not a valid code point");r[o]=e<65536?cp(e):cp(55296+((e-=65536)>>10),e%1024+56320)}return lp(r,"")}});var hp=b("".indexOf);Ce({target:"String",proto:!0,forced:!rp("includes")},{includes:function(t){return!!~hp(Wr(j(this)),Wr(tp(t)),arguments.length>1?arguments[1]:void 0)}}),Ze("String","includes"),b(un.String);var pp=/Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(_),vp=Xc.start;Ce({target:"String",proto:!0,forced:pp},{padStart:function(t){return vp(this,t,arguments.length>1?arguments[1]:void 0)}}),Ze("String","padStart");var dp=Xc.end;Ce({target:"String",proto:!0,forced:pp},{padEnd:function(t){return dp(this,t,arguments.length>1?arguments[1]:void 0)}}),Ze("String","padEnd");var gp=b([].push),yp=b([].join);Ce({target:"String",stat:!0},{raw:function(t){var e=k(it(t).raw),r=de(e);if(!r)return"";for(var n=arguments.length,o=[],i=0;;){if(gp(o,Wr(e[i++])),i===r)return yp(o,"");i1?arguments[1]:void 0,e.length)),n=Wr(t);return bp(e,r,r+n.length)===n}}),Ze("String","startsWith");var Op=zt.PROPER,xp=function(t){return a(function(){return!!Mi[t]()||"​…᠎"!=="​…᠎"[t]()||Op&&Mi[t].name!==t})},Rp=_i.start,Pp=xp("trimStart")?function(){return Rp(this)}:"".trimStart;Ce({target:"String",proto:!0,name:"trimStart",forced:"".trimLeft!==Pp},{trimLeft:Pp}),Ce({target:"String",proto:!0,name:"trimStart",forced:"".trimStart!==Pp},{trimStart:Pp}),Ze("String","trimLeft");var Ap=_i.end,jp=xp("trimEnd")?function(){return Ap(this)}:"".trimEnd;Ce({target:"String",proto:!0,name:"trimEnd",forced:"".trimRight!==jp},{trimRight:jp}),Ce({target:"String",proto:!0,name:"trimEnd",forced:"".trimEnd!==jp},{trimEnd:jp}),Ze("String","trimRight");var kp=Object.getOwnPropertyDescriptor,Ip=function(t){if(!u)return i[t];var e=kp(i,t);return e&&e.value},Tp=dt("iterator"),Mp=!a(function(){var t=new URL("b?a=1&b=2&c=3","https://a"),e=t.searchParams,r=new URLSearchParams("a=1&a=2&b=3"),n="";return t.pathname="c%20d",e.forEach(function(t,r){e.delete("b"),n+=r+t}),r.delete("a",2),r.delete("b",void 0),!e.size&&!u||!e.sort||"https://a/c%20d?a=1&c=3"!==t.href||"3"!==e.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!e[Tp]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("https://тест").host||"#%D0%B1"!==new URL("https://a#б").hash||"a1c3"!==n||"x"!==new URL("https://x",void 0).host}),Lp=TypeError,Up=function(t,e){if(t0;)t[o]=t[--o];o!==i++&&(t[o]=n)}else for(var a=Np(r/2),u=Cp(vo(t,0,a),e),s=Cp(vo(t,a),e),c=u.length,f=s.length,l=0,h=0;l0&&0!=(t&r);r>>=1)e++;return e},pv=function(t){var e=null;switch(t.length){case 1:e=t[0];break;case 2:e=(31&t[0])<<6|63&t[1];break;case 3:e=(15&t[0])<<12|(63&t[1])<<6|63&t[2];break;case 4:e=(7&t[0])<<18|(63&t[1])<<12|(63&t[2])<<6|63&t[3]}return e>1114111?null:e},vv=function(t){for(var e=(t=nv(t,cv," ")).length,r="",n=0;ne){r+="%",n++;continue}var i=lv(t,n+1);if(i!=i){r+=o,n++;continue}n+=2;var a=hv(i);if(0===a)o=Jp(i);else{if(1===a||a>4){r+="�",n++;continue}for(var u=[i],s=1;se||"%"!==tv(t,n));){var c=lv(t,n+1);if(c!=c){n+=3;break}if(c>191||c<128)break;rv(u,c),n+=2,s++}if(u.length!==a){r+="�";continue}var f=pv(u);null===f?r+="�":o=Qp(f)}}r+=o,n++}return r},dv=/[!'()~]|%20/g,gv={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},yv=function(t){return gv[t]},mv=function(t){return nv(Xp(t),dv,yv)},bv=fn(function(t,e){zp(this,{type:Dp,target:Wp(t).entries,index:0,kind:e})},Bp,function(){var t=qp(this),e=t.target,r=t.index++;if(!e||r>=e.length)return t.target=null,Pn(void 0,!0);var n=e[r];switch(t.kind){case"keys":return Pn(n.key,!1);case"values":return Pn(n.value,!1)}return Pn([n.key,n.value],!1)},!0),wv=function(t){this.entries=[],this.url=null,void 0!==t&&(M(t)?this.parseObject(t):this.parseQuery("string"==typeof t?"?"===tv(t,0)?uv(t,1):t:Wr(t)))};wv.prototype={type:Bp,bindURL:function(t){this.url=t,this.update()},parseObject:function(t){var e,r,n,o,i,a,u,s=this.entries,c=Fn(t);if(c)for(r=(e=Dn(t,c)).next;!(n=f(r,e)).done;){if(o=Dn(kt(n.value)),(a=f(i=o.next,o)).done||(u=f(i,o)).done||!f(i,o).done)throw new Yp("Expected sequence with length 2");rv(s,{key:Wr(a.value),value:Wr(u.value)})}else for(var l in t)ut(t,l)&&rv(s,{key:l,value:Wr(t[l])})},parseQuery:function(t){if(t)for(var e,r,n=this.entries,o=av(t,"&"),i=0;i0?arguments[0]:void 0));u||(this.size=t.entries.length)},Ev=Sv.prototype;if(Mo(Ev,{append:function(t,e){var r=Wp(this);Up(arguments.length,2),rv(r.entries,{key:Wr(t),value:Wr(e)}),u||this.length++,r.updateURL()},delete:function(t){for(var e=Wp(this),r=Up(arguments.length,1),n=e.entries,o=Wr(t),i=r<2?void 0:arguments[1],a=void 0===i?i:Wr(i),s=0;se.key?1:-1}),t.updateURL()},forEach:function(t){for(var e,r=Wp(this).entries,n=ar(t,arguments.length>1?arguments[1]:void 0),o=0;o1?Rv(arguments[1]):{})}}),T($p)){var Pv=function(t){return ko(this,Gp),new $p(t,arguments.length>1?Rv(arguments[1]):{})};Gp.constructor=Pv,Pv.prototype=Gp,Ce({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:Pv})}}var Av={URLSearchParams:Sv,getState:Wp},jv=URLSearchParams,kv=jv.prototype,Iv=b(kv.append),Tv=b(kv.delete),Mv=b(kv.forEach),Lv=b([].push),Uv=new jv("a=1&a=2&b=3");Uv.delete("a",1),Uv.delete("b",void 0),Uv+""!="a=2"&&ie(kv,"delete",function(t){var e=arguments.length,r=e<2?void 0:arguments[1];if(e&&void 0===r)return Tv(this,t);var n=[];Mv(this,function(t,e){Lv(n,{key:e,value:t})}),Up(e,1);for(var o,i=Wr(t),a=Wr(r),u=0,s=0,c=!1,f=n.length;uo;)for(var s,c=R(arguments[o++]),l=i?$v(_e(c),i(c)):_e(c),h=l.length,p=0;h>p;)s=l[p++],u&&!f(a,c,s)||(r[s]=c[s]);return r}:qv,Gv=2147483647,Vv=/[^\0-\u007E]/,Yv=/[.\u3002\uFF0E\uFF61]/g,Xv="Overflow: input needs wider integers to process",Jv=RangeError,Qv=b(Yv.exec),Zv=Math.floor,td=String.fromCharCode,ed=b("".charCodeAt),rd=b([].join),nd=b([].push),od=b("".replace),id=b("".split),ad=b("".toLowerCase),ud=function(t){return t+22+75*(t<26)},sd=function(t,e,r){var n=0;for(t=r?Zv(t/700):t>>1,t+=Zv(t/e);t>455;)t=Zv(t/35),n+=36;return Zv(n+36*t/(t+38))},cd=function(t){var e=[];t=function(t){for(var e=[],r=0,n=t.length;r=55296&&o<=56319&&r=i&&nZv((Gv-a)/l))throw new Jv(Xv);for(a+=(f-i)*l,i=f,r=0;rGv)throw new Jv(Xv);if(n===i){for(var h=a,p=36;;){var v=p<=u?1:p>=u+26?26:p-u;if(h?@[\\\]^|]/,qd=/[\0\t\n\r #/:<>?@[\\\]^|]/,Hd=/^[\u0000-\u0020]+/,$d=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,Kd=/[\t\n\r]/g,Gd=function(t){var e,r,n,o;if("number"==typeof t){for(e=[],r=0;r<4;r++)Td(e,t%256),t=md(t/256);return Ed(e,".")}if("object"==typeof t){for(e="",n=function(t){for(var e=null,r=1,n=null,o=0,i=0;i<8;i++)0!==t[i]?(o>r&&(e=n,r=o),n=null,o=0):(null===n&&(n=i),++o);return o>r?n:e}(t),r=0;r<8;r++)o&&0===t[r]||(o&&(o=!1),n===r?(e+=r?":":"::",o=!0):(e+=Od(t[r],16),r<7&&(e+=":")));return"["+e+"]"}return t},Vd={},Yd=Kv({},Vd,{" ":1,'"':1,"<":1,">":1,"`":1}),Xd=Kv({},Yd,{"#":1,"?":1,"{":1,"}":1}),Jd=Kv({},Xd,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Qd=function(t,e){var r=fd(t,0);return r>32&&r<127&&!ut(e,t)?t:encodeURIComponent(t)},Zd={ftp:21,file:null,http:80,https:443,ws:80,wss:443},tg=function(t,e){var r;return 2===t.length&&Sd(Nd,wd(t,0))&&(":"===(r=wd(t,1))||!e&&"|"===r)},eg=function(t){var e;return t.length>1&&tg(kd(t,0,2))&&(2===t.length||"/"===(e=wd(t,2))||"\\"===e||"?"===e||"#"===e)},rg=function(t){return"."===t||"%2e"===Id(t)},ng={},og={},ig={},ag={},ug={},sg={},cg={},fg={},lg={},hg={},pg={},vg={},dg={},gg={},yg={},mg={},bg={},wg={},Sg={},Eg={},Og={},xg=function(t,e,r){var n,o,i,a=Wr(t);if(e){if(o=this.parse(a))throw new gd(o);this.searchParams=null}else{if(void 0!==r&&(n=new xg(r,!0)),o=this.parse(a,null,n))throw new gd(o);(i=vd(new pd)).bindURL(this),this.searchParams=i}};xg.prototype={type:"URL",parse:function(t,e,r){var n,o,i,a,u,s=this,c=e||ng,f=0,l="",h=!1,p=!1,v=!1;for(t=Wr(t),e||(s.scheme="",s.username="",s.password="",s.host=null,s.port=null,s.path=[],s.query=null,s.fragment=null,s.cannotBeABaseURL=!1,t=Pd(t,Hd,""),t=Pd(t,$d,"$1")),t=Pd(t,Kd,""),n=Wn(t);f<=n.length;){switch(o=n[f],c){case ng:if(!o||!Sd(Nd,o)){if(e)return Md;c=ig;continue}l+=Id(o),c=og;break;case og:if(o&&(Sd(Cd,o)||"+"===o||"-"===o||"."===o))l+=Id(o);else{if(":"!==o){if(e)return Md;l="",c=ig,f=0;continue}if(e&&(s.isSpecial()!==ut(Zd,l)||"file"===l&&(s.includesCredentials()||null!==s.port)||"file"===s.scheme&&!s.host))return;if(s.scheme=l,e)return void(s.isSpecial()&&Zd[s.scheme]===s.port&&(s.port=null));l="","file"===s.scheme?c=gg:s.isSpecial()&&r&&r.scheme===s.scheme?c=ag:s.isSpecial()?c=fg:"/"===n[f+1]?(c=ug,f++):(s.cannotBeABaseURL=!0,Rd(s.path,""),c=Sg)}break;case ig:if(!r||r.cannotBeABaseURL&&"#"!==o)return Md;if(r.cannotBeABaseURL&&"#"===o){s.scheme=r.scheme,s.path=vo(r.path),s.query=r.query,s.fragment="",s.cannotBeABaseURL=!0,c=Og;break}c="file"===r.scheme?gg:sg;continue;case ag:if("/"!==o||"/"!==n[f+1]){c=sg;continue}c=lg,f++;break;case ug:if("/"===o){c=hg;break}c=wg;continue;case sg:if(s.scheme=r.scheme,o===Wv)s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query=r.query;else if("/"===o||"\\"===o&&s.isSpecial())c=cg;else if("?"===o)s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query="",c=Eg;else{if("#"!==o){s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.path.length--,c=wg;continue}s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,s.path=vo(r.path),s.query=r.query,s.fragment="",c=Og}break;case cg:if(!s.isSpecial()||"/"!==o&&"\\"!==o){if("/"!==o){s.username=r.username,s.password=r.password,s.host=r.host,s.port=r.port,c=wg;continue}c=hg}else c=lg;break;case fg:if(c=lg,"/"!==o||"/"!==wd(l,f+1))continue;f++;break;case lg:if("/"!==o&&"\\"!==o){c=hg;continue}break;case hg:if("@"===o){h&&(l="%40"+l),h=!0,i=Wn(l);for(var d=0;d65535)return Ud;s.port=s.isSpecial()&&m===Zd[s.scheme]?null:m,l=""}if(e)return;c=bg;continue}return Ud}l+=o;break;case gg:if(s.scheme="file","/"===o||"\\"===o)c=yg;else{if(!r||"file"!==r.scheme){c=wg;continue}switch(o){case Wv:s.host=r.host,s.path=vo(r.path),s.query=r.query;break;case"?":s.host=r.host,s.path=vo(r.path),s.query="",c=Eg;break;case"#":s.host=r.host,s.path=vo(r.path),s.query=r.query,s.fragment="",c=Og;break;default:eg(Ed(vo(n,f),""))||(s.host=r.host,s.path=vo(r.path),s.shortenPath()),c=wg;continue}}break;case yg:if("/"===o||"\\"===o){c=mg;break}r&&"file"===r.scheme&&!eg(Ed(vo(n,f),""))&&(tg(r.path[0],!0)?Rd(s.path,r.path[0]):s.host=r.host),c=wg;continue;case mg:if(o===Wv||"/"===o||"\\"===o||"?"===o||"#"===o){if(!e&&tg(l))c=wg;else if(""===l){if(s.host="",e)return;c=bg}else{if(a=s.parseHost(l))return a;if("localhost"===s.host&&(s.host=""),e)return;l="",c=bg}continue}l+=o;break;case bg:if(s.isSpecial()){if(c=wg,"/"!==o&&"\\"!==o)continue}else if(e||"?"!==o)if(e||"#"!==o){if(o!==Wv&&(c=wg,"/"!==o))continue}else s.fragment="",c=Og;else s.query="",c=Eg;break;case wg:if(o===Wv||"/"===o||"\\"===o&&s.isSpecial()||!e&&("?"===o||"#"===o)){if(".."===(u=Id(u=l))||"%2e."===u||".%2e"===u||"%2e%2e"===u?(s.shortenPath(),"/"===o||"\\"===o&&s.isSpecial()||Rd(s.path,"")):rg(l)?"/"===o||"\\"===o&&s.isSpecial()||Rd(s.path,""):("file"===s.scheme&&!s.path.length&&tg(l)&&(s.host&&(s.host=""),l=wd(l,0)+":"),Rd(s.path,l)),l="","file"===s.scheme&&(o===Wv||"?"===o||"#"===o))for(;s.path.length>1&&""===s.path[0];)Ad(s.path);"?"===o?(s.query="",c=Eg):"#"===o&&(s.fragment="",c=Og)}else l+=Qd(o,Xd);break;case Sg:"?"===o?(s.query="",c=Eg):"#"===o?(s.fragment="",c=Og):o!==Wv&&(s.path[0]+=Qd(o,Vd));break;case Eg:e||"#"!==o?o!==Wv&&("'"===o&&s.isSpecial()?s.query+="%27":s.query+="#"===o?"%23":Qd(o,Vd)):(s.fragment="",c=Og);break;case Og:o!==Wv&&(s.fragment+=Qd(o,Yd))}f++}},parseHost:function(t){var e,r,n;if("["===wd(t,0)){if("]"!==wd(t,t.length-1))return Ld;if(e=function(t){var e,r,n,o,i,a,u,s=[0,0,0,0,0,0,0,0],c=0,f=null,l=0,h=function(){return wd(t,l)};if(":"===h()){if(":"!==wd(t,1))return;l+=2,f=++c}for(;h();){if(8===c)return;if(":"!==h()){for(e=r=0;r<4&&Sd(zd,h());)e=16*e+yd(h(),16),l++,r++;if("."===h()){if(0===r)return;if(l-=r,c>6)return;for(n=0;h();){if(o=null,n>0){if(!("."===h()&&n<4))return;l++}if(!Sd(_d,h()))return;for(;Sd(_d,h());){if(i=yd(h(),10),null===o)o=i;else{if(0===o)return;o=10*o+i}if(o>255)return;l++}s[c]=256*s[c]+o,2!=++n&&4!==n||c++}if(4!==n)return;break}if(":"===h()){if(l++,!h())return}else if(h())return;s[c++]=e}else{if(null!==f)return;l++,f=++c}}if(null!==f)for(a=c-f,c=7;0!==c&&a>0;)u=s[c],s[c--]=s[f+a-1],s[f+--a]=u;else if(8!==c)return;return s}(kd(t,1,-1)),!e)return Ld;this.host=e}else if(this.isSpecial()){if(t=function(t){var e,r,n=[],o=id(od(ad(t),Yv,"."),".");for(e=0;e4)return t;for(r=[],n=0;n1&&"0"===wd(o,0)&&(i=Sd(Fd,o)?16:8,o=kd(o,8===i?1:2)),""===o)a=0;else{if(!Sd(10===i?Dd:8===i?Bd:zd,o))return t;a=yd(o,i)}Rd(r,a)}for(n=0;n=bd(256,5-e))return null}else if(a>255)return null;for(u=xd(r),n=0;n1?arguments[1]:void 0,n=ld(e,new xg(t,!1,r));u||(e.href=n.serialize(),e.origin=n.getOrigin(),e.protocol=n.getProtocol(),e.username=n.getUsername(),e.password=n.getPassword(),e.host=n.getHost(),e.hostname=n.getHostname(),e.port=n.getPort(),e.pathname=n.getPathname(),e.search=n.getSearch(),e.searchParams=n.getSearchParams(),e.hash=n.getHash())},Pg=Rg.prototype,Ag=function(t,e){return{get:function(){return hd(this)[t]()},set:e&&function(t){return hd(this)[e](t)},configurable:!0,enumerable:!0}};if(u&&(so(Pg,"href",Ag("serialize","setHref")),so(Pg,"origin",Ag("getOrigin")),so(Pg,"protocol",Ag("getProtocol","setProtocol")),so(Pg,"username",Ag("getUsername","setUsername")),so(Pg,"password",Ag("getPassword","setPassword")),so(Pg,"host",Ag("getHost","setHost")),so(Pg,"hostname",Ag("getHostname","setHostname")),so(Pg,"port",Ag("getPort","setPort")),so(Pg,"pathname",Ag("getPathname","setPathname")),so(Pg,"search",Ag("getSearch","setSearch")),so(Pg,"searchParams",Ag("getSearchParams")),so(Pg,"hash",Ag("getHash","setHash"))),ie(Pg,"toJSON",function(){return hd(this).serialize()},{enumerable:!0}),ie(Pg,"toString",function(){return hd(this).serialize()},{enumerable:!0}),dd){var jg=dd.createObjectURL,kg=dd.revokeObjectURL;jg&&ie(Rg,"createObjectURL",ar(jg,dd)),kg&&ie(Rg,"revokeObjectURL",ar(kg,dd))}an(Rg,"URL"),Ce({global:!0,constructor:!0,forced:!Mp,sham:!u},{URL:Rg});var Ig=L("URL"),Tg=Mp&&a(function(){Ig.canParse()}),Mg=a(function(){return 1!==Ig.canParse.length});Ce({target:"URL",stat:!0,forced:!Tg||Mg},{canParse:function(t){var e=Up(arguments.length,1),r=Wr(t),n=e<2||void 0===arguments[1]?void 0:Wr(arguments[1]);try{return!!new Ig(r,n)}catch(t){return!1}}});var Lg=L("URL");Ce({target:"URL",stat:!0,forced:!Mp},{parse:function(t){var e=Up(arguments.length,1),r=Wr(t),n=e<2||void 0===arguments[1]?void 0:Wr(arguments[1]);try{return new Lg(r,n)}catch(t){return null}}}),Ce({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return f(URL.prototype.toString,this)}});var Ug=WeakMap.prototype,Ng={WeakMap:WeakMap,set:b(Ug.set),get:b(Ug.get),has:b(Ug.has),remove:b(Ug.delete)},Cg=Ng.has,_g=function(t){return Cg(t),t},Fg=Ng.get,Bg=Ng.has,Dg=Ng.set;Ce({target:"WeakMap",proto:!0,real:!0,forced:!0},{emplace:function(t,e){var r,n,o=_g(this);return Bg(o,t)?(r=Fg(o,t),"update"in e&&(r=e.update(r,t,o),Dg(o,t,r)),r):(n=e.insert(t,o),Dg(o,t,n),n)}}),Ce({target:"WeakMap",stat:!0,forced:!0},{from:ei(Ng.WeakMap,Ng.set,!0)}),Ce({target:"WeakMap",stat:!0,forced:!0},{of:ri(Ng.WeakMap,Ng.set,!0)});var zg=Ng.remove;Ce({target:"WeakMap",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=_g(this),r=!0,n=0,o=arguments.length;n2&&(n=r,M(o=arguments[2])&&"cause"in o&&_t(n,"cause",o.cause));var s=[];return Ao(t,ny,{that:s}),_t(r,"errors",s),r};dn?dn(oy,ry):Ae(oy,ry,{name:!0});var iy=oy.prototype=Ve(ry.prototype,{constructor:d(1,oy),message:d(1,""),name:d(1,"AggregateError")});Ce({global:!0,constructor:!0,arity:2},{AggregateError:oy});var ay,uy,sy,cy,fy=function(t){return _.slice(0,t.length)===t},ly=fy("Bun/")?"BUN":fy("Cloudflare-Workers")?"CLOUDFLARE":fy("Deno/")?"DENO":fy("Node.js/")?"NODE":i.Bun&&"string"==typeof Bun.version?"BUN":i.Deno&&"object"==typeof Deno.version?"DENO":"process"===E(i.process)?"NODE":i.window&&i.document?"BROWSER":"REST",hy="NODE"===ly,py=/(?:ipad|iphone|ipod).*applewebkit/i.test(_),vy=i.setImmediate,dy=i.clearImmediate,gy=i.process,yy=i.Dispatch,my=i.Function,by=i.MessageChannel,wy=i.String,Sy=0,Ey={},Oy="onreadystatechange";a(function(){ay=i.location});var xy=function(t){if(ut(Ey,t)){var e=Ey[t];delete Ey[t],e()}},Ry=function(t){return function(){xy(t)}},Py=function(t){xy(t.data)},Ay=function(t){i.postMessage(wy(t),ay.protocol+"//"+ay.host)};vy&&dy||(vy=function(t){Up(arguments.length,1);var e=T(t)?t:my(t),r=vo(arguments,1);return Ey[++Sy]=function(){Ra(e,void 0,r)},uy(Sy),Sy},dy=function(t){delete Ey[t]},hy?uy=function(t){gy.nextTick(Ry(t))}:yy&&yy.now?uy=function(t){yy.now(Ry(t))}:by&&!py?(cy=(sy=new by).port2,sy.port1.onmessage=Py,uy=ar(cy.postMessage,cy)):i.addEventListener&&T(i.postMessage)&&!i.importScripts&&ay&&"file:"!==ay.protocol&&!a(Ay)?(uy=Ay,i.addEventListener("message",Py,!1)):uy=Oy in Et("script")?function(t){De.appendChild(Et("script"))[Oy]=function(){De.removeChild(this),xy(t)}}:function(t){setTimeout(Ry(t),0)});var jy={set:vy,clear:dy},ky=function(){this.head=null,this.tail=null};ky.prototype={add:function(t){var e={item:t,next:null},r=this.tail;r?r.next=e:this.head=e,this.tail=e},get:function(){var t=this.head;if(t)return null===(this.head=t.next)&&(this.tail=null),t.item}};var Iy,Ty,My,Ly,Uy,Ny=ky,Cy=/ipad|iphone|ipod/i.test(_)&&"undefined"!=typeof Pebble,_y=/web0s(?!.*chrome)/i.test(_),Fy=jy.set,By=i.MutationObserver||i.WebKitMutationObserver,Dy=i.document,zy=i.process,Wy=i.Promise,qy=Ip("queueMicrotask");if(!qy){var Hy=new Ny,$y=function(){var t,e;for(hy&&(t=zy.domain)&&t.exit();e=Hy.get();)try{e()}catch(t){throw Hy.head&&Iy(),t}t&&t.enter()};py||hy||_y||!By||!Dy?!Cy&&Wy&&Wy.resolve?((Ly=Wy.resolve(void 0)).constructor=Wy,Uy=ar(Ly.then,Ly),Iy=function(){Uy($y)}):hy?Iy=function(){zy.nextTick($y)}:(Fy=ar(Fy,i),Iy=function(){Fy($y)}):(Ty=!0,My=Dy.createTextNode(""),new By($y).observe(My,{characterData:!0}),Iy=function(){My.data=Ty=!Ty}),qy=function(t){Hy.head||Iy(),Hy.add(t)}}var Ky,Gy,Vy,Yy=qy,Xy=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}},Jy=i.Promise,Qy=dt("species"),Zy=!1,tm=T(i.PromiseRejectionEvent),em=Ue("Promise",function(){var t=Kt(Jy),e=t!==String(Jy);if(!e&&66===W)return!0;if(!W||W<51||!/native code/.test(t)){var r=new Jy(function(t){t(1)}),n=function(t){t(function(){},function(){})};if((r.constructor={})[Qy]=n,!(Zy=r.then(function(){})instanceof n))return!0}return!(e||"BROWSER"!==ly&&"DENO"!==ly||tm)}),rm={CONSTRUCTOR:em,REJECTION_EVENT:tm,SUBCLASSING:Zy},nm=TypeError,om=function(t){var e,r;this.promise=new t(function(t,n){if(void 0!==e||void 0!==r)throw new nm("Bad Promise constructor");e=t,r=n}),this.resolve=J(e),this.reject=J(r)},im={f:function(t){return new om(t)}},am=jy.set,um="Promise",sm=rm.CONSTRUCTOR,cm=rm.REJECTION_EVENT,fm=rm.SUBCLASSING,lm=ne.getterFor(um),hm=ne.set,pm=Jy&&Jy.prototype,vm=Jy,dm=pm,gm=i.TypeError,ym=i.document,mm=i.process,bm=im.f,wm=bm,Sm=!!(ym&&ym.createEvent&&i.dispatchEvent),Em="unhandledrejection",Om=function(t){var e;return!(!M(t)||!T(e=t.then))&&e},xm=function(t,e){var r,n,o,i=e.value,a=1===e.state,u=a?t.ok:t.fail,s=t.resolve,c=t.reject,l=t.domain;try{u?(a||(2===e.rejection&&km(e),e.rejection=1),!0===u?r=i:(l&&l.enter(),r=u(i),l&&(l.exit(),o=!0)),r===t.promise?c(new gm("Promise-chain cycle")):(n=Om(r))?f(n,r,s,c):s(r)):c(i)}catch(t){l&&!o&&l.exit(),c(t)}},Rm=function(t,e){t.notified||(t.notified=!0,Yy(function(){for(var r,n=t.reactions;r=n.get();)xm(r,t);t.notified=!1,e&&!t.rejection&&Am(t)}))},Pm=function(t,e,r){var n,o;Sm?((n=ym.createEvent("Event")).promise=e,n.reason=r,n.initEvent(t,!1,!0),i.dispatchEvent(n)):n={promise:e,reason:r},!cm&&(o=i["on"+t])?o(n):t===Em&&function(t,e){try{1===arguments.length?console.error(t):console.error(t,e)}catch(t){}}("Unhandled promise rejection",r)},Am=function(t){f(am,i,function(){var e,r=t.facade,n=t.value;if(jm(t)&&(e=Xy(function(){hy?mm.emit("unhandledRejection",n,r):Pm(Em,r,n)}),t.rejection=hy||jm(t)?2:1,e.error))throw e.value})},jm=function(t){return 1!==t.rejection&&!t.parent},km=function(t){f(am,i,function(){var e=t.facade;hy?mm.emit("rejectionHandled",e):Pm("rejectionhandled",e,t.value)})},Im=function(t,e,r){return function(n){t(e,n,r)}},Tm=function(t,e,r){t.done||(t.done=!0,r&&(t=r),t.value=e,t.state=2,Rm(t,!0))},Mm=function(t,e,r){if(!t.done){t.done=!0,r&&(t=r);try{if(t.facade===e)throw new gm("Promise can't be resolved itself");var n=Om(e);n?Yy(function(){var r={done:!1};try{f(n,e,Im(Mm,r,t),Im(Tm,r,t))}catch(e){Tm(r,e,t)}}):(t.value=e,t.state=1,Rm(t,!1))}catch(e){Tm({done:!1},e,t)}}};if(sm&&(vm=function(t){ko(this,dm),J(t),f(Ky,this);var e=lm(this);try{t(Im(Mm,e),Im(Tm,e))}catch(t){Tm(e,t)}},(Ky=function(t){hm(this,{type:um,done:!1,notified:!1,parent:!1,reactions:new Ny,rejection:!1,state:0,value:null})}).prototype=ie(dm=vm.prototype,"then",function(t,e){var r=lm(this),n=bm(Cc(this,vm));return r.parent=!0,n.ok=!T(t)||t,n.fail=T(e)&&e,n.domain=hy?mm.domain:void 0,0===r.state?r.reactions.add(n):Yy(function(){xm(n,r)}),n.promise}),Gy=function(){var t=new Ky,e=lm(t);this.promise=t,this.resolve=Im(Mm,e),this.reject=Im(Tm,e)},im.f=bm=function(t){return t===vm||void 0===t?new Gy(t):wm(t)},T(Jy)&&pm!==Object.prototype)){Vy=pm.then,fm||ie(pm,"then",function(t,e){var r=this;return new vm(function(t,e){f(Vy,r,t,e)}).then(t,e)},{unsafe:!0});try{delete pm.constructor}catch(t){}dn&&dn(pm,dm)}Ce({global:!0,constructor:!0,wrap:!0,forced:sm},{Promise:vm}),an(vm,um,!1),Uo(um);var Lm=rm.CONSTRUCTOR||!Gn(function(t){Jy.all(t).then(void 0,function(){})});Ce({target:"Promise",stat:!0,forced:Lm},{all:function(t){var e=this,r=im.f(e),n=r.resolve,o=r.reject,i=Xy(function(){var r=J(e.resolve),i=[],a=0,u=1;Ao(t,function(t){var s=a++,c=!1;u++,f(r,e,t).then(function(t){c||(c=!0,i[s]=t,--u||n(i))},o)}),--u||n(i)});return i.error&&o(i.value),r.promise}});var Um=Jy&&Jy.prototype;if(Ce({target:"Promise",proto:!0,forced:rm.CONSTRUCTOR,real:!0},{catch:function(t){return this.then(void 0,t)}}),T(Jy)){var Nm=L("Promise").prototype.catch;Um.catch!==Nm&&ie(Um,"catch",Nm,{unsafe:!0})}Ce({target:"Promise",stat:!0,forced:Lm},{race:function(t){var e=this,r=im.f(e),n=r.reject,o=Xy(function(){var o=J(e.resolve);Ao(t,function(t){f(o,e,t).then(r.resolve,n)})});return o.error&&n(o.value),r.promise}}),Ce({target:"Promise",stat:!0,forced:rm.CONSTRUCTOR},{reject:function(t){var e=im.f(this);return(0,e.reject)(t),e.promise}});var Cm=function(t,e){if(kt(t),M(e)&&e.constructor===t)return e;var r=im.f(t);return(0,r.resolve)(e),r.promise};Ce({target:"Promise",stat:!0,forced:rm.CONSTRUCTOR},{resolve:function(t){return Cm(this,t)}}),Ce({target:"Promise",stat:!0,forced:Lm},{allSettled:function(t){var e=this,r=im.f(e),n=r.resolve,o=r.reject,i=Xy(function(){var r=J(e.resolve),o=[],i=0,a=1;Ao(t,function(t){var u=i++,s=!1;a++,f(r,e,t).then(function(t){s||(s=!0,o[u]={status:"fulfilled",value:t},--a||n(o))},function(t){s||(s=!0,o[u]={status:"rejected",reason:t},--a||n(o))})}),--a||n(o)});return i.error&&o(i.value),r.promise}});var _m="No one promise resolved";Ce({target:"Promise",stat:!0,forced:Lm},{any:function(t){var e=this,r=L("AggregateError"),n=im.f(e),o=n.resolve,i=n.reject,a=Xy(function(){var n=J(e.resolve),a=[],u=0,s=1,c=!1;Ao(t,function(t){var l=u++,h=!1;s++,f(n,e,t).then(function(t){h||c||(c=!0,o(t))},function(t){h||c||(h=!0,a[l]=t,--s||i(new r(a,_m)))})}),--s||i(new r(a,_m))});return a.error&&i(a.value),n.promise}}),Ce({target:"Promise",stat:!0},{withResolvers:function(){var t=im.f(this);return{promise:t.promise,resolve:t.resolve,reject:t.reject}}});var Fm=Jy&&Jy.prototype,Bm=!!Jy&&a(function(){Fm.finally.call({then:function(){}},function(){})});if(Ce({target:"Promise",proto:!0,real:!0,forced:Bm},{finally:function(t){var e=Cc(this,L("Promise")),r=T(t);return this.then(r?function(r){return Cm(e,t()).then(function(){return r})}:t,r?function(r){return Cm(e,t()).then(function(){throw r})}:t)}}),T(Jy)){var Dm=L("Promise").prototype.finally;Fm.finally!==Dm&&ie(Fm,"finally",Dm,{unsafe:!0})}var zm=i.Promise,Wm=!1,qm=!zm||!zm.try||Xy(function(){zm.try(function(t){Wm=8===t},8)}).error||!Wm;Ce({target:"Promise",stat:!0,forced:qm},{try:function(t){var e=arguments.length>1?vo(arguments,1):[],r=im.f(this),n=Xy(function(){return Ra(J(t),void 0,e)});return(n.error?r.reject:r.resolve)(n.value),r.promise}}),Ze("Promise","finally");var Hm="URLSearchParams"in self,$m="Symbol"in self&&"iterator"in Symbol,Km="FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(t){return!1}}(),Gm="FormData"in self,Vm="ArrayBuffer"in self;if(Vm)var Ym=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],Xm=ArrayBuffer.isView||function(t){return t&&Ym.indexOf(Object.prototype.toString.call(t))>-1};function Jm(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function Qm(t){return"string"!=typeof t&&(t=String(t)),t}function Zm(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return $m&&(e[Symbol.iterator]=function(){return e}),e}function tb(t){this.map={},t instanceof tb?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function eb(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function rb(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function nb(t){var e=new FileReader,r=rb(e);return e.readAsArrayBuffer(t),r}function ob(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function ib(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:Km&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:Gm&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:Hm&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():Vm&&Km&&(e=t)&&DataView.prototype.isPrototypeOf(e)?(this._bodyArrayBuffer=ob(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):Vm&&(ArrayBuffer.prototype.isPrototypeOf(t)||Xm(t))?this._bodyArrayBuffer=ob(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):Hm&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},Km&&(this.blob=function(){var t=eb(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?eb(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(nb)}),this.text=function(){var t=eb(this);if(t)return t;if(this._bodyBlob)return function(t){var e=new FileReader,r=rb(e);return e.readAsText(t),r}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?e:t}(e.method||this.method||"GET"),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&r)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(r)}function sb(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function cb(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new tb(e.headers),this.url=e.url||"",this._initBody(t)}ub.prototype.clone=function(){return new ub(this,{body:this._bodyInit})},ib.call(ub.prototype),ib.call(cb.prototype),cb.prototype.clone=function(){return new cb(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new tb(this.headers),url:this.url})},cb.error=function(){var t=new cb(null,{status:0,statusText:""});return t.type="error",t};var fb=[301,302,303,307,308];cb.redirect=function(t,e){if(-1===fb.indexOf(e))throw new RangeError("Invalid status code");return new cb(null,{status:e,headers:{location:t}})};var lb=self.DOMException;try{new lb}catch(t){(lb=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),lb.prototype.constructor=lb}function hb(t,e){return new Promise(function(r,n){var o=new ub(t,e);if(o.signal&&o.signal.aborted)return n(new lb("Aborted","AbortError"));var i=new XMLHttpRequest;function a(){i.abort()}i.onload=function(){var t,e,n={status:i.status,statusText:i.statusText,headers:(t=i.getAllResponseHeaders()||"",e=new tb,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();e.append(n,o)}}),e)};n.url="responseURL"in i?i.responseURL:n.headers.get("X-Request-URL"),r(new cb("response"in i?i.response:i.responseText,n))},i.onerror=function(){n(new TypeError("Network request failed"))},i.ontimeout=function(){n(new TypeError("Network request failed"))},i.onabort=function(){n(new lb("Aborted","AbortError"))},i.open(o.method,o.url,!0),"include"===o.credentials?i.withCredentials=!0:"omit"===o.credentials&&(i.withCredentials=!1),"responseType"in i&&Km&&(i.responseType="blob"),o.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),o.signal&&(o.signal.addEventListener("abort",a),i.onreadystatechange=function(){4===i.readyState&&o.signal.removeEventListener("abort",a)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})}hb.polyfill=!0,self.fetch||(self.fetch=hb,self.Headers=tb,self.Request=ub,self.Response=cb);var pb=Object.getOwnPropertySymbols,vb=Object.prototype.hasOwnProperty,db=Object.prototype.propertyIsEnumerable,gb=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(t){n[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r,n,o=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),i=1;i = ParamMap[Route] + +interface LayoutSlotMap { + "/": never +} + + +export type { AppRoutes, PageRoutes, LayoutRoutes, RedirectRoutes, RewriteRoutes, ParamMap, AppRouteHandlerRoutes } + +declare global { + /** + * Props for Next.js App Router page components + * @example + * ```tsx + * export default function Page(props: PageProps<'/blog/[slug]'>) { + * const { slug } = await props.params + * return
Blog post: {slug}
+ * } + * ``` + */ + interface PageProps { + params: Promise + searchParams: Promise> + } + + /** + * Props for Next.js App Router layout components + * @example + * ```tsx + * export default function Layout(props: LayoutProps<'/dashboard'>) { + * return
{props.children}
+ * } + * ``` + */ + type LayoutProps = { + params: Promise + children: React.ReactNode + } & { + [K in LayoutSlotMap[LayoutRoute]]: React.ReactNode + } + + /** + * Context for Next.js App Router route handlers + * @example + * ```tsx + * export async function GET(request: NextRequest, context: RouteContext<'/api/users/[id]'>) { + * const { id } = await context.params + * return Response.json({ id }) + * } + * ``` + */ + interface RouteContext { + params: Promise + } +} diff --git a/superlog/apps/sample/.next/types/validator.ts b/superlog/apps/sample/.next/types/validator.ts new file mode 100644 index 0000000000000000000000000000000000000000..e0bba3fb1f463cbfac59a1f9d815528d41a7db24 --- /dev/null +++ b/superlog/apps/sample/.next/types/validator.ts @@ -0,0 +1,97 @@ +// This file is generated automatically by Next.js +// Do not edit this file manually +// This file validates that all pages and layouts export the correct types + +import type { AppRoutes, LayoutRoutes, ParamMap, AppRouteHandlerRoutes } from "./routes.js" +import type { ResolvingMetadata, ResolvingViewport } from "next/types.js" +import type { NextRequest } from 'next/server.js' + +type AppPageConfig = { + default: React.ComponentType<{ params: Promise } & any> | ((props: { params: Promise } & any) => React.ReactNode | Promise | never | void | Promise) + generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise | any[] + generateMetadata?: ( + props: { params: Promise } & any, + parent: ResolvingMetadata + ) => Promise | any + generateViewport?: ( + props: { params: Promise } & any, + parent: ResolvingViewport + ) => Promise | any + metadata?: any + viewport?: any +} + +type LayoutConfig = { + default: React.ComponentType> | ((props: LayoutProps) => React.ReactNode | Promise | never | void | Promise) + generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise | any[] + generateMetadata?: ( + props: { params: Promise } & any, + parent: ResolvingMetadata + ) => Promise | any + generateViewport?: ( + props: { params: Promise } & any, + parent: ResolvingViewport + ) => Promise | any + metadata?: any + viewport?: any +} + +type RouteHandlerConfig = { + GET?: (request: NextRequest, context: { params: Promise }) => Promise | Response | void + POST?: (request: NextRequest, context: { params: Promise }) => Promise | Response | void + PUT?: (request: NextRequest, context: { params: Promise }) => Promise | Response | void + PATCH?: (request: NextRequest, context: { params: Promise }) => Promise | Response | void + DELETE?: (request: NextRequest, context: { params: Promise }) => Promise | Response | void + HEAD?: (request: NextRequest, context: { params: Promise }) => Promise | Response | void + OPTIONS?: (request: NextRequest, context: { params: Promise }) => Promise | Response | void +} + + +// Validate ../../app/page.tsx +{ + type __IsExpected> = Specific + const handler = {} as typeof import("../../app/page.js") + type __Check = __IsExpected + // @ts-ignore + type __Unused = __Check +} + +// Validate ../../app/api/broken/route.ts +{ + type __IsExpected> = Specific + const handler = {} as typeof import("../../app/api/broken/route.js") + type __Check = __IsExpected + // @ts-ignore + type __Unused = __Check +} + +// Validate ../../app/api/broken2/route.ts +{ + type __IsExpected> = Specific + const handler = {} as typeof import("../../app/api/broken2/route.js") + type __Check = __IsExpected + // @ts-ignore + type __Unused = __Check +} + +// Validate ../../app/api/healthy/route.ts +{ + type __IsExpected> = Specific + const handler = {} as typeof import("../../app/api/healthy/route.js") + type __Check = __IsExpected + // @ts-ignore + type __Unused = __Check +} + + + + + +// Validate ../../app/layout.tsx +{ + type __IsExpected> = Specific + const handler = {} as typeof import("../../app/layout.js") + type __Check = __IsExpected + // @ts-ignore + type __Unused = __Check +} diff --git a/superlog/apps/sample/app/api/broken/route.ts b/superlog/apps/sample/app/api/broken/route.ts new file mode 100644 index 0000000000000000000000000000000000000000..29ed8ce622bfd35d92f3ae012509b5d33496ab9e --- /dev/null +++ b/superlog/apps/sample/app/api/broken/route.ts @@ -0,0 +1,14 @@ +import { trace, SpanStatusCode } from "@opentelemetry/api"; + +const tracer = trace.getTracer("@superlog/sample"); + +export async function GET() { + return tracer.startActiveSpan("demo.fail", (span) => { + span.setAttribute("demo.kind", "thrown-error"); + const err = new Error("sample: deliberately broken endpoint"); + span.recordException(err); + span.setStatus({ code: SpanStatusCode.ERROR, message: err.message }); + span.end(); + throw err; + }); +} diff --git a/superlog/apps/sample/app/api/broken2/route.ts b/superlog/apps/sample/app/api/broken2/route.ts new file mode 100644 index 0000000000000000000000000000000000000000..1b30538307f9a66e74bf50e56c2bdd7bd77862f1 --- /dev/null +++ b/superlog/apps/sample/app/api/broken2/route.ts @@ -0,0 +1,21 @@ +import { trace, SpanStatusCode } from "@opentelemetry/api"; + +const tracer = trace.getTracer("@superlog/sample"); + +export async function GET() { + return tracer.startActiveSpan("demo.null-deref", (span) => { + span.setAttribute("demo.kind", "null-deref"); + try { + const obj = null as unknown as { name: string }; + const body = { name: obj.name }; + span.setStatus({ code: SpanStatusCode.OK }); + return Response.json(body); + } catch (err) { + span.recordException(err as Error); + span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message }); + throw err; + } finally { + span.end(); + } + }); +} diff --git a/superlog/apps/sample/app/api/healthy/route.ts b/superlog/apps/sample/app/api/healthy/route.ts new file mode 100644 index 0000000000000000000000000000000000000000..685ed3d78131030ab61c87d79fdfa005a1acdfe2 --- /dev/null +++ b/superlog/apps/sample/app/api/healthy/route.ts @@ -0,0 +1,16 @@ +import { trace, SpanStatusCode } from "@opentelemetry/api"; + +const tracer = trace.getTracer("@superlog/sample"); + +export async function GET() { + return tracer.startActiveSpan("healthcheck.serve", async (span) => { + try { + span.setAttribute("healthcheck.kind", "ok"); + const body = { ok: true }; + span.setStatus({ code: SpanStatusCode.OK }); + return Response.json(body); + } finally { + span.end(); + } + }); +} diff --git a/superlog/apps/sample/app/layout.tsx b/superlog/apps/sample/app/layout.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c61315203deb98cc1c31f0eeeafb3f3d94916218 --- /dev/null +++ b/superlog/apps/sample/app/layout.tsx @@ -0,0 +1,9 @@ +export const metadata = { title: "superlog-sample" }; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/superlog/apps/sample/app/page.tsx b/superlog/apps/sample/app/page.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4fc3224b16a8b1f5e43f3ea36893fd8befe594fb --- /dev/null +++ b/superlog/apps/sample/app/page.tsx @@ -0,0 +1,18 @@ +import Link from "next/link"; + +export default function Home() { + return ( +
+

superlog-sample

+

Trigger API routes to generate telemetry.

+
    +
  • + GET /api/healthy +
  • +
  • + GET /api/broken (throws) +
  • +
+
+ ); +} diff --git a/superlog/apps/sample/instrumentation.ts b/superlog/apps/sample/instrumentation.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f14ff54e89242fb18c5e5b83e3466dd9c70509b --- /dev/null +++ b/superlog/apps/sample/instrumentation.ts @@ -0,0 +1,5 @@ +import { registerOTel } from "@vercel/otel"; + +export function register() { + registerOTel({ serviceName: "superlog-sample-nextjs" }); +} diff --git a/superlog/apps/sample/next-env.d.ts b/superlog/apps/sample/next-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..830fb594ca2970a827555c28a253b097367e08d8 --- /dev/null +++ b/superlog/apps/sample/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/superlog/apps/sample/next.config.ts b/superlog/apps/sample/next.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..dbedcdb5c9890804f566c664f54ddeb03af24515 --- /dev/null +++ b/superlog/apps/sample/next.config.ts @@ -0,0 +1,5 @@ +import type { NextConfig } from "next"; + +const config: NextConfig = {}; + +export default config; diff --git a/superlog/apps/sample/node_modules/.bin/next b/superlog/apps/sample/node_modules/.bin/next new file mode 100644 index 0000000000000000000000000000000000000000..43f77190e8c765e42344cfe206e0493d0572c147 --- /dev/null +++ b/superlog/apps/sample/node_modules/.bin/next @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/next/dist/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/next/dist/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/next/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/next/dist/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/next/dist/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/next/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/next@15.5.15_@babel+core@7.29.0_@opentelemetry+api@1.9.1_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../next/dist/bin/next" "$@" +else + exec node "$basedir/../next/dist/bin/next" "$@" +fi diff --git a/superlog/apps/sample/node_modules/.bin/tsc b/superlog/apps/sample/node_modules/.bin/tsc new file mode 100644 index 0000000000000000000000000000000000000000..5a3027f858d7058aef8886d341f0b32c85ab95db --- /dev/null +++ b/superlog/apps/sample/node_modules/.bin/tsc @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" +else + exec node "$basedir/../typescript/bin/tsc" "$@" +fi diff --git a/superlog/apps/sample/node_modules/.bin/tsserver b/superlog/apps/sample/node_modules/.bin/tsserver new file mode 100644 index 0000000000000000000000000000000000000000..95999db035aafe7ad567730b16e83c6114b243ae --- /dev/null +++ b/superlog/apps/sample/node_modules/.bin/tsserver @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" +else + exec node "$basedir/../typescript/bin/tsserver" "$@" +fi diff --git a/superlog/apps/sample/package.json b/superlog/apps/sample/package.json new file mode 100644 index 0000000000000000000000000000000000000000..9e19780aa7cc52b83dddbce6d16c74e3256be0d7 --- /dev/null +++ b/superlog/apps/sample/package.json @@ -0,0 +1,25 @@ +{ + "name": "@superlog/sample", + "version": "0.0.0", + "private": true, + "license": "Apache-2.0", + "scripts": { + "dev": "next dev --port 3005", + "build": "next build", + "start": "next start --port 3005", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@vercel/otel": "^1.10.4", + "next": "^15.1.3", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^22.10.1", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", + "typescript": "^5.7.2" + } +} diff --git a/superlog/apps/sample/tsconfig.json b/superlog/apps/sample/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..afedc7443c025f9c9dc4013d63316e5a8adb74e9 --- /dev/null +++ b/superlog/apps/sample/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [{ "name": "next" }], + "paths": { "@/*": ["./*"] } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/superlog/apps/web/.gitignore b/superlog/apps/web/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..4c49bd78f1d08f2bc09fa0bd8191ed38b7dce5e3 --- /dev/null +++ b/superlog/apps/web/.gitignore @@ -0,0 +1 @@ +.env diff --git a/superlog/apps/web/Dockerfile b/superlog/apps/web/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..beb78c5df015abaeefcd94ba593a802ac0bbc3d5 --- /dev/null +++ b/superlog/apps/web/Dockerfile @@ -0,0 +1,37 @@ +# Build context: repo root. Build with `docker build -f apps/web/Dockerfile .` +# VITE_* vars must be passed as build args (Vite inlines them at build time). +FROM node:20-slim AS build + +WORKDIR /app + +RUN corepack enable && corepack prepare pnpm@9.12.0 --activate + +COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./ +COPY apps/web/package.json apps/web/ + +RUN pnpm install --frozen-lockfile --filter @superlog/web... + +COPY tsconfig.base.json ./ +COPY apps/web apps/web + +ARG VITE_API_URL +ARG VITE_OTEL_EXPORTER_OTLP_ENDPOINT +ARG VITE_OTEL_EXPORTER_OTLP_HEADERS +ARG VITE_OTEL_SERVICE_NAME +ENV VITE_API_URL=$VITE_API_URL +ENV VITE_OTEL_EXPORTER_OTLP_ENDPOINT=$VITE_OTEL_EXPORTER_OTLP_ENDPOINT +ENV VITE_OTEL_EXPORTER_OTLP_HEADERS=$VITE_OTEL_EXPORTER_OTLP_HEADERS +ENV VITE_OTEL_SERVICE_NAME=$VITE_OTEL_SERVICE_NAME + +RUN pnpm --filter @superlog/web build + +FROM node:20-slim + +RUN npm install -g serve@14 + +COPY --from=build /app/apps/web/dist /app/dist + +ENV PORT=8080 +EXPOSE 8080 + +CMD ["sh", "-c", "serve -s /app/dist -l ${PORT}"] diff --git a/superlog/apps/web/index.html b/superlog/apps/web/index.html new file mode 100644 index 0000000000000000000000000000000000000000..be84cdafa65e9c81ca1154160ef2c7fa9136b73a --- /dev/null +++ b/superlog/apps/web/index.html @@ -0,0 +1,33 @@ + + + + + + superlog + + + + + + + + + + + +
+ + + diff --git a/superlog/apps/web/node_modules/.bin/autoprefixer b/superlog/apps/web/node_modules/.bin/autoprefixer new file mode 100644 index 0000000000000000000000000000000000000000..626a5e1021ae212ac7b40121bbf038c832448cdb --- /dev/null +++ b/superlog/apps/web/node_modules/.bin/autoprefixer @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/autoprefixer@10.5.0_postcss@8.5.10/node_modules/autoprefixer/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/autoprefixer@10.5.0_postcss@8.5.10/node_modules/autoprefixer/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/autoprefixer@10.5.0_postcss@8.5.10/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/autoprefixer@10.5.0_postcss@8.5.10/node_modules/autoprefixer/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/autoprefixer@10.5.0_postcss@8.5.10/node_modules/autoprefixer/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/autoprefixer@10.5.0_postcss@8.5.10/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../autoprefixer/bin/autoprefixer" "$@" +else + exec node "$basedir/../autoprefixer/bin/autoprefixer" "$@" +fi diff --git a/superlog/apps/web/node_modules/.bin/tailwind b/superlog/apps/web/node_modules/.bin/tailwind new file mode 100644 index 0000000000000000000000000000000000000000..ad84ef687c63bca44250a02a2f3f7e8ffe4360a3 --- /dev/null +++ b/superlog/apps/web/node_modules/.bin/tailwind @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/lib/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/lib/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../tailwindcss/lib/cli.js" "$@" +else + exec node "$basedir/../tailwindcss/lib/cli.js" "$@" +fi diff --git a/superlog/apps/web/node_modules/.bin/tailwindcss b/superlog/apps/web/node_modules/.bin/tailwindcss new file mode 100644 index 0000000000000000000000000000000000000000..ad84ef687c63bca44250a02a2f3f7e8ffe4360a3 --- /dev/null +++ b/superlog/apps/web/node_modules/.bin/tailwindcss @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/lib/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/lib/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules/tailwindcss/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../tailwindcss/lib/cli.js" "$@" +else + exec node "$basedir/../tailwindcss/lib/cli.js" "$@" +fi diff --git a/superlog/apps/web/node_modules/.bin/tsc b/superlog/apps/web/node_modules/.bin/tsc new file mode 100644 index 0000000000000000000000000000000000000000..5a3027f858d7058aef8886d341f0b32c85ab95db --- /dev/null +++ b/superlog/apps/web/node_modules/.bin/tsc @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@" +else + exec node "$basedir/../typescript/bin/tsc" "$@" +fi diff --git a/superlog/apps/web/node_modules/.bin/tsserver b/superlog/apps/web/node_modules/.bin/tsserver new file mode 100644 index 0000000000000000000000000000000000000000..95999db035aafe7ad567730b16e83c6114b243ae --- /dev/null +++ b/superlog/apps/web/node_modules/.bin/tsserver @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@" +else + exec node "$basedir/../typescript/bin/tsserver" "$@" +fi diff --git a/superlog/apps/web/node_modules/.bin/vite b/superlog/apps/web/node_modules/.bin/vite new file mode 100644 index 0000000000000000000000000000000000000000..9f667185c4f36cd3c1d029e39e4c4f3df20e8cde --- /dev/null +++ b/superlog/apps/web/node_modules/.bin/vite @@ -0,0 +1,17 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -z "$NODE_PATH" ]; then + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.17_jiti@1.21.7_tsx@4.21.0_yaml@2.8.3/node_modules/vite/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.17_jiti@1.21.7_tsx@4.21.0_yaml@2.8.3/node_modules/vite/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.17_jiti@1.21.7_tsx@4.21.0_yaml@2.8.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules" +else + export NODE_PATH="/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.17_jiti@1.21.7_tsx@4.21.0_yaml@2.8.3/node_modules/vite/bin/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.17_jiti@1.21.7_tsx@4.21.0_yaml@2.8.3/node_modules/vite/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.17_jiti@1.21.7_tsx@4.21.0_yaml@2.8.3/node_modules:/home/smlflg/Projekte/Experimente/superlog/node_modules/.pnpm/node_modules:$NODE_PATH" +fi +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../vite/bin/vite.js" "$@" +else + exec node "$basedir/../vite/bin/vite.js" "$@" +fi diff --git a/superlog/apps/web/node_modules/.vite/deps/@base-ui_react_tooltip.js b/superlog/apps/web/node_modules/.vite/deps/@base-ui_react_tooltip.js new file mode 100644 index 0000000000000000000000000000000000000000..d1ed603997344de9145ae75ba2bcb7af5acc8143 --- /dev/null +++ b/superlog/apps/web/node_modules/.vite/deps/@base-ui_react_tooltip.js @@ -0,0 +1,8133 @@ +import { + createSelectorCreator, + lruMemoize, + require_shim, + require_with_selector +} from "./chunk-7G4FR3AY.js"; +import { + require_react_dom +} from "./chunk-PIMRQMBW.js"; +import { + require_jsx_runtime +} from "./chunk-ANMYMG4I.js"; +import { + require_react +} from "./chunk-BYN7445N.js"; +import { + __export, + __publicField, + __toESM +} from "./chunk-KWPVD4H7.js"; + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/tooltip/index.parts.js +var index_parts_exports = {}; +__export(index_parts_exports, { + Arrow: () => TooltipArrow, + Handle: () => TooltipHandle, + Popup: () => TooltipPopup, + Portal: () => TooltipPortal, + Positioner: () => TooltipPositioner, + Provider: () => TooltipProvider, + Root: () => TooltipRoot, + Trigger: () => TooltipTrigger, + Viewport: () => TooltipViewport, + createHandle: () => createTooltipHandle +}); + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/tooltip/root/TooltipRoot.js +var React37 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/fastHooks.js +var React2 = __toESM(require_react()); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useRefWithInit.js +var React = __toESM(require_react(), 1); +var UNINITIALIZED = {}; +function useRefWithInit(init, initArg) { + const ref = React.useRef(UNINITIALIZED); + if (ref.current === UNINITIALIZED) { + ref.current = init(initArg); + } + return ref; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/fastHooks.js +var hooks = []; +var currentInstance = void 0; +function getInstance() { + return currentInstance; +} +function register(hook) { + hooks.push(hook); +} +function fastComponent(fn) { + const FastComponent = (props, forwardedRef) => { + const instance = useRefWithInit(createInstance).current; + let result; + try { + currentInstance = instance; + for (const hook of hooks) { + hook.before(instance); + } + result = fn(props, forwardedRef); + for (const hook of hooks) { + hook.after(instance); + } + instance.didInitialize = true; + } finally { + currentInstance = void 0; + } + return result; + }; + FastComponent.displayName = fn.displayName || fn.name; + return FastComponent; +} +function fastComponentRef(fn) { + return React2.forwardRef(fastComponent(fn)); +} +function createInstance() { + return { + didInitialize: false + }; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useOnFirstRender.js +var React3 = __toESM(require_react()); +function useOnFirstRender(fn) { + const ref = React3.useRef(true); + if (ref.current) { + ref.current = false; + fn(); + } +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useIsoLayoutEffect.js +var React4 = __toESM(require_react()); +var noop = () => { +}; +var useIsoLayoutEffect = typeof document !== "undefined" ? React4.useLayoutEffect : noop; + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/formatErrorMessage.js +function createFormatErrorMessage(baseUrl, prefix) { + return function formatErrorMessage2(code, ...args) { + const url = new URL(baseUrl); + url.searchParams.set("code", code.toString()); + args.forEach((arg) => url.searchParams.append("args[]", arg)); + return `${prefix} error #${code}; visit ${url} for the full message.`; + }; +} +var formatErrorMessage = createFormatErrorMessage("https://base-ui.com/production-error", "Base UI"); + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/tooltip/root/TooltipRootContext.js +var React5 = __toESM(require_react(), 1); +var TooltipRootContext = React5.createContext(void 0); +if (true) TooltipRootContext.displayName = "TooltipRootContext"; +function useTooltipRootContext(optional) { + const context = React5.useContext(TooltipRootContext); + if (context === void 0 && !optional) { + throw new Error(true ? "Base UI: TooltipRootContext is missing. Tooltip parts must be placed within ." : formatErrorMessage_default(72)); + } + return context; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingDelayGroup.js +var React7 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useOnMount.js +var React6 = __toESM(require_react(), 1); +var EMPTY = []; +function useOnMount(fn) { + React6.useEffect(fn, EMPTY); +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useTimeout.js +var EMPTY2 = 0; +var Timeout = class _Timeout { + constructor() { + __publicField(this, "currentId", EMPTY2); + __publicField(this, "clear", () => { + if (this.currentId !== EMPTY2) { + clearTimeout(this.currentId); + this.currentId = EMPTY2; + } + }); + __publicField(this, "disposeEffect", () => { + return this.clear; + }); + } + static create() { + return new _Timeout(); + } + /** + * Executes `fn` after `delay`, clearing any previously scheduled call. + */ + start(delay, fn) { + this.clear(); + this.currentId = setTimeout(() => { + this.currentId = EMPTY2; + fn(); + }, delay); + } + isStarted() { + return this.currentId !== EMPTY2; + } +}; +function useTimeout() { + const timeout = useRefWithInit(Timeout.create).current; + useOnMount(timeout.disposeEffect); + return timeout; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/detectBrowser.js +var hasNavigator = typeof navigator !== "undefined"; +var nav = getNavigatorData(); +var platform = getPlatform(); +var userAgent = getUserAgent(); +var isWebKit = typeof CSS === "undefined" || !CSS.supports ? false : CSS.supports("-webkit-backdrop-filter:none"); +var isIOS = ( + // iPads can claim to be MacIntel + nav.platform === "MacIntel" && nav.maxTouchPoints > 1 ? true : /iP(hone|ad|od)|iOS/.test(nav.platform) +); +var isFirefox = hasNavigator && /firefox/i.test(userAgent); +var isSafari = hasNavigator && /apple/i.test(navigator.vendor); +var isEdge = hasNavigator && /Edg/i.test(userAgent); +var isAndroid = hasNavigator && /android/i.test(platform) || /android/i.test(userAgent); +var isMac = hasNavigator && platform.toLowerCase().startsWith("mac") && !navigator.maxTouchPoints; +var isJSDOM = userAgent.includes("jsdom/"); +function getNavigatorData() { + if (!hasNavigator) { + return { + platform: "", + maxTouchPoints: -1 + }; + } + const uaData = navigator.userAgentData; + if (uaData == null ? void 0 : uaData.platform) { + return { + platform: uaData.platform, + maxTouchPoints: navigator.maxTouchPoints + }; + } + return { + platform: navigator.platform ?? "", + maxTouchPoints: navigator.maxTouchPoints ?? -1 + }; +} +function getUserAgent() { + if (!hasNavigator) { + return ""; + } + const uaData = navigator.userAgentData; + if (uaData && Array.isArray(uaData.brands)) { + return uaData.brands.map(({ + brand, + version: version2 + }) => `${brand}/${version2}`).join(" "); + } + return navigator.userAgent; +} +function getPlatform() { + if (!hasNavigator) { + return ""; + } + const uaData = navigator.userAgentData; + if (uaData == null ? void 0 : uaData.platform) { + return uaData.platform; + } + return navigator.platform ?? ""; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/event.js +function isReactEvent(event) { + return "nativeEvent" in event; +} +function isMouseLikePointerType(pointerType, strict) { + const values = ["mouse", "pen"]; + if (!strict) { + values.push("", void 0); + } + return values.includes(pointerType); +} +function isClickLikeEvent(event) { + const type = event.type; + return type === "click" || type === "mousedown" || type === "keydown" || type === "keyup"; +} + +// ../../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs +function hasWindow() { + return typeof window !== "undefined"; +} +function getNodeName(node) { + if (isNode(node)) { + return (node.nodeName || "").toLowerCase(); + } + return "#document"; +} +function getWindow(node) { + var _node$ownerDocument; + return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; +} +function getDocumentElement(node) { + var _ref; + return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; +} +function isNode(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Node || value instanceof getWindow(value).Node; +} +function isElement(value) { + if (!hasWindow()) { + return false; + } + return value instanceof Element || value instanceof getWindow(value).Element; +} +function isHTMLElement(value) { + if (!hasWindow()) { + return false; + } + return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; +} +function isShadowRoot(value) { + if (!hasWindow() || typeof ShadowRoot === "undefined") { + return false; + } + return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot; +} +function isOverflowElement(element) { + const { + overflow, + overflowX, + overflowY, + display + } = getComputedStyle2(element); + return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== "inline" && display !== "contents"; +} +function isTableElement(element) { + return /^(table|td|th)$/.test(getNodeName(element)); +} +function isTopLayer(element) { + try { + if (element.matches(":popover-open")) { + return true; + } + } catch (_e) { + } + try { + return element.matches(":modal"); + } catch (_e) { + return false; + } +} +var willChangeRe = /transform|translate|scale|rotate|perspective|filter/; +var containRe = /paint|layout|strict|content/; +var isNotNone = (value) => !!value && value !== "none"; +var isWebKitValue; +function isContainingBlock(elementOrCss) { + const css = isElement(elementOrCss) ? getComputedStyle2(elementOrCss) : elementOrCss; + return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit2() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || "") || containRe.test(css.contain || ""); +} +function getContainingBlock(element) { + let currentNode = getParentNode(element); + while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { + if (isContainingBlock(currentNode)) { + return currentNode; + } else if (isTopLayer(currentNode)) { + return null; + } + currentNode = getParentNode(currentNode); + } + return null; +} +function isWebKit2() { + if (isWebKitValue == null) { + isWebKitValue = typeof CSS !== "undefined" && CSS.supports && CSS.supports("-webkit-backdrop-filter", "none"); + } + return isWebKitValue; +} +function isLastTraversableNode(node) { + return /^(html|body|#document)$/.test(getNodeName(node)); +} +function getComputedStyle2(element) { + return getWindow(element).getComputedStyle(element); +} +function getNodeScroll(element) { + if (isElement(element)) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; + } + return { + scrollLeft: element.scrollX, + scrollTop: element.scrollY + }; +} +function getParentNode(node) { + if (getNodeName(node) === "html") { + return node; + } + const result = ( + // Step into the shadow DOM of the parent of a slotted node. + node.assignedSlot || // DOM Element detected. + node.parentNode || // ShadowRoot detected. + isShadowRoot(node) && node.host || // Fallback. + getDocumentElement(node) + ); + return isShadowRoot(result) ? result.host : result; +} +function getNearestOverflowAncestor(node) { + const parentNode = getParentNode(node); + if (isLastTraversableNode(parentNode)) { + return node.ownerDocument ? node.ownerDocument.body : node.body; + } + if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { + return parentNode; + } + return getNearestOverflowAncestor(parentNode); +} +function getOverflowAncestors(node, list, traverseIframes) { + var _node$ownerDocument2; + if (list === void 0) { + list = []; + } + if (traverseIframes === void 0) { + traverseIframes = true; + } + const scrollableAncestor = getNearestOverflowAncestor(node); + const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); + const win = getWindow(scrollableAncestor); + if (isBody) { + const frameElement = getFrameElement(win); + return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); + } else { + return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); + } +} +function getFrameElement(win) { + return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/constants.js +var FOCUSABLE_ATTRIBUTE = "data-base-ui-focusable"; +var TYPEABLE_SELECTOR = "input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])"; + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/internals/shadowDom.js +function activeElement(doc) { + var _a; + let element = doc.activeElement; + while (((_a = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a.activeElement) != null) { + element = element.shadowRoot.activeElement; + } + return element; +} +function contains(parent, child) { + var _a; + if (!parent || !child) { + return false; + } + const rootNode = (_a = child.getRootNode) == null ? void 0 : _a.call(child); + if (parent.contains(child)) { + return true; + } + if (rootNode && isShadowRoot(rootNode)) { + let next = child; + while (next) { + if (parent === next) { + return true; + } + next = next.parentNode || next.host; + } + } + return false; +} +function getTarget(event) { + if ("composedPath" in event) { + return event.composedPath()[0]; + } + return event.target; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/element.js +function isTargetInsideEnabledTrigger(target, triggerElements) { + if (!isElement(target)) { + return false; + } + const targetElement = target; + if (triggerElements.hasElement(targetElement)) { + return !targetElement.hasAttribute("data-trigger-disabled"); + } + for (const [, trigger] of triggerElements.entries()) { + if (contains(trigger, targetElement)) { + return !trigger.hasAttribute("data-trigger-disabled"); + } + } + return false; +} +function isEventTargetWithin(event, node) { + if (node == null) { + return false; + } + if ("composedPath" in event) { + return event.composedPath().includes(node); + } + const eventAgain = event; + return eventAgain.target != null && node.contains(eventAgain.target); +} +function isRootElement(element) { + return element.matches("html,body"); +} +function isTypeableElement(element) { + return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR); +} +function isInteractiveElement(element) { + return (element == null ? void 0 : element.closest(`button,a[href],[role="button"],select,[tabindex]:not([tabindex="-1"]),${TYPEABLE_SELECTOR}`)) != null; +} +function matchesFocusVisible(element) { + if (!element || isJSDOM) { + return true; + } + try { + return element.matches(":focus-visible"); + } catch (_e) { + return true; + } +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/hooks/useHoverShared.js +function resolveValue(value, pointerType) { + if (pointerType != null && !isMouseLikePointerType(pointerType)) { + return 0; + } + if (typeof value === "function") { + return value(); + } + return value; +} +function getDelay(value, prop, pointerType) { + const result = resolveValue(value, pointerType); + if (typeof result === "number") { + return result; + } + return result == null ? void 0 : result[prop]; +} +function getRestMs(value) { + if (typeof value === "function") { + return value(); + } + return value; +} +function isClickLikeOpenEvent(openEventType, interactedInside) { + return interactedInside || openEventType === "click" || openEventType === "mousedown"; +} +function isHoverOpenEvent(openEventType) { + return (openEventType == null ? void 0 : openEventType.includes("mouse")) && openEventType !== "mousedown"; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/empty.js +function NOOP() { +} +var EMPTY_ARRAY = Object.freeze([]); +var EMPTY_OBJECT = Object.freeze({}); + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/internals/reason-parts.js +var reason_parts_exports = {}; +__export(reason_parts_exports, { + cancelOpen: () => cancelOpen, + chipRemovePress: () => chipRemovePress, + clearPress: () => clearPress, + closePress: () => closePress, + closeWatcher: () => closeWatcher, + decrementPress: () => decrementPress, + disabled: () => disabled, + drag: () => drag, + escapeKey: () => escapeKey, + focusOut: () => focusOut, + imperativeAction: () => imperativeAction, + incrementPress: () => incrementPress, + initial: () => initial, + inputBlur: () => inputBlur, + inputChange: () => inputChange, + inputClear: () => inputClear, + inputPaste: () => inputPaste, + inputPress: () => inputPress, + itemPress: () => itemPress, + keyboard: () => keyboard, + linkPress: () => linkPress, + listNavigation: () => listNavigation, + missing: () => missing, + none: () => none, + outsidePress: () => outsidePress, + pointer: () => pointer, + scrub: () => scrub, + siblingOpen: () => siblingOpen, + swipe: () => swipe, + trackPress: () => trackPress, + triggerFocus: () => triggerFocus, + triggerHover: () => triggerHover, + triggerPress: () => triggerPress, + wheel: () => wheel, + windowResize: () => windowResize +}); +var none = "none"; +var triggerPress = "trigger-press"; +var triggerHover = "trigger-hover"; +var triggerFocus = "trigger-focus"; +var outsidePress = "outside-press"; +var itemPress = "item-press"; +var closePress = "close-press"; +var linkPress = "link-press"; +var clearPress = "clear-press"; +var chipRemovePress = "chip-remove-press"; +var trackPress = "track-press"; +var incrementPress = "increment-press"; +var decrementPress = "decrement-press"; +var inputChange = "input-change"; +var inputClear = "input-clear"; +var inputBlur = "input-blur"; +var inputPaste = "input-paste"; +var inputPress = "input-press"; +var focusOut = "focus-out"; +var escapeKey = "escape-key"; +var closeWatcher = "close-watcher"; +var listNavigation = "list-navigation"; +var keyboard = "keyboard"; +var pointer = "pointer"; +var drag = "drag"; +var wheel = "wheel"; +var scrub = "scrub"; +var cancelOpen = "cancel-open"; +var siblingOpen = "sibling-open"; +var disabled = "disabled"; +var missing = "missing"; +var initial = "initial"; +var imperativeAction = "imperative-action"; +var swipe = "swipe"; +var windowResize = "window-resize"; + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/internals/createBaseUIEventDetails.js +function createChangeEventDetails(reason, event, trigger, customProperties) { + let canceled = false; + let allowPropagation = false; + const custom = customProperties ?? EMPTY_OBJECT; + const details = { + reason, + event: event ?? new Event("base-ui"), + cancel() { + canceled = true; + }, + allowPropagation() { + allowPropagation = true; + }, + get isCanceled() { + return canceled; + }, + get isPropagationAllowed() { + return allowPropagation; + }, + trigger, + ...custom + }; + return details; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingDelayGroup.js +var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); +var FloatingDelayGroupContext = React7.createContext({ + hasProvider: false, + timeoutMs: 0, + delayRef: { + current: 0 + }, + initialDelayRef: { + current: 0 + }, + timeout: new Timeout(), + currentIdRef: { + current: null + }, + currentContextRef: { + current: null + } +}); +if (true) FloatingDelayGroupContext.displayName = "FloatingDelayGroupContext"; +function FloatingDelayGroup(props) { + const { + children, + delay, + timeoutMs = 0 + } = props; + const delayRef = React7.useRef(delay); + const initialDelayRef = React7.useRef(delay); + const currentIdRef = React7.useRef(null); + const currentContextRef = React7.useRef(null); + const timeout = useTimeout(); + return (0, import_jsx_runtime.jsx)(FloatingDelayGroupContext.Provider, { + value: React7.useMemo(() => ({ + hasProvider: true, + delayRef, + initialDelayRef, + currentIdRef, + timeoutMs, + currentContextRef, + timeout + }), [timeoutMs, timeout]), + children + }); +} +function useDelayGroup(context, options = { + open: false +}) { + const { + open + } = options; + const store = "rootStore" in context ? context.rootStore : context; + const floatingId = store.useState("floatingId"); + const groupContext = React7.useContext(FloatingDelayGroupContext); + const { + currentIdRef, + delayRef, + timeoutMs, + initialDelayRef, + currentContextRef, + hasProvider, + timeout + } = groupContext; + const [isInstantPhase, setIsInstantPhase] = React7.useState(false); + useIsoLayoutEffect(() => { + function unset() { + var _a; + setIsInstantPhase(false); + (_a = currentContextRef.current) == null ? void 0 : _a.setIsInstantPhase(false); + currentIdRef.current = null; + currentContextRef.current = null; + delayRef.current = initialDelayRef.current; + } + if (!currentIdRef.current) { + return void 0; + } + if (!open && currentIdRef.current === floatingId) { + setIsInstantPhase(false); + if (timeoutMs) { + const closingId = floatingId; + timeout.start(timeoutMs, () => { + if (store.select("open") || currentIdRef.current && currentIdRef.current !== closingId) { + return; + } + unset(); + }); + return () => { + timeout.clear(); + }; + } + unset(); + } + return void 0; + }, [open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeout, store]); + useIsoLayoutEffect(() => { + if (!open) { + return; + } + const prevContext = currentContextRef.current; + const prevId = currentIdRef.current; + timeout.clear(); + currentContextRef.current = { + onOpenChange: store.setOpen, + setIsInstantPhase + }; + currentIdRef.current = floatingId; + delayRef.current = { + open: 0, + close: getDelay(initialDelayRef.current, "close") + }; + if (prevId !== null && prevId !== floatingId) { + setIsInstantPhase(true); + prevContext == null ? void 0 : prevContext.setIsInstantPhase(true); + prevContext == null ? void 0 : prevContext.onOpenChange(false, createChangeEventDetails(reason_parts_exports.none)); + } else { + setIsInstantPhase(false); + prevContext == null ? void 0 : prevContext.setIsInstantPhase(false); + } + }, [open, floatingId, store, currentIdRef, delayRef, initialDelayRef, currentContextRef, timeout]); + useIsoLayoutEffect(() => { + return () => { + currentContextRef.current = null; + }; + }, [currentContextRef]); + return React7.useMemo(() => ({ + hasProvider, + delayRef, + isInstantPhase + }), [hasProvider, delayRef, isInstantPhase]); +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingFocusManager.js +var React16 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/addEventListener.js +function addEventListener(target, type, listener, options) { + target.addEventListener(type, listener, options); + return () => { + target.removeEventListener(type, listener, options); + }; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/mergeCleanups.js +function mergeCleanups(...cleanups) { + return () => { + for (let i = 0; i < cleanups.length; i += 1) { + const cleanup = cleanups[i]; + if (cleanup) { + cleanup(); + } + } + }; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useMergedRefs.js +function useMergedRefs(a, b, c, d) { + const forkRef = useRefWithInit(createForkRef).current; + if (didChange(forkRef, a, b, c, d)) { + update(forkRef, [a, b, c, d]); + } + return forkRef.callback; +} +function useMergedRefsN(refs) { + const forkRef = useRefWithInit(createForkRef).current; + if (didChangeN(forkRef, refs)) { + update(forkRef, refs); + } + return forkRef.callback; +} +function createForkRef() { + return { + callback: null, + cleanup: null, + refs: [] + }; +} +function didChange(forkRef, a, b, c, d) { + return forkRef.refs[0] !== a || forkRef.refs[1] !== b || forkRef.refs[2] !== c || forkRef.refs[3] !== d; +} +function didChangeN(forkRef, newRefs) { + return forkRef.refs.length !== newRefs.length || forkRef.refs.some((ref, index2) => ref !== newRefs[index2]); +} +function update(forkRef, refs) { + forkRef.refs = refs; + if (refs.every((ref) => ref == null)) { + forkRef.callback = null; + return; + } + forkRef.callback = (instance) => { + if (forkRef.cleanup) { + forkRef.cleanup(); + forkRef.cleanup = null; + } + if (instance != null) { + const cleanupCallbacks = Array(refs.length).fill(null); + for (let i = 0; i < refs.length; i += 1) { + const ref = refs[i]; + if (ref == null) { + continue; + } + switch (typeof ref) { + case "function": { + const refCleanup = ref(instance); + if (typeof refCleanup === "function") { + cleanupCallbacks[i] = refCleanup; + } + break; + } + case "object": { + ref.current = instance; + break; + } + default: + } + } + forkRef.cleanup = () => { + for (let i = 0; i < refs.length; i += 1) { + const ref = refs[i]; + if (ref == null) { + continue; + } + switch (typeof ref) { + case "function": { + const cleanupCallback = cleanupCallbacks[i]; + if (typeof cleanupCallback === "function") { + cleanupCallback(); + } else { + ref(null); + } + break; + } + case "object": { + ref.current = null; + break; + } + default: + } + } + }; + } + }; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useValueAsRef.js +function useValueAsRef(value) { + const latest = useRefWithInit(createLatestRef, value).current; + latest.next = value; + useIsoLayoutEffect(latest.effect); + return latest; +} +function createLatestRef(value) { + const latest = { + current: value, + next: value, + effect: () => { + latest.current = latest.next; + } + }; + return latest; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/safeReact.js +var React8 = __toESM(require_react(), 1); +var SafeReact = { + ...React8 +}; + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useStableCallback.js +var useInsertionEffect = SafeReact.useInsertionEffect; +var useSafeInsertionEffect = ( + // React 17 doesn't have useInsertionEffect. + useInsertionEffect && // Preact replaces useInsertionEffect with useLayoutEffect and fires too late. + useInsertionEffect !== SafeReact.useLayoutEffect ? useInsertionEffect : (fn) => fn() +); +function useStableCallback(callback) { + const stable = useRefWithInit(createStableCallback).current; + stable.next = callback; + useSafeInsertionEffect(stable.effect); + return stable.trampoline; +} +function createStableCallback() { + const stable = { + next: void 0, + callback: assertNotCalled, + trampoline: (...args) => { + var _a; + return (_a = stable.callback) == null ? void 0 : _a.call(stable, ...args); + }, + effect: () => { + stable.callback = stable.next; + } + }; + return stable; +} +function assertNotCalled() { + if (true) { + throw ( + /* minify-error-disabled */ + new Error("Base UI: Cannot call an event handler while rendering.") + ); + } +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useAnimationFrame.js +var EMPTY3 = null; +var LAST_RAF = globalThis.requestAnimationFrame; +var Scheduler = class { + constructor() { + /* This implementation uses an array as a backing data-structure for frame callbacks. + * It allows `O(1)` callback cancelling by inserting a `null` in the array, though it + * never calls the native `cancelAnimationFrame` if there are no frames left. This can + * be much more efficient if there is a call pattern that alterns as + * "request-cancel-request-cancel-…". + * But in the case of "request-request-…-cancel-cancel-…", it leaves the final animation + * frame to run anyway. We turn that frame into a `O(1)` no-op via `callbacksCount`. */ + __publicField(this, "callbacks", []); + __publicField(this, "callbacksCount", 0); + __publicField(this, "nextId", 1); + __publicField(this, "startId", 1); + __publicField(this, "isScheduled", false); + __publicField(this, "tick", (timestamp) => { + var _a; + this.isScheduled = false; + const currentCallbacks = this.callbacks; + const currentCallbacksCount = this.callbacksCount; + this.callbacks = []; + this.callbacksCount = 0; + this.startId = this.nextId; + if (currentCallbacksCount > 0) { + for (let i = 0; i < currentCallbacks.length; i += 1) { + (_a = currentCallbacks[i]) == null ? void 0 : _a.call(currentCallbacks, timestamp); + } + } + }); + } + request(fn) { + const id = this.nextId; + this.nextId += 1; + this.callbacks.push(fn); + this.callbacksCount += 1; + const didRAFChange = LAST_RAF !== requestAnimationFrame && (LAST_RAF = requestAnimationFrame, true); + if (!this.isScheduled || didRAFChange) { + requestAnimationFrame(this.tick); + this.isScheduled = true; + } + return id; + } + cancel(id) { + const index2 = id - this.startId; + if (index2 < 0 || index2 >= this.callbacks.length) { + return; + } + this.callbacks[index2] = null; + this.callbacksCount -= 1; + } +}; +var scheduler = new Scheduler(); +var AnimationFrame = class _AnimationFrame { + constructor() { + __publicField(this, "currentId", EMPTY3); + __publicField(this, "cancel", () => { + if (this.currentId !== EMPTY3) { + scheduler.cancel(this.currentId); + this.currentId = EMPTY3; + } + }); + __publicField(this, "disposeEffect", () => { + return this.cancel; + }); + } + static create() { + return new _AnimationFrame(); + } + static request(fn) { + return scheduler.request(fn); + } + static cancel(id) { + return scheduler.cancel(id); + } + /** + * Executes `fn` after `delay`, clearing any previously scheduled call. + */ + request(fn) { + this.cancel(); + this.currentId = scheduler.request(() => { + this.currentId = EMPTY3; + fn(); + }); + } +}; +function useAnimationFrame() { + const timeout = useRefWithInit(AnimationFrame.create).current; + useOnMount(timeout.disposeEffect); + return timeout; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/owner.js +function ownerDocument(node) { + return (node == null ? void 0 : node.ownerDocument) || document; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/utils/FocusGuard.js +var React9 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/visuallyHidden.js +var visuallyHiddenBase = { + clipPath: "inset(50%)", + overflow: "hidden", + whiteSpace: "nowrap", + border: 0, + padding: 0, + width: 1, + height: 1, + margin: -1 +}; +var visuallyHidden = { + ...visuallyHiddenBase, + position: "fixed", + top: 0, + left: 0 +}; +var visuallyHiddenInput = { + ...visuallyHiddenBase, + position: "absolute" +}; + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/utils/FocusGuard.js +var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); +var FocusGuard = React9.forwardRef(function FocusGuard2(props, ref) { + const [role, setRole] = React9.useState(); + useIsoLayoutEffect(() => { + if (isSafari) { + setRole("button"); + } + }, []); + const restProps = { + tabIndex: 0, + // Role is only for VoiceOver + role + }; + return (0, import_jsx_runtime2.jsx)("span", { + ...props, + ref, + style: visuallyHidden, + "aria-hidden": role ? void 0 : true, + ...restProps, + "data-base-ui-focus-guard": "" + }); +}); +if (true) FocusGuard.displayName = "FocusGuard"; + +// ../../node_modules/.pnpm/@floating-ui+utils@0.2.11/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs +var sides = ["top", "right", "bottom", "left"]; +var alignments = ["start", "end"]; +var placements = sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []); +var min = Math.min; +var max = Math.max; +var round = Math.round; +var floor = Math.floor; +var createCoords = (v) => ({ + x: v, + y: v +}); +var oppositeSideMap = { + left: "right", + right: "left", + bottom: "top", + top: "bottom" +}; +function clamp(start, value, end) { + return max(start, min(value, end)); +} +function evaluate(value, param) { + return typeof value === "function" ? value(param) : value; +} +function getSide(placement) { + return placement.split("-")[0]; +} +function getAlignment(placement) { + return placement.split("-")[1]; +} +function getOppositeAxis(axis) { + return axis === "x" ? "y" : "x"; +} +function getAxisLength(axis) { + return axis === "y" ? "height" : "width"; +} +function getSideAxis(placement) { + const firstChar = placement[0]; + return firstChar === "t" || firstChar === "b" ? "y" : "x"; +} +function getAlignmentAxis(placement) { + return getOppositeAxis(getSideAxis(placement)); +} +function getAlignmentSides(placement, rects, rtl) { + if (rtl === void 0) { + rtl = false; + } + const alignment = getAlignment(placement); + const alignmentAxis = getAlignmentAxis(placement); + const length = getAxisLength(alignmentAxis); + let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top"; + if (rects.reference[length] > rects.floating[length]) { + mainAlignmentSide = getOppositePlacement(mainAlignmentSide); + } + return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)]; +} +function getExpandedPlacements(placement) { + const oppositePlacement = getOppositePlacement(placement); + return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; +} +function getOppositeAlignmentPlacement(placement) { + return placement.includes("start") ? placement.replace("start", "end") : placement.replace("end", "start"); +} +var lrPlacement = ["left", "right"]; +var rlPlacement = ["right", "left"]; +var tbPlacement = ["top", "bottom"]; +var btPlacement = ["bottom", "top"]; +function getSideList(side, isStart, rtl) { + switch (side) { + case "top": + case "bottom": + if (rtl) return isStart ? rlPlacement : lrPlacement; + return isStart ? lrPlacement : rlPlacement; + case "left": + case "right": + return isStart ? tbPlacement : btPlacement; + default: + return []; + } +} +function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { + const alignment = getAlignment(placement); + let list = getSideList(getSide(placement), direction === "start", rtl); + if (alignment) { + list = list.map((side) => side + "-" + alignment); + if (flipAlignment) { + list = list.concat(list.map(getOppositeAlignmentPlacement)); + } + } + return list; +} +function getOppositePlacement(placement) { + const side = getSide(placement); + return oppositeSideMap[side] + placement.slice(side.length); +} +function expandPaddingObject(padding) { + return { + top: 0, + right: 0, + bottom: 0, + left: 0, + ...padding + }; +} +function getPaddingObject(padding) { + return typeof padding !== "number" ? expandPaddingObject(padding) : { + top: padding, + right: padding, + bottom: padding, + left: padding + }; +} +function rectToClientRect(rect) { + const { + x, + y, + width, + height + } = rect; + return { + width, + height, + top: y, + left: x, + right: x + width, + bottom: y + height, + x, + y + }; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/composite.js +function isHiddenByStyles(styles) { + return styles.visibility === "hidden" || styles.visibility === "collapse"; +} +function isElementVisible(element, styles = element ? getComputedStyle2(element) : null) { + if (!element || !element.isConnected || !styles || isHiddenByStyles(styles)) { + return false; + } + if (typeof element.checkVisibility === "function") { + return element.checkVisibility(); + } + return styles.display !== "none" && styles.display !== "contents"; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/tabbable.js +var CANDIDATE_SELECTOR = 'a[href],button,input,select,textarea,summary,details,iframe,object,embed,[tabindex],[contenteditable]:not([contenteditable="false"]),audio[controls],video[controls]'; +function getParentElement(element) { + const assignedSlot = element.assignedSlot; + if (assignedSlot) { + return assignedSlot; + } + if (element.parentElement) { + return element.parentElement; + } + const rootNode = element.getRootNode(); + return isShadowRoot(rootNode) ? rootNode.host : null; +} +function getDetailsSummary(details) { + for (const child of Array.from(details.children)) { + if (getNodeName(child) === "summary") { + return child; + } + } + return null; +} +function isWithinOpenDetailsSummary(element, details) { + const summary = getDetailsSummary(details); + return !!summary && (element === summary || contains(summary, element)); +} +function isFocusableCandidate(element) { + const nodeName = element ? getNodeName(element) : ""; + return element != null && element.matches(CANDIDATE_SELECTOR) && (nodeName !== "summary" || element.parentElement != null && getNodeName(element.parentElement) === "details" && getDetailsSummary(element.parentElement) === element) && (nodeName !== "details" || getDetailsSummary(element) == null) && (nodeName !== "input" || element.type !== "hidden"); +} +function isFocusableElement(element) { + if (!isFocusableCandidate(element) || !element.isConnected || element.matches(":disabled")) { + return false; + } + for (let current = element; current; current = getParentElement(current)) { + const isAncestor = current !== element; + const isSlot = getNodeName(current) === "slot"; + if (current.hasAttribute("inert")) { + return false; + } + if (isAncestor && getNodeName(current) === "details" && !current.open && !isWithinOpenDetailsSummary(element, current) || current.hasAttribute("hidden") || !isSlot && !isVisibleInTabbableTree(current, isAncestor)) { + return false; + } + } + return true; +} +function isVisibleInTabbableTree(element, isAncestor) { + const styles = getComputedStyle2(element); + if (!isAncestor) { + return isElementVisible(element, styles); + } + return styles.display !== "none"; +} +function getTabIndex(element) { + const tabIndex = element.tabIndex; + if (tabIndex < 0) { + const nodeName = getNodeName(element); + if (nodeName === "details" || nodeName === "audio" || nodeName === "video" || isHTMLElement(element) && element.isContentEditable) { + return 0; + } + } + return tabIndex; +} +function getNamedRadioInput(element) { + if (getNodeName(element) !== "input") { + return null; + } + const input = element; + return input.type === "radio" && input.name !== "" ? input : null; +} +function isTabbableRadio(element, candidates) { + const input = getNamedRadioInput(element); + if (!input) { + return true; + } + const checkedRadio = candidates.find((candidate) => { + const radio = getNamedRadioInput(candidate); + return (radio == null ? void 0 : radio.name) === input.name && radio.form === input.form && radio.checked; + }); + if (checkedRadio) { + return checkedRadio === input; + } + return candidates.find((candidate) => { + const radio = getNamedRadioInput(candidate); + return (radio == null ? void 0 : radio.name) === input.name && radio.form === input.form; + }) === input; +} +function getComposedChildren(container) { + if (isHTMLElement(container) && getNodeName(container) === "slot") { + const assignedElements = container.assignedElements({ + flatten: true + }); + if (assignedElements.length > 0) { + return assignedElements; + } + } + if (isHTMLElement(container) && container.shadowRoot) { + return Array.from(container.shadowRoot.children); + } + return Array.from(container.children); +} +function appendCandidates(container, list) { + getComposedChildren(container).forEach((child) => { + if (isFocusableCandidate(child)) { + list.push(child); + } + appendCandidates(child, list); + }); +} +function appendMatchingElements(container, selector, list) { + getComposedChildren(container).forEach((child) => { + if (isHTMLElement(child) && child.matches(selector)) { + list.push(child); + } + appendMatchingElements(child, selector, list); + }); +} +function focusable(container) { + const candidates = []; + appendCandidates(container, candidates); + return candidates.filter(isFocusableElement); +} +function tabbable(container) { + const candidates = focusable(container); + return candidates.filter((element) => getTabIndex(element) >= 0 && isTabbableRadio(element, candidates)); +} +function getTabbableIn(container, dir) { + const list = tabbable(container); + const len = list.length; + if (len === 0) { + return void 0; + } + const active = activeElement(ownerDocument(container)); + const index2 = list.indexOf(active); + const nextIndex = index2 === -1 ? dir === 1 ? 0 : len - 1 : index2 + dir; + return list[nextIndex]; +} +function getNextTabbable(referenceElement) { + return getTabbableIn(ownerDocument(referenceElement).body, 1) || referenceElement; +} +function getPreviousTabbable(referenceElement) { + return getTabbableIn(ownerDocument(referenceElement).body, -1) || referenceElement; +} +function isOutsideEvent(event, container) { + const containerElement = container || event.currentTarget; + const relatedTarget = event.relatedTarget; + return !relatedTarget || !contains(containerElement, relatedTarget); +} +function disableFocusInside(container) { + const tabbableElements = tabbable(container); + tabbableElements.forEach((element) => { + element.dataset.tabindex = element.getAttribute("tabindex") || ""; + element.setAttribute("tabindex", "-1"); + }); +} +function enableFocusInside(container) { + const elements = []; + appendMatchingElements(container, "[data-tabindex]", elements); + elements.forEach((element) => { + const tabindex = element.dataset.tabindex; + delete element.dataset.tabindex; + if (tabindex) { + element.setAttribute("tabindex", tabindex); + } else { + element.removeAttribute("tabindex"); + } + }); +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/nodes.js +function getNodeChildren(nodes, id, onlyOpenChildren = true) { + const directChildren = nodes.filter((node) => node.parentId === id); + return directChildren.flatMap((child) => { + var _a; + return [...!onlyOpenChildren || ((_a = child.context) == null ? void 0 : _a.open) ? [child] : [], ...getNodeChildren(nodes, child.id, onlyOpenChildren)]; + }); +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/createAttribute.js +function createAttribute(name) { + return `data-base-ui-${name}`; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingPortal.js +var React14 = __toESM(require_react(), 1); +var ReactDOM = __toESM(require_react_dom(), 1); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/useId.js +var React10 = __toESM(require_react()); +var globalId = 0; +function useGlobalId(idOverride, prefix = "mui") { + const [defaultId, setDefaultId] = React10.useState(idOverride); + const id = idOverride || defaultId; + React10.useEffect(() => { + if (defaultId == null) { + globalId += 1; + setDefaultId(`${prefix}-${globalId}`); + } + }, [defaultId, prefix]); + return id; +} +var maybeReactUseId = SafeReact.useId; +function useId(idOverride, prefix) { + if (maybeReactUseId !== void 0) { + const reactId = maybeReactUseId(); + return idOverride ?? (prefix ? `${prefix}-${reactId}` : reactId); + } + return useGlobalId(idOverride, prefix); +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/internals/useRenderElement.js +var React13 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/getReactElementRef.js +var React12 = __toESM(require_react()); + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/reactVersion.js +var React11 = __toESM(require_react(), 1); +var majorVersion = parseInt(React11.version, 10); +function isReactVersionAtLeast(reactVersionToCheck) { + return majorVersion >= reactVersionToCheck; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/getReactElementRef.js +function getReactElementRef(element) { + if (!React12.isValidElement(element)) { + return null; + } + const reactElement = element; + const propsWithRef = reactElement.props; + return (isReactVersionAtLeast(19) ? propsWithRef == null ? void 0 : propsWithRef.ref : reactElement.ref) ?? null; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/mergeObjects.js +function mergeObjects(a, b) { + if (a && !b) { + return a; + } + if (!a && b) { + return b; + } + if (a || b) { + return { + ...a, + ...b + }; + } + return void 0; +} + +// ../../node_modules/.pnpm/@base-ui+utils@0.2.9_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/utils/esm/warn.js +var set; +if (true) { + set = /* @__PURE__ */ new Set(); +} +function warn(...messages) { + if (true) { + const messageKey = messages.join(" "); + if (!set.has(messageKey)) { + set.add(messageKey); + console.warn(`Base UI: ${messageKey}`); + } + } +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/internals/getStateAttributesProps.js +function getStateAttributesProps(state, customMapping) { + const props = {}; + for (const key in state) { + const value = state[key]; + if (customMapping == null ? void 0 : customMapping.hasOwnProperty(key)) { + const customProps = customMapping[key](value); + if (customProps != null) { + Object.assign(props, customProps); + } + continue; + } + if (value === true) { + props[`data-${key.toLowerCase()}`] = ""; + } else if (value) { + props[`data-${key.toLowerCase()}`] = value.toString(); + } + } + return props; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/utils/resolveClassName.js +function resolveClassName(className, state) { + return typeof className === "function" ? className(state) : className; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/utils/resolveStyle.js +function resolveStyle(style, state) { + return typeof style === "function" ? style(state) : style; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/merge-props/mergeProps.js +var EMPTY_PROPS = {}; +function mergeProps(a, b, c, d, e) { + if (!c && !d && !e && !a) { + return createInitialMergedProps(b); + } + let merged = createInitialMergedProps(a); + if (b) { + merged = mergeInto(merged, b); + } + if (c) { + merged = mergeInto(merged, c); + } + if (d) { + merged = mergeInto(merged, d); + } + if (e) { + merged = mergeInto(merged, e); + } + return merged; +} +function mergePropsN(props) { + if (props.length === 0) { + return EMPTY_PROPS; + } + if (props.length === 1) { + return createInitialMergedProps(props[0]); + } + let merged = createInitialMergedProps(props[0]); + for (let i = 1; i < props.length; i += 1) { + merged = mergeInto(merged, props[i]); + } + return merged; +} +function createInitialMergedProps(inputProps) { + if (isPropsGetter(inputProps)) { + return { + ...resolvePropsGetter(inputProps, EMPTY_PROPS) + }; + } + return copyInitialProps(inputProps); +} +function mergeInto(merged, inputProps) { + if (isPropsGetter(inputProps)) { + return resolvePropsGetter(inputProps, merged); + } + return mutablyMergeInto(merged, inputProps); +} +function copyInitialProps(inputProps) { + const copiedProps = { + ...inputProps + }; + for (const propName in copiedProps) { + const propValue = copiedProps[propName]; + if (isEventHandler(propName, propValue)) { + copiedProps[propName] = wrapEventHandler(propValue); + } + } + return copiedProps; +} +function mutablyMergeInto(mergedProps, externalProps) { + if (!externalProps) { + return mergedProps; + } + for (const propName in externalProps) { + const externalPropValue = externalProps[propName]; + switch (propName) { + case "style": { + mergedProps[propName] = mergeObjects(mergedProps.style, externalPropValue); + break; + } + case "className": { + mergedProps[propName] = mergeClassNames(mergedProps.className, externalPropValue); + break; + } + default: { + if (isEventHandler(propName, externalPropValue)) { + mergedProps[propName] = mergeEventHandlers(mergedProps[propName], externalPropValue); + } else { + mergedProps[propName] = externalPropValue; + } + } + } + } + return mergedProps; +} +function isEventHandler(key, value) { + const code0 = key.charCodeAt(0); + const code1 = key.charCodeAt(1); + const code2 = key.charCodeAt(2); + return code0 === 111 && code1 === 110 && code2 >= 65 && code2 <= 90 && (typeof value === "function" || typeof value === "undefined"); +} +function isPropsGetter(inputProps) { + return typeof inputProps === "function"; +} +function resolvePropsGetter(inputProps, previousProps) { + if (isPropsGetter(inputProps)) { + return inputProps(previousProps); + } + return inputProps ?? EMPTY_PROPS; +} +function mergeEventHandlers(ourHandler, theirHandler) { + if (!theirHandler) { + return ourHandler; + } + if (!ourHandler) { + return wrapEventHandler(theirHandler); + } + return (...args) => { + const event = args[0]; + if (isSyntheticEvent(event)) { + const baseUIEvent = event; + makeEventPreventable(baseUIEvent); + const result2 = theirHandler(...args); + if (!baseUIEvent.baseUIHandlerPrevented) { + ourHandler == null ? void 0 : ourHandler(...args); + } + return result2; + } + const result = theirHandler(...args); + ourHandler == null ? void 0 : ourHandler(...args); + return result; + }; +} +function wrapEventHandler(handler) { + if (!handler) { + return handler; + } + return (...args) => { + const event = args[0]; + if (isSyntheticEvent(event)) { + makeEventPreventable(event); + } + return handler(...args); + }; +} +function makeEventPreventable(event) { + event.preventBaseUIHandler = () => { + event.baseUIHandlerPrevented = true; + }; + return event; +} +function mergeClassNames(ourClassName, theirClassName) { + if (theirClassName) { + if (ourClassName) { + return theirClassName + " " + ourClassName; + } + return theirClassName; + } + return ourClassName; +} +function isSyntheticEvent(event) { + return event != null && typeof event === "object" && "nativeEvent" in event; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/internals/useRenderElement.js +var import_react = __toESM(require_react(), 1); +function useRenderElement(element, componentProps, params = {}) { + const renderProp = componentProps.render; + const outProps = useRenderElementProps(componentProps, params); + if (params.enabled === false) { + return null; + } + const state = params.state ?? EMPTY_OBJECT; + return evaluateRenderProp(element, renderProp, outProps, state); +} +function useRenderElementProps(componentProps, params = {}) { + const { + className: classNameProp, + style: styleProp, + render: renderProp + } = componentProps; + const { + state = EMPTY_OBJECT, + ref, + props, + stateAttributesMapping: stateAttributesMapping3, + enabled = true + } = params; + const className = enabled ? resolveClassName(classNameProp, state) : void 0; + const style = enabled ? resolveStyle(styleProp, state) : void 0; + const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping3) : EMPTY_OBJECT; + const resolvedProps = enabled && props ? resolveRenderFunctionProps(props) : void 0; + const outProps = enabled ? mergeObjects(stateProps, resolvedProps) ?? {} : EMPTY_OBJECT; + if (typeof document !== "undefined") { + if (!enabled) { + useMergedRefs(null, null); + } else if (Array.isArray(ref)) { + outProps.ref = useMergedRefsN([outProps.ref, getReactElementRef(renderProp), ...ref]); + } else { + outProps.ref = useMergedRefs(outProps.ref, getReactElementRef(renderProp), ref); + } + } + if (!enabled) { + return EMPTY_OBJECT; + } + if (className !== void 0) { + outProps.className = mergeClassNames(outProps.className, className); + } + if (style !== void 0) { + outProps.style = mergeObjects(outProps.style, style); + } + return outProps; +} +function resolveRenderFunctionProps(props) { + if (Array.isArray(props)) { + return mergePropsN(props); + } + return mergeProps(void 0, props); +} +var REACT_LAZY_TYPE = Symbol.for("react.lazy"); +var COMPONENT_IDENTIFIER_PATTERN = /^[A-Z][A-Za-z0-9$]*$/; +var LOWERCASE_CHARACTER_PATTERN = /[a-z]/; +function evaluateRenderProp(element, render, props, state) { + if (render) { + if (typeof render === "function") { + if (true) { + warnIfRenderPropLooksLikeComponent(render); + } + return render(props, state); + } + const mergedProps = mergeProps(props, render.props); + mergedProps.ref = props.ref; + let newElement = render; + if ((newElement == null ? void 0 : newElement.$$typeof) === REACT_LAZY_TYPE) { + const children = React13.Children.toArray(render); + newElement = children[0]; + } + if (true) { + if (!React13.isValidElement(newElement)) { + throw new Error(["Base UI: The `render` prop was provided an invalid React element as `React.isValidElement(render)` is `false`.", "A valid React element must be provided to the `render` prop because it is cloned with props to replace the default element.", "https://base-ui.com/r/invalid-render-prop"].join("\n")); + } + } + return React13.cloneElement(newElement, mergedProps); + } + if (element) { + if (typeof element === "string") { + return renderTag(element, props); + } + } + throw new Error(true ? "Base UI: Render element or function are not defined." : formatErrorMessage_default(8)); +} +function warnIfRenderPropLooksLikeComponent(renderFn) { + const functionName = renderFn.name; + if (functionName.length === 0) { + return; + } + if (!COMPONENT_IDENTIFIER_PATTERN.test(functionName)) { + return; + } + if (!LOWERCASE_CHARACTER_PATTERN.test(functionName)) { + return; + } + warn(`The \`render\` prop received a function named \`${functionName}\` that starts with an uppercase letter.`, "This usually means a React component was passed directly as `render={Component}`.", "Base UI calls `render` as a plain function, which can break the Rules of Hooks during reconciliation.", "If this is an intentional render callback, rename it to start with a lowercase letter.", "Use `render={}` or `render={(props) => }` instead.", "https://base-ui.com/r/invalid-render-prop"); +} +function renderTag(Tag, props) { + if (Tag === "button") { + return (0, import_react.createElement)("button", { + type: "button", + ...props, + key: props.key + }); + } + if (Tag === "img") { + return (0, import_react.createElement)("img", { + alt: "", + ...props, + key: props.key + }); + } + return React13.createElement(Tag, props); +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/internals/constants.js +var DISABLED_TRANSITIONS_STYLE = { + style: { + transition: "none" + } +}; +var BASE_UI_SWIPE_IGNORE_ATTRIBUTE = "data-base-ui-swipe-ignore"; +var LEGACY_SWIPE_IGNORE_ATTRIBUTE = "data-swipe-ignore"; +var BASE_UI_SWIPE_IGNORE_SELECTOR = `[${BASE_UI_SWIPE_IGNORE_ATTRIBUTE}]`; +var LEGACY_SWIPE_IGNORE_SELECTOR = `[${LEGACY_SWIPE_IGNORE_ATTRIBUTE}]`; +var POPUP_COLLISION_AVOIDANCE = { + fallbackAxisSide: "end" +}; +var ownerVisuallyHidden = { + clipPath: "inset(50%)", + position: "fixed", + top: 0, + left: 0 +}; + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingPortal.js +var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); +var PortalContext = React14.createContext(null); +if (true) PortalContext.displayName = "PortalContext"; +var usePortalContext = () => React14.useContext(PortalContext); +var attr = createAttribute("portal"); +function useFloatingPortalNode(props = {}) { + const { + ref, + container: containerProp, + componentProps = EMPTY_OBJECT, + elementProps + } = props; + const uniqueId = useId(); + const portalContext = usePortalContext(); + const parentPortalNode = portalContext == null ? void 0 : portalContext.portalNode; + const [containerElement, setContainerElement] = React14.useState(null); + const [portalNode, setPortalNode] = React14.useState(null); + const setPortalNodeRef = useStableCallback((node) => { + if (node !== null) { + setPortalNode(node); + } + }); + const containerRef = React14.useRef(null); + useIsoLayoutEffect(() => { + if (containerProp === null) { + if (containerRef.current) { + containerRef.current = null; + setPortalNode(null); + setContainerElement(null); + } + return; + } + if (uniqueId == null) { + return; + } + const resolvedContainer = (containerProp && (isNode(containerProp) ? containerProp : containerProp.current)) ?? parentPortalNode ?? document.body; + if (resolvedContainer == null) { + if (containerRef.current) { + containerRef.current = null; + setPortalNode(null); + setContainerElement(null); + } + return; + } + if (containerRef.current !== resolvedContainer) { + containerRef.current = resolvedContainer; + setPortalNode(null); + setContainerElement(resolvedContainer); + } + }, [containerProp, parentPortalNode, uniqueId]); + const portalElement = useRenderElement("div", componentProps, { + ref: [ref, setPortalNodeRef], + props: [{ + id: uniqueId, + [attr]: "" + }, elementProps] + }); + const portalSubtree = containerElement && portalElement ? ReactDOM.createPortal(portalElement, containerElement) : null; + return { + portalNode, + portalSubtree + }; +} +var FloatingPortal = React14.forwardRef(function FloatingPortal2(componentProps, forwardedRef) { + const { + render, + className, + style, + children, + container, + renderGuards, + ...elementProps + } = componentProps; + const { + portalNode, + portalSubtree + } = useFloatingPortalNode({ + container, + ref: forwardedRef, + componentProps, + elementProps + }); + const beforeOutsideRef = React14.useRef(null); + const afterOutsideRef = React14.useRef(null); + const beforeInsideRef = React14.useRef(null); + const afterInsideRef = React14.useRef(null); + const [focusManagerState, setFocusManagerState] = React14.useState(null); + const focusInsideDisabledRef = React14.useRef(false); + const modal = focusManagerState == null ? void 0 : focusManagerState.modal; + const open = focusManagerState == null ? void 0 : focusManagerState.open; + const shouldRenderGuards = typeof renderGuards === "boolean" ? renderGuards : !!focusManagerState && !focusManagerState.modal && focusManagerState.open && !!portalNode; + React14.useEffect(() => { + if (!portalNode || modal) { + return void 0; + } + function onFocus(event) { + if (portalNode && event.relatedTarget && isOutsideEvent(event)) { + if (event.type === "focusin") { + if (focusInsideDisabledRef.current) { + enableFocusInside(portalNode); + focusInsideDisabledRef.current = false; + } + } else { + disableFocusInside(portalNode); + focusInsideDisabledRef.current = true; + } + } + } + return mergeCleanups(addEventListener(portalNode, "focusin", onFocus, true), addEventListener(portalNode, "focusout", onFocus, true)); + }, [portalNode, modal]); + React14.useEffect(() => { + if (!portalNode || open !== false) { + return; + } + enableFocusInside(portalNode); + focusInsideDisabledRef.current = false; + }, [open, portalNode]); + const portalContextValue = React14.useMemo(() => ({ + beforeOutsideRef, + afterOutsideRef, + beforeInsideRef, + afterInsideRef, + portalNode, + setFocusManagerState + }), [portalNode]); + return (0, import_jsx_runtime3.jsxs)(React14.Fragment, { + children: [portalSubtree, (0, import_jsx_runtime3.jsxs)(PortalContext.Provider, { + value: portalContextValue, + children: [shouldRenderGuards && portalNode && (0, import_jsx_runtime3.jsx)(FocusGuard, { + "data-type": "outside", + ref: beforeOutsideRef, + onFocus: (event) => { + var _a; + if (isOutsideEvent(event, portalNode)) { + (_a = beforeInsideRef.current) == null ? void 0 : _a.focus(); + } else { + const domReference = focusManagerState ? focusManagerState.domReference : null; + const prevTabbable = getPreviousTabbable(domReference); + prevTabbable == null ? void 0 : prevTabbable.focus(); + } + } + }), shouldRenderGuards && portalNode && (0, import_jsx_runtime3.jsx)("span", { + "aria-owns": portalNode.id, + style: ownerVisuallyHidden + }), portalNode && ReactDOM.createPortal(children, portalNode), shouldRenderGuards && portalNode && (0, import_jsx_runtime3.jsx)(FocusGuard, { + "data-type": "outside", + ref: afterOutsideRef, + onFocus: (event) => { + var _a; + if (isOutsideEvent(event, portalNode)) { + (_a = afterInsideRef.current) == null ? void 0 : _a.focus(); + } else { + const domReference = focusManagerState ? focusManagerState.domReference : null; + const nextTabbable = getNextTabbable(domReference); + nextTabbable == null ? void 0 : nextTabbable.focus(); + if (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) { + focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, createChangeEventDetails(reason_parts_exports.focusOut, event.nativeEvent)); + } + } + } + })] + })] + }); +}); +if (true) FloatingPortal.displayName = "FloatingPortal"; + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingTree.js +var React15 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/utils/createEventEmitter.js +function createEventEmitter() { + const map = /* @__PURE__ */ new Map(); + return { + emit(event, data) { + var _a; + (_a = map.get(event)) == null ? void 0 : _a.forEach((listener) => listener(data)); + }, + on(event, listener) { + if (!map.has(event)) { + map.set(event, /* @__PURE__ */ new Set()); + } + map.get(event).add(listener); + }, + off(event, listener) { + var _a; + (_a = map.get(event)) == null ? void 0 : _a.delete(listener); + } + }; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingTree.js +var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); +var FloatingNodeContext = React15.createContext(null); +if (true) FloatingNodeContext.displayName = "FloatingNodeContext"; +var FloatingTreeContext = React15.createContext(null); +if (true) FloatingTreeContext.displayName = "FloatingTreeContext"; +var useFloatingParentNodeId = () => { + var _a; + return ((_a = React15.useContext(FloatingNodeContext)) == null ? void 0 : _a.id) || null; +}; +var useFloatingTree = (externalTree) => { + const contextTree = React15.useContext(FloatingTreeContext); + return externalTree ?? contextTree; +}; + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/utils/resolveRef.js +function resolveRef(maybeRef) { + if (maybeRef == null) { + return maybeRef; + } + return "current" in maybeRef ? maybeRef.current : maybeRef; +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/components/FloatingFocusManager.js +var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/hooks/useClick.js +var React17 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/hooks/useClientPoint.js +var React18 = __toESM(require_react(), 1); +function createVirtualElement(domElement, data) { + let offsetX = null; + let offsetY = null; + let isAutoUpdateEvent = false; + return { + contextElement: domElement || void 0, + getBoundingClientRect() { + var _a; + const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || { + width: 0, + height: 0, + x: 0, + y: 0 + }; + const isXAxis = data.axis === "x" || data.axis === "both"; + const isYAxis = data.axis === "y" || data.axis === "both"; + const canTrackCursorOnAutoUpdate = ["mouseenter", "mousemove"].includes(((_a = data.dataRef.current.openEvent) == null ? void 0 : _a.type) || "") && data.pointerType !== "touch"; + let width = domRect.width; + let height = domRect.height; + let x = domRect.x; + let y = domRect.y; + if (offsetX == null && data.x && isXAxis) { + offsetX = domRect.x - data.x; + } + if (offsetY == null && data.y && isYAxis) { + offsetY = domRect.y - data.y; + } + x -= offsetX || 0; + y -= offsetY || 0; + width = 0; + height = 0; + if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) { + width = data.axis === "y" ? domRect.width : 0; + height = data.axis === "x" ? domRect.height : 0; + x = isXAxis && data.x != null ? data.x : x; + y = isYAxis && data.y != null ? data.y : y; + } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) { + height = data.axis === "x" ? domRect.height : height; + width = data.axis === "y" ? domRect.width : width; + } + isAutoUpdateEvent = true; + return { + width, + height, + x, + y, + top: y, + right: x + width, + bottom: y + height, + left: x + }; + } + }; +} +function isMouseBasedEvent(event) { + return event != null && event.clientX != null; +} +function useClientPoint(context, props = {}) { + const { + enabled = true, + axis = "both" + } = props; + const store = "rootStore" in context ? context.rootStore : context; + const open = store.useState("open"); + const floating = store.useState("floatingElement"); + const domReference = store.useState("domReferenceElement"); + const dataRef = store.context.dataRef; + const initialRef = React18.useRef(false); + const cleanupListenerRef = React18.useRef(null); + const [pointerType, setPointerType] = React18.useState(); + const [reactive, setReactive] = React18.useState([]); + const resetReference = useStableCallback((reference2) => { + store.set("positionReference", reference2); + }); + const setReference = useStableCallback((newX, newY, referenceElement) => { + if (initialRef.current) { + return; + } + if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) { + return; + } + store.set("positionReference", createVirtualElement(referenceElement ?? domReference, { + x: newX, + y: newY, + axis, + dataRef, + pointerType + })); + }); + const handleReferenceEnterOrMove = useStableCallback((event) => { + if (!open) { + setReference(event.clientX, event.clientY, event.currentTarget); + } else if (!cleanupListenerRef.current) { + setReference(event.clientX, event.clientY, event.currentTarget); + setReactive([]); + } + }); + const openCheck = isMouseLikePointerType(pointerType) ? floating : open; + React18.useEffect(() => { + if (!enabled) { + resetReference(domReference); + return void 0; + } + if (!openCheck) { + return void 0; + } + function cleanupListener() { + var _a; + (_a = cleanupListenerRef.current) == null ? void 0 : _a.call(cleanupListenerRef); + cleanupListenerRef.current = null; + } + const win = getWindow(floating); + function handleMouseMove(event) { + const target = getTarget(event); + if (!contains(floating, target)) { + setReference(event.clientX, event.clientY); + } else { + cleanupListener(); + } + } + if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) { + cleanupListenerRef.current = addEventListener(win, "mousemove", handleMouseMove); + } else { + resetReference(domReference); + } + return cleanupListener; + }, [openCheck, enabled, floating, dataRef, domReference, store, setReference, resetReference, reactive]); + React18.useEffect(() => () => { + store.set("positionReference", null); + }, [store]); + React18.useEffect(() => { + if (enabled && !floating) { + initialRef.current = false; + } + }, [enabled, floating]); + React18.useEffect(() => { + if (!enabled && open) { + initialRef.current = true; + } + }, [enabled, open]); + const reference = React18.useMemo(() => { + function setPointerTypeRef(event) { + setPointerType(event.pointerType); + } + return { + onPointerDown: setPointerTypeRef, + onPointerEnter: setPointerTypeRef, + onMouseMove: handleReferenceEnterOrMove, + onMouseEnter: handleReferenceEnterOrMove + }; + }, [handleReferenceEnterOrMove]); + return React18.useMemo(() => enabled ? { + reference, + trigger: reference + } : {}, [enabled, reference]); +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/hooks/useDismiss.js +var React19 = __toESM(require_react(), 1); +var bubbleHandlerKeys = { + intentional: "onClick", + sloppy: "onPointerDown" +}; +function alwaysFalse() { + return false; +} +function normalizeProp(normalizable) { + return { + escapeKey: typeof normalizable === "boolean" ? normalizable : (normalizable == null ? void 0 : normalizable.escapeKey) ?? false, + outsidePress: typeof normalizable === "boolean" ? normalizable : (normalizable == null ? void 0 : normalizable.outsidePress) ?? true + }; +} +function useDismiss(context, props = {}) { + const { + enabled = true, + escapeKey: escapeKey2 = true, + outsidePress: outsidePressProp = true, + outsidePressEvent = "sloppy", + referencePress = alwaysFalse, + referencePressEvent = "sloppy", + bubbles, + externalTree + } = props; + const store = "rootStore" in context ? context.rootStore : context; + const open = store.useState("open"); + const floatingElement = store.useState("floatingElement"); + const { + dataRef + } = store.context; + const tree = useFloatingTree(externalTree); + const outsidePressFn = useStableCallback(typeof outsidePressProp === "function" ? outsidePressProp : () => false); + const outsidePress2 = typeof outsidePressProp === "function" ? outsidePressFn : outsidePressProp; + const outsidePressEnabled = outsidePress2 !== false; + const getOutsidePressEventProp = useStableCallback(() => outsidePressEvent); + const { + escapeKey: escapeKeyBubbles, + outsidePress: outsidePressBubbles + } = normalizeProp(bubbles); + const pressStartedInsideRef = React19.useRef(false); + const pressStartPreventedRef = React19.useRef(false); + const suppressNextOutsideClickRef = React19.useRef(false); + const isComposingRef = React19.useRef(false); + const currentPointerTypeRef = React19.useRef(""); + const touchStateRef = React19.useRef(null); + const cancelDismissOnEndTimeout = useTimeout(); + const clearInsideReactTreeTimeout = useTimeout(); + const clearInsideReactTree = useStableCallback(() => { + clearInsideReactTreeTimeout.clear(); + dataRef.current.insideReactTree = false; + }); + const hasBlockingChild = useStableCallback((bubbleKey) => { + var _a; + const nodeId = (_a = dataRef.current.floatingContext) == null ? void 0 : _a.nodeId; + const children = tree ? getNodeChildren(tree.nodesRef.current, nodeId) : []; + return children.some((child) => { + var _a2; + return ((_a2 = child.context) == null ? void 0 : _a2.open) && !child.context.dataRef.current[bubbleKey]; + }); + }); + const isEventWithinOwnElements = useStableCallback((event) => { + return isEventTargetWithin(event, store.select("floatingElement")) || isEventTargetWithin(event, store.select("domReferenceElement")); + }); + const closeOnReferencePress = useStableCallback((event) => { + if (!referencePress()) { + return; + } + store.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerPress, event.nativeEvent)); + }); + const closeOnEscapeKeyDown = useStableCallback((event) => { + if (!open || !enabled || !escapeKey2 || event.key !== "Escape") { + return; + } + if (isComposingRef.current) { + return; + } + if (!escapeKeyBubbles && hasBlockingChild("__escapeKeyBubbles")) { + return; + } + const native = isReactEvent(event) ? event.nativeEvent : event; + const eventDetails = createChangeEventDetails(reason_parts_exports.escapeKey, native); + store.setOpen(false, eventDetails); + if (!eventDetails.isCanceled) { + event.preventDefault(); + } + if (!escapeKeyBubbles && !eventDetails.isPropagationAllowed) { + event.stopPropagation(); + } + }); + const markInsideReactTree = useStableCallback(() => { + dataRef.current.insideReactTree = true; + clearInsideReactTreeTimeout.start(0, clearInsideReactTree); + }); + const markPressStartedInsideReactTree = useStableCallback((event) => { + if (!open || !enabled || event.button !== 0) { + return; + } + const target = getTarget(event.nativeEvent); + if (!contains(store.select("floatingElement"), target)) { + return; + } + if (!pressStartedInsideRef.current) { + pressStartedInsideRef.current = true; + pressStartPreventedRef.current = false; + } + }); + const markInsidePressStartPrevented = useStableCallback((event) => { + if (!open || !enabled) { + return; + } + if (!(event.defaultPrevented || event.nativeEvent.defaultPrevented)) { + return; + } + if (pressStartedInsideRef.current) { + pressStartPreventedRef.current = true; + } + }); + React19.useEffect(() => { + if (!open || !enabled) { + return void 0; + } + dataRef.current.__escapeKeyBubbles = escapeKeyBubbles; + dataRef.current.__outsidePressBubbles = outsidePressBubbles; + const compositionTimeout = new Timeout(); + const preventedPressSuppressionTimeout = new Timeout(); + function handleCompositionStart() { + compositionTimeout.clear(); + isComposingRef.current = true; + } + function handleCompositionEnd() { + compositionTimeout.start( + // 0ms or 1ms don't work in Safari. 5ms appears to consistently work. + // Only apply to WebKit for the test to remain 0ms. + isWebKit2() ? 5 : 0, + () => { + isComposingRef.current = false; + } + ); + } + function suppressImmediateOutsideClickAfterPreventedStart() { + suppressNextOutsideClickRef.current = true; + preventedPressSuppressionTimeout.start(0, () => { + suppressNextOutsideClickRef.current = false; + }); + } + function resetPressStartState() { + pressStartedInsideRef.current = false; + pressStartPreventedRef.current = false; + } + function getOutsidePressEvent() { + const type = currentPointerTypeRef.current; + const computedType = type === "pen" || !type ? "mouse" : type; + const outsidePressEventValue = getOutsidePressEventProp(); + const resolved = typeof outsidePressEventValue === "function" ? outsidePressEventValue() : outsidePressEventValue; + if (typeof resolved === "string") { + return resolved; + } + return resolved[computedType]; + } + function shouldIgnoreEvent(event) { + const computedOutsidePressEvent = getOutsidePressEvent(); + return computedOutsidePressEvent === "intentional" && event.type !== "click" || computedOutsidePressEvent === "sloppy" && event.type === "click"; + } + function isEventWithinFloatingTree(event) { + var _a; + const nodeId = (_a = dataRef.current.floatingContext) == null ? void 0 : _a.nodeId; + const targetIsInsideChildren = tree && getNodeChildren(tree.nodesRef.current, nodeId).some((node) => { + var _a2; + return isEventTargetWithin(event, (_a2 = node.context) == null ? void 0 : _a2.elements.floating); + }); + return isEventWithinOwnElements(event) || targetIsInsideChildren; + } + function closeOnPressOutside(event) { + if (shouldIgnoreEvent(event)) { + if (event.type !== "click" && !isEventWithinOwnElements(event)) { + preventedPressSuppressionTimeout.clear(); + suppressNextOutsideClickRef.current = false; + } + clearInsideReactTree(); + return; + } + if (dataRef.current.insideReactTree) { + clearInsideReactTree(); + return; + } + const target = getTarget(event); + const inertSelector = `[${createAttribute("inert")}]`; + const targetRoot = isElement(target) ? target.getRootNode() : null; + const markers = Array.from((isShadowRoot(targetRoot) ? targetRoot : ownerDocument(store.select("floatingElement"))).querySelectorAll(inertSelector)); + const triggers = store.context.triggerElements; + if (target && (triggers.hasElement(target) || triggers.hasMatchingElement((trigger) => contains(trigger, target)))) { + return; + } + let targetRootAncestor = isElement(target) ? target : null; + while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) { + const nextParent = getParentNode(targetRootAncestor); + if (isLastTraversableNode(nextParent) || !isElement(nextParent)) { + break; + } + targetRootAncestor = nextParent; + } + if (markers.length && isElement(target) && !isRootElement(target) && // Clicked on a direct ancestor (e.g. FloatingOverlay). + !contains(target, store.select("floatingElement")) && // If the target root element contains none of the markers, then the + // element was injected after the floating element rendered. + markers.every((marker) => !contains(targetRootAncestor, marker))) { + return; + } + if (isHTMLElement(target) && !("touches" in event)) { + const lastTraversableNode = isLastTraversableNode(target); + const style = getComputedStyle2(target); + const scrollRe = /auto|scroll/; + const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX); + const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY); + const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth; + const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight; + const isRTL2 = style.direction === "rtl"; + const pressedVerticalScrollbar = canScrollY && (isRTL2 ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth); + const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight; + if (pressedVerticalScrollbar || pressedHorizontalScrollbar) { + return; + } + } + if (isEventWithinFloatingTree(event)) { + return; + } + if (getOutsidePressEvent() === "intentional" && suppressNextOutsideClickRef.current) { + preventedPressSuppressionTimeout.clear(); + suppressNextOutsideClickRef.current = false; + return; + } + if (typeof outsidePress2 === "function" && !outsidePress2(event)) { + return; + } + if (hasBlockingChild("__outsidePressBubbles")) { + return; + } + store.setOpen(false, createChangeEventDetails(reason_parts_exports.outsidePress, event)); + clearInsideReactTree(); + } + function handlePointerDown(event) { + if (getOutsidePressEvent() !== "sloppy" || event.pointerType === "touch" || !store.select("open") || !enabled || isEventWithinOwnElements(event)) { + return; + } + closeOnPressOutside(event); + } + function handleTouchStart(event) { + if (getOutsidePressEvent() !== "sloppy" || !store.select("open") || !enabled || isEventWithinOwnElements(event)) { + return; + } + const touch = event.touches[0]; + if (touch) { + touchStateRef.current = { + startTime: Date.now(), + startX: touch.clientX, + startY: touch.clientY, + dismissOnTouchEnd: false, + dismissOnMouseDown: true + }; + cancelDismissOnEndTimeout.start(1e3, () => { + if (touchStateRef.current) { + touchStateRef.current.dismissOnTouchEnd = false; + touchStateRef.current.dismissOnMouseDown = false; + } + }); + } + } + function addTargetEventListenerOnce(event, listener) { + const target = getTarget(event); + if (!target) { + return; + } + const unsubscribe2 = addEventListener(target, event.type, () => { + listener(event); + unsubscribe2(); + }); + } + function handleTouchStartCapture(event) { + currentPointerTypeRef.current = "touch"; + addTargetEventListenerOnce(event, handleTouchStart); + } + function closeOnPressOutsideCapture(event) { + cancelDismissOnEndTimeout.clear(); + if (event.type === "pointerdown") { + currentPointerTypeRef.current = event.pointerType; + } + if (event.type === "mousedown" && touchStateRef.current && !touchStateRef.current.dismissOnMouseDown) { + return; + } + addTargetEventListenerOnce(event, (targetEvent) => { + if (targetEvent.type === "pointerdown") { + handlePointerDown(targetEvent); + } else { + closeOnPressOutside(targetEvent); + } + }); + } + function handlePressEndCapture(event) { + if (!pressStartedInsideRef.current) { + return; + } + const pressStartedInsideDefaultPrevented = pressStartPreventedRef.current; + resetPressStartState(); + if (getOutsidePressEvent() !== "intentional") { + return; + } + if (event.type === "pointercancel") { + if (pressStartedInsideDefaultPrevented) { + suppressImmediateOutsideClickAfterPreventedStart(); + } + return; + } + if (isEventWithinFloatingTree(event)) { + return; + } + if (pressStartedInsideDefaultPrevented) { + suppressImmediateOutsideClickAfterPreventedStart(); + return; + } + if (typeof outsidePress2 === "function" && !outsidePress2(event)) { + return; + } + preventedPressSuppressionTimeout.clear(); + suppressNextOutsideClickRef.current = true; + clearInsideReactTree(); + } + function handleTouchMove(event) { + if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) { + return; + } + const touch = event.touches[0]; + if (!touch) { + return; + } + const deltaX = Math.abs(touch.clientX - touchStateRef.current.startX); + const deltaY = Math.abs(touch.clientY - touchStateRef.current.startY); + const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); + if (distance > 5) { + touchStateRef.current.dismissOnTouchEnd = true; + } + if (distance > 10) { + closeOnPressOutside(event); + cancelDismissOnEndTimeout.clear(); + touchStateRef.current = null; + } + } + function handleTouchMoveCapture(event) { + addTargetEventListenerOnce(event, handleTouchMove); + } + function handleTouchEnd(event) { + if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) { + return; + } + if (touchStateRef.current.dismissOnTouchEnd) { + closeOnPressOutside(event); + } + cancelDismissOnEndTimeout.clear(); + touchStateRef.current = null; + } + function handleTouchEndCapture(event) { + addTargetEventListenerOnce(event, handleTouchEnd); + } + const doc = ownerDocument(floatingElement); + const unsubscribe = mergeCleanups(escapeKey2 && mergeCleanups(addEventListener(doc, "keydown", closeOnEscapeKeyDown), addEventListener(doc, "compositionstart", handleCompositionStart), addEventListener(doc, "compositionend", handleCompositionEnd)), outsidePressEnabled && mergeCleanups(addEventListener(doc, "click", closeOnPressOutsideCapture, true), addEventListener(doc, "pointerdown", closeOnPressOutsideCapture, true), addEventListener(doc, "pointerup", handlePressEndCapture, true), addEventListener(doc, "pointercancel", handlePressEndCapture, true), addEventListener(doc, "mousedown", closeOnPressOutsideCapture, true), addEventListener(doc, "mouseup", handlePressEndCapture, true), addEventListener(doc, "touchstart", handleTouchStartCapture, true), addEventListener(doc, "touchmove", handleTouchMoveCapture, true), addEventListener(doc, "touchend", handleTouchEndCapture, true))); + return () => { + unsubscribe(); + compositionTimeout.clear(); + preventedPressSuppressionTimeout.clear(); + resetPressStartState(); + suppressNextOutsideClickRef.current = false; + }; + }, [dataRef, floatingElement, escapeKey2, outsidePressEnabled, outsidePress2, open, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, clearInsideReactTree, getOutsidePressEventProp, hasBlockingChild, isEventWithinOwnElements, tree, store, cancelDismissOnEndTimeout]); + React19.useEffect(clearInsideReactTree, [outsidePress2, clearInsideReactTree]); + const reference = React19.useMemo(() => ({ + onKeyDown: closeOnEscapeKeyDown, + [bubbleHandlerKeys[referencePressEvent]]: closeOnReferencePress, + ...referencePressEvent !== "intentional" && { + onClick: closeOnReferencePress + } + }), [closeOnEscapeKeyDown, closeOnReferencePress, referencePressEvent]); + const floating = React19.useMemo(() => ({ + onKeyDown: closeOnEscapeKeyDown, + // `onMouseDown` may be blocked if `event.preventDefault()` is called in + // `onPointerDown`, such as with . + // See https://github.com/mui/base-ui/pull/3379 + onPointerDown: markInsidePressStartPrevented, + onMouseDown: markInsidePressStartPrevented, + onClickCapture: markInsideReactTree, + onMouseDownCapture(event) { + markInsideReactTree(); + markPressStartedInsideReactTree(event); + }, + onPointerDownCapture(event) { + markInsideReactTree(); + markPressStartedInsideReactTree(event); + }, + onMouseUpCapture: markInsideReactTree, + onTouchEndCapture: markInsideReactTree, + onTouchMoveCapture: markInsideReactTree + }), [closeOnEscapeKeyDown, markInsideReactTree, markPressStartedInsideReactTree, markInsidePressStartPrevented]); + return React19.useMemo(() => enabled ? { + reference, + floating, + trigger: reference + } : {}, [enabled, reference, floating]); +} + +// ../../node_modules/.pnpm/@base-ui+react@1.5.0_@types+react@19.2.14_react-dom@19.2.5_react@19.2.5__react@19.2.5/node_modules/@base-ui/react/esm/floating-ui-react/hooks/useFloating.js +var React29 = __toESM(require_react(), 1); + +// ../../node_modules/.pnpm/@floating-ui+core@1.7.5/node_modules/@floating-ui/core/dist/floating-ui.core.mjs +function computeCoordsFromPlacement(_ref, placement, rtl) { + let { + reference, + floating + } = _ref; + const sideAxis = getSideAxis(placement); + const alignmentAxis = getAlignmentAxis(placement); + const alignLength = getAxisLength(alignmentAxis); + const side = getSide(placement); + const isVertical = sideAxis === "y"; + const commonX = reference.x + reference.width / 2 - floating.width / 2; + const commonY = reference.y + reference.height / 2 - floating.height / 2; + const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; + let coords; + switch (side) { + case "top": + coords = { + x: commonX, + y: reference.y - floating.height + }; + break; + case "bottom": + coords = { + x: commonX, + y: reference.y + reference.height + }; + break; + case "right": + coords = { + x: reference.x + reference.width, + y: commonY + }; + break; + case "left": + coords = { + x: reference.x - floating.width, + y: commonY + }; + break; + default: + coords = { + x: reference.x, + y: reference.y + }; + } + switch (getAlignment(placement)) { + case "start": + coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); + break; + case "end": + coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); + break; + } + return coords; +} +async function detectOverflow(state, options) { + var _await$platform$isEle; + if (options === void 0) { + options = {}; + } + const { + x, + y, + platform: platform3, + rects, + elements, + strategy + } = state; + const { + boundary = "clippingAncestors", + rootBoundary = "viewport", + elementContext = "floating", + altBoundary = false, + padding = 0 + } = evaluate(options, state); + const paddingObject = getPaddingObject(padding); + const altContext = elementContext === "floating" ? "reference" : "floating"; + const element = elements[altBoundary ? altContext : elementContext]; + const clippingClientRect = rectToClientRect(await platform3.getClippingRect({ + element: ((_await$platform$isEle = await (platform3.isElement == null ? void 0 : platform3.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform3.getDocumentElement == null ? void 0 : platform3.getDocumentElement(elements.floating)), + boundary, + rootBoundary, + strategy + })); + const rect = elementContext === "floating" ? { + x, + y, + width: rects.floating.width, + height: rects.floating.height + } : rects.reference; + const offsetParent = await (platform3.getOffsetParent == null ? void 0 : platform3.getOffsetParent(elements.floating)); + const offsetScale = await (platform3.isElement == null ? void 0 : platform3.isElement(offsetParent)) ? await (platform3.getScale == null ? void 0 : platform3.getScale(offsetParent)) || { + x: 1, + y: 1 + } : { + x: 1, + y: 1 + }; + const elementClientRect = rectToClientRect(platform3.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform3.convertOffsetParentRelativeRectToViewportRelativeRect({ + elements, + rect, + offsetParent, + strategy + }) : rect); + return { + top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, + bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, + left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, + right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x + }; +} +var MAX_RESET_COUNT = 50; +var computePosition = async (reference, floating, config) => { + const { + placement = "bottom", + strategy = "absolute", + middleware = [], + platform: platform3 + } = config; + const platformWithDetectOverflow = platform3.detectOverflow ? platform3 : { + ...platform3, + detectOverflow + }; + const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(floating)); + let rects = await platform3.getElementRects({ + reference, + floating, + strategy + }); + let { + x, + y + } = computeCoordsFromPlacement(rects, placement, rtl); + let statefulPlacement = placement; + let resetCount = 0; + const middlewareData = {}; + for (let i = 0; i < middleware.length; i++) { + const currentMiddleware = middleware[i]; + if (!currentMiddleware) { + continue; + } + const { + name, + fn + } = currentMiddleware; + const { + x: nextX, + y: nextY, + data, + reset + } = await fn({ + x, + y, + initialPlacement: placement, + placement: statefulPlacement, + strategy, + middlewareData, + rects, + platform: platformWithDetectOverflow, + elements: { + reference, + floating + } + }); + x = nextX != null ? nextX : x; + y = nextY != null ? nextY : y; + middlewareData[name] = { + ...middlewareData[name], + ...data + }; + if (reset && resetCount < MAX_RESET_COUNT) { + resetCount++; + if (typeof reset === "object") { + if (reset.placement) { + statefulPlacement = reset.placement; + } + if (reset.rects) { + rects = reset.rects === true ? await platform3.getElementRects({ + reference, + floating, + strategy + }) : reset.rects; + } + ({ + x, + y + } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); + } + i = -1; + } + } + return { + x, + y, + placement: statefulPlacement, + strategy, + middlewareData + }; +}; +var flip = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "flip", + options, + async fn(state) { + var _middlewareData$arrow, _middlewareData$flip; + const { + placement, + middlewareData, + rects, + initialPlacement, + platform: platform3, + elements + } = state; + const { + mainAxis: checkMainAxis = true, + crossAxis: checkCrossAxis = true, + fallbackPlacements: specifiedFallbackPlacements, + fallbackStrategy = "bestFit", + fallbackAxisSideDirection = "none", + flipAlignment = true, + ...detectOverflowOptions + } = evaluate(options, state); + if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { + return {}; + } + const side = getSide(placement); + const initialSideAxis = getSideAxis(initialPlacement); + const isBasePlacement = getSide(initialPlacement) === initialPlacement; + const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)); + const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); + const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none"; + if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { + fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); + } + const placements2 = [initialPlacement, ...fallbackPlacements]; + const overflow = await platform3.detectOverflow(state, detectOverflowOptions); + const overflows = []; + let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; + if (checkMainAxis) { + overflows.push(overflow[side]); + } + if (checkCrossAxis) { + const sides2 = getAlignmentSides(placement, rects, rtl); + overflows.push(overflow[sides2[0]], overflow[sides2[1]]); + } + overflowsData = [...overflowsData, { + placement, + overflows + }]; + if (!overflows.every((side2) => side2 <= 0)) { + var _middlewareData$flip2, _overflowsData$filter; + const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; + const nextPlacement = placements2[nextIndex]; + if (nextPlacement) { + const ignoreCrossAxisOverflow = checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false; + if (!ignoreCrossAxisOverflow || // We leave the current main axis only if every placement on that axis + // overflows the main axis. + overflowsData.every((d) => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) { + return { + data: { + index: nextIndex, + overflows: overflowsData + }, + reset: { + placement: nextPlacement + } + }; + } + } + let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; + if (!resetPlacement) { + switch (fallbackStrategy) { + case "bestFit": { + var _overflowsData$filter2; + const placement2 = (_overflowsData$filter2 = overflowsData.filter((d) => { + if (hasFallbackAxisSideDirection) { + const currentSideAxis = getSideAxis(d.placement); + return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal + // reading directions favoring greater width. + currentSideAxis === "y"; + } + return true; + }).map((d) => [d.placement, d.overflows.filter((overflow2) => overflow2 > 0).reduce((acc, overflow2) => acc + overflow2, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; + if (placement2) { + resetPlacement = placement2; + } + break; + } + case "initialPlacement": + resetPlacement = initialPlacement; + break; + } + } + if (placement !== resetPlacement) { + return { + reset: { + placement: resetPlacement + } + }; + } + } + return {}; + } + }; +}; +function getSideOffsets(overflow, rect) { + return { + top: overflow.top - rect.height, + right: overflow.right - rect.width, + bottom: overflow.bottom - rect.height, + left: overflow.left - rect.width + }; +} +function isAnySideFullyClipped(overflow) { + return sides.some((side) => overflow[side] >= 0); +} +var hide = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "hide", + options, + async fn(state) { + const { + rects, + platform: platform3 + } = state; + const { + strategy = "referenceHidden", + ...detectOverflowOptions + } = evaluate(options, state); + switch (strategy) { + case "referenceHidden": { + const overflow = await platform3.detectOverflow(state, { + ...detectOverflowOptions, + elementContext: "reference" + }); + const offsets = getSideOffsets(overflow, rects.reference); + return { + data: { + referenceHiddenOffsets: offsets, + referenceHidden: isAnySideFullyClipped(offsets) + } + }; + } + case "escaped": { + const overflow = await platform3.detectOverflow(state, { + ...detectOverflowOptions, + altBoundary: true + }); + const offsets = getSideOffsets(overflow, rects.floating); + return { + data: { + escapedOffsets: offsets, + escaped: isAnySideFullyClipped(offsets) + } + }; + } + default: { + return {}; + } + } + } + }; +}; +var originSides = /* @__PURE__ */ new Set(["left", "top"]); +async function convertValueToCoords(state, options) { + const { + placement, + platform: platform3, + elements + } = state; + const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)); + const side = getSide(placement); + const alignment = getAlignment(placement); + const isVertical = getSideAxis(placement) === "y"; + const mainAxisMulti = originSides.has(side) ? -1 : 1; + const crossAxisMulti = rtl && isVertical ? -1 : 1; + const rawValue = evaluate(options, state); + let { + mainAxis, + crossAxis, + alignmentAxis + } = typeof rawValue === "number" ? { + mainAxis: rawValue, + crossAxis: 0, + alignmentAxis: null + } : { + mainAxis: rawValue.mainAxis || 0, + crossAxis: rawValue.crossAxis || 0, + alignmentAxis: rawValue.alignmentAxis + }; + if (alignment && typeof alignmentAxis === "number") { + crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis; + } + return isVertical ? { + x: crossAxis * crossAxisMulti, + y: mainAxis * mainAxisMulti + } : { + x: mainAxis * mainAxisMulti, + y: crossAxis * crossAxisMulti + }; +} +var offset = function(options) { + if (options === void 0) { + options = 0; + } + return { + name: "offset", + options, + async fn(state) { + var _middlewareData$offse, _middlewareData$arrow; + const { + x, + y, + placement, + middlewareData + } = state; + const diffCoords = await convertValueToCoords(state, options); + if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { + return {}; + } + return { + x: x + diffCoords.x, + y: y + diffCoords.y, + data: { + ...diffCoords, + placement + } + }; + } + }; +}; +var shift = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "shift", + options, + async fn(state) { + const { + x, + y, + placement, + platform: platform3 + } = state; + const { + mainAxis: checkMainAxis = true, + crossAxis: checkCrossAxis = false, + limiter = { + fn: (_ref) => { + let { + x: x2, + y: y2 + } = _ref; + return { + x: x2, + y: y2 + }; + } + }, + ...detectOverflowOptions + } = evaluate(options, state); + const coords = { + x, + y + }; + const overflow = await platform3.detectOverflow(state, detectOverflowOptions); + const crossAxis = getSideAxis(getSide(placement)); + const mainAxis = getOppositeAxis(crossAxis); + let mainAxisCoord = coords[mainAxis]; + let crossAxisCoord = coords[crossAxis]; + if (checkMainAxis) { + const minSide = mainAxis === "y" ? "top" : "left"; + const maxSide = mainAxis === "y" ? "bottom" : "right"; + const min2 = mainAxisCoord + overflow[minSide]; + const max2 = mainAxisCoord - overflow[maxSide]; + mainAxisCoord = clamp(min2, mainAxisCoord, max2); + } + if (checkCrossAxis) { + const minSide = crossAxis === "y" ? "top" : "left"; + const maxSide = crossAxis === "y" ? "bottom" : "right"; + const min2 = crossAxisCoord + overflow[minSide]; + const max2 = crossAxisCoord - overflow[maxSide]; + crossAxisCoord = clamp(min2, crossAxisCoord, max2); + } + const limitedCoords = limiter.fn({ + ...state, + [mainAxis]: mainAxisCoord, + [crossAxis]: crossAxisCoord + }); + return { + ...limitedCoords, + data: { + x: limitedCoords.x - x, + y: limitedCoords.y - y, + enabled: { + [mainAxis]: checkMainAxis, + [crossAxis]: checkCrossAxis + } + } + }; + } + }; +}; +var limitShift = function(options) { + if (options === void 0) { + options = {}; + } + return { + options, + fn(state) { + const { + x, + y, + placement, + rects, + middlewareData + } = state; + const { + offset: offset4 = 0, + mainAxis: checkMainAxis = true, + crossAxis: checkCrossAxis = true + } = evaluate(options, state); + const coords = { + x, + y + }; + const crossAxis = getSideAxis(placement); + const mainAxis = getOppositeAxis(crossAxis); + let mainAxisCoord = coords[mainAxis]; + let crossAxisCoord = coords[crossAxis]; + const rawOffset = evaluate(offset4, state); + const computedOffset = typeof rawOffset === "number" ? { + mainAxis: rawOffset, + crossAxis: 0 + } : { + mainAxis: 0, + crossAxis: 0, + ...rawOffset + }; + if (checkMainAxis) { + const len = mainAxis === "y" ? "height" : "width"; + const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis; + const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis; + if (mainAxisCoord < limitMin) { + mainAxisCoord = limitMin; + } else if (mainAxisCoord > limitMax) { + mainAxisCoord = limitMax; + } + } + if (checkCrossAxis) { + var _middlewareData$offse, _middlewareData$offse2; + const len = mainAxis === "y" ? "width" : "height"; + const isOriginSide = originSides.has(getSide(placement)); + const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis); + const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0); + if (crossAxisCoord < limitMin) { + crossAxisCoord = limitMin; + } else if (crossAxisCoord > limitMax) { + crossAxisCoord = limitMax; + } + } + return { + [mainAxis]: mainAxisCoord, + [crossAxis]: crossAxisCoord + }; + } + }; +}; +var size = function(options) { + if (options === void 0) { + options = {}; + } + return { + name: "size", + options, + async fn(state) { + var _state$middlewareData, _state$middlewareData2; + const { + placement, + rects, + platform: platform3, + elements + } = state; + const { + apply = () => { + }, + ...detectOverflowOptions + } = evaluate(options, state); + const overflow = await platform3.detectOverflow(state, detectOverflowOptions); + const side = getSide(placement); + const alignment = getAlignment(placement); + const isYAxis = getSideAxis(placement) === "y"; + const { + width, + height + } = rects.floating; + let heightSide; + let widthSide; + if (side === "top" || side === "bottom") { + heightSide = side; + widthSide = alignment === (await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)) ? "start" : "end") ? "left" : "right"; + } else { + widthSide = side; + heightSide = alignment === "end" ? "top" : "bottom"; + } + const maximumClippingHeight = height - overflow.top - overflow.bottom; + const maximumClippingWidth = width - overflow.left - overflow.right; + const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight); + const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth); + const noShift = !state.middlewareData.shift; + let availableHeight = overflowAvailableHeight; + let availableWidth = overflowAvailableWidth; + if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) { + availableWidth = maximumClippingWidth; + } + if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) { + availableHeight = maximumClippingHeight; + } + if (noShift && !alignment) { + const xMin = max(overflow.left, 0); + const xMax = max(overflow.right, 0); + const yMin = max(overflow.top, 0); + const yMax = max(overflow.bottom, 0); + if (isYAxis) { + availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)); + } else { + availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)); + } + } + await apply({ + ...state, + availableWidth, + availableHeight + }); + const nextDimensions = await platform3.getDimensions(elements.floating); + if (width !== nextDimensions.width || height !== nextDimensions.height) { + return { + reset: { + rects: true + } + }; + } + return {}; + } + }; +}; + +// ../../node_modules/.pnpm/@floating-ui+dom@1.7.6/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs +function getCssDimensions(element) { + const css = getComputedStyle2(element); + let width = parseFloat(css.width) || 0; + let height = parseFloat(css.height) || 0; + const hasOffset = isHTMLElement(element); + const offsetWidth = hasOffset ? element.offsetWidth : width; + const offsetHeight = hasOffset ? element.offsetHeight : height; + const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; + if (shouldFallback) { + width = offsetWidth; + height = offsetHeight; + } + return { + width, + height, + $: shouldFallback + }; +} +function unwrapElement(element) { + return !isElement(element) ? element.contextElement : element; +} +function getScale(element) { + const domElement = unwrapElement(element); + if (!isHTMLElement(domElement)) { + return createCoords(1); + } + const rect = domElement.getBoundingClientRect(); + const { + width, + height, + $ + } = getCssDimensions(domElement); + let x = ($ ? round(rect.width) : rect.width) / width; + let y = ($ ? round(rect.height) : rect.height) / height; + if (!x || !Number.isFinite(x)) { + x = 1; + } + if (!y || !Number.isFinite(y)) { + y = 1; + } + return { + x, + y + }; +} +var noOffsets = createCoords(0); +function getVisualOffsets(element) { + const win = getWindow(element); + if (!isWebKit2() || !win.visualViewport) { + return noOffsets; + } + return { + x: win.visualViewport.offsetLeft, + y: win.visualViewport.offsetTop + }; +} +function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { + if (isFixed === void 0) { + isFixed = false; + } + if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) { + return false; + } + return isFixed; +} +function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { + if (includeScale === void 0) { + includeScale = false; + } + if (isFixedStrategy === void 0) { + isFixedStrategy = false; + } + const clientRect = element.getBoundingClientRect(); + const domElement = unwrapElement(element); + let scale = createCoords(1); + if (includeScale) { + if (offsetParent) { + if (isElement(offsetParent)) { + scale = getScale(offsetParent); + } + } else { + scale = getScale(element); + } + } + const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); + let x = (clientRect.left + visualOffsets.x) / scale.x; + let y = (clientRect.top + visualOffsets.y) / scale.y; + let width = clientRect.width / scale.x; + let height = clientRect.height / scale.y; + if (domElement) { + const win = getWindow(domElement); + const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent; + let currentWin = win; + let currentIFrame = getFrameElement(currentWin); + while (currentIFrame && offsetParent && offsetWin !== currentWin) { + const iframeScale = getScale(currentIFrame); + const iframeRect = currentIFrame.getBoundingClientRect(); + const css = getComputedStyle2(currentIFrame); + const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; + const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; + x *= iframeScale.x; + y *= iframeScale.y; + width *= iframeScale.x; + height *= iframeScale.y; + x += left; + y += top; + currentWin = getWindow(currentIFrame); + currentIFrame = getFrameElement(currentWin); + } + } + return rectToClientRect({ + width, + height, + x, + y + }); +} +function getWindowScrollBarX(element, rect) { + const leftScroll = getNodeScroll(element).scrollLeft; + if (!rect) { + return getBoundingClientRect(getDocumentElement(element)).left + leftScroll; + } + return rect.left + leftScroll; +} +function getHTMLOffset(documentElement, scroll) { + const htmlRect = documentElement.getBoundingClientRect(); + const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect); + const y = htmlRect.top + scroll.scrollTop; + return { + x, + y + }; +} +function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { + let { + elements, + rect, + offsetParent, + strategy + } = _ref; + const isFixed = strategy === "fixed"; + const documentElement = getDocumentElement(offsetParent); + const topLayer = elements ? isTopLayer(elements.floating) : false; + if (offsetParent === documentElement || topLayer && isFixed) { + return rect; + } + let scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + let scale = createCoords(1); + const offsets = createCoords(0); + const isOffsetParentAnElement = isHTMLElement(offsetParent); + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isOffsetParentAnElement) { + const offsetRect = getBoundingClientRect(offsetParent); + scale = getScale(offsetParent); + offsets.x = offsetRect.x + offsetParent.clientLeft; + offsets.y = offsetRect.y + offsetParent.clientTop; + } + } + const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); + return { + width: rect.width * scale.x, + height: rect.height * scale.y, + x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, + y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y + }; +} +function getClientRects(element) { + return Array.from(element.getClientRects()); +} +function getDocumentRect(element) { + const html = getDocumentElement(element); + const scroll = getNodeScroll(element); + const body = element.ownerDocument.body; + const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); + const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); + let x = -scroll.scrollLeft + getWindowScrollBarX(element); + const y = -scroll.scrollTop; + if (getComputedStyle2(body).direction === "rtl") { + x += max(html.clientWidth, body.clientWidth) - width; + } + return { + width, + height, + x, + y + }; +} +var SCROLLBAR_MAX = 25; +function getViewportRect(element, strategy) { + const win = getWindow(element); + const html = getDocumentElement(element); + const visualViewport = win.visualViewport; + let width = html.clientWidth; + let height = html.clientHeight; + let x = 0; + let y = 0; + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; + const visualViewportBased = isWebKit2(); + if (!visualViewportBased || visualViewportBased && strategy === "fixed") { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + const windowScrollbarX = getWindowScrollBarX(html); + if (windowScrollbarX <= 0) { + const doc = html.ownerDocument; + const body = doc.body; + const bodyStyles = getComputedStyle(body); + const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0; + const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline); + if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) { + width -= clippingStableScrollbarWidth; + } + } else if (windowScrollbarX <= SCROLLBAR_MAX) { + width += windowScrollbarX; + } + return { + width, + height, + x, + y + }; +} +function getInnerBoundingClientRect(element, strategy) { + const clientRect = getBoundingClientRect(element, true, strategy === "fixed"); + const top = clientRect.top + element.clientTop; + const left = clientRect.left + element.clientLeft; + const scale = isHTMLElement(element) ? getScale(element) : createCoords(1); + const width = element.clientWidth * scale.x; + const height = element.clientHeight * scale.y; + const x = left * scale.x; + const y = top * scale.y; + return { + width, + height, + x, + y + }; +} +function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { + let rect; + if (clippingAncestor === "viewport") { + rect = getViewportRect(element, strategy); + } else if (clippingAncestor === "document") { + rect = getDocumentRect(getDocumentElement(element)); + } else if (isElement(clippingAncestor)) { + rect = getInnerBoundingClientRect(clippingAncestor, strategy); + } else { + const visualOffsets = getVisualOffsets(element); + rect = { + x: clippingAncestor.x - visualOffsets.x, + y: clippingAncestor.y - visualOffsets.y, + width: clippingAncestor.width, + height: clippingAncestor.height + }; + } + return rectToClientRect(rect); +} +function hasFixedPositionAncestor(element, stopNode) { + const parentNode = getParentNode(element); + if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { + return false; + } + return getComputedStyle2(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode); +} +function getClippingElementAncestors(element, cache) { + const cachedResult = cache.get(element); + if (cachedResult) { + return cachedResult; + } + let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body"); + let currentContainingBlockComputedStyle = null; + const elementIsFixed = getComputedStyle2(element).position === "fixed"; + let currentNode = elementIsFixed ? getParentNode(element) : element; + while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { + const computedStyle = getComputedStyle2(currentNode); + const currentNodeIsContaining = isContainingBlock(currentNode); + if (!currentNodeIsContaining && computedStyle.position === "fixed") { + currentContainingBlockComputedStyle = null; + } + const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === "absolute" || currentContainingBlockComputedStyle.position === "fixed") || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); + if (shouldDropCurrentNode) { + result = result.filter((ancestor) => ancestor !== currentNode); + } else { + currentContainingBlockComputedStyle = computedStyle; + } + currentNode = getParentNode(currentNode); + } + cache.set(element, result); + return result; +} +function getClippingRect(_ref) { + let { + element, + boundary, + rootBoundary, + strategy + } = _ref; + const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary); + const clippingAncestors = [...elementClippingAncestors, rootBoundary]; + const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy); + let top = firstRect.top; + let right = firstRect.right; + let bottom = firstRect.bottom; + let left = firstRect.left; + for (let i = 1; i < clippingAncestors.length; i++) { + const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy); + top = max(rect.top, top); + right = min(rect.right, right); + bottom = min(rect.bottom, bottom); + left = max(rect.left, left); + } + return { + width: right - left, + height: bottom - top, + x: left, + y: top + }; +} +function getDimensions(element) { + const { + width, + height + } = getCssDimensions(element); + return { + width, + height + }; +} +function getRectRelativeToOffsetParent(element, offsetParent, strategy) { + const isOffsetParentAnElement = isHTMLElement(offsetParent); + const documentElement = getDocumentElement(offsetParent); + const isFixed = strategy === "fixed"; + const rect = getBoundingClientRect(element, true, isFixed, offsetParent); + let scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + const offsets = createCoords(0); + function setLeftRTLScrollbarOffset() { + offsets.x = getWindowScrollBarX(documentElement); + } + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + if (isOffsetParentAnElement) { + const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); + offsets.x = offsetRect.x + offsetParent.clientLeft; + offsets.y = offsetRect.y + offsetParent.clientTop; + } else if (documentElement) { + setLeftRTLScrollbarOffset(); + } + } + if (isFixed && !isOffsetParentAnElement && documentElement) { + setLeftRTLScrollbarOffset(); + } + const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); + const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; + const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; + return { + x, + y, + width: rect.width, + height: rect.height + }; +} +function isStaticPositioned(element) { + return getComputedStyle2(element).position === "static"; +} +function getTrueOffsetParent(element, polyfill) { + if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") { + return null; + } + if (polyfill) { + return polyfill(element); + } + let rawOffsetParent = element.offsetParent; + if (getDocumentElement(element) === rawOffsetParent) { + rawOffsetParent = rawOffsetParent.ownerDocument.body; + } + return rawOffsetParent; +} +function getOffsetParent(element, polyfill) { + const win = getWindow(element); + if (isTopLayer(element)) { + return win; + } + if (!isHTMLElement(element)) { + let svgOffsetParent = getParentNode(element); + while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { + if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { + return svgOffsetParent; + } + svgOffsetParent = getParentNode(svgOffsetParent); + } + return win; + } + let offsetParent = getTrueOffsetParent(element, polyfill); + while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) { + offsetParent = getTrueOffsetParent(offsetParent, polyfill); + } + if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) { + return win; + } + return offsetParent || getContainingBlock(element) || win; +} +var getElementRects = async function(data) { + const getOffsetParentFn = this.getOffsetParent || getOffsetParent; + const getDimensionsFn = this.getDimensions; + const floatingDimensions = await getDimensionsFn(data.floating); + return { + reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), + floating: { + x: 0, + y: 0, + width: floatingDimensions.width, + height: floatingDimensions.height + } + }; +}; +function isRTL(element) { + return getComputedStyle2(element).direction === "rtl"; +} +var platform2 = { + convertOffsetParentRelativeRectToViewportRelativeRect, + getDocumentElement, + getClippingRect, + getOffsetParent, + getElementRects, + getClientRects, + getDimensions, + getScale, + isElement, + isRTL +}; +function rectsAreEqual(a, b) { + return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; +} +function observeMove(element, onMove) { + let io = null; + let timeoutId; + const root = getDocumentElement(element); + function cleanup() { + var _io; + clearTimeout(timeoutId); + (_io = io) == null || _io.disconnect(); + io = null; + } + function refresh(skip, threshold) { + if (skip === void 0) { + skip = false; + } + if (threshold === void 0) { + threshold = 1; + } + cleanup(); + const elementRectForRootMargin = element.getBoundingClientRect(); + const { + left, + top, + width, + height + } = elementRectForRootMargin; + if (!skip) { + onMove(); + } + if (!width || !height) { + return; + } + const insetTop = floor(top); + const insetRight = floor(root.clientWidth - (left + width)); + const insetBottom = floor(root.clientHeight - (top + height)); + const insetLeft = floor(left); + const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; + const options = { + rootMargin, + threshold: max(0, min(1, threshold)) || 1 + }; + let isFirstUpdate = true; + function handleObserve(entries) { + const ratio = entries[0].intersectionRatio; + if (ratio !== threshold) { + if (!isFirstUpdate) { + return refresh(); + } + if (!ratio) { + timeoutId = setTimeout(() => { + refresh(false, 1e-7); + }, 1e3); + } else { + refresh(false, ratio); + } + } + if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) { + refresh(); + } + isFirstUpdate = false; + } + try { + io = new IntersectionObserver(handleObserve, { + ...options, + // Handle