Showing preview only (542K chars total). Download the full file or copy to clipboard to get everything.
Repository: r-renato/ha-card-weather-conditions
Branch: master
Commit: 2a264d2ac301
Files: 63
Total size: 518.5 KB
Directory structure:
gitextract_h_qgsp48/
├── .eslintignore
├── .eslintrc.json
├── .github/
│ └── workflows/
│ └── codeql.yml
├── .gitignore
├── .npmignore
├── .vscode/
│ └── settings.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── dist/
│ ├── ha-card-weather-conditions.js
│ └── transl/
│ ├── cs.json
│ ├── da.json
│ ├── de.json
│ ├── en.json
│ ├── es.json
│ ├── fr.json
│ ├── it.json
│ ├── nl.json
│ ├── no-NO.json
│ ├── pt.json
│ ├── ru.json
│ └── sr-latn.json
├── hacs.json
├── info.md
├── package.json
├── rollup.new.config.mjs
├── src/
│ ├── base/
│ │ └── lovelace-base.ts
│ ├── builder/
│ │ ├── b-airquality.ts
│ │ ├── b-camera.ts
│ │ ├── b-meteoalarm.ts
│ │ ├── b-pollen.ts
│ │ ├── b-present.ts
│ │ ├── b-summary.ts
│ │ ├── b-ultraviolet.ts
│ │ └── b-weather-forecast.ts
│ ├── css/
│ │ ├── css-base-card.ts
│ │ ├── css-camera.ts
│ │ ├── css-meteoalarm.ts
│ │ ├── css-pollen.ts
│ │ ├── css-present.ts
│ │ ├── css-summary.ts
│ │ ├── css-ultraviolet.ts
│ │ └── css-weather-forecast.ts
│ ├── ha-weather-ecard.ts
│ ├── iconmodels/
│ │ ├── im-buienradar.ts
│ │ ├── im-climacell.ts
│ │ ├── im-darksky.ts
│ │ ├── im-hass.ts
│ │ ├── im-openweathermap.ts
│ │ └── im-pirateweather.ts
│ ├── templates/
│ │ ├── t-camera.ts
│ │ ├── t-meteoalarm.ts
│ │ ├── t-pollen.ts
│ │ ├── t-present.ts
│ │ ├── t-summary.ts
│ │ ├── t-ultraviolet.ts
│ │ └── t-weather-forecast.ts
│ └── utils/
│ ├── colors.ts
│ ├── config-schema.ts
│ ├── const.ts
│ ├── helper-render.ts
│ └── helper.ts
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .eslintignore
================================================
backup/
dist/
node_modules/
rollup.config.mjs
rollup.config copy.js
rollup.new.config.mjs
================================================
FILE: .eslintrc.json
================================================
{
"root": true,
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 2022,
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"airbnb-base"
],
"rules": {
"operator-linebreak": "warn",
"no-trailing-spaces": "warn",
"one-var": "warn",
"one-var-declaration-per-line": "warn",
"dot-notation": "warn",
"max-len": ["error", { "code": 150 }],
"eol-last": ["error", "always"],
"no-console": "off",
"no-unused-vars": ["warn", { "args": "none", "ignoreRestSiblings": true }],
"nonblock-statement-body-position": "warn",
"@typescript-eslint/no-unused-vars": "warn",
"max-classes-per-file": ["warn", 3],
"import/extensions": ["warn", "ignorePackages", {
"ts": "never",
"js": "never"
}]
},
"settings": {
"import/resolver": {
"node": {
"extensions": [".js", ".ts", ".jsx", ".tsx"]
}
}
},
"env": {
"browser": true,
"es2022": true
}
}
================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL"
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: "22 7 * * 0"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ javascript ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
queries: +security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{ matrix.language }}"
================================================
FILE: .gitignore
================================================
# ####### ####### #######
# Folders
.idea
__pycache__
/node_modules/
/.rpt2_cache/
/trash/
/backup/
# ####### ####### #######
# Files
package-lock.json
================================================
FILE: .npmignore
================================================
# OS X
.DS_Store
backup
================================================
FILE: .vscode/settings.json
================================================
{
"eslint.enable": true,
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
"editor.tabSize": 2,
"ha_module_path": "/home/drp/homeassistant/www/community/ha-card-weather-conditions",
"editor.wordWrap": "wordWrapColumn",
"editor.wordWrapColumn": 120,
}
================================================
FILE: CHANGELOG.md
================================================
# HA (Lovelace) Card Weather Conditions
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [2.0.1] 2025-06-08
### Fixed
### Added
- ru locale
### Changed
- nl locale
## [2.0.0] 2025-06-08
### Changed
- Readme and PNG image
- Fully reengineered the card
- Czech locale
### Changed
- Update Spanish locale
## [1.9.12] 2021-01-29
### Fixed
- Minor bug fixing
## [1.9.11] 2021-01-29
### Fixed
- Minor bug fixing
## [1.9.10] 2021-01-24
### Changed
Update ClimaCel icons map
## [1.9.9] 2021-01-11
### Added
- Norwegian locale
## [1.9.8] 2021-01-07
### Added
- Danish locale
## [1.9.7] 2020-12-06
### Fixed
- Fixed the snow icon name for the night time (climacell, darksky, openweathermap)
## [1.9.6] 2020-08-17
### Fixed
- German locale, fix for "Feels Like" word
## [1.9.6] 2020-08-08
### Added
- Icon model for: buienradar, defaulthass
## [1.9.5] 2020-08-08
### Fixed
- Documentation
## [1.9.5] 2020-07-21
### Added
- Errors catch and display while loading translations files
## [1.9.4] 2020-07-19
### Fixed
- Minor bug fixing
## [1.9.3] 2020-07-18
### Changed
- Exposition time change from hours to minutes
## [1.9.2] 2020-07-10
### Fixed
- Minor bug fixing
## [1.9.1] 2020-06-22
### Added
- Added icon override mode for the pollen layer
## [1.9.0] 2020-06-21
### Fixed
- Minor bug fixing
### Added
- Add `sea` Weather Forecast session
## [1.8.1] 2020-06-15
### Fixed
- Minor bug fixing
## [1.8.0] 2020-06-15
### Fixed
- Minor bug fixing
### Changed
- Internationalization model
### Added
- Add `pt` language
- Add Alert Layer
### Changed
## [1.7.1] 2020-05-24
### Fixed
- Minor bug fixing
## [1.7.0] 2020-05-23
### Fixed
- Minor bug fixing
### Added
- Add `sr-latn` language
## [1.6.0] 2020-05-22
### Added
- Add `fr` language
## [1.5.1] 2020-05-21
### Fixed
- Minor bug fixing
## [1.5.0] 2020-05-14
### Fixed
- Minor bug fixing
### Added
- Add `uv` (ultraviolet) session
## [1.4.0] 2020-05-13
### Added
- Add `es` language
## [1.3.1] 2020-05-13
### Fixed
- Minor bug fixing
## [1.3.0] 2020-05-10
### Added
- Add moon phase
## [1.2.0] 2020-05-08
### Added
- Add NL (Dutch) language
## [1.1.0] 2020-05-07
### Added
- Add feels_like sensor
## [1.0.1] 2020-05-07
### Fixed
- Minor bug fixing
## [1.0.0] 2020-05-03
- Initial stable version
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2019 Renato Rossi, https://www.linkedin.com/in/renatorossi/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Weather Conditions Card
ha-card-weather-conditions is a powerful and flexible Lovelace card for Home Assistant. It integrates a variety of weather-related data sources to present a comprehensive summary and forecast.<br>
[](https://github.com/hacs/integration)
[![License][license-shield]](LICENSE)
[](https://lgtm.com/projects/g/r-renato/ha-card-weather-conditions/alerts/)
[](https://lgtm.com/projects/g/r-renato/ha-card-weather-conditions/context:javascript)
[![BuyMeCoffee][buymecoffeebadge]][buymecoffee]
## Features
* Current and forecast weather conditions
* Marine forecast (swell, wave, wind)
* Ultraviolet radiation index and protection advice
* Pollen level display (tree, weed, grass)
* Air quality index with multiple pollutant types
* Weather alerts (fire, storm, hydrogeological, hydraulic)
* Meteogram and camera integration
* Multilingual support
* Display MeteoAlarm (Early Warnings for Europe) and Dipartimento Protezione Civile (Italy only) Alert
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-overview.png" width="100%" height="auto" alt="Home Assistant lovelace card">
</p>
<!-- <p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-full.png" width="40%" height="auto" alt="Home Assistant lovelace card">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-1.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-2.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p> -->
## **Card Configuration**
To use the ```ha-card-weather-conditions``` card, add the following configuration to your ```lovelace``` dashboard:
```yaml
resources:
# Required: Load the card if installed via HACS
- url: /hacsfiles/ha-card-weather-conditions/ha-card-weather-conditions.js
type: module
# Optional: Load Card Mod to enable advanced styling/customization
- url: /hacsfiles/lovelace-card-mod/card-mod.js
type: module
# ...
```
## **Card Schema Summary**
| **Parameter** | **Type** | **Required** | **Default** | **Description** |
| ------------- | --------- | ------------ | ----------- | ---------------------------------------------------------------------------------------------------------- |
| `type` | `string` | Yes | — | Must be set to `custom:ha-card-weather-conditions`. |
| `language` | `string` | No | `en` | Language for labels. Supported values: `en`, `it`, `nl`, `es`, `de`, `fr`, `sr-latn`, `pt`, `da`, `no-NO`, `cs`, `ru`. |
| `weather` | `object` | No | — | Configuration for main weather source. See dedicated section. |
| `ultraviolet` | `object` | No | — | Configuration for UV index display. See dedicated section for details. |
| `pollen` | `object` | No | — | Configuration for pollen levels. See dedicated section. |
| `airquality` | `object` | No | — | Configuration for air quality index. See dedicated section. |
| `camera` | `string` | No | — | Entity ID of the camera to display. |
## **1 `weather` Object Schema**
The following parameters configure the weather object to display current conditions, short-term and long-term forecasts, as well as related alerts.
This card has been tested with weather data provided by `pirateweather`, `climacell`, `darksky` and `openweathermap` integrations.
| **Name** | **Type** | **Required** | **Default** | **Description** |
| ------------------------- | --------- | ------------ | --------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `name` | `string` | No | — | Name of the location displayed in the summary section. |
| `sun` | `string` | No | — | Entity ID for the sun sensor (used to adjust visuals for daylight, sunrise, and sunset). |
| `moonphase` | `string` | No | — | Entity ID for the moon phase sensor. |
| `icons_model` | `string` | **Yes** | `pirateweather` | Icon set to use. Supported values: `pirateweather`, `climacell`, `darksky`, `openweathermap`, `buienradar`, `defaulthass`. |
| `animation` | `boolean` | No | `false` | Enables visual effects like moving clouds, rain, or waves based on weather conditions. |
| `present` | `object` | No | — | Object containing current weather data (e.g., temperature, humidity, pressure). |
| `daily_forecasts` | `object` | No | — | Object containing multi-day weather forecast data. |
| `hourly_forecasts` | `object` | No | — | Object containing hourly weather forecast data. |
| `marine_daily_forecasts` | `object` | No | — | Object with daily marine forecast data (e.g., wave height, wind, tides). |
| `marine_hourly_forecasts` | `object` | No | — | Object with hourly marine forecast data. |
| `meteoalarm` | `string` | No | — | Entity ID from [Meteoalarm](https://meteoalarm.org/) integration for regional weather warnings. |
| `dpcalarm` | `object` | No | — | Object providing DPC (Protezione Civile) alerts such as thunderstorm or flood risks. |
### **1.1 `present` Object Schema**
The present object defines the entities used to display the current weather conditions in the summary section of the card. Each property corresponds to a specific sensor or attribute providing real-time environmental data.
| **Name** | **Type** | **Required** | **Default** | **Description** |
| --------------------------- | ---------- | ------------ | ----------- | ----------------------------------------------------------------------------- |
| `condition` | `string` | No | — | Entity ID providing the current weather condition (e.g. sunny, cloudy, rain). |
| `temperature` | `string` | No | — | Entity ID providing the current temperature. |
| `temperature_feelslike` | `string` | No | — | Entity ID providing the perceived (feels-like) temperature. |
| `temperature_min` | `string` | No | — | Entity ID providing the minimum temperature of the day. |
| `temperature_max` | `string` | No | — | Entity ID providing the maximum temperature of the day. |
| `humidity` | `string` | No | — | Entity ID providing the current humidity level (%). |
| `pressure` | `string` | No | — | Entity ID providing the current atmospheric pressure. |
| `visibility` | `string` | No | — | Entity ID providing the current visibility level. |
| `wind_bearing` | `string` | No | — | Entity ID providing the wind direction in degrees. |
| `wind_speed` | `string` | No | — | Entity ID providing the wind speed. |
| `precipitation_intensity` | `string` | No | — | Entity ID providing the precipitation rate (e.g. mm/h). |
| `precipitation_probability` | `string` | No | — | Entity ID providing the probability of precipitation (%). |
### **1.2 `daily_forecasts` Object Schema**
This object defines the structure for multi-day forecast data, where each property can include multiple time slots (e.g. `day_1`, `day_2`, `day_3`…).
Each forecast element (such as `temperature`, `condition`, `precipitation probability`, etc.) must be represented as a Home Assistant entity (e.g., sensor) that includes the following attributes:
- `datetime`: the timestamp indicating the forecast reference time, in ISO 8601 format, for example: <code>2025-06-12T22:00:00+00:00</code>
- `unit_of_measurement`: the unit of measure for the forecasted value (e.g., "`°C`", "`mm`", "`%`"), which must be exposed as an attribute of the sensor.
These attributes are essential to ensure accurate time alignment and proper rendering of the forecast data.
| **Name** | **Type** | **Required** | **Default** | **Description** |
| --------------------------- | ------------ | ------------ | ----------- | -------------------------------------------------------------------------- |
| `condition` | `iTimeSlots` | No | — | Object containing the weather condition icons or states for each day slot. |
| `temperature_high` | `iTimeSlots` | No | — | Object containing the daily high temperature values per slot. |
| `temperature_low` | `iTimeSlots` | No | — | Object containing the daily low temperature values per slot. |
| `precipitation_intensity` | `iTimeSlots` | No | — | Object with the forecasted precipitation amount for each slot. |
| `precipitation_probability` | `iTimeSlots` | No | — | Object with the probability of precipitation (%) per slot. |
### **1.3 `hourly_forecasts` Object Schema**
This object defines the structure for hourly weather forecast data. All fields are optional and do not have default values.
Each forecast element (such as `temperature`, `condition`, `precipitation probability`, etc.) must be represented as a Home Assistant entity (e.g., sensor) that includes the following attributes:
- `datetime`: the timestamp indicating the forecast reference time, in ISO 8601 format, for example: <code>2025-06-12T22:00:00+00:00</code>
- `unit_of_measurement`: the unit of measure for the forecasted value (e.g., "`°C`", "`mm`", "`%`"), which must be exposed as an attribute of the sensor.
These attributes are essential to ensure accurate time alignment and proper rendering of the forecast data.
| **Name** | **Type** | **Required** | **Default** | **Description** |
| --------------------------- | ------------ | ------------ | ----------- | ----------------------------------------------------------------------------- |
| `condition` | `iTimeSlots` | No | — | Object containing the weather condition icons or states for each hourly slot. |
| `temperature` | `iTimeSlots` | No | — | Object containing the perceived ambient temperature for each hour. |
| `temperature_feelslike` | `iTimeSlots` | No | — | Object containing the "feels like" temperature values for each hour. |
| `precipitation_intensity` | `iTimeSlots` | No | — | Object with forecasted precipitation amount per hour. |
| `precipitation_probability` | `iTimeSlots` | No | — | Object with probability of precipitation (%) per hour. |
| `wind_bearing` | `iTimeSlots` | No | — | Object with wind direction (in degrees or cardinal direction) per hour. |
| `wind_speed` | `iTimeSlots` | No | — | Object with wind speed values per hour. |
### **1.3.1 `iTimeSlots` Object Schema**
This object represents a set of six time slots used to store sequential forecast data (e.g., hourly, daily, etc.).
| **Name** | **Type** | **Required** | **Description** |
| -------- | -------- | ------------ | ------------------------------------------------------------ |
| `slot1` | `string` | No | Value for the first time slot (e.g., current or first hour). |
| `slot2` | `string` | No | Value for the second time slot. |
| `slot3` | `string` | No | Value for the third time slot. |
| `slot4` | `string` | No | Value for the fourth time slot. |
| `slot5` | `string` | No | Value for the fifth time slot. |
| `slot6` | `string` | No | Value for the sixth time slot. |
### **1.4 `dpcalarm` Object Schema**
The `dpcalarm` object is used to configure weather-related alerts provided by the Italian Civil Protection Department (DPC), including thunderstorms, hydraulic, and hydrogeological risks. Each property should reference a specific sensor entity ID.
| **Name** | **Type** | **Required** | **Description** |
| ----------------- | -------- | ------------ | ---------------------------------------------------------------------------- |
| `thunderstorms` | `string` | No | Entity ID providing thunderstorm alert information from DPC. |
| `hydraulic` | `string` | No | Entity ID providing hydraulic (river/stream flooding) alert information. |
| `hydrogeological` | `string` | No | Entity ID providing hydrogeological (landslide/soil instability) alert data. |
## **2 `ultraviolet` Object Schema**
The ultraviolet object allows you to display UV-related data such as the current index, ozone level, protection window, and safe exposure times for different skin types (I–VI).
| **Name** | **Type** | **Required** | **Description** |
| ------------------- | -------- | ------------ | ------------------------------------------------------------------------------- |
| `protection_window` | `string` | No | Entity ID providing the time window during which sun protection is recommended. |
| `ozone_level` | `string` | No | Entity ID providing the current atmospheric ozone level. |
| `uv_index` | `string` | No | Entity ID providing the current UV index value. |
| `uv_level` | `string` | No | Entity ID describing the UV risk level (e.g. low, moderate, high). |
| `max_uv_index` | `string` | No | Entity ID providing the maximum forecasted UV index for the day. |
| `set_skin_type_1` | `string` | No | Entity ID providing sun exposure time recommendation for skin type I. |
| `set_skin_type_2` | `string` | No | Entity ID providing sun exposure time recommendation for skin type II. |
| `set_skin_type_3` | `string` | No | Entity ID providing sun exposure time recommendation for skin type III. |
| `set_skin_type_4` | `string` | No | Entity ID providing sun exposure time recommendation for skin type IV. |
| `set_skin_type_5` | `string` | No | Entity ID providing sun exposure time recommendation for skin type V. |
| `set_skin_type_6` | `string` | No | Entity ID providing sun exposure time recommendation for skin type VI. |
## **3 `pollen` Object Schema**
The pollen object provides information about airborne allergens. It defines the range of measured values (`min` and `max`) and includes a list of `entities` describing each pollen type.
| **Name** | **Type** | **Required** | **Description** |
| ---------- | --------------- | ------------ | ----------------------------------------------------------------------- |
| `entities` | `iPollenItem[]` | Yes | Array of pollen data objects, each representing a specific pollen type. |
| `min` | `number` | Yes | Minimum expected pollen concentration (used for scaling). |
| `max` | `number` | Yes | Maximum expected pollen concentration (used for scaling). |
## **3.1 `iPollenItem` Object Schema**
Each `iPollenItem` defines a specific pollen type to be tracked, including a name for display and the corresponding entity ID in Home Assistant.
| **Name** | **Type** | **Required** | **Description** |
| -------- | -------- | ------------ | ----------------------------------------------------------------- |
| `name` | `string` | Yes | Display name of the pollen type (e.g., “Grass”, “Birch”). |
| `entity` | `string` | Yes | Home Assistant entity ID providing the pollen concentration data. |
## **4 `airquality` Object Schema**
The `airquality` object defines the Home Assistant entity IDs used to monitor various air pollution metrics and EPA health indicators. Each field corresponds to a specific air quality parameter.
| **Name** | **Type** | **Required** | **Description** |
| ----------------------- | -------- | ------------ | ---------------------------------------------------------------------------- |
| `pm25` | `string` | No | Entity ID providing PM2.5 (fine particulate matter) concentration. |
| `pm10` | `string` | No | Entity ID providing PM10 (coarse particulate matter) concentration. |
| `o3` | `string` | No | Entity ID providing Ozone (O₃) concentration. |
| `no2` | `string` | No | Entity ID providing Nitrogen Dioxide (NO₂) concentration. |
| `co` | `string` | No | Entity ID providing Carbon Monoxide (CO) concentration. |
| `so2` | `string` | No | Entity ID providing Sulfur Dioxide (SO₂) concentration. |
| `epa_aqi` | `string` | No | Entity ID providing the EPA-computed Air Quality Index. |
| `epa_primary_pollutant` | `string` | No | Entity ID providing the EPA-designated primary pollutant. |
| `epa_health_concern` | `string` | No | Entity ID describing the EPA-assigned health concern level (e.g., moderate). |
## **Card Layers Sample**
This section showcases a complete example of the different visual layers supported by the `ha-card-weather-conditions` card.
Each layer such as summary, weather conditions, air quality, UV index, and alerts—can be configured independently, allowing full control over how and where data appears.
Use this reference as a guide when designing your Lovelace configuration to build a fully personalized weather dashboard.
### **Summary Layer**
The summary layers present a concise visual overview of current weather conditions.
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-summary.png" width="40%" height="auto" alt="Home Assistant lovelace card">
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
weather:
name: "Acquafredda"
icons_model: pirateweather
moonphase: sensor.moon_phase
present:
condition: sensor.home_condition
temperature: sensor.home_temperature
temperature_feelslike: sensor.home_apparent_temperature
```
### **Present Layer**
This layer displays the current weather conditions using entity data such as temperature, humidity, wind, and more.
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-present.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
weather:
icons_model: pirateweather
sun: sun.sun
present:
temperature_min: sensor.home_temperature_min
temperature_max: sensor.home_temperature_max
humidity: sensor.home_relative_humidity
pressure: sensor.home_pressure
wind_bearing: sensor.home_wind_bearing
wind_speed: sensor.home_wind_speed
precipitation_intensity: sensor.home_precipitation
precipitation_probability: sensor.home_precipitation_probability
```
### **Daily Forecast Layer**
This layer provides a multi-day weather overview, including expected temperature highs and lows, precipitation probability, and general conditions.
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-daily-forecast.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
weather:
icons_model: pirateweather
daily_forecasts:
condition:
slot1: sensor.home_daily_forecast_condition_d1
slot2: sensor.home_daily_forecast_condition_d2
slot3: sensor.home_daily_forecast_condition_d3
slot4: sensor.home_daily_forecast_condition_d4
temperature_high:
slot1: sensor.home_daily_forecast_temperature_max_d1
slot2: sensor.home_daily_forecast_temperature_max_d2
slot3: sensor.home_daily_forecast_temperature_max_d3
slot4: sensor.home_daily_forecast_temperature_max_d4
temperature_low:
slot1: sensor.home_daily_forecast_temperature_min_d1
slot2: sensor.home_daily_forecast_temperature_min_d2
slot3: sensor.home_daily_forecast_temperature_min_d3
slot4: sensor.home_daily_forecast_temperature_min_d4
precipitation_probability:
slot1: sensor.home_daily_forecast_precipitation_probability_d1
slot2: sensor.home_daily_forecast_precipitation_probability_d2
slot3: sensor.home_daily_forecast_precipitation_probability_d3
slot4: sensor.home_daily_forecast_precipitation_probability_d4
precipitation_intensity:
slot1: sensor.home_daily_forecast_precipitation_d1
slot2: sensor.home_daily_forecast_precipitation_d2
slot3: sensor.home_daily_forecast_precipitation_d3
slot4: sensor.home_daily_forecast_precipitation_d4
```
### **Hourly Forecast Layer**
This layer displays detailed weather data for the next several hours, including temperature, precipitation, and wind conditions.
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-hourly-forecast.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
weather:
icons_model: pirateweather
hourly_forecasts:
condition:
slot1: sensor.home_hourly_forecast_condition_h1
slot2: sensor.home_hourly_forecast_condition_h2
slot3: sensor.home_hourly_forecast_condition_h3
slot4: sensor.home_hourly_forecast_condition_h4
temperature:
slot1: sensor.home_hourly_forecast_temperature_h1
slot2: sensor.home_hourly_forecast_temperature_h2
slot3: sensor.home_hourly_forecast_temperature_h3
slot4: sensor.home_hourly_forecast_temperature_h4
temperature_feelslike:
slot1: sensor.home_hourly_forecast_apparent_temperature_h1
slot2: sensor.home_hourly_forecast_apparent_temperature_h2
slot3: sensor.home_hourly_forecast_apparent_temperature_h3
slot4: sensor.home_hourly_forecast_apparent_temperature_h4
precipitation_intensity:
slot1: sensor.home_hourly_forecast_precipitation_h1
slot2: sensor.home_hourly_forecast_precipitation_h2
slot3: sensor.home_hourly_forecast_precipitation_h3
slot4: sensor.home_hourly_forecast_precipitation_h4
precipitation_probability:
slot1: sensor.home_hourly_forecast_precipitation_probability_h1
slot2: sensor.home_hourly_forecast_precipitation_probability_h2
slot3: sensor.home_hourly_forecast_precipitation_probability_h3
slot4: sensor.home_hourly_forecast_precipitation_probability_h4
wind_bearing:
slot1: sensor.home_hourly_forecast_wind_bearing_h1
slot2: sensor.home_hourly_forecast_wind_bearing_h2
slot3: sensor.home_hourly_forecast_wind_bearing_h3
slot4: sensor.home_hourly_forecast_wind_bearing_h4
wind_speed:
slot1: sensor.home_hourly_forecast_wind_speed_h1
slot2: sensor.home_hourly_forecast_wind_speed_h2
slot3: sensor.home_hourly_forecast_wind_speed_h3
slot4: sensor.home_hourly_forecast_wind_speed_h4
```
### **Marine Daily Forecast Layer**
This layer provides daily marine weather forecasts, including information such as wave height, wind speed, and sea conditions.
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-marine-daily-forecast.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
weather:
icons_model: pirateweather
marine_daily_forecasts:
wave_height_max:
slot1: sensor.marine_wave_height_max_day_0
slot2: sensor.marine_wave_height_max_day_1
slot3: sensor.marine_wave_height_max_day_2
slot4: sensor.marine_wave_height_max_day_3
wave_direction:
slot1: sensor.marine_wave_direction_dominant_day_0
slot2: sensor.marine_wave_direction_dominant_day_1
slot3: sensor.marine_wave_direction_dominant_day_2
slot4: sensor.marine_wave_direction_dominant_day_3
swell_wave_height_max:
slot1: sensor.amarine_swell_wave_height_max_day_0
slot2: sensor.marine_swell_wave_height_max_day_1
slot3: sensor.marine_swell_wave_height_max_day_2
slot4: sensor.marine_swell_wave_height_max_day_3
wind_wave_height_max:
slot1: sensor.marine_wind_wave_height_max_day_0
slot2: sensor.marine_wind_wave_height_max_day_1
slot3: sensor.marine_wind_wave_height_max_day_2
slot4: sensor.marine_wind_wave_height_max_day_3
```
### **Alarms Layer**
This layer displays weather alerts and warnings from official sources such as Meteoalarm and the Italian Civil Protection Department (DPC).
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-alarms.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
weather:
icons_model: pirateweather
meteoalarm: binary_sensor.italy_basilicata_meteo_alarm
dpcalarm:
thunderstorms: binary_sensor.dpc_basilicata_temporali_oggi
hydraulic: binary_sensor.dpc_basilicata_idraulico_oggi
hydrogeological: binary_sensor.dpc_basilicata_idrogeologico_oggi
```
### **Ultraviolet Layer**
This layer presents real-time ultraviolet (UV) radiation data, including UV index levels, ozone concentration, and skin protection recommendations.
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-ultraviolet.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
ultraviolet:
protection_window: binary_sensor.openuv_protection_window
ozone_level: sensor.openuv_current_ozone_level
uv_index: sensor.openuv_current_uv_index
uv_level: sensor.openuv_current_uv_level
max_uv_index: sensor.openuv_max_uv_index
set_skin_type_1: sensor.openuv_skin_type_1_safe_exposure_time
set_skin_type_2: sensor.openuv_skin_type_2_safe_exposure_time
set_skin_type_3: sensor.openuv_skin_type_3_safe_exposure_time
set_skin_type_4: sensor.openuv_skin_type_4_safe_exposure_time
set_skin_type_5: sensor.openuv_skin_type_5_safe_exposure_time
set_skin_type_6: sensor.openuv_skin_type_6_safe_exposure_time
```
### **Pollen Layer**
This layer displays information about airborne pollen levels, helping users monitor potential allergen exposure.
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-pollen.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
pollen:
min: 1
max: 4
entities:
- name: Alder
entity: sensor.openmeteo_pollen_alder_level
- name: Birch
entity: sensor.openmeteo_pollen_birch_level
- name: Grass
entity: sensor.openmeteo_pollen_grass_level
- name: Mugwort
entity: sensor.openmeteo_pollen_mugwort_level
- name: Olive
entity: sensor.openmeteo_pollen_olive_level
- name: Ragweed
entity: sensor.openmeteo_pollen_ragweed_level
```
### **Air Quality Layer**
This layer presents real-time data on key air quality indicators such as PM2.5, PM10, ozone, and nitrogen dioxide levels.
<p float="left">
<img src="https://github.com/r-renato/ha-card-weather-conditions/raw/master/md.images/ha-card-weather-condition-air-quality.png" width="40%" height="auto" alt="Home Assistant lovelace card">
</p>
#### **YAML example**
```yaml
type: custom:ha-card-weather-conditions
language: it
airquality:
pm25: sensor.lazio_italy_pm2_5
pm10: sensor.lazio_italy_pm10
o3: sensor.roma_lazio_italy_ozone
co: sensor.roma_lazio_italy_carbon_monoxide
epa_aqi: sensor.lazio_italy_air_quality_index
epa_primary_pollutant: sensor.lazio_italy_dominant_pollutant
```
[license-shield]:https://img.shields.io/github/license/r-renato/ha-card-weather-conditions
[buymecoffee]: https://www.buymeacoffee.com/0D3WbkKrn
[buymecoffeebadge]: https://img.shields.io/badge/buy%20me%20a%20coffee-donate-yellow?style=for-the-badge
================================================
FILE: dist/ha-card-weather-conditions.js
================================================
function e(e,t,i,n){var a,s=arguments.length,o=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,n);else for(var r=e.length-1;r>=0;r--)(a=e[r])&&(o=(s<3?a(o):s>3?a(t,i,o):a(t,i))||o);return s>3&&o&&Object.defineProperty(t,i,o),o}"function"==typeof SuppressedError&&SuppressedError;
/**
* @license
* Copyright 2019 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/
const t=globalThis,i=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,n=Symbol(),a=new WeakMap;let s=class{constructor(e,t,i){if(this._$cssResult$=!0,i!==n)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o;const t=this.t;if(i&&void 0===e){const i=void 0!==t&&1===t.length;i&&(e=a.get(t)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),i&&a.set(t,e))}return e}toString(){return this.cssText}};const o=(e,...t)=>{const i=1===e.length?e[0]:t.reduce(((t,i,n)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if("number"==typeof e)return e;throw Error("Value passed to 'css' function must be a 'css' function result: "+e+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[n+1]),e[0]);return new s(i,e,n)},r=i?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new s("string"==typeof e?e:e+"",void 0,n))(t)})(e):e
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/,{is:l,defineProperty:c,getOwnPropertyDescriptor:d,getOwnPropertyNames:h,getOwnPropertySymbols:u,getPrototypeOf:p}=Object,m=globalThis,g=m.trustedTypes,y=g?g.emptyScript:"",f=m.reactiveElementPolyfillSupport,v=(e,t)=>e,_={toAttribute(e,t){switch(t){case Boolean:e=e?y:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},w=(e,t)=>!l(e,t),$={attribute:!0,type:String,converter:_,reflect:!1,useDefault:!1,hasChanged:w};Symbol.metadata??=Symbol("metadata"),m.litPropertyMetadata??=new WeakMap;let x=class extends HTMLElement{static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=$){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const i=Symbol(),n=this.getPropertyDescriptor(e,i,t);void 0!==n&&c(this.prototype,e,n)}}static getPropertyDescriptor(e,t,i){const{get:n,set:a}=d(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:n,set(t){const s=n?.call(this);a?.call(this,t),this.requestUpdate(e,s,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??$}static _$Ei(){if(this.hasOwnProperty(v("elementProperties")))return;const e=p(this);e.finalize(),void 0!==e.l&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(v("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(v("properties"))){const e=this.properties,t=[...h(e),...u(e)];for(const i of t)this.createProperty(i,e[i])}const e=this[Symbol.metadata];if(null!==e){const t=litPropertyMetadata.get(e);if(void 0!==t)for(const[e,i]of t)this.elementProperties.set(e,i)}this._$Eh=new Map;for(const[e,t]of this.elementProperties){const i=this._$Eu(e,t);void 0!==i&&this._$Eh.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(r(e))}else void 0!==e&&t.push(r(e));return t}static _$Eu(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof e?e.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((e=>this.enableUpdating=e)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((e=>e(this)))}addController(e){(this._$EO??=new Set).add(e),void 0!==this.renderRoot&&this.isConnected&&e.hostConnected?.()}removeController(e){this._$EO?.delete(e)}_$E_(){const e=new Map,t=this.constructor.elementProperties;for(const i of t.keys())this.hasOwnProperty(i)&&(e.set(i,this[i]),delete this[i]);e.size>0&&(this._$Ep=e)}createRenderRoot(){const e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((e,n)=>{if(i)e.adoptedStyleSheets=n.map((e=>e instanceof CSSStyleSheet?e:e.styleSheet));else for(const i of n){const n=document.createElement("style"),a=t.litNonce;void 0!==a&&n.setAttribute("nonce",a),n.textContent=i.cssText,e.appendChild(n)}})(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((e=>e.hostConnected?.()))}enableUpdating(e){}disconnectedCallback(){this._$EO?.forEach((e=>e.hostDisconnected?.()))}attributeChangedCallback(e,t,i){this._$AK(e,i)}_$ET(e,t){const i=this.constructor.elementProperties.get(e),n=this.constructor._$Eu(e,i);if(void 0!==n&&!0===i.reflect){const a=(void 0!==i.converter?.toAttribute?i.converter:_).toAttribute(t,i.type);this._$Em=e,null==a?this.removeAttribute(n):this.setAttribute(n,a),this._$Em=null}}_$AK(e,t){const i=this.constructor,n=i._$Eh.get(e);if(void 0!==n&&this._$Em!==n){const e=i.getPropertyOptions(n),a="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:_;this._$Em=n,this[n]=a.fromAttribute(t,e.type)??this._$Ej?.get(n)??null,this._$Em=null}}requestUpdate(e,t,i){if(void 0!==e){const n=this.constructor,a=this[e];if(i??=n.getPropertyOptions(e),!((i.hasChanged??w)(a,t)||i.useDefault&&i.reflect&&a===this._$Ej?.get(e)&&!this.hasAttribute(n._$Eu(e,i))))return;this.C(e,t,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(e,t,{useDefault:i,reflect:n,wrapped:a},s){i&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,s??t??this[e]),!0!==a||void 0!==s)||(this._$AL.has(e)||(this.hasUpdated||i||(t=void 0),this._$AL.set(e,t)),!0===n&&this._$Em!==e&&(this._$Eq??=new Set).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[e,t]of this._$Ep)this[e]=t;this._$Ep=void 0}const e=this.constructor.elementProperties;if(e.size>0)for(const[t,i]of e){const{wrapped:e}=i,n=this[t];!0!==e||this._$AL.has(t)||void 0===n||this.C(t,void 0,i,n)}}let e=!1;const t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),this._$EO?.forEach((e=>e.hostUpdate?.())),this.update(t)):this._$EM()}catch(t){throw e=!1,this._$EM(),t}e&&this._$AE(t)}willUpdate(e){}_$AE(e){this._$EO?.forEach((e=>e.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&=this._$Eq.forEach((e=>this._$ET(e,this[e]))),this._$EM()}updated(e){}firstUpdated(e){}};x.elementStyles=[],x.shadowRootOptions={mode:"open"},x[v("elementProperties")]=new Map,x[v("finalized")]=new Map,f?.({ReactiveElement:x}),(m.reactiveElementVersions??=[]).push("2.1.0");
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/
const b=globalThis,A=b.trustedTypes,z=A?A.createPolicy("lit-html",{createHTML:e=>e}):void 0,E="$lit$",k=`lit$${Math.random().toFixed(9).slice(2)}$`,S="?"+k,C=`<${S}>`,I=document,N=()=>I.createComment(""),P=e=>null===e||"object"!=typeof e&&"function"!=typeof e,T=Array.isArray,U="[ \t\n\f\r]",D=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,O=/-->/g,M=/>/g,L=RegExp(`>|${U}(?:([^\\s"'>=/]+)(${U}*=${U}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),j=/'/g,R=/"/g,H=/^(?:script|style|textarea|title)$/i,F=(e=>(t,...i)=>({_$litType$:e,strings:t,values:i}))(1),V=Symbol.for("lit-noChange"),W=Symbol.for("lit-nothing"),B=new WeakMap,q=I.createTreeWalker(I,129);function Z(e,t){if(!T(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==z?z.createHTML(t):t}const J=(e,t)=>{const i=e.length-1,n=[];let a,s=2===t?"<svg>":3===t?"<math>":"",o=D;for(let t=0;t<i;t++){const i=e[t];let r,l,c=-1,d=0;for(;d<i.length&&(o.lastIndex=d,l=o.exec(i),null!==l);)d=o.lastIndex,o===D?"!--"===l[1]?o=O:void 0!==l[1]?o=M:void 0!==l[2]?(H.test(l[2])&&(a=RegExp("</"+l[2],"g")),o=L):void 0!==l[3]&&(o=L):o===L?">"===l[0]?(o=a??D,c=-1):void 0===l[1]?c=-2:(c=o.lastIndex-l[2].length,r=l[1],o=void 0===l[3]?L:'"'===l[3]?R:j):o===R||o===j?o=L:o===O||o===M?o=D:(o=L,a=void 0);const h=o===L&&e[t+1].startsWith("/>")?" ":"";s+=o===D?i+C:c>=0?(n.push(r),i.slice(0,c)+E+i.slice(c)+k+h):i+k+(-2===c?t:h)}return[Z(e,s+(e[i]||"<?>")+(2===t?"</svg>":3===t?"</math>":"")),n]};class Y{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let a=0,s=0;const o=e.length-1,r=this.parts,[l,c]=J(e,t);if(this.el=Y.createElement(l,i),q.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=q.nextNode())&&r.length<o;){if(1===n.nodeType){if(n.hasAttributes())for(const e of n.getAttributeNames())if(e.endsWith(E)){const t=c[s++],i=n.getAttribute(e).split(k),o=/([.?@])?(.*)/.exec(t);r.push({type:1,index:a,name:o[2],strings:i,ctor:"."===o[1]?ee:"?"===o[1]?te:"@"===o[1]?ie:X}),n.removeAttribute(e)}else e.startsWith(k)&&(r.push({type:6,index:a}),n.removeAttribute(e));if(H.test(n.tagName)){const e=n.textContent.split(k),t=e.length-1;if(t>0){n.textContent=A?A.emptyScript:"";for(let i=0;i<t;i++)n.append(e[i],N()),q.nextNode(),r.push({type:2,index:++a});n.append(e[t],N())}}}else if(8===n.nodeType)if(n.data===S)r.push({type:2,index:a});else{let e=-1;for(;-1!==(e=n.data.indexOf(k,e+1));)r.push({type:7,index:a}),e+=k.length-1}a++}}static createElement(e,t){const i=I.createElement("template");return i.innerHTML=e,i}}function Q(e,t,i=e,n){if(t===V)return t;let a=void 0!==n?i._$Co?.[n]:i._$Cl;const s=P(t)?void 0:t._$litDirective$;return a?.constructor!==s&&(a?._$AO?.(!1),void 0===s?a=void 0:(a=new s(e),a._$AT(e,i,n)),void 0!==n?(i._$Co??=[])[n]=a:i._$Cl=a),void 0!==a&&(t=Q(e,a._$AS(e,t.values),a,n)),t}class K{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){const{el:{content:t},parts:i}=this._$AD,n=(e?.creationScope??I).importNode(t,!0);q.currentNode=n;let a=q.nextNode(),s=0,o=0,r=i[0];for(;void 0!==r;){if(s===r.index){let t;2===r.type?t=new G(a,a.nextSibling,this,e):1===r.type?t=new r.ctor(a,r.name,r.strings,this,e):6===r.type&&(t=new ne(a,this,e)),this._$AV.push(t),r=i[++o]}s!==r?.index&&(a=q.nextNode(),s++)}return q.currentNode=I,n}p(e){let t=0;for(const i of this._$AV)void 0!==i&&(void 0!==i.strings?(i._$AI(e,i,t),t+=i.strings.length-2):i._$AI(e[t])),t++}}class G{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,i,n){this.type=2,this._$AH=W,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=i,this.options=n,this._$Cv=n?.isConnected??!0}get parentNode(){let e=this._$AA.parentNode;const t=this._$AM;return void 0!==t&&11===e?.nodeType&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=Q(this,e,t),P(e)?e===W||null==e||""===e?(this._$AH!==W&&this._$AR(),this._$AH=W):e!==this._$AH&&e!==V&&this._(e):void 0!==e._$litType$?this.$(e):void 0!==e.nodeType?this.T(e):(e=>T(e)||"function"==typeof e?.[Symbol.iterator])(e)?this.k(e):this._(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==W&&P(this._$AH)?this._$AA.nextSibling.data=e:this.T(I.createTextNode(e)),this._$AH=e}$(e){const{values:t,_$litType$:i}=e,n="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=Y.createElement(Z(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===n)this._$AH.p(t);else{const e=new K(n,this),i=e.u(this.options);e.p(t),this.T(i),this._$AH=e}}_$AC(e){let t=B.get(e.strings);return void 0===t&&B.set(e.strings,t=new Y(e)),t}k(e){T(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,n=0;for(const a of e)n===t.length?t.push(i=new G(this.O(N()),this.O(N()),this,this.options)):i=t[n],i._$AI(a),n++;n<t.length&&(this._$AR(i&&i._$AB.nextSibling,n),t.length=n)}_$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e&&e!==this._$AB;){const t=e.nextSibling;e.remove(),e=t}}setConnected(e){void 0===this._$AM&&(this._$Cv=e,this._$AP?.(e))}}class X{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,i,n,a){this.type=1,this._$AH=W,this._$AN=void 0,this.element=e,this.name=t,this._$AM=n,this.options=a,i.length>2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=W}_$AI(e,t=this,i,n){const a=this.strings;let s=!1;if(void 0===a)e=Q(this,e,t,0),s=!P(e)||e!==this._$AH&&e!==V,s&&(this._$AH=e);else{const n=e;let o,r;for(e=a[0],o=0;o<a.length-1;o++)r=Q(this,n[i+o],t,o),r===V&&(r=this._$AH[o]),s||=!P(r)||r!==this._$AH[o],r===W?e=W:e!==W&&(e+=(r??"")+a[o+1]),this._$AH[o]=r}s&&!n&&this.j(e)}j(e){e===W?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??"")}}class ee extends X{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===W?void 0:e}}class te extends X{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==W)}}class ie extends X{constructor(e,t,i,n,a){super(e,t,i,n,a),this.type=5}_$AI(e,t=this){if((e=Q(this,e,t,0)??W)===V)return;const i=this._$AH,n=e===W&&i!==W||e.capture!==i.capture||e.once!==i.once||e.passive!==i.passive,a=e!==W&&(i===W||n);n&&this.element.removeEventListener(this.name,this,i),a&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){"function"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,e):this._$AH.handleEvent(e)}}class ne{constructor(e,t,i){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=i}get _$AU(){return this._$AM._$AU}_$AI(e){Q(this,e)}}const ae=b.litHtmlPolyfillSupport;ae?.(Y,G),(b.litHtmlVersions??=[]).push("3.3.0");const se=globalThis;
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/class oe extends x{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=((e,t,i)=>{const n=i?.renderBefore??t;let a=n._$litPart$;if(void 0===a){const e=i?.renderBefore??null;n._$litPart$=a=new G(t.insertBefore(N(),e),e,void 0,i??{})}return a._$AI(e),a})(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return V}}oe._$litElement$=!0,oe.finalized=!0,se.litElementHydrateSupport?.({LitElement:oe});const re=se.litElementPolyfillSupport;re?.({LitElement:oe}),(se.litElementVersions??=[]).push("4.2.0");
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/
const le={attribute:!0,type:String,converter:_,reflect:!1,hasChanged:w},ce=(e=le,t,i)=>{const{kind:n,metadata:a}=i;let s=globalThis.litPropertyMetadata.get(a);if(void 0===s&&globalThis.litPropertyMetadata.set(a,s=new Map),"setter"===n&&((e=Object.create(e)).wrapped=!0),s.set(i.name,e),"accessor"===n){const{name:n}=i;return{set(i){const a=t.get.call(this);t.set.call(this,i),this.requestUpdate(n,a,e)},init(t){return void 0!==t&&this.C(n,void 0,e,t),t}}}if("setter"===n){const{name:n}=i;return function(i){const a=this[n];t.call(this,i),this.requestUpdate(n,a,e)}}throw Error("Unsupported decorator location: "+n)};
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: BSD-3-Clause
*/function de(e){return(t,i)=>"object"==typeof i?ce(e,t,i):((e,t,i)=>{const n=t.hasOwnProperty(i);return t.constructor.createProperty(i,e),n?Object.getOwnPropertyDescriptor(t,i):void 0})(e,t,i)}const he=o`
--default-red: 244, 67, 54;
--default-pink: 233, 30, 99;
--default-purple: 146, 107, 199;
--default-deep-purple: 110, 65, 171;
--default-indigo: 63, 81, 181;
--default-blue: 33, 150, 243;
--default-light-blue: 3, 169, 244;
--default-cyan: 0, 188, 212;
--default-teal: 0, 150, 136;
--default-green: 76, 175, 80;
--default-light-green: 139, 195, 74;
--default-lime: 205, 220, 57;
--default-yellow: 255, 235, 59;
--default-amber: 255, 193, 7;
--default-orange: 255, 152, 0;
--default-deep-orange: 255, 111, 34;
--default-brown: 121, 85, 72;
--default-light-grey: 189, 189, 189;
--default-grey: 158, 158, 158;
--default-dark-grey: 96, 96, 96;
--default-blue-grey: 96, 125, 139;
--default-black: 0, 0, 0;
--default-white: 255, 255, 255;
--default-disabled: 189, 189, 189;
`,ue=o`
--default-disabled: 111, 111, 111;
`,pe="%c WEATHER-CONDITION-CARD %c 2.0.0",me="/local/community/ha-card-weather-conditions/icons",ge="/local/ha-card-weather-conditions/icons",ye="color: white; background: green; font-weight: 700;",fe="color: green; background: white; font-weight: 700;",ve="color: black; background: white; font-weight: 700;",_e={en:0,it:1,nl:2,es:3,de:4,fr:5,"sr-latn":6,pt:7,da:8,"no-no":9,cs:10,ru:11},we={snowy:"snowy-3","light-snow":"snowy-2","snowy-rainy":"snowy-1","partlycloudy-light-snow":"snowy-1","partlycloudy-snow":"snowy-1","partlycloudy-light-rain":"rainy-1","light-rain":"rainy-1",rainy:"rainy-2","partlycloudy-rain":"rainy-1","partlycloudy-fog":"fog",cloudy:"cloudy-original",partlycloudy:"cloudy-day-2","partlycloudy-lightning":"cloudy-day-1",lightning:"cloudy-day-1",clear:"day"},$e={...we},xe={freezing_rain_heavy:"rainy-3","heavy freezing rain":"rainy-3",freezing_rain:"rainy-2","freezing rain":"rainy-2",freezing_rain_light:"rainy-1","light freezing rain":"rainy-1",freezing_drizzle:"rain-and-sleet-mix","freezing drizzle":"rain-and-sleet-mix",ice_pellets_heavy:"rain-and-snow-mix","heavy ice pellets":"rain-and-snow-mix",ice_pellets:"rain-and-snow-mix","ice pellets":"rain-and-snow-mix",ice_pellets_light:"rain-and-snow-mix","light ice pellets":"rain-and-snow-mix",snow_heavy:"snowy-3","heavy snow":"snowy-3",snow:"snowy-2",snow_light:"snowy-1","light snow":"snowy-1",flurries:"wind",tstorm:"tropical-storm",rain_heavy:"rainy-3","heavy rain":"rainy-3",rain_light:"rainy-1","light rain":"rainy-1",rain:"rainy-2",drizzle:"rainy-1",fog_light:"haze","light fog":"haze",fog:"fog",cloudy:"cloudy-original",mostly_cloudy:"cloudy-day-3","mostly cloudy":"cloudy-day-3",partly_cloudy:"cloudy-day-2","partly cloudy":"cloudy-day-2",mostly_clear:"cloudy-day-1","mostly clear":"cloudy-day-1",clear:"day"},be={...xe,freezing_rain_heavy:"rainy-6","heavy freezing rain":"rainy-6",freezing_rain:"rainy-5","freezing rain":"rainy-5",freezing_rain_light:"rainy-4","light freezing rain":"rainy-4",snow_heavy:"snowy-6","heavy snow":"snowy-6",snow:"snowy-5",snow_light:"snowy-4","light snow":"snowy-4",rain_heavy:"rainy-6","heavy rain":"rainy-6",rain_light:"rainy-4","light rain":"rainy-4",rain:"rainy-5",drizzle:"rainy-4",mostly_cloudy:"cloudy-night-3","mostly cloudy":"cloudy-night-3",partly_cloudy:"cloudy-night-2","partly cloudy":"cloudy-night-2",mostly_clear:"cloudy-night-1","mostly clear":"cloudy-night-1",clear:"night",sunny:"night"},Ae={clear:"day","clear-day":"day",rain:"rainy-2",snow:"snowy-2",sleet:"rain-and-sleet-mix",wind:"cloudy-day-1",fog:"fog",cloudy:"cloudy-original","partly-cloudy-day":"cloudy-day-2"},ze={...Ae,clear:"night","clear-night":"night",wind:"cloudy-night-1","partly-cloudy-day":"cloudy-night-2","partly-cloudy-night":"cloudy-night-2"},Ee={cloudy:"cloudy-day-3",exceptional:"severe-thunderstorm",fog:"fog",hail:"snow-and-sleet-mix",lightning:"severe-thunderstorm","lightning-rainy":"scattered-thunderstorms",partlycloudy:"cloudy-day-3",pouring:"rainy-6",rainy:"rainy-5",snowy:"snowy-6","snowy-rainy":"snow-and-sleet-mix",sunny:"clear-day",windy:"wind","windy-variant":"wind"},ke={...Ee,"clear-night":"clear-night"},Se={"clear sky":"day","few clouds":"cloudy-day-1","scattered clouds":"cloudy-day-2","broken clouds":"cloudy-day-3","shower rain":"rainy-3",rain:"rainy-2",thunderstorm:"tropical-storm",snow:"snowy-2",mist:"fog"},Ce={...Se,"clear sky":"day-night","few clouds":"cloudy-night-1","scattered clouds":"cloudy-night-2","broken clouds":"cloudy-night-3"},Ie={freezing_rain_heavy:"rainy-3","heavy freezing rain":"rainy-3",freezing_rain:"rainy-2","freezing rain":"rainy-2",freezing_rain_light:"rainy-1","light freezing rain":"rainy-1",freezing_drizzle:"rain-and-sleet-mix",sleet:"rain-and-sleet-mix","freezing drizzle":"rain-and-sleet-mix",ice_pellets_heavy:"rain-and-snow-mix","heavy ice pellets":"rain-and-snow-mix",ice_pellets:"rain-and-snow-mix","ice pellets":"rain-and-snow-mix",ice_pellets_light:"rain-and-snow-mix","light ice pellets":"rain-and-snow-mix",snow_heavy:"snowy-3","heavy snow":"snowy-3",snow:"snowy-2",snow_light:"snowy-1","light snow":"snowy-1",flurries:"wind",tstorm:"tropical-storm",rain_heavy:"rainy-3","heavy rain":"rainy-3",rain_light:"rainy-1",rainy:"rainy-1","light rain":"rainy-1",rain:"rainy-2",drizzle:"rainy-1",fog_light:"haze","light fog":"haze",fog:"fog",cloudy:"cloudy-original",mostly_cloudy:"cloudy-day-3","mostly cloudy":"cloudy-day-3",partly_cloudy:"cloudy-day-2",partlycloudy:"cloudy-day-2","partly-cloudy-day":"cloudy-day-2","partly cloudy":"cloudy-day-2",mostly_clear:"cloudy-day-1","mostly clear":"cloudy-day-1",clear:"day","clear-day":"day",wind:"wind",windy:"wind",sunny:"day","clear-night":"day"},Ne={...Ie,freezing_rain_heavy:"rainy-6","heavy freezing rain":"rainy-6",freezing_rain:"rainy-5","freezing rain":"rainy-5",freezing_rain_light:"rainy-4","light freezing rain":"rainy-4",snow_heavy:"snowy-6","heavy snow":"snowy-6",snow:"snowy-5",snow_light:"snowy-4","light snow":"snowy-4",rain_heavy:"rainy-6","heavy rain":"rainy-6",rain_light:"rainy-4","light rain":"rainy-4",rain:"rainy-5",drizzle:"rainy-4",mostly_cloudy:"cloudy-night-3","mostly cloudy":"cloudy-night-3",partly_cloudy:"cloudy-night-2",partlycloudy:"cloudy-night-2","partly-cloudy-night":"cloudy-night-2","partly cloudy":"cloudy-night-2",mostly_clear:"cloudy-night-1","mostly clear":"cloudy-night-1",clear:"night","clear-night":"night",sunny:"night"},Pe={pirateweather:{iconsDay:Ie,iconsNight:Ne},climacell:{iconsDay:xe,iconsNight:be},darksky:{iconsDay:Ae,iconsNight:ze},openweathermap:{iconsDay:Se,iconsNight:Ce},buienradar:{iconsDay:we,iconsNight:$e},defaulthass:{iconsDay:Ee,iconsNight:ke}},Te=(e,t)=>{const i=Object.keys(t).find((t=>t.toLowerCase()===e.toLowerCase()));return i?t[i]:e},Ue=e=>{const t={en:0,it:1,nl:2,es:3,de:4,fr:5,"sr-latn":6,pt:7,da:8,"no-no":9,cs:10,ru:11};return{locale:{en:"en-US",it:"it-IT",nl:"nl-NL",es:"es-ES",de:"de-DE",fr:"fr-FR","sr-latn":"sr-Latn",pt:"pt-PT",da:"da-DK","no-no":"nb-NO",cs:"cs-CZ",ru:"ru-RU"}[e]||e,timezone:{en:"America/New_York",it:"Europe/Rome",nl:"Europe/Amsterdam",es:"Europe/Madrid",de:"Europe/Berlin",fr:"Europe/Paris","sr-latn":"Europe/Belgrade",ja:"Asia/Tokyo",pt:"Europe/Lisbon",da:"Europe/Copenhagen","no-no":"Europe/Oslo",cs:"Europe/Prague",ru:"Europe/Moscow"}[e]||"UTC",...e in t&&{cwc:t[e]}}},De=e=>({it:"it-IT",en:"en-US",fr:"fr-FR",de:"de-DE",es:"es-ES",ja:"ja-JP",zh:"zh-CN"}[e]||`${e}-${e.toUpperCase()}`),Oe=({stringNumber:e,lang:t="en",fractionDigits:i=1,useGrouping:n=!1})=>{const a=parseFloat(e);if(Number.isNaN(a))return"";const s=((e="en-US",t=1,i=!1)=>new Intl.NumberFormat(e,{minimumFractionDigits:t,maximumFractionDigits:t,useGrouping:i}))(De(t),i,n);return s.format(a)};const Me=(e,t)=>t&&e.states[t]?.state,Le=(e,t,i)=>t&&e.states[t]?.attributes[i],je=({entityId:e,hass:t,lang:i="en",decimals:n=0}={})=>{const a=t&&e&&t.states[e]?.state;return void 0!==a?Oe({stringNumber:a,fractionDigits:n,lang:i}):void 0},Re=(e,t)=>t&&e.states[t]?.attributes?.unit_of_measurement,He=(e,t)=>t&&e.states[t]?.attributes?.icon,Fe=(e,t)=>{const i="number"==typeof e?e:parseFloat(e);if(Number.isNaN(i))return t[e]??null;if(i<0||i>360)return console.error(`Invalid wind direction: '${e}'. Valid values are between 0 and 360 degrees.`),null;return t[["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"][Math.floor((i+11.25)%360/22.5)]]??null};function Ve(e,t=5e3){return new Promise((i=>{const n=new Image,a=setTimeout((()=>{n.src="",i(!1)}),t);n.onload=()=>{clearTimeout(a),i(!0)},n.onerror=()=>{clearTimeout(a),i(!1)},n.src=e}))}function We(e,...t){console.info(e,...t.length?t:[])}function Be(e,t="en-US"){if("number"==typeof e)return e;const i=e.replace(/\./g,"").replace(",",".");return Number(i)}const qe={new_moon:"🌑",new:"🌑",waxing_crescent:"🌒",first_quarter:"🌓",waxing_gibbous:"🌔",full:"🌕",full_moon:"🌕",waning_gibbous:"🌖",third_quarter:"🌗",last_quarter:"🌗",waning_crescent:"🌘"},Ze=o`
ha-card {
cursor: pointer;
position: relative;
width: 100%;
}
.ha-card-weather-conditions {
width: 100%;
box-sizing: border-box;
background-color: var(--card-background-color, #1c1c1c);
color: var(--primary-text-color, #ffffff);
border-radius: var(--ha-card-border-radius, 12px);
box-shadow: var(--ha-card-box-shadow, 0 2px 6px rgba(0, 0, 0, 0.2));
overflow: hidden;
padding: 0;
display: flex;
flex-direction: column;
}
.nd-container {
width: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
padding: 16px 20px; /* ← padding orizzontale più ampio */
gap: 12px;
background-size: cover;
background-position: center;
transition: background-image 0.3s ease-in-out;
}
/* Esempio di stile dinamico aggiuntivo se habgImage è una classe */
.nd-container.sunny {
background-image: url('/local/images/sunny-bg.jpg');
}
.nd-container.rainy {
background-image: url('/local/images/rainy-bg.jpg');
}
/* -------------- */
`,Je=o`
.summary-grid-container {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* <-- 3 colonne reali */
grid-template-rows: auto auto;
width: 100%;
max-width: 600px;
// background: #1c1c1c;
// color: white;
gap: 4px;
padding: 0px;
box-sizing: border-box;
// border: 1px solid #444; /* debug */
}
.summary-col-left {
grid-column: 1;
grid-row: 1 / span 2;
// background: #2c2c2c;
padding-top: 0px;
padding-right: 0px;
padding-bottom: 0px;
padding-left: 0px;
display: flex; /* Attiva Flexbox */
justify-content: center; /* Centra orizzontalmente */
align-items: center; /* Centra verticalmente */
width: 100%;
max-width: 100%;
aspect-ratio: 1 / 1; /* opzionale: mantiene forma quadrata */
overflow: hidden;
}
.summary-top-right {
grid-column: 2 / span 2; /* occupa colonne 2 e 3 */
grid-row: 1;
// background: #3c3c3c;
padding-top: 0px;
padding-right: 8px;
padding-bottom: 0px;
padding-left: 8px;
display: flex; /* aggiunto */
align-items: center; /* centra verticalmente */
justify-content: flex-start; /* allinea a sinistra */
}
.summary-bottom-right-left {
grid-column: 2;
grid-row: 2;
// background: #4c4c4c;
padding-top: 0px;
padding-right: 8px;
padding-bottom: 0px;
padding-left: 8px;
display: flex; /* Attiva Flexbox */
justify-content: center; /* Centra orizzontalmente */
align-items: center; /* Centra verticalmente */
}
.summary-bottom-right-right {
grid-column: 3;
grid-row: 2;
// background: #5c5c5c;
padding-top: 0px;
padding-right: 8px;
padding-bottom: 0px;
padding-left: 8px;
}
.weather-condition-icon {
width: 100%;
height: auto;
max-width: 100%;
max-height: 100%;
object-fit: contain;
// max-width: 100%;
// max-height: 100%;
// width: 72px;
// height: 72px;
// object-fit: contain;
transition: transform 0.2s ease;
}
.summary-col-left:hover .weather-condition-icon {
transform: scale(1.05);
}
.weather-city-name {
font-size: clamp(1em, 2vw, 1.2em);
text-align: left;
}
.moon-row {
display: flex;
align-items: center;
gap: 6px;
// font-size: 0.95em;
// color: #eeeeee;
}
.summary-moon-icon {
font-size: 1.8em;
display: inline-block;
}
.temperature-block {
display: flex;
flex-direction: column;
align-items: flex-end;
text-align: right;
}
.temperature {
font-size: 1.6em;
font-weight: bold;
}
.temp-unit {
font-size: 0.95em;
vertical-align: super;
margin-left: 2px;
}
.feels-like {
font-size: 0.85em;
// color: #aaaaaa;
}
.summary-wrapper {
position: relative;
width: 100%;
height: 100%;
min-height: 100px; /* oppure clamp() dinamico */
overflow: visible;
}
.lightning-background {
position: absolute;
inset: 0; /* top: 0; right: 0; bottom: 0; left: 0 */
pointer-events: none;
z-index: 0;
}
.lightning-flash {
position: absolute;
width: 2px;
background: white;
opacity: 0.7;
transform: translate(-50%, -50%);
animation-name: flash-blink;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
border-radius: 1px;
filter: blur(0.5px);
box-shadow: 0 0 4px rgba(255,255,255,0.6);
z-index: 0;
}
@keyframes flash-blink {
0%, 100% {
opacity: 0.1;
}
50% {
opacity: 0.9;
}
}
.lightning-flash-zigzag {
position: absolute;
width: 2px;
height: 0;
background: linear-gradient(to bottom, yellow, white);
clip-path: polygon(var(--points));
animation: flash-zigzag linear forwards;
z-index: 3;
}
@keyframes flash-zigzag {
0% {
opacity: 1;
transform: scaleY(1);
}
100% {
opacity: 0;
transform: scaleY(1.2);
}
}
.lightning-svg {
position: absolute;
transform: translate(-50%, 0);
opacity: 0;
filter: drop-shadow(0 0 4px rgba(98, 61, 173, 0.6));
animation-name: flash-zigzag-svg;
animation-timing-function: ease-in-out;
animation-iteration-count: 1;
z-index: 3;
}
@keyframes flash-zigzag-svg {
0%, 100% {
opacity: 0;
}
40% {
opacity: 1;
}
60% {
opacity: 0.5;
}
}
`,Ye=o`
.present-grid-container {
display: flex;
flex-direction: column;
gap: 4px;
}
.present-row {
display: flex;
justify-content: space-between;
gap: 16px;
}
.present-left,
.present-right {
flex: 1;
}
.present-left {
display: flex;
justify-content: flex-start;
}
.present-right {
display: flex;
justify-content: flex-end;
}
.present-value-block {
display: flex;
align-items: center;
gap: 4px;
}
.present-unit {
font-size: 0.9em;
opacity: 0.8;
}
`,Qe=o`
.ultraviolet-grid-container {
display: flex;
flex-direction: column;
gap: 4px;
}
.ultraviolet-row {
display: flex;
justify-content: space-between;
gap: 16px;
}
.ultraviolet-left,
.present-right {
flex: 1;
}
.ultraviolet-left {
display: flex;
justify-content: flex-start;
}
.ultraviolet-right {
display: flex;
justify-content: flex-end;
}
.ultraviolet-value-block {
display: flex;
align-items: center;
gap: 4px;
}
.ultraviolet-unit {
font-size: 0.9em;
opacity: 0.8;
}
------------------------------------------------------------------
// .ultraviolet-grid-container {
// display: flex;
// flex-direction: column;
// gap: 12px;
// }
// .ultraviolet-row {
// display: flex;
// justify-content: space-between;
// padding: 4px 0;
// }
// .ultraviolet-value-block {
// display: flex;
// align-items: center;
// gap: 4px;
// }
// .ultraviolet-unit {
// font-size: 0.9em;
// opacity: 0.7;
// }
.ultraviolet-skin-type-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(48px, 1fr));
gap: 8px;
margin-top: 8px;
}
.ultraviolet-skin-type-cell {
flex: 1;
min-width: 48px;
height: 48px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border-radius: 6px;
font-family: 'Segoe UI', sans-serif;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
color: black;
}
.ultraviolet-skin-type-label {
font-weight: bold;
font-size: 0.95em;
line-height: 1em;
}
.ultraviolet-exposure-time {
font-size: 0.75em;
margin-top: 2px;
color: #222;
opacity: 0.85;
}
`,Ke=o`
.pollen-grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(48px, 1fr));
gap: 8px 12px;
width: 100%;
justify-items: center;
align-items: end;
padding: 8px 4px;
box-sizing: border-box;
}
.pollen-stack {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
min-width: 48px;
}
.levels {
display: flex;
flex-direction: column-reverse;
gap: clamp(1px, 0.2vw, 2px);
}
.level {
width: clamp(16px, 3.5vw, 24px);
height: clamp(5px, 0.7vw, 8px); /* 👈 anche in altezza */
border-radius: 3px;
opacity: 0.3;
transition: opacity 0.2s ease;
}
.level.active {
opacity: 1;
outline: 1px solid #333;
}
.molto-alto {
background-color: #f44336;
}
.alto {
background-color: #ff9800;
}
.moderato {
background-color: #ffeb3b;
}
.basso {
background-color: #4caf50;
}
.pollen-name {
font-size: clamp(0.55em, 1.3vw, 0.85em); /* 👈 stringe di più */
// font-weight: 500;
text-align: center;
// color: #333;
white-space: nowrap;
}
.label {
width: 100%;
text-align: center;
font-size: clamp(0.55em, 1.3vw, 0.85em);
// font-weight: 500;
margin-top: clamp(4px, 0.5vw, 8px);
}
`,Ge=o`
.camera-container {
margin-top: 10px;
width: 100%;
display: flex;
align-items: stretch;
}
.camera-image {
aspect-ratio: 16 / 9;
width: 100%;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.camera-image > img {
width: 100%;
height: 100%;
object-fit: cover;
}
`,Xe=o`
.weather-forecast-grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(78px, 1fr));
column-gap: 2px; /* spazio orizzontale tra i giorni */
row-gap: 6px; /* spazio verticale tra righe, se ci sono */
align-items: stretch;
font-family: 'Segoe UI', sans-serif;
width: 100%;
}
.weather-forecast-grid-wrapper {
display: flex;
flex-direction: column;
align-items: center; /* centrare il titolo orizzontalmente */
}
.weather-forecast-title {
font-size: clamp(0.85em, 1vw, 0.95em);
font-weight: bold;
// margin-bottom: 0.5em;
text-align: center;
}
.weather-forecast-slot {
text-align: center;
padding: 8px 4px;
min-width: 0;
overflow: hidden;
}
.weather-forecast-slot:last-child {
border-right: none;
}
.weather-forecast-label-slot {
font-size: 0.9em;
font-weight: bold;
margin-bottom: 6px; /* ridotto */
}
.weather-forecast-icon {
font-size: 1.6rem; /* ridotto */
/* margin: 6px 0; ridotto */
height: 32px;
}
.weather-forecast-temperature {
font-size: clamp(0.8em, 1vw, 0.9em); /* leggermente più piccolo */
margin: 4px 0; /* meno margine */
}
.weather-forecast-temperature .high {
font-weight: bold;
}
.weather-forecast-precipitation {
font-size: clamp(0.65em, 1vw, 0.75em);
line-height: 1.2; /* compatta verticalmente */
}
.weather-forecast-precipitation .mm {
font-weight: bold;
}
`,et=o`
.meteodcpalarm-grid-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 16px;
padding: 12px;
}
.meteodcpalarm-group {
display: flex;
flex-direction: column;
align-items: center;
flex: 1 1 72px; /* 👈 cresce, ma non scende sotto i 72px */
max-width: 220px; /* 👈 opzionale: previene allargamento eccessivo */
text-align: center;
}
.meteodcpalarm-group ha-icon {
--mdc-icon-size: 36px;
}
.meteodcpalarm-label {
margin-top: 6px;
font-size: 0.85em;
color: var(--primary-text-color);
}
`,tt=(e,t,i)=>{const n="below_horizon"===i,a=(n?t.iconsNight:t.iconsDay)[e];return t.path||console.info("Image path not found."),a?`${t.path}/${t.iconType}/${a}.svg`:(console.info(`Icons issue. Model=${t.icons_model}, Time=${n?"night":"day"}, Condition=${e}`),"")};function it(e){return!!e&&e.themes.darkMode}async function nt(){const[e,t]=await Promise.all([Ve(`${me}/static/cloudy.svg`),Ve(`${ge}/static/cloudy.svg`)]);let i=null;if(i=e?me:t?ge:null,!i)return We(`${pe} - Impossibile determinare il path immagini.`),{translations:[],imagePath:null};const n=`${i}/../transl/`;return{translations:await Promise.all(["en","it","nl","es","de","fr","sr-latn","pt","da","no-NO","cs"].map((e=>async function(e){try{const t=await fetch(e);if(!t.ok){const i=`ERROR retrieving JSON file: '${e}', status: ${t.status} ${t.statusText}`;throw console.info(i),new Error(i)}return console.info(`Locale '${e}' loaded`),await t.text()}catch(t){throw console.info(`Fetch failed for '${e}':`,t),t}}(`${n}${e}.json`)))),imagePath:i}}class at extends oe{constructor(){super(...arguments),this.isPanel=!1,this.editMode=!1,this.invalidConfig=!1,this._hasPresent=!1,this._hasDailyForecasts=!1,this._hasHourlyForecasts=!1,this._hasMarineDailyForecasts=!1,this._hasMarineHourlyForecasts=!1,this._hasMetealarm=!1,this._hasDPCalarm=!1,this._hasMeteogram=!1,this._hasAirQuality=!1,this._hasPollen=!1,this._hasUltraviolet=!1,this._hasAlert=!1,this._hasSea=!1,this._hasCamera=!1}updated(e){if(super.updated(e),e.has("hass")&&this.hass){const t=it(e.get("hass")),i=it(this.hass);t!==i&&this.toggleAttribute("dark-mode",i)}}static get styles(){return[o`
:host {
${he}
}
:host([dark-mode]) {
${ue}
}
${o`
${Ze}
${Je}
${Ye}
${Xe}
${Qe}
${Ke}
${Ge}
${et}
`}
`]}async setConfig(e){if(!e)throw this.invalidConfig=!0,new Error("Invalid configuration");if(!this._translations?.length||!this._imagesPath){const{translations:e,imagePath:t}=await nt();this._translations=e,this._imagesPath=t}this._name=e?.weather?.name??void 0,this._language=e.language?.toLowerCase()||"en",this._loadTranslations(this._language),this._detectDataSections(e),this._setupIcons(e.weather?.icons_model),this._config=e,We(`${pe} - Config loaded.`)}getCardSize(){return 1}_loadTranslations(e){try{const t=JSON.parse(this._translations[_e[e]]);this._terms={windDirections:t.cwcLocWindDirections,words:t.cwcTerms},We(`${pe}%c card "${this._name}", locale is '${e}'.`,ye,fe,ve)}catch(t){const i="en",n=JSON.parse(this._translations[_e[i]]);this._terms={windDirections:n.cwcLocWindDirections,words:n.cwcTerms},We(`${pe}%c card "${this._name}" unable to use '${e}' locale, set as default '${i}'.`,ye,fe,ve)}}_detectDataSections(e){this._hasPresent=!!e.weather?.present,this._hasDailyForecasts=!!e.weather?.daily_forecasts,this._hasHourlyForecasts=!!e.weather?.hourly_forecasts,this._hasMarineDailyForecasts=!!e.weather?.marine_daily_forecasts,this._hasMarineHourlyForecasts=!!e.weather?.marine_hourly_forecasts,this._hasMetealarm=!!e.weather?.meteoalarm,this._hasDPCalarm=!!e.weather?.dpcalarm,this._hasAirQuality=!!e.airquality,this._hasPollen=e.pollen&&Array.isArray(e.pollen.entities)&&e.pollen.entities.length>0,this._hasUltraviolet=!!e.ultraviolet,this._hasCamera=!!e.camera}_setupIcons(e){if(this._iconsConfig={path:this._imagesPath,iconType:this._config?.weather?.animation?"animated":"static",icons_model:e||"pirateweather",iconsDay:Ie,iconsNight:Ne},e){const t=(e=>{const t=e.toLowerCase()??"climacell";if(t in Pe){const{iconsDay:e,iconsNight:i}=Pe[t];return{iconsModel:t,iconsDay:e,iconsNight:i}}console.warn(`Unknown icons model: ${t}. Falling back to 'climacell'.`);const i=Pe.climacell;return{iconsModel:"climacell",iconsDay:i.iconsDay,iconsNight:i.iconsNight}})(e);this._iconsConfig.icons_model=t.iconsModel,this._iconsConfig.iconsDay=t.iconsDay,this._iconsConfig.iconsNight=t.iconsNight}}render(){return this.invalidConfig?F`
<ha-card class="ha-card-weather-conditions">
<div class='banner'>
<div class="header">ha-card-weather-conditions</div>
</div>
<div class='content'>
Configuration ERROR!
</div>
</ha-card>
`:this._render()}}e([de({attribute:!1})],at.prototype,"hass",void 0),e([de({attribute:!1})],at.prototype,"_config",void 0);const st=(e,t,i,n,a,s,o,r)=>{const l=Me(e,r),c=l?qe[l.toLowerCase()]:"";const d=Me(e,o),h=Me(e,s.condition)?.toLowerCase()||"na",u=s.temperature?je({entityId:s.temperature,hass:e,lang:t})??void 0:void 0,p=s.temperature_feelslike?je({entityId:s.temperature_feelslike,hass:e,lang:t})??void 0:void 0,m=e.states[s.temperature_feelslike]?.attributes.icon??"";return(({title:e,moonText:t,moonIcon:i,conditionText:n,conditionIcon:a,temperature:s,temperatureUnit:o,feelsLikeTerm:r,temperatureFeelsLike:l,temperatureFeelsLikeIcon:c})=>a||t||s?F`
<div class="summary-wrapper">
${W}
<div class="summary-grid-container">
${a?F`
<div class="summary-col-left">
<img class="weather-condition-icon" src="${a}" alt="${n}" />
</div>
`:W}
${e?F`
<div class="summary-top-right">
<span class="weather-city-name">${e}</span>
</div>
`:W}
${t?F`
<div class="summary-bottom-right-left">
<div class="moon-row">
<span class="summary-moon-icon">${i}</span>
<span class="summary-moon-text">${t}</span>
</div>
</div>
`:W}
${s?F`
<div class="summary-bottom-right-right">
<div class="temperature-block">
<div>
<span class="temperature">${s}</span>
<span class="temp-unit">${o}</span>
</div>
${l&&F`<div class="feels-like">${r} <div>${l} ${o}</div></div>`}
</div>
</div>
`:W}
</div>
</div>
`:F``)({title:a??void 0,moonText:r?Te(l,i.words):void 0,moonIcon:c,conditionText:h,conditionIcon:tt(h,n,d),temperature:u,temperatureUnit:Re(e,s.temperature),feelsLikeTerm:Te("Feels Like",i.words),temperatureFeelsLike:p,temperatureFeelsLikeIcon:m})},ot=e=>"string"==typeof e||"number"==typeof e,rt=(e,t)=>{const i=[],n=e.precipitationIntensity?.value,a=e.precipitationProbability?.value;if(ot(n)&&ot(a)){const s=De(t),o=Be(n,s),r=Be(a,s);!Number.isNaN(Number(o))&&!Number.isNaN(Number(r))&&o>0&&r>0&&i.push({icon:e.precipitationIntensity.icon||e.precipitationProbability.icon||"mdi:weather-rainy",value:`${e.precipitationIntensity.value} ${e.precipitationIntensity.unit} / ${e.precipitationProbability.value} ${e.precipitationProbability.unit}`})}void 0!==e.temperatureLow?.value&&void 0!==e.temperatureHigh?.value&&i.push({icon:e.temperatureLow.icon||e.temperatureHigh.icon||"mdi:thermometer",value:`${e.temperatureLow.value} / ${e.temperatureHigh.value}`,unit:e.temperatureLow.unit||e.temperatureHigh.unit});return["humidity","pressure","visibility"].forEach((t=>{return n=e[t],void(void 0!==n?.value&&i.push(n));var n})),void 0===e.windSpeed?.value&&void 0===e.windBearing?.value||i.push({icon:e.windSpeed?.icon||"mdi:weather-windy",value:`${e.windBearing?.value?`${e.windBearing.value} `:""}${e.windSpeed?.value??""}`,unit:e.windSpeed?.unit?`${e.windSpeed.unit}`:""}),["nextRising","nextSetting"].forEach((t=>{const n=e[t];n?.value&&i.push({icon:n.icon,value:n.value,unit:""})})),i},lt=(e,t)=>{const i=[];return["epa_aqi","epa_primary_pollutant","pm25","pm10","o3","no2","co","so2"].forEach((t=>{return n=e[t],void(void 0!==n?.value&&i.push(n));var n})),i},ct=(e,t)=>{const i=[],n=e=>F`
<span class="present-value-block">
${e.value}${e.unit?F`<span class="present-unit">${e.unit}</span>`:""}
<ha-icon icon="${e.icon}" style=${e.icon_color?`color: ${e.icon_color}`:""}></ha-icon>
</span>
`;i.push(...rt(e,t),...lt(e));const a=[];for(let e=0;e<i.length;e+=2){const t=i[e],o=i[e+1];(t&&t.value||o&&o.value)&&a.push(F`
<div class="present-row">
<div class="present-left">${t?(s=t,F`
<span class="present-value-block">
<ha-icon icon="${s.icon}" style=${s.icon_color?`color: ${s.icon_color}`:""}></ha-icon>
${s.value}${s.unit?F`<span class="present-unit">${s.unit}</span>`:""}
</span>
`):F``}</div>
<div class="present-right">${o?n(o):F``}</div>
</div>
`)}var s;return a.length>0?F`
<div class="present-grid-container">
${a}
</div>
`:F``},dt=(e,t,i,n,a)=>{const s=t||e.selectedLanguage||e.language,o=((e,t,i,n,a)=>{const s=Ue(t),o=a?e.states[a]:void 0,{next_rising:r,next_setting:l}=o?.attributes??{};return{nextRising:{value:r?new Date(r).toLocaleTimeString(s.locale,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZone:s.timezone}):void 0,icon:"mdi:weather-sunset-up"},nextSetting:{value:r?new Date(l).toLocaleTimeString(s.locale,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZone:s.timezone}):void 0,icon:"mdi:weather-sunset-down"},precipitationIntensity:{value:je({entityId:n.precipitation_intensity,hass:e,lang:t,decimals:2}),unit:Re(e,n.precipitation_intensity),icon:"mdi:weather-rainy"},precipitationProbability:{value:je({entityId:n.precipitation_probability,hass:e,lang:t,decimals:0}),unit:Re(e,n.precipitation_probability),icon:"mdi:weather-rainy"},humidity:{value:je({entityId:n.humidity,hass:e,lang:t,decimals:0}),unit:Re(e,n.humidity),icon:"mdi:water-percent"},windBearing:{value:Fe(Me(e,n.wind_bearing),i)},windSpeed:{value:je({entityId:n.wind_speed,hass:e,lang:t,decimals:0}),unit:Re(e,n.wind_speed),icon:"mdi:weather-windy"},pressure:{value:je({entityId:n.pressure,hass:e,lang:t,decimals:0}),unit:Re(e,n.pressure),icon:"mdi:gauge"},visibility:{value:je({entityId:n.visibility,hass:e,lang:t,decimals:0}),unit:Re(e,n.visibility),icon:"mdi:weather-fog"},temperatureHigh:{value:je({entityId:n.temperature_max,hass:e,lang:t,decimals:0}),unit:Re(e,n.temperature_max),icon:"mdi:thermometer"},temperatureLow:{value:je({entityId:n.temperature_min,hass:e,lang:t,decimals:0}),unit:Re(e,n.temperature_min),icon:"mdi:thermometer"}}})(e,s,i.windDirections,n,a);return ct({...o},s)},ht=["I","II","III","IV","V","VI"],ut=["#F1D1B1","#E4B590","#CF9F7D","#B67851","#A15E2D","#513938"],pt=(e,t)=>{const i=[],n=e=>F`
<span class="ultraviolet-value-block">
${e.value}${e.unit?F`<span class="ultraviolet-unit">${e.unit}</span>`:""}
<ha-icon icon="${e.icon}" style="${"on"===e.value?"color: red;":""}"></ha-icon>
</span>
`,a=(e,t)=>{void 0!==t?.value&&i.push(t)};let s=["protectionWindow","currentUVLevel"];s.forEach((t=>a(0,e[t]))),void 0!==e.currentUVIndex?.value&&void 0!==e.maxUVIndex?.value&&i.push({icon:e.currentUVIndex.icon||e.maxUVIndex.icon||"mdi:weather-sunny",value:`${e.currentUVIndex.value} / ${e.maxUVIndex.value}`,unit:e.currentUVIndex.unit||e.maxUVIndex.unit}),s=["currentOzoneLevel"],s.forEach((t=>a(0,e[t])));const o=[];for(let e=0;e<i.length;e+=2){const t=i[e],a=i[e+1];o.push(F`
<div class="ultraviolet-row">
<div class="ultraviolet-left">${t?(r=t,F`
<span class="ultraviolet-value-block">
<ha-icon icon="${r.icon}" style="${"on"===r.value?"color: red;":""}"></ha-icon>
${r.value}${r.unit?F`<span class="ultraviolet-unit">${r.unit}</span>`:""}
</span>
`):F``}</div>
<div class="ultraviolet-right">${a?n(a):F``}</div>
</div>
`)}var r;const l=[t.skinType1,t.skinType2,t.skinType3,t.skinType4,t.skinType5,t.skinType6],c=F`
<div class="ultraviolet-skin-type-grid">
${l.map(((e,t)=>{const i=ut[t],n=(e=>{const t=e.replace("#","");return(299*parseInt(t.substr(0,2),16)+587*parseInt(t.substr(2,2),16)+114*parseInt(t.substr(4,2),16))/1e3>125?"#000":"#fff"})(i);return F`
<div
class="ultraviolet-skin-type-cell"
style="background: ${i};"
title="Fototipo ${ht[t]}"
>
<div class="ultraviolet-skin-type-label">${ht[t]}</div>
<div class="ultraviolet-exposure-time" style="color: ${n};">${e.value||"--"}</div>
</div>
`}))}
</div>
`;return F`
<div class="ultraviolet-grid-container">
${o}
${c}
</div>
`},mt=e=>{const t="string"==typeof e&&"unknown"===e.toLowerCase()?NaN:Number(e);if(!Number.isFinite(t)||t<0)return"--";const i=Math.floor(t/60),n=t%60;return i>0?`${i}:${function(e,t,i="0"){return e.toString().padStart(t,i)}(n,2)} h`:`${n} m`},gt=(e,t,i)=>({protectionWindow:{value:Me(e,i.protection_window)&&"unknown"!==Me(e,i.protection_window)?Me(e,i.protection_window):"off",icon:"mdi:sunglasses"},currentUVLevel:{value:Me(e,i.uv_level),icon:"mdi:weather-sunny"},currentUVIndex:{value:je({entityId:i.uv_index,hass:e,lang:t}),unit:"UV Idx",icon:"mdi:weather-sunny"},maxUVIndex:{value:je({entityId:i.max_uv_index,hass:e,lang:t}),unit:"UV Idx",icon:"mdi:weather-sunny"},currentOzoneLevel:{value:je({entityId:i.ozone_level,hass:e,lang:t}),unit:"DU",icon:"mdi:vector-triangle"}}),yt=(e,t,i)=>({skinType1:{value:mt(je({entityId:i.set_skin_type_1,hass:e,lang:t}))},skinType2:{value:mt(je({entityId:i.set_skin_type_2,hass:e,lang:t}))},skinType3:{value:mt(je({entityId:i.set_skin_type_3,hass:e,lang:t}))},skinType4:{value:mt(je({entityId:i.set_skin_type_4,hass:e,lang:t}))},skinType5:{value:mt(je({entityId:i.set_skin_type_5,hass:e,lang:t}))},skinType6:{value:mt(je({entityId:i.set_skin_type_6,hass:e,lang:t}))}}),ft=["basso","moderato","alto","molto-alto","estremo"],vt=(e,t,i)=>{const n=i-t+1,a=ft.slice(0,n);return 0===e.length?F``:F`
<div class="pollen-grid-container">
${e.map((e=>{const n=((e,t,i)=>{const n=(i-t+1)/ft.length,a=Math.floor((e-t)/n);return Math.min(a,ft.length-1)})(e.value,t,i);return F`
<div class="pollen-stack">
<div class="levels">
${a.map(((e,t)=>F`
<div
class="level ${e} ${t===n?"active":""}"
title="${e}"
></div>
`))}
</div>
<div class="pollen-name">${e.name}</div>
</div>
`}))}
</div>
`},_t=(e,t,i)=>{const n=[];return Array.isArray(i.entities)&&i.entities.length>0&&i.entities.forEach((t=>{const a=Me(e,t.entity);if(a&&"unknown"!==a&&"unavailable"!==a){let a=((e,t="en-US")=>{if("number"==typeof e)return e;const i=new Intl.NumberFormat(t).formatToParts(1234567.89),n=i.find((e=>"group"===e.type))?.value||"",a=i.find((e=>"decimal"===e.type))?.value||".",s=e.replace(new RegExp(`\\${n}`,"g"),"").replace(new RegExp(`\\${a}`),".");return Number(s)})(Me(e,t.entity));(Number.isNaN(a)||a<i.min||a>i.max)&&(a=0),n.push({name:t.name,value:a})}})),vt(n,i.min,i.max)},wt=(e,t)=>{const i=t.map((e=>{const t=e.reference?.value,i=e.condition?.img,n=e.condition?.icon,a=e.condition?.iconColor,s=e.temperature_low?.value,o=e.temperature_high?.value,r=e.temperature_high?.unit||e.temperature_low?.unit,l=Number(e.precipitation_probability?.value??0),c=e.precipitation_intensity?.value,d=e.precipitation_intensity?.unit,h=e.temperature?.value,u=e.temperature?.unit||e.temperature_feelslike?.unit,p=e.temperature_feelslike?.value,m=e.wind_speed?.value,g=e.wind_speed?.unit,y=e.wind_bearing?.value,f=e.wind_wave_height_max?.value,v=e.swell_wave_height_max?.value,_=e.wave_height_max?.value,w=e.wave_direction?.value,$=e.wave_direction?.icon,x=e.wave_height_max?.unit;return F`
<div class="weather-forecast-slot">
${t?F`<div class="weather-forecast-label-slot">${t}</div>`:""}
${i?F`<img class="weather-forecast-icon" src="${i}" alt="${i}" />`:""}
${n?F`<ha-icon icon="${n}" style=${a?`color: ${a}`:""}></ha-icon>`:""}
${void 0!==s&&void 0!==o?F`
<div class="weather-forecast-temperature">
${s} / <span class="high">${o}${r?` ${r}`:""}</span>
</div>
`:""}
${void 0!==h&&void 0!==p?F`
<div class="weather-forecast-temperature">
${h} / <span class="high">${p}${u?` ${u}`:""}</span>
</div>
`:""}
${void 0!==m&&void 0!==y?F`
<div class="weather-forecast-temperature">
${m} ${g} ${y}</span>
</div>
`:""}
${void 0!==_?F`
<div class="weather-forecast-temperature">
${_} ${x?` ${x}`:""}
</div>
`:""}
${void 0!==w?F`
<div class="weather-forecast-temperature">
${$?F`<ha-icon
icon="mdi:arrow-up-thin"
style="display:inline-block; transform: rotate(${$}deg);"
></ha-icon>`:""} ${w}
</div>
`:""}
${void 0!==f&&void 0!==v?F`
<div class="weather-forecast-temperature">
${v} / ${f} ${x?` ${x}`:""}
</div>
`:""}
${void 0!==l&&void 0!==c&&0!==l?F`
<div class="weather-forecast-precipitation">
${l} % / <span class="mm">${c}${d?` ${d}`:""}</span>
</div>
`:""}
</div>
`}));let n="Daily";return 1===e?n="Hourly":2===e?n="Marine daily":3===e&&(n="Marine hourly"),F`
<div class="weather-forecast-grid-wrapper">
<div class="weather-forecast-title">${n} forecast</div>
<div class="weather-forecast-grid-container">
${i}
</div>
</div>
`},$t=e=>e.includes("temperature")?"mdi:thermometer":e.includes("precipitation")?"mdi:weather-rainy":"mdi:help-circle-outline",xt=(e,t,i,n,a,s,o,r,l,c)=>{const d=[],h=Me(e,c);let u=d;if(n){u=Object.keys(n.condition||n.temperature_high||n.temperature_low||n.precipitation_intensity||n.precipitation_probability||{}).map((i=>((e,t,i,n,a,s,o)=>{const r={},l=Ue(t);let c;if(i.condition&&i.condition[o]&&(r.condition={img:tt(Me(e,i.condition[o]),a,s)}),["temperature_high","temperature_low","precipitation_intensity","precipitation_probability"].forEach((n=>{const a=i[n],s=a?.[o];let l=0;s&&("precipitation_intensity"===n&&(l=2),c=new Date(Le(e,s,"datetime")),r[n]={value:je({entityId:s,hass:e,lang:t,decimals:l}),unit:Re(e,s),img:He(e,s)||$t(n)})})),c&&Object.keys(r).length>0){const e=c.toLocaleDateString(l.locale,{weekday:"short",timeZone:"UTC"}),t=c.toLocaleTimeString(l.locale,{hour:"2-digit",minute:"2-digit",timeZone:l.timezone});r.reference={value:0===n?e.toUpperCase():t}}return r})(e,t,n,r,l,h,i)))}let p=d;if(a){p=Object.keys(a.condition||a.temperature||a.temperature_feelslike||a.precipitation_intensity||a.precipitation_probability||{}).map((n=>((e,t,i,n,a,s,o,r)=>{const l={},c=Ue(t);let d;if(n.condition&&n.condition[r]&&(l.condition={img:tt(Me(e,n.condition[r]),s,o)}),n.wind_bearing&&n.wind_bearing[r]&&(l.wind_bearing={value:Fe(Me(e,n.wind_bearing[r]),i)}),["temperature","temperature_feelslike","precipitation_intensity","precipitation_probability","wind_speed"].forEach((i=>{const a=n[i],s=a?.[r];let o=0;s&&("precipitation_intensity"===i&&(o=2),d=new Date(Le(e,s,"datetime")),l[i]={value:je({entityId:s,hass:e,lang:t,decimals:o}),unit:Re(e,s),img:He(e,s)||$t(i)})})),d&&Object.keys(l).length>0){const e=d.toLocaleTimeString(c.locale,{hour:"2-digit",minute:"2-digit",timeZone:c.timezone});l.reference={value:e}}return l})(e,t,i.windDirections,a,0,l,h,n)))}let m=d;if(s){m=Object.keys(s.swell_wave_height_max||s.wave_direction||s.wave_height_max||s.wind_wave_height_max||{}).map((n=>((e,t,i,n,a,s,o,r)=>{const l={},c=Ue(t);let d;var h,u,p;if(n.wave_height_max&&n.swell_wave_height_max&&n.wind_wave_height_max&&n.swell_wave_height_max[r]&&n.wind_wave_height_max[r]&&(l.condition={icon:"mdi:flag-variant",iconColor:(h=n.wave_height_max[r],u=n.swell_wave_height_max[r],p=n.wind_wave_height_max[r],h>=1.8||u>=1.5&&p>=.8?"red":h>=1||u>=.8||p>=.6?"yellow":"green")}),n.wave_direction&&n.wave_direction[r]&&(l.wave_direction={value:Fe(Me(e,n.wave_direction[r]),i),icon:Me(e,n.wave_direction[r])}),["wave_height_max","swell_wave_height_max","wind_wave_height_max"].forEach((i=>{const a=n[i],s=a?.[r];s&&(d=new Date(Le(e,s,"datetime")),l[i]={value:je({entityId:s,hass:e,lang:t,decimals:1}),unit:Re(e,s),img:He(e,s)||$t(i)})})),d&&Object.keys(l).length>0){const e=d.toLocaleDateString(c.locale,{weekday:"short",timeZone:"UTC"}),t=d.toLocaleTimeString(c.locale,{hour:"2-digit",minute:"2-digit",timeZone:c.timezone});l.reference={value:2===a?e.toUpperCase():t}}return l})(e,t,i.windDirections,s,r,0,0,n)))}switch(r){case 0:return wt(r,u);case 1:return wt(r,p);case 2:return wt(r,m);default:return wt(r,d)}},bt=(e,t,i,n,a)=>{const s=a&&e.states[a],o=s?.attributes?.entity_picture;return((e,t,i,n)=>i?F`
<div
class="camera-container"
@click=${i=>e(i,t)}
>
<div class="camera-image">
<img
src="${i}"
alt="${n}"
loading="lazy"
/>
</div>
</div>
`:F``)(n,a,o,s?.attributes?.friendly_name??a)};const At=(e,t,i,n)=>{const a={wind:"mdi:weather-windy","snow-ice":"mdi:snowflake-alert",thunderstorm:"mdi:weather-lightning",fog:"mdi:weather-fog","high-temperature":"mdi:weather-sunny-alert","low-temperature":"mdi:thermometer-low","coastal-event":"mdi:home-flood","forest-fire":"mdi:pine-tree-fire",avalanche:"mdi:image-filter-hdr",rain:"mdi:weather-pouring",flood:"mdi:home-flood","rain-flood":"mdi:weather-pouring","marine-hazard":"mdi:weather-hurricane",drought:"mdi:water-off"},s={green:"green",yellow:"#ffa600",orange:"orange",red:"red"},o=n&&e.states[n];if(!o?.attributes)return{};const r={};if("on"===o.state&&o.attributes){const e=Ue(t),{event:i,severity:n,awareness_type:l,awareness_level:c,effective:d}=o.attributes,h=l?.split(";")[1]?.trim().toLowerCase()||"",u=c?.split(";")[1]?.trim().toLowerCase()||"",p=i||"",m=n?.split(";")[1]?.trim()||"";(e=>{const t=new Date(e),i=new Date,n=new Date(i.getFullYear(),i.getMonth(),i.getDate()),a=new Date(t.getFullYear(),t.getMonth(),t.getDate()),s=Math.round((a.getTime()-n.getTime())/864e5);let o;o=0===s?"oggi":1===s?"domani":2===s?"dopodomani":void 0})(d),r.meteoalarm={event:p,severity:m,icon:a[h]||"mdi:alert",icon_color:s[u]||"grey",datetime:new Date(d).toLocaleDateString(e.locale,{weekday:"short",timeZone:e.timezone}).toLocaleUpperCase()}}return r},zt=(e,t,i,n)=>{if(!n)return{};const a=Ue(t),s={0:"gray",1:"green",2:"#ffa600",3:"orange",4:"red"},o={};return["thunderstorms","hydraulic","hydrogeological"].forEach((t=>{const i=n[t],r=i&&e.states[i];if(r&&"on"===r.state&&r.attributes){const{level:e,info:i,icon:n}=r.attributes;o[t]={event:i,severity:e,icon:n,icon_color:s[e],datetime:(new Date).toLocaleDateString(a.locale,{weekday:"short",timeZone:a.timezone}).toLocaleUpperCase()}}})),o},Et=(e,t,i,n,a)=>{const s={...At(e,t,0,n),...zt(e,t,0,a)};return(o=s)&&0!==Object.keys(o).length?F`
<div class="meteodcpalarm-grid-container">
${Object.entries(o).map((([e,t])=>F`
<div class="meteodcpalarm-group">
<ha-icon icon="${t.icon}" style="color: ${t.icon_color};"></ha-icon>
<div class="meteodcpalarm-label">${t.datetime}</div>
<div class="meteodcpalarm-label">${t.event}</div>
</div>
`))}
</div>
`:F``;var o},{translations:kt,imagePath:St}=await nt();let Ct=class extends at{constructor(){super(...arguments),this._translations=kt,this._imagesPath=St}_render(){return F`
<ha-card class="ha-card-weather-conditions">
<div class="nd-container">
${this._buildTemplate()}
</div>
</ha-card>
`}_buildTemplate(){let e=F``,t=F``,i=F``,n=F``,a=F``,s=F``,o=F``,r=F``,l=F``,c=F``,d=F``;const h=e=>xt(this.hass,this._language,this._terms,this._config.weather.daily_forecasts,this._config.weather.hourly_forecasts,this._config.weather.marine_daily_forecasts,this._config.weather.marine_hourly_forecasts,e,this._iconsConfig,this._config.weather.sun);var u,p,m;return this._hasPresent&&(e=st(this.hass,this._language,this._terms,this._iconsConfig,this._config.weather?.name,this._config?.weather?.present||null,this._config?.weather?.sun,this._config?.weather?.moonphase)),this._hasPresent&&(t=dt(this.hass,this._language,this._terms,this._config?.weather?.present||{},this._config?.weather?.sun)),(this._hasMetealarm||this._hasDPCalarm)&&(o=Et(this.hass,this._language,this._terms,this._config?.weather?.meteoalarm,this._config?.weather?.dpcalarm)),this._hasDailyForecasts&&(i=h(0)),this._hasHourlyForecasts&&(n=h(1)),this._hasMarineDailyForecasts&&(a=h(2)),this._hasMarineHourlyForecasts&&(s=h(3)),this._hasUltraviolet&&(u=this.hass,p=this._language,m=this._config.ultraviolet,r=pt({...gt(u,p,m)},{...yt(u,p,m)})),this._hasPollen&&(l=_t(this.hass,this._language,this._config.pollen)),this._hasAirQuality&&(c=((e,t,i)=>{const n=t||e.selectedLanguage||e.language,a=je({entityId:i.pm25,hass:e,lang:t,decimals:0}),s=je({entityId:i.pm10,hass:e,lang:t,decimals:0}),o=je({entityId:i.o3,hass:e,lang:t,decimals:1}),r=je({entityId:i.no2,hass:e,lang:t,decimals:0}),l=je({entityId:i.co,hass:e,lang:t,decimals:1}),c=je({entityId:i.so2,hass:e,lang:t,decimals:0}),d=je({entityId:i.epa_aqi,hass:e,lang:t,decimals:0}),h=Me(e,i.epa_primary_pollutant),u={pm25:{value:a?`pm2.5 ${a}`:a,unit:Re(e,i.pm25)||"µg/m³",icon:"mdi:weather-hazy"},pm10:{value:s?`pm10 ${s}`:s,unit:Re(e,i.pm10)||"µg/m³",icon:"mdi:weather-hazy"},o3:{value:o?`o3 ${o}`:o,unit:Re(e,i.o3)||"µg/m³",icon:"mdi:molecule"},no2:{value:r?`no2 ${r}`:r,unit:Re(e,i.no2)||"µg/m³",icon:"mdi:molecule"},co:{value:l?`co ${l}`:l,unit:Re(e,i.co)||"µg/m³",icon:"mdi:molecule"},so2:{value:c?`so2 ${c}`:c,unit:Re(e,i.so2)||"µg/m³",icon:"mdi:molecule"},epa_aqi:{value:d?`Air Quality Index ${d}`:d,icon:"mdi:weather-hazy",icon_color:(p=Number(Me(e,i.epa_aqi)),p<=50?"#009966":p<=100?"#ffde33":p<=150?"#ff9933":p<=200?"#cc0033":p<=300?"#660099":"#7e0023")},epa_primary_pollutant:{value:h?`Primary ${h}`:h,icon:"mdi:weather-hazy"}};var p;return ct(u,n)})(this.hass,this._language,this._config.airquality)),this._hasCamera&&(d=bt(this.hass,this._language,this._terms,this._handlePopup.bind(this),this._config.camera)),F`
${e}
${t}
${n}
${i}
${s}
${a}
${o}
${l}
${r}
${c}
${d}`}_handlePopup(e,t){e.stopPropagation();const i=new Event("hass-more-info",{composed:!0});i.detail={entityId:t},this.dispatchEvent(i)}};Ct=e([(e=>(t,i)=>{void 0!==i?i.addInitializer((()=>{customElements.define(e,t)})):customElements.define(e,t)})("ha-card-weather-conditions")],Ct);export{Ct as HaCardWeatherConditions};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGEtY2FyZC13ZWF0aGVyLWNvbmRpdGlvbnMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanMiLCIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2Nzcy10YWcuanMiLCIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3JlYWN0aXZlLWVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvbGl0LWh0bWwuanMiLCIuLi9ub2RlX21vZHVsZXMvbGl0LWVsZW1lbnQvbGl0LWVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvY3VzdG9tLWVsZW1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L2RlY29yYXRvcnMvcHJvcGVydHkuanMiLCIuLi9zcmMvdXRpbHMvY29sb3JzLnRzIiwiLi4vc3JjL3V0aWxzL2NvbnN0LnRzIiwiLi4vc3JjL2ljb25tb2RlbHMvaW0tYnVpZW5yYWRhci50cyIsIi4uL3NyYy9pY29ubW9kZWxzL2ltLWNsaW1hY2VsbC50cyIsIi4uL3NyYy9pY29ubW9kZWxzL2ltLWRhcmtza3kudHMiLCIuLi9zcmMvaWNvbm1vZGVscy9pbS1oYXNzLnRzIiwiLi4vc3JjL2ljb25tb2RlbHMvaW0tb3BlbndlYXRoZXJtYXAudHMiLCIuLi9zcmMvaWNvbm1vZGVscy9pbS1waXJhdGV3ZWF0aGVyLnRzIiwiLi4vYmFja3VwL3R5cGVzLnRzIiwiLi4vc3JjL3V0aWxzL2hlbHBlci50cyIsIi4uL2JhY2t1cC9oYS1jd2MtY29uc3RzLnRzIiwiLi4vc3JjL2Nzcy9jc3MtYmFzZS1jYXJkLnRzIiwiLi4vc3JjL2Nzcy9jc3Mtc3VtbWFyeS50cyIsIi4uL3NyYy9jc3MvY3NzLXByZXNlbnQudHMiLCIuLi9zcmMvY3NzL2Nzcy11bHRyYXZpb2xldC50cyIsIi4uL3NyYy9jc3MvY3NzLXBvbGxlbi50cyIsIi4uL3NyYy9jc3MvY3NzLWNhbWVyYS50cyIsIi4uL3NyYy9jc3MvY3NzLXdlYXRoZXItZm9yZWNhc3QudHMiLCIuLi9zcmMvY3NzL2Nzcy1tZXRlb2FsYXJtLnRzIiwiLi4vc3JjL3V0aWxzL2hlbHBlci1yZW5kZXIudHMiLCIuLi9zcmMvYmFzZS9sb3ZlbGFjZS1iYXNlLnRzIiwiLi4vc3JjL3RlbXBsYXRlcy90LXN1bW1hcnkudHMiLCIuLi9zcmMvYnVpbGRlci9iLXN1bW1hcnkudHMiLCIuLi9zcmMvdGVtcGxhdGVzL3QtcHJlc2VudC50cyIsIi4uL3NyYy9idWlsZGVyL2ItcHJlc2VudC50cyIsIi4uL3NyYy90ZW1wbGF0ZXMvdC11bHRyYXZpb2xldC50cyIsIi4uL3NyYy9idWlsZGVyL2ItdWx0cmF2aW9sZXQudHMiLCIuLi9zcmMvdGVtcGxhdGVzL3QtcG9sbGVuLnRzIiwiLi4vc3JjL2J1aWxkZXIvYi1wb2xsZW4udHMiLCIuLi9zcmMvdGVtcGxhdGVzL3Qtd2VhdGhlci1mb3JlY2FzdC50cyIsIi4uL3NyYy9idWlsZGVyL2Itd2VhdGhlci1mb3JlY2FzdC50cyIsIi4uL3NyYy9idWlsZGVyL2ItY2FtZXJhLnRzIiwiLi4vc3JjL3RlbXBsYXRlcy90LWNhbWVyYS50cyIsIi4uL3NyYy9idWlsZGVyL2ItYWlycXVhbGl0eS50cyIsIi4uL3NyYy9idWlsZGVyL2ItbWV0ZW9hbGFybS50cyIsIi4uL3NyYy90ZW1wbGF0ZXMvdC1tZXRlb2FsYXJtLnRzIiwiLi4vc3JjL2hhLXdlYXRoZXItZWNhcmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xyXG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xyXG4gICAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIGFyID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG93bktleXMobyk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xyXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG5cclxufVxyXG5cclxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcclxuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XHJcbiAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XHJcbiAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciByLCBzID0gMDtcclxuICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBzIHw9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGU6IF9fZXNEZWNvcmF0ZSxcclxuICAgIF9fcnVuSW5pdGlhbGl6ZXJzOiBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleTogX19wcm9wS2V5LFxyXG4gICAgX19zZXRGdW5jdGlvbk5hbWU6IF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG4gICAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb246IF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxyXG59O1xyXG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cbmNvbnN0IHQ9Z2xvYmFsVGhpcyxlPXQuU2hhZG93Um9vdCYmKHZvaWQgMD09PXQuU2hhZHlDU1N8fHQuU2hhZHlDU1MubmF0aXZlU2hhZG93KSYmXCJhZG9wdGVkU3R5bGVTaGVldHNcImluIERvY3VtZW50LnByb3RvdHlwZSYmXCJyZXBsYWNlXCJpbiBDU1NTdHlsZVNoZWV0LnByb3RvdHlwZSxzPVN5bWJvbCgpLG89bmV3IFdlYWtNYXA7Y2xhc3Mgbntjb25zdHJ1Y3Rvcih0LGUsbyl7aWYodGhpcy5fJGNzc1Jlc3VsdCQ9ITAsbyE9PXMpdGhyb3cgRXJyb3IoXCJDU1NSZXN1bHQgaXMgbm90IGNvbnN0cnVjdGFibGUuIFVzZSBgdW5zYWZlQ1NTYCBvciBgY3NzYCBpbnN0ZWFkLlwiKTt0aGlzLmNzc1RleHQ9dCx0aGlzLnQ9ZX1nZXQgc3R5bGVTaGVldCgpe2xldCB0PXRoaXMubztjb25zdCBzPXRoaXMudDtpZihlJiZ2b2lkIDA9PT10KXtjb25zdCBlPXZvaWQgMCE9PXMmJjE9PT1zLmxlbmd0aDtlJiYodD1vLmdldChzKSksdm9pZCAwPT09dCYmKCh0aGlzLm89dD1uZXcgQ1NTU3R5bGVTaGVldCkucmVwbGFjZVN5bmModGhpcy5jc3NUZXh0KSxlJiZvLnNldChzLHQpKX1yZXR1cm4gdH10b1N0cmluZygpe3JldHVybiB0aGlzLmNzc1RleHR9fWNvbnN0IHI9dD0+bmV3IG4oXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDp0K1wiXCIsdm9pZCAwLHMpLGk9KHQsLi4uZSk9Pntjb25zdCBvPTE9PT10Lmxlbmd0aD90WzBdOmUucmVkdWNlKCgoZSxzLG8pPT5lKyh0PT57aWYoITA9PT10Ll8kY3NzUmVzdWx0JClyZXR1cm4gdC5jc3NUZXh0O2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXJldHVybiB0O3Rocm93IEVycm9yKFwiVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6IFwiK3QrXCIuIFVzZSAndW5zYWZlQ1NTJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0IHRha2UgY2FyZSB0byBlbnN1cmUgcGFnZSBzZWN1cml0eS5cIil9KShzKSt0W28rMV0pLHRbMF0pO3JldHVybiBuZXcgbihvLHQscyl9LFM9KHMsbyk9PntpZihlKXMuYWRvcHRlZFN0eWxlU2hlZXRzPW8ubWFwKCh0PT50IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldD90OnQuc3R5bGVTaGVldCkpO2Vsc2UgZm9yKGNvbnN0IGUgb2Ygbyl7Y29uc3Qgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksbj10LmxpdE5vbmNlO3ZvaWQgMCE9PW4mJm8uc2V0QXR0cmlidXRlKFwibm9uY2VcIixuKSxvLnRleHRDb250ZW50PWUuY3NzVGV4dCxzLmFwcGVuZENoaWxkKG8pfX0sYz1lP3Q9PnQ6dD0+dCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQ/KHQ9PntsZXQgZT1cIlwiO2Zvcihjb25zdCBzIG9mIHQuY3NzUnVsZXMpZSs9cy5jc3NUZXh0O3JldHVybiByKGUpfSkodCk6dDtleHBvcnR7biBhcyBDU1NSZXN1bHQsUyBhcyBhZG9wdFN0eWxlcyxpIGFzIGNzcyxjIGFzIGdldENvbXBhdGlibGVTdHlsZSxlIGFzIHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyxyIGFzIHVuc2FmZUNTU307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jc3MtdGFnLmpzLm1hcFxuIiwiaW1wb3J0e2dldENvbXBhdGlibGVTdHlsZSBhcyB0LGFkb3B0U3R5bGVzIGFzIHN9ZnJvbVwiLi9jc3MtdGFnLmpzXCI7ZXhwb3J0e0NTU1Jlc3VsdCxjc3Msc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzLHVuc2FmZUNTU31mcm9tXCIuL2Nzcy10YWcuanNcIjtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL2NvbnN0e2lzOmksZGVmaW5lUHJvcGVydHk6ZSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6aCxnZXRPd25Qcm9wZXJ0eU5hbWVzOnIsZ2V0T3duUHJvcGVydHlTeW1ib2xzOm8sZ2V0UHJvdG90eXBlT2Y6bn09T2JqZWN0LGE9Z2xvYmFsVGhpcyxjPWEudHJ1c3RlZFR5cGVzLGw9Yz9jLmVtcHR5U2NyaXB0OlwiXCIscD1hLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydCxkPSh0LHMpPT50LHU9e3RvQXR0cmlidXRlKHQscyl7c3dpdGNoKHMpe2Nhc2UgQm9vbGVhbjp0PXQ/bDpudWxsO2JyZWFrO2Nhc2UgT2JqZWN0OmNhc2UgQXJyYXk6dD1udWxsPT10P3Q6SlNPTi5zdHJpbmdpZnkodCl9cmV0dXJuIHR9LGZyb21BdHRyaWJ1dGUodCxzKXtsZXQgaT10O3N3aXRjaChzKXtjYXNlIEJvb2xlYW46aT1udWxsIT09dDticmVhaztjYXNlIE51bWJlcjppPW51bGw9PT10P251bGw6TnVtYmVyKHQpO2JyZWFrO2Nhc2UgT2JqZWN0OmNhc2UgQXJyYXk6dHJ5e2k9SlNPTi5wYXJzZSh0KX1jYXRjaCh0KXtpPW51bGx9fXJldHVybiBpfX0sZj0odCxzKT0+IWkodCxzKSxiPXthdHRyaWJ1dGU6ITAsdHlwZTpTdHJpbmcsY29udmVydGVyOnUscmVmbGVjdDohMSx1c2VEZWZhdWx0OiExLGhhc0NoYW5nZWQ6Zn07U3ltYm9sLm1ldGFkYXRhPz89U3ltYm9sKFwibWV0YWRhdGFcIiksYS5saXRQcm9wZXJ0eU1ldGFkYXRhPz89bmV3IFdlYWtNYXA7Y2xhc3MgeSBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBhZGRJbml0aWFsaXplcih0KXt0aGlzLl8kRWkoKSwodGhpcy5sPz89W10pLnB1c2godCl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm4gdGhpcy5maW5hbGl6ZSgpLHRoaXMuXyRFaCYmWy4uLnRoaXMuXyRFaC5rZXlzKCldfXN0YXRpYyBjcmVhdGVQcm9wZXJ0eSh0LHM9Yil7aWYocy5zdGF0ZSYmKHMuYXR0cmlidXRlPSExKSx0aGlzLl8kRWkoKSx0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSh0KSYmKChzPU9iamVjdC5jcmVhdGUocykpLndyYXBwZWQ9ITApLHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHQscyksIXMubm9BY2Nlc3Nvcil7Y29uc3QgaT1TeW1ib2woKSxoPXRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQsaSxzKTt2b2lkIDAhPT1oJiZlKHRoaXMucHJvdG90eXBlLHQsaCl9fXN0YXRpYyBnZXRQcm9wZXJ0eURlc2NyaXB0b3IodCxzLGkpe2NvbnN0e2dldDplLHNldDpyfT1oKHRoaXMucHJvdG90eXBlLHQpPz97Z2V0KCl7cmV0dXJuIHRoaXNbc119LHNldCh0KXt0aGlzW3NdPXR9fTtyZXR1cm57Z2V0OmUsc2V0KHMpe2NvbnN0IGg9ZT8uY2FsbCh0aGlzKTtyPy5jYWxsKHRoaXMscyksdGhpcy5yZXF1ZXN0VXBkYXRlKHQsaCxpKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fXN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnModCl7cmV0dXJuIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuZ2V0KHQpPz9ifXN0YXRpYyBfJEVpKCl7aWYodGhpcy5oYXNPd25Qcm9wZXJ0eShkKFwiZWxlbWVudFByb3BlcnRpZXNcIikpKXJldHVybjtjb25zdCB0PW4odGhpcyk7dC5maW5hbGl6ZSgpLHZvaWQgMCE9PXQubCYmKHRoaXMubD1bLi4udC5sXSksdGhpcy5lbGVtZW50UHJvcGVydGllcz1uZXcgTWFwKHQuZWxlbWVudFByb3BlcnRpZXMpfXN0YXRpYyBmaW5hbGl6ZSgpe2lmKHRoaXMuaGFzT3duUHJvcGVydHkoZChcImZpbmFsaXplZFwiKSkpcmV0dXJuO2lmKHRoaXMuZmluYWxpemVkPSEwLHRoaXMuXyRFaSgpLHRoaXMuaGFzT3duUHJvcGVydHkoZChcInByb3BlcnRpZXNcIikpKXtjb25zdCB0PXRoaXMucHJvcGVydGllcyxzPVsuLi5yKHQpLC4uLm8odCldO2Zvcihjb25zdCBpIG9mIHMpdGhpcy5jcmVhdGVQcm9wZXJ0eShpLHRbaV0pfWNvbnN0IHQ9dGhpc1tTeW1ib2wubWV0YWRhdGFdO2lmKG51bGwhPT10KXtjb25zdCBzPWxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KHQpO2lmKHZvaWQgMCE9PXMpZm9yKGNvbnN0W3QsaV1vZiBzKXRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KHQsaSl9dGhpcy5fJEVoPW5ldyBNYXA7Zm9yKGNvbnN0W3Qsc11vZiB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzKXtjb25zdCBpPXRoaXMuXyRFdSh0LHMpO3ZvaWQgMCE9PWkmJnRoaXMuXyRFaC5zZXQoaSx0KX10aGlzLmVsZW1lbnRTdHlsZXM9dGhpcy5maW5hbGl6ZVN0eWxlcyh0aGlzLnN0eWxlcyl9c3RhdGljIGZpbmFsaXplU3R5bGVzKHMpe2NvbnN0IGk9W107aWYoQXJyYXkuaXNBcnJheShzKSl7Y29uc3QgZT1uZXcgU2V0KHMuZmxhdCgxLzApLnJldmVyc2UoKSk7Zm9yKGNvbnN0IHMgb2YgZSlpLnVuc2hpZnQodChzKSl9ZWxzZSB2b2lkIDAhPT1zJiZpLnB1c2godChzKSk7cmV0dXJuIGl9c3RhdGljIF8kRXUodCxzKXtjb25zdCBpPXMuYXR0cmlidXRlO3JldHVybiExPT09aT92b2lkIDA6XCJzdHJpbmdcIj09dHlwZW9mIGk/aTpcInN0cmluZ1wiPT10eXBlb2YgdD90LnRvTG93ZXJDYXNlKCk6dm9pZCAwfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl8kRXA9dm9pZCAwLHRoaXMuaXNVcGRhdGVQZW5kaW5nPSExLHRoaXMuaGFzVXBkYXRlZD0hMSx0aGlzLl8kRW09bnVsbCx0aGlzLl8kRXYoKX1fJEV2KCl7dGhpcy5fJEVTPW5ldyBQcm9taXNlKCh0PT50aGlzLmVuYWJsZVVwZGF0aW5nPXQpKSx0aGlzLl8kQUw9bmV3IE1hcCx0aGlzLl8kRV8oKSx0aGlzLnJlcXVlc3RVcGRhdGUoKSx0aGlzLmNvbnN0cnVjdG9yLmw/LmZvckVhY2goKHQ9PnQodGhpcykpKX1hZGRDb250cm9sbGVyKHQpeyh0aGlzLl8kRU8/Pz1uZXcgU2V0KS5hZGQodCksdm9pZCAwIT09dGhpcy5yZW5kZXJSb290JiZ0aGlzLmlzQ29ubmVjdGVkJiZ0Lmhvc3RDb25uZWN0ZWQ/LigpfXJlbW92ZUNvbnRyb2xsZXIodCl7dGhpcy5fJEVPPy5kZWxldGUodCl9XyRFXygpe2NvbnN0IHQ9bmV3IE1hcCxzPXRoaXMuY29uc3RydWN0b3IuZWxlbWVudFByb3BlcnRpZXM7Zm9yKGNvbnN0IGkgb2Ygcy5rZXlzKCkpdGhpcy5oYXNPd25Qcm9wZXJ0eShpKSYmKHQuc2V0KGksdGhpc1tpXSksZGVsZXRlIHRoaXNbaV0pO3Quc2l6ZT4wJiYodGhpcy5fJEVwPXQpfWNyZWF0ZVJlbmRlclJvb3QoKXtjb25zdCB0PXRoaXMuc2hhZG93Um9vdD8/dGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyk7cmV0dXJuIHModCx0aGlzLmNvbnN0cnVjdG9yLmVsZW1lbnRTdHlsZXMpLHR9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLnJlbmRlclJvb3Q/Pz10aGlzLmNyZWF0ZVJlbmRlclJvb3QoKSx0aGlzLmVuYWJsZVVwZGF0aW5nKCEwKSx0aGlzLl8kRU8/LmZvckVhY2goKHQ9PnQuaG9zdENvbm5lY3RlZD8uKCkpKX1lbmFibGVVcGRhdGluZyh0KXt9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLl8kRU8/LmZvckVhY2goKHQ9PnQuaG9zdERpc2Nvbm5lY3RlZD8uKCkpKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxzLGkpe3RoaXMuXyRBSyh0LGkpfV8kRVQodCxzKXtjb25zdCBpPXRoaXMuY29uc3RydWN0b3IuZWxlbWVudFByb3BlcnRpZXMuZ2V0KHQpLGU9dGhpcy5jb25zdHJ1Y3Rvci5fJEV1KHQsaSk7aWYodm9pZCAwIT09ZSYmITA9PT1pLnJlZmxlY3Qpe2NvbnN0IGg9KHZvaWQgMCE9PWkuY29udmVydGVyPy50b0F0dHJpYnV0ZT9pLmNvbnZlcnRlcjp1KS50b0F0dHJpYnV0ZShzLGkudHlwZSk7dGhpcy5fJEVtPXQsbnVsbD09aD90aGlzLnJlbW92ZUF0dHJpYnV0ZShlKTp0aGlzLnNldEF0dHJpYnV0ZShlLGgpLHRoaXMuXyRFbT1udWxsfX1fJEFLKHQscyl7Y29uc3QgaT10aGlzLmNvbnN0cnVjdG9yLGU9aS5fJEVoLmdldCh0KTtpZih2b2lkIDAhPT1lJiZ0aGlzLl8kRW0hPT1lKXtjb25zdCB0PWkuZ2V0UHJvcGVydHlPcHRpb25zKGUpLGg9XCJmdW5jdGlvblwiPT10eXBlb2YgdC5jb252ZXJ0ZXI/e2Zyb21BdHRyaWJ1dGU6dC5jb252ZXJ0ZXJ9OnZvaWQgMCE9PXQuY29udmVydGVyPy5mcm9tQXR0cmlidXRlP3QuY29udmVydGVyOnU7dGhpcy5fJEVtPWUsdGhpc1tlXT1oLmZyb21BdHRyaWJ1dGUocyx0LnR5cGUpPz90aGlzLl8kRWo/LmdldChlKT8/bnVsbCx0aGlzLl8kRW09bnVsbH19cmVxdWVzdFVwZGF0ZSh0LHMsaSl7aWYodm9pZCAwIT09dCl7Y29uc3QgZT10aGlzLmNvbnN0cnVjdG9yLGg9dGhpc1t0XTtpZihpPz89ZS5nZXRQcm9wZXJ0eU9wdGlvbnModCksISgoaS5oYXNDaGFuZ2VkPz9mKShoLHMpfHxpLnVzZURlZmF1bHQmJmkucmVmbGVjdCYmaD09PXRoaXMuXyRFaj8uZ2V0KHQpJiYhdGhpcy5oYXNBdHRyaWJ1dGUoZS5fJEV1KHQsaSkpKSlyZXR1cm47dGhpcy5DKHQscyxpKX0hMT09PXRoaXMuaXNVcGRhdGVQZW5kaW5nJiYodGhpcy5fJEVTPXRoaXMuXyRFUCgpKX1DKHQscyx7dXNlRGVmYXVsdDppLHJlZmxlY3Q6ZSx3cmFwcGVkOmh9LHIpe2kmJiEodGhpcy5fJEVqPz89bmV3IE1hcCkuaGFzKHQpJiYodGhpcy5fJEVqLnNldCh0LHI/P3M/P3RoaXNbdF0pLCEwIT09aHx8dm9pZCAwIT09cil8fCh0aGlzLl8kQUwuaGFzKHQpfHwodGhpcy5oYXNVcGRhdGVkfHxpfHwocz12b2lkIDApLHRoaXMuXyRBTC5zZXQodCxzKSksITA9PT1lJiZ0aGlzLl8kRW0hPT10JiYodGhpcy5fJEVxPz89bmV3IFNldCkuYWRkKHQpKX1hc3luYyBfJEVQKCl7dGhpcy5pc1VwZGF0ZVBlbmRpbmc9ITA7dHJ5e2F3YWl0IHRoaXMuXyRFU31jYXRjaCh0KXtQcm9taXNlLnJlamVjdCh0KX1jb25zdCB0PXRoaXMuc2NoZWR1bGVVcGRhdGUoKTtyZXR1cm4gbnVsbCE9dCYmYXdhaXQgdCwhdGhpcy5pc1VwZGF0ZVBlbmRpbmd9c2NoZWR1bGVVcGRhdGUoKXtyZXR1cm4gdGhpcy5wZXJmb3JtVXBkYXRlKCl9cGVyZm9ybVVwZGF0ZSgpe2lmKCF0aGlzLmlzVXBkYXRlUGVuZGluZylyZXR1cm47aWYoIXRoaXMuaGFzVXBkYXRlZCl7aWYodGhpcy5yZW5kZXJSb290Pz89dGhpcy5jcmVhdGVSZW5kZXJSb290KCksdGhpcy5fJEVwKXtmb3IoY29uc3RbdCxzXW9mIHRoaXMuXyRFcCl0aGlzW3RdPXM7dGhpcy5fJEVwPXZvaWQgMH1jb25zdCB0PXRoaXMuY29uc3RydWN0b3IuZWxlbWVudFByb3BlcnRpZXM7aWYodC5zaXplPjApZm9yKGNvbnN0W3MsaV1vZiB0KXtjb25zdHt3cmFwcGVkOnR9PWksZT10aGlzW3NdOyEwIT09dHx8dGhpcy5fJEFMLmhhcyhzKXx8dm9pZCAwPT09ZXx8dGhpcy5DKHMsdm9pZCAwLGksZSl9fWxldCB0PSExO2NvbnN0IHM9dGhpcy5fJEFMO3RyeXt0PXRoaXMuc2hvdWxkVXBkYXRlKHMpLHQ/KHRoaXMud2lsbFVwZGF0ZShzKSx0aGlzLl8kRU8/LmZvckVhY2goKHQ9PnQuaG9zdFVwZGF0ZT8uKCkpKSx0aGlzLnVwZGF0ZShzKSk6dGhpcy5fJEVNKCl9Y2F0Y2gocyl7dGhyb3cgdD0hMSx0aGlzLl8kRU0oKSxzfXQmJnRoaXMuXyRBRShzKX13aWxsVXBkYXRlKHQpe31fJEFFKHQpe3RoaXMuXyRFTz8uZm9yRWFjaCgodD0+dC5ob3N0VXBkYXRlZD8uKCkpKSx0aGlzLmhhc1VwZGF0ZWR8fCh0aGlzLmhhc1VwZGF0ZWQ9ITAsdGhpcy5maXJzdFVwZGF0ZWQodCkpLHRoaXMudXBkYXRlZCh0KX1fJEVNKCl7dGhpcy5fJEFMPW5ldyBNYXAsdGhpcy5pc1VwZGF0ZVBlbmRpbmc9ITF9Z2V0IHVwZGF0ZUNvbXBsZXRlKCl7cmV0dXJuIHRoaXMuZ2V0VXBkYXRlQ29tcGxldGUoKX1nZXRVcGRhdGVDb21wbGV0ZSgpe3JldHVybiB0aGlzLl8kRVN9c2hvdWxkVXBkYXRlKHQpe3JldHVybiEwfXVwZGF0ZSh0KXt0aGlzLl8kRXEmJj10aGlzLl8kRXEuZm9yRWFjaCgodD0+dGhpcy5fJEVUKHQsdGhpc1t0XSkpKSx0aGlzLl8kRU0oKX11cGRhdGVkKHQpe31maXJzdFVwZGF0ZWQodCl7fX15LmVsZW1lbnRTdHlsZXM9W10seS5zaGFkb3dSb290T3B0aW9ucz17bW9kZTpcIm9wZW5cIn0seVtkKFwiZWxlbWVudFByb3BlcnRpZXNcIildPW5ldyBNYXAseVtkKFwiZmluYWxpemVkXCIpXT1uZXcgTWFwLHA/Lih7UmVhY3RpdmVFbGVtZW50Onl9KSwoYS5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucz8/PVtdKS5wdXNoKFwiMi4xLjBcIik7ZXhwb3J0e3kgYXMgUmVhY3RpdmVFbGVtZW50LHMgYXMgYWRvcHRTdHlsZXMsdSBhcyBkZWZhdWx0Q29udmVydGVyLHQgYXMgZ2V0Q29tcGF0aWJsZVN0eWxlLGYgYXMgbm90RXF1YWx9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVhY3RpdmUtZWxlbWVudC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuY29uc3QgdD1nbG9iYWxUaGlzLGk9dC50cnVzdGVkVHlwZXMscz1pP2kuY3JlYXRlUG9saWN5KFwibGl0LWh0bWxcIix7Y3JlYXRlSFRNTDp0PT50fSk6dm9pZCAwLGU9XCIkbGl0JFwiLGg9YGxpdCQke01hdGgucmFuZG9tKCkudG9GaXhlZCg5KS5zbGljZSgyKX0kYCxvPVwiP1wiK2gsbj1gPCR7b30+YCxyPWRvY3VtZW50LGw9KCk9PnIuY3JlYXRlQ29tbWVudChcIlwiKSxjPXQ9Pm51bGw9PT10fHxcIm9iamVjdFwiIT10eXBlb2YgdCYmXCJmdW5jdGlvblwiIT10eXBlb2YgdCxhPUFycmF5LmlzQXJyYXksdT10PT5hKHQpfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiB0Py5bU3ltYm9sLml0ZXJhdG9yXSxkPVwiWyBcXHRcXG5cXGZcXHJdXCIsZj0vPCg/OighLS18XFwvW15hLXpBLVpdKXwoXFwvP1thLXpBLVpdW14+XFxzXSopfChcXC8/JCkpL2csdj0vLS0+L2csXz0vPi9nLG09UmVnRXhwKGA+fCR7ZH0oPzooW15cXFxcc1wiJz49L10rKSgke2R9Kj0ke2R9Kig/OlteIFxcdFxcblxcZlxcclwiJ1xcYDw+PV18KFwifCcpfCkpfCQpYCxcImdcIikscD0vJy9nLGc9L1wiL2csJD0vXig/OnNjcmlwdHxzdHlsZXx0ZXh0YXJlYXx0aXRsZSkkL2kseT10PT4oaSwuLi5zKT0+KHtfJGxpdFR5cGUkOnQsc3RyaW5nczppLHZhbHVlczpzfSkseD15KDEpLGI9eSgyKSx3PXkoMyksVD1TeW1ib2wuZm9yKFwibGl0LW5vQ2hhbmdlXCIpLEU9U3ltYm9sLmZvcihcImxpdC1ub3RoaW5nXCIpLEE9bmV3IFdlYWtNYXAsQz1yLmNyZWF0ZVRyZWVXYWxrZXIociwxMjkpO2Z1bmN0aW9uIFAodCxpKXtpZighYSh0KXx8IXQuaGFzT3duUHJvcGVydHkoXCJyYXdcIikpdGhyb3cgRXJyb3IoXCJpbnZhbGlkIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXlcIik7cmV0dXJuIHZvaWQgMCE9PXM/cy5jcmVhdGVIVE1MKGkpOml9Y29uc3QgVj0odCxpKT0+e2NvbnN0IHM9dC5sZW5ndGgtMSxvPVtdO2xldCByLGw9Mj09PWk/XCI8c3ZnPlwiOjM9PT1pP1wiPG1hdGg+XCI6XCJcIixjPWY7Zm9yKGxldCBpPTA7aTxzO2krKyl7Y29uc3Qgcz10W2ldO2xldCBhLHUsZD0tMSx5PTA7Zm9yKDt5PHMubGVuZ3RoJiYoYy5sYXN0SW5kZXg9eSx1PWMuZXhlYyhzKSxudWxsIT09dSk7KXk9Yy5sYXN0SW5kZXgsYz09PWY/XCIhLS1cIj09PXVbMV0/Yz12OnZvaWQgMCE9PXVbMV0/Yz1fOnZvaWQgMCE9PXVbMl0/KCQudGVzdCh1WzJdKSYmKHI9UmVnRXhwKFwiPC9cIit1WzJdLFwiZ1wiKSksYz1tKTp2b2lkIDAhPT11WzNdJiYoYz1tKTpjPT09bT9cIj5cIj09PXVbMF0/KGM9cj8/ZixkPS0xKTp2b2lkIDA9PT11WzFdP2Q9LTI6KGQ9Yy5sYXN0SW5kZXgtdVsyXS5sZW5ndGgsYT11WzFdLGM9dm9pZCAwPT09dVszXT9tOidcIic9PT11WzNdP2c6cCk6Yz09PWd8fGM9PT1wP2M9bTpjPT09dnx8Yz09PV8/Yz1mOihjPW0scj12b2lkIDApO2NvbnN0IHg9Yz09PW0mJnRbaSsxXS5zdGFydHNXaXRoKFwiLz5cIik/XCIgXCI6XCJcIjtsKz1jPT09Zj9zK246ZD49MD8oby5wdXNoKGEpLHMuc2xpY2UoMCxkKStlK3Muc2xpY2UoZCkraCt4KTpzK2grKC0yPT09ZD9pOngpfXJldHVybltQKHQsbCsodFtzXXx8XCI8Pz5cIikrKDI9PT1pP1wiPC9zdmc+XCI6Mz09PWk/XCI8L21hdGg+XCI6XCJcIikpLG9dfTtjbGFzcyBOe2NvbnN0cnVjdG9yKHtzdHJpbmdzOnQsXyRsaXRUeXBlJDpzfSxuKXtsZXQgcjt0aGlzLnBhcnRzPVtdO2xldCBjPTAsYT0wO2NvbnN0IHU9dC5sZW5ndGgtMSxkPXRoaXMucGFydHMsW2Ysdl09Vih0LHMpO2lmKHRoaXMuZWw9Ti5jcmVhdGVFbGVtZW50KGYsbiksQy5jdXJyZW50Tm9kZT10aGlzLmVsLmNvbnRlbnQsMj09PXN8fDM9PT1zKXtjb25zdCB0PXRoaXMuZWwuY29udGVudC5maXJzdENoaWxkO3QucmVwbGFjZVdpdGgoLi4udC5jaGlsZE5vZGVzKX1mb3IoO251bGwhPT0ocj1DLm5leHROb2RlKCkpJiZkLmxlbmd0aDx1Oyl7aWYoMT09PXIubm9kZVR5cGUpe2lmKHIuaGFzQXR0cmlidXRlcygpKWZvcihjb25zdCB0IG9mIHIuZ2V0QXR0cmlidXRlTmFtZXMoKSlpZih0LmVuZHNXaXRoKGUpKXtjb25zdCBpPXZbYSsrXSxzPXIuZ2V0QXR0cmlidXRlKHQpLnNwbGl0KGgpLGU9LyhbLj9AXSk/KC4qKS8uZXhlYyhpKTtkLnB1c2goe3R5cGU6MSxpbmRleDpjLG5hbWU6ZVsyXSxzdHJpbmdzOnMsY3RvcjpcIi5cIj09PWVbMV0/SDpcIj9cIj09PWVbMV0/STpcIkBcIj09PWVbMV0/TDprfSksci5yZW1vdmVBdHRyaWJ1dGUodCl9ZWxzZSB0LnN0YXJ0c1dpdGgoaCkmJihkLnB1c2goe3R5cGU6NixpbmRleDpjfSksci5yZW1vdmVBdHRyaWJ1dGUodCkpO2lmKCQudGVzdChyLnRhZ05hbWUpKXtjb25zdCB0PXIudGV4dENvbnRlbnQuc3BsaXQoaCkscz10Lmxlbmd0aC0xO2lmKHM+MCl7ci50ZXh0Q29udGVudD1pP2kuZW1wdHlTY3JpcHQ6XCJcIjtmb3IobGV0IGk9MDtpPHM7aSsrKXIuYXBwZW5kKHRbaV0sbCgpKSxDLm5leHROb2RlKCksZC5wdXNoKHt0eXBlOjIsaW5kZXg6KytjfSk7ci5hcHBlbmQodFtzXSxsKCkpfX19ZWxzZSBpZig4PT09ci5ub2RlVHlwZSlpZihyLmRhdGE9PT1vKWQucHVzaCh7dHlwZToyLGluZGV4OmN9KTtlbHNle2xldCB0PS0xO2Zvcig7LTEhPT0odD1yLmRhdGEuaW5kZXhPZihoLHQrMSkpOylkLnB1c2goe3R5cGU6NyxpbmRleDpjfSksdCs9aC5sZW5ndGgtMX1jKyt9fXN0YXRpYyBjcmVhdGVFbGVtZW50KHQsaSl7Y29uc3Qgcz1yLmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyZXR1cm4gcy5pbm5lckhUTUw9dCxzfX1mdW5jdGlvbiBTKHQsaSxzPXQsZSl7aWYoaT09PVQpcmV0dXJuIGk7bGV0IGg9dm9pZCAwIT09ZT9zLl8kQ28/LltlXTpzLl8kQ2w7Y29uc3Qgbz1jKGkpP3ZvaWQgMDppLl8kbGl0RGlyZWN0aXZlJDtyZXR1cm4gaD8uY29uc3RydWN0b3IhPT1vJiYoaD8uXyRBTz8uKCExKSx2b2lkIDA9PT1vP2g9dm9pZCAwOihoPW5ldyBvKHQpLGguXyRBVCh0LHMsZSkpLHZvaWQgMCE9PWU/KHMuXyRDbz8/PVtdKVtlXT1oOnMuXyRDbD1oKSx2b2lkIDAhPT1oJiYoaT1TKHQsaC5fJEFTKHQsaS52YWx1ZXMpLGgsZSkpLGl9Y2xhc3MgTXtjb25zdHJ1Y3Rvcih0LGkpe3RoaXMuXyRBVj1bXSx0aGlzLl8kQU49dm9pZCAwLHRoaXMuXyRBRD10LHRoaXMuXyRBTT1pfWdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuXyRBTS5wYXJlbnROb2RlfWdldCBfJEFVKCl7cmV0dXJuIHRoaXMuXyRBTS5fJEFVfXUodCl7Y29uc3R7ZWw6e2NvbnRlbnQ6aX0scGFydHM6c309dGhpcy5fJEFELGU9KHQ/LmNyZWF0aW9uU2NvcGU/P3IpLmltcG9ydE5vZGUoaSwhMCk7Qy5jdXJyZW50Tm9kZT1lO2xldCBoPUMubmV4dE5vZGUoKSxvPTAsbj0wLGw9c1swXTtmb3IoO3ZvaWQgMCE9PWw7KXtpZihvPT09bC5pbmRleCl7bGV0IGk7Mj09PWwudHlwZT9pPW5ldyBSKGgsaC5uZXh0U2libGluZyx0aGlzLHQpOjE9PT1sLnR5cGU/aT1uZXcgbC5jdG9yKGgsbC5uYW1lLGwuc3RyaW5ncyx0aGlzLHQpOjY9PT1sLnR5cGUmJihpPW5ldyB6KGgsdGhpcyx0KSksdGhpcy5fJEFWLnB1c2goaSksbD1zWysrbl19byE9PWw/LmluZGV4JiYoaD1DLm5leHROb2RlKCksbysrKX1yZXR1cm4gQy5jdXJyZW50Tm9kZT1yLGV9cCh0KXtsZXQgaT0wO2Zvcihjb25zdCBzIG9mIHRoaXMuXyRBVil2b2lkIDAhPT1zJiYodm9pZCAwIT09cy5zdHJpbmdzPyhzLl8kQUkodCxzLGkpLGkrPXMuc3RyaW5ncy5sZW5ndGgtMik6cy5fJEFJKHRbaV0pKSxpKyt9fWNsYXNzIFJ7Z2V0IF8kQVUoKXtyZXR1cm4gdGhpcy5fJEFNPy5fJEFVPz90aGlzLl8kQ3Z9Y29uc3RydWN0b3IodCxpLHMsZSl7dGhpcy50eXBlPTIsdGhpcy5fJEFIPUUsdGhpcy5fJEFOPXZvaWQgMCx0aGlzLl8kQUE9dCx0aGlzLl8kQUI9aSx0aGlzLl8kQU09cyx0aGlzLm9wdGlvbnM9ZSx0aGlzLl8kQ3Y9ZT8uaXNDb25uZWN0ZWQ/PyEwfWdldCBwYXJlbnROb2RlKCl7bGV0IHQ9dGhpcy5fJEFBLnBhcmVudE5vZGU7Y29uc3QgaT10aGlzLl8kQU07cmV0dXJuIHZvaWQgMCE9PWkmJjExPT09dD8ubm9kZVR5cGUmJih0PWkucGFyZW50Tm9kZSksdH1nZXQgc3RhcnROb2RlKCl7cmV0dXJuIHRoaXMuXyRBQX1nZXQgZW5kTm9kZSgpe3JldHVybiB0aGlzLl8kQUJ9XyRBSSh0LGk9dGhpcyl7dD1TKHRoaXMsdCxpKSxjKHQpP3Q9PT1FfHxudWxsPT10fHxcIlwiPT09dD8odGhpcy5fJEFIIT09RSYmdGhpcy5fJEFSKCksdGhpcy5fJEFIPUUpOnQhPT10aGlzLl8kQUgmJnQhPT1UJiZ0aGlzLl8odCk6dm9pZCAwIT09dC5fJGxpdFR5cGUkP3RoaXMuJCh0KTp2b2lkIDAhPT10Lm5vZGVUeXBlP3RoaXMuVCh0KTp1KHQpP3RoaXMuayh0KTp0aGlzLl8odCl9Tyh0KXtyZXR1cm4gdGhpcy5fJEFBLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fJEFCKX1UKHQpe3RoaXMuXyRBSCE9PXQmJih0aGlzLl8kQVIoKSx0aGlzLl8kQUg9dGhpcy5PKHQpKX1fKHQpe3RoaXMuXyRBSCE9PUUmJmModGhpcy5fJEFIKT90aGlzLl8kQUEubmV4dFNpYmxpbmcuZGF0YT10OnRoaXMuVChyLmNyZWF0ZVRleHROb2RlKHQpKSx0aGlzLl8kQUg9dH0kKHQpe2NvbnN0e3ZhbHVlczppLF8kbGl0VHlwZSQ6c309dCxlPVwibnVtYmVyXCI9PXR5cGVvZiBzP3RoaXMuXyRBQyh0KToodm9pZCAwPT09cy5lbCYmKHMuZWw9Ti5jcmVhdGVFbGVtZW50KFAocy5oLHMuaFswXSksdGhpcy5vcHRpb25zKSkscyk7aWYodGhpcy5fJEFIPy5fJEFEPT09ZSl0aGlzLl8kQUgucChpKTtlbHNle2NvbnN0IHQ9bmV3IE0oZSx0aGlzKSxzPXQudSh0aGlzLm9wdGlvbnMpO3QucChpKSx0aGlzLlQocyksdGhpcy5fJEFIPXR9fV8kQUModCl7bGV0IGk9QS5nZXQodC5zdHJpbmdzKTtyZXR1cm4gdm9pZCAwPT09aSYmQS5zZXQodC5zdHJpbmdzLGk9bmV3IE4odCkpLGl9ayh0KXthKHRoaXMuXyRBSCl8fCh0aGlzLl8kQUg9W10sdGhpcy5fJEFSKCkpO2NvbnN0IGk9dGhpcy5fJEFIO2xldCBzLGU9MDtmb3IoY29uc3QgaCBvZiB0KWU9PT1pLmxlbmd0aD9pLnB1c2gocz1uZXcgUih0aGlzLk8obCgpKSx0aGlzLk8obCgpKSx0aGlzLHRoaXMub3B0aW9ucykpOnM9aVtlXSxzLl8kQUkoaCksZSsrO2U8aS5sZW5ndGgmJih0aGlzLl8kQVIocyYmcy5fJEFCLm5leHRTaWJsaW5nLGUpLGkubGVuZ3RoPWUpfV8kQVIodD10aGlzLl8kQUEubmV4dFNpYmxpbmcsaSl7Zm9yKHRoaXMuXyRBUD8uKCExLCEwLGkpO3QmJnQhPT10aGlzLl8kQUI7KXtjb25zdCBpPXQubmV4dFNpYmxpbmc7dC5yZW1vdmUoKSx0PWl9fXNldENvbm5lY3RlZCh0KXt2b2lkIDA9PT10aGlzLl8kQU0mJih0aGlzLl8kQ3Y9dCx0aGlzLl8kQVA/Lih0KSl9fWNsYXNzIGt7Z2V0IHRhZ05hbWUoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnRhZ05hbWV9Z2V0IF8kQVUoKXtyZXR1cm4gdGhpcy5fJEFNLl8kQVV9Y29uc3RydWN0b3IodCxpLHMsZSxoKXt0aGlzLnR5cGU9MSx0aGlzLl8kQUg9RSx0aGlzLl8kQU49dm9pZCAwLHRoaXMuZWxlbWVudD10LHRoaXMubmFtZT1pLHRoaXMuXyRBTT1lLHRoaXMub3B0aW9ucz1oLHMubGVuZ3RoPjJ8fFwiXCIhPT1zWzBdfHxcIlwiIT09c1sxXT8odGhpcy5fJEFIPUFycmF5KHMubGVuZ3RoLTEpLmZpbGwobmV3IFN0cmluZyksdGhpcy5zdHJpbmdzPXMpOnRoaXMuXyRBSD1FfV8kQUkodCxpPXRoaXMscyxlKXtjb25zdCBoPXRoaXMuc3RyaW5ncztsZXQgbz0hMTtpZih2b2lkIDA9PT1oKXQ9Uyh0aGlzLHQsaSwwKSxvPSFjKHQpfHx0IT09dGhpcy5fJEFIJiZ0IT09VCxvJiYodGhpcy5fJEFIPXQpO2Vsc2V7Y29uc3QgZT10O2xldCBuLHI7Zm9yKHQ9aFswXSxuPTA7bjxoLmxlbmd0aC0xO24rKylyPVModGhpcyxlW3Mrbl0saSxuKSxyPT09VCYmKHI9dGhpcy5fJEFIW25dKSxvfHw9IWMocil8fHIhPT10aGlzLl8kQUhbbl0scj09PUU/dD1FOnQhPT1FJiYodCs9KHI/P1wiXCIpK2hbbisxXSksdGhpcy5fJEFIW25dPXJ9byYmIWUmJnRoaXMuaih0KX1qKHQpe3Q9PT1FP3RoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUodGhpcy5uYW1lKTp0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMubmFtZSx0Pz9cIlwiKX19Y2xhc3MgSCBleHRlbmRzIGt7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMudHlwZT0zfWoodCl7dGhpcy5lbGVtZW50W3RoaXMubmFtZV09dD09PUU/dm9pZCAwOnR9fWNsYXNzIEkgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnR5cGU9NH1qKHQpe3RoaXMuZWxlbWVudC50b2dnbGVBdHRyaWJ1dGUodGhpcy5uYW1lLCEhdCYmdCE9PUUpfX1jbGFzcyBMIGV4dGVuZHMga3tjb25zdHJ1Y3Rvcih0LGkscyxlLGgpe3N1cGVyKHQsaSxzLGUsaCksdGhpcy50eXBlPTV9XyRBSSh0LGk9dGhpcyl7aWYoKHQ9Uyh0aGlzLHQsaSwwKT8/RSk9PT1UKXJldHVybjtjb25zdCBzPXRoaXMuXyRBSCxlPXQ9PT1FJiZzIT09RXx8dC5jYXB0dXJlIT09cy5jYXB0dXJlfHx0Lm9uY2UhPT1zLm9uY2V8fHQucGFzc2l2ZSE9PXMucGFzc2l2ZSxoPXQhPT1FJiYocz09PUV8fGUpO2UmJnRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMubmFtZSx0aGlzLHMpLGgmJnRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMubmFtZSx0aGlzLHQpLHRoaXMuXyRBSD10fWhhbmRsZUV2ZW50KHQpe1wiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuXyRBSD90aGlzLl8kQUguY2FsbCh0aGlzLm9wdGlvbnM/Lmhvc3Q/P3RoaXMuZWxlbWVudCx0KTp0aGlzLl8kQUguaGFuZGxlRXZlbnQodCl9fWNsYXNzIHp7Y29uc3RydWN0b3IodCxpLHMpe3RoaXMuZWxlbWVudD10LHRoaXMudHlwZT02LHRoaXMuXyRBTj12b2lkIDAsdGhpcy5fJEFNPWksdGhpcy5vcHRpb25zPXN9Z2V0IF8kQVUoKXtyZXR1cm4gdGhpcy5fJEFNLl8kQVV9XyRBSSh0KXtTKHRoaXMsdCl9fWNvbnN0IFo9e006ZSxQOmgsQTpvLEM6MSxMOlYsUjpNLEQ6dSxWOlMsSTpSLEg6ayxOOkksVTpMLEI6SCxGOnp9LGo9dC5saXRIdG1sUG9seWZpbGxTdXBwb3J0O2o/LihOLFIpLCh0LmxpdEh0bWxWZXJzaW9ucz8/PVtdKS5wdXNoKFwiMy4zLjBcIik7Y29uc3QgQj0odCxpLHMpPT57Y29uc3QgZT1zPy5yZW5kZXJCZWZvcmU/P2k7bGV0IGg9ZS5fJGxpdFBhcnQkO2lmKHZvaWQgMD09PWgpe2NvbnN0IHQ9cz8ucmVuZGVyQmVmb3JlPz9udWxsO2UuXyRsaXRQYXJ0JD1oPW5ldyBSKGkuaW5zZXJ0QmVmb3JlKGwoKSx0KSx0LHZvaWQgMCxzPz97fSl9cmV0dXJuIGguXyRBSSh0KSxofTtleHBvcnR7WiBhcyBfJExILHggYXMgaHRtbCx3IGFzIG1hdGhtbCxUIGFzIG5vQ2hhbmdlLEUgYXMgbm90aGluZyxCIGFzIHJlbmRlcixiIGFzIHN2Z307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXQtaHRtbC5qcy5tYXBcbiIsImltcG9ydHtSZWFjdGl2ZUVsZW1lbnQgYXMgdH1mcm9tXCJAbGl0L3JlYWN0aXZlLWVsZW1lbnRcIjtleHBvcnQqZnJvbVwiQGxpdC9yZWFjdGl2ZS1lbGVtZW50XCI7aW1wb3J0e3JlbmRlciBhcyBlLG5vQ2hhbmdlIGFzIHJ9ZnJvbVwibGl0LWh0bWxcIjtleHBvcnQqZnJvbVwibGl0LWh0bWxcIjtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL2NvbnN0IHM9Z2xvYmFsVGhpcztjbGFzcyBpIGV4dGVuZHMgdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5yZW5kZXJPcHRpb25zPXtob3N0OnRoaXN9LHRoaXMuXyREbz12b2lkIDB9Y3JlYXRlUmVuZGVyUm9vdCgpe2NvbnN0IHQ9c3VwZXIuY3JlYXRlUmVuZGVyUm9vdCgpO3JldHVybiB0aGlzLnJlbmRlck9wdGlvbnMucmVuZGVyQmVmb3JlPz89dC5maXJzdENoaWxkLHR9dXBkYXRlKHQpe2NvbnN0IHI9dGhpcy5yZW5kZXIoKTt0aGlzLmhhc1VwZGF0ZWR8fCh0aGlzLnJlbmRlck9wdGlvbnMuaXNDb25uZWN0ZWQ9dGhpcy5pc0Nvbm5lY3RlZCksc3VwZXIudXBkYXRlKHQpLHRoaXMuXyREbz1lKHIsdGhpcy5yZW5kZXJSb290LHRoaXMucmVuZGVyT3B0aW9ucyl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuXyREbz8uc2V0Q29ubmVjdGVkKCEwKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5fJERvPy5zZXRDb25uZWN0ZWQoITEpfXJlbmRlcigpe3JldHVybiByfX1pLl8kbGl0RWxlbWVudCQ9ITAsaVtcImZpbmFsaXplZFwiXT0hMCxzLmxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydD8uKHtMaXRFbGVtZW50Oml9KTtjb25zdCBvPXMubGl0RWxlbWVudFBvbHlmaWxsU3VwcG9ydDtvPy4oe0xpdEVsZW1lbnQ6aX0pO2NvbnN0IG49e18kQUs6KHQsZSxyKT0+e3QuXyRBSyhlLHIpfSxfJEFMOnQ9PnQuXyRBTH07KHMubGl0RWxlbWVudFZlcnNpb25zPz89W10pLnB1c2goXCI0LjIuMFwiKTtleHBvcnR7aSBhcyBMaXRFbGVtZW50LG4gYXMgXyRMRX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saXQtZWxlbWVudC5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuY29uc3QgdD10PT4oZSxvKT0+e3ZvaWQgMCE9PW8/by5hZGRJbml0aWFsaXplcigoKCk9PntjdXN0b21FbGVtZW50cy5kZWZpbmUodCxlKX0pKTpjdXN0b21FbGVtZW50cy5kZWZpbmUodCxlKX07ZXhwb3J0e3QgYXMgY3VzdG9tRWxlbWVudH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jdXN0b20tZWxlbWVudC5qcy5tYXBcbiIsImltcG9ydHtkZWZhdWx0Q29udmVydGVyIGFzIHQsbm90RXF1YWwgYXMgZX1mcm9tXCIuLi9yZWFjdGl2ZS1lbGVtZW50LmpzXCI7XG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9jb25zdCBvPXthdHRyaWJ1dGU6ITAsdHlwZTpTdHJpbmcsY29udmVydGVyOnQscmVmbGVjdDohMSxoYXNDaGFuZ2VkOmV9LHI9KHQ9byxlLHIpPT57Y29uc3R7a2luZDpuLG1ldGFkYXRhOml9PXI7bGV0IHM9Z2xvYmFsVGhpcy5saXRQcm9wZXJ0eU1ldGFkYXRhLmdldChpKTtpZih2b2lkIDA9PT1zJiZnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuc2V0KGkscz1uZXcgTWFwKSxcInNldHRlclwiPT09biYmKCh0PU9iamVjdC5jcmVhdGUodCkpLndyYXBwZWQ9ITApLHMuc2V0KHIubmFtZSx0KSxcImFjY2Vzc29yXCI9PT1uKXtjb25zdHtuYW1lOm99PXI7cmV0dXJue3NldChyKXtjb25zdCBuPWUuZ2V0LmNhbGwodGhpcyk7ZS5zZXQuY2FsbCh0aGlzLHIpLHRoaXMucmVxdWVzdFVwZGF0ZShvLG4sdCl9LGluaXQoZSl7cmV0dXJuIHZvaWQgMCE9PWUmJnRoaXMuQyhvLHZvaWQgMCx0LGUpLGV9fX1pZihcInNldHRlclwiPT09bil7Y29uc3R7bmFtZTpvfT1yO3JldHVybiBmdW5jdGlvbihyKXtjb25zdCBuPXRoaXNbb107ZS5jYWxsKHRoaXMsciksdGhpcy5yZXF1ZXN0VXBkYXRlKG8sbix0KX19dGhyb3cgRXJyb3IoXCJVbnN1cHBvcnRlZCBkZWNvcmF0b3IgbG9jYXRpb246IFwiK24pfTtmdW5jdGlvbiBuKHQpe3JldHVybihlLG8pPT5cIm9iamVjdFwiPT10eXBlb2Ygbz9yKHQsZSxvKTooKHQsZSxvKT0+e2NvbnN0IHI9ZS5oYXNPd25Qcm9wZXJ0eShvKTtyZXR1cm4gZS5jb25zdHJ1Y3Rvci5jcmVhdGVQcm9wZXJ0eShvLHQpLHI/T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG8pOnZvaWQgMH0pKHQsZSxvKX1leHBvcnR7biBhcyBwcm9wZXJ0eSxyIGFzIHN0YW5kYXJkUHJvcGVydHl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvcGVydHkuanMubWFwXG4iLCJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuaW1wb3J0ICogYXMgQ29sb3IgZnJvbSAnY29sb3InO1xuXG5leHBvcnQgY29uc3QgQ09MT1JTID0gW1xuICAncHJpbWFyeScsXG4gICdhY2NlbnQnLFxuICAncmVkJyxcbiAgJ3BpbmsnLFxuICAncHVycGxlJyxcbiAgJ2RlZXAtcHVycGxlJyxcbiAgJ2luZGlnbycsXG4gICdibHVlJyxcbiAgJ2xpZ2h0LWJsdWUnLFxuICAnY3lhbicsXG4gICd0ZWFsJyxcbiAgJ2dyZWVuJyxcbiAgJ2xpZ2h0LWdyZWVuJyxcbiAgJ2xpbWUnLFxuICAneWVsbG93JyxcbiAgJ2FtYmVyJyxcbiAgJ29yYW5nZScsXG4gICdkZWVwLW9yYW5nZScsXG4gICdicm93bicsXG4gICdsaWdodC1ncmV5JyxcbiAgJ2dyZXknLFxuICAnZGFyay1ncmV5JyxcbiAgJ2JsdWUtZ3JleScsXG4gICdibGFjaycsXG4gICd3aGl0ZScsXG4gICdkaXNhYmxlZCcsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVJnYkNvbG9yKGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29sb3IgPT09ICdwcmltYXJ5JyB8fCBjb2xvciA9PT0gJ2FjY2VudCcpIHtcbiAgICByZXR1cm4gYHZhcigtLXJnYi0ke2NvbG9yfS1jb2xvcilgO1xuICB9XG4gIGlmIChDT0xPUlMuaW5jbHVkZXMoY29sb3IpKSB7XG4gICAgcmV0dXJuIGB2YXIoLS1yZ2ItJHtjb2xvcn0pYDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVsc2UtcmV0dXJuXG4gIH0gZWxzZSBpZiAoY29sb3Iuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDb2xvci5yZ2IoY29sb3IpLnJnYigpLmFycmF5KCkuam9pbignLCAnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbG9yO1xufVxuXG5mdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ29sb3JOYW1lKGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29sb3JcbiAgICAuc3BsaXQoJy0nKVxuICAgIC5tYXAoKHMpID0+IGNhcGl0YWxpemVGaXJzdExldHRlcihzKSlcbiAgICAuam9pbignICcpO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbG9yQ3NzID0gY3NzYFxuICAtLWRlZmF1bHQtcmVkOiAyNDQsIDY3LCA1NDtcbiAgLS1kZWZhdWx0LXBpbms6IDIzMywgMzAsIDk5O1xuICAtLWRlZmF1bHQtcHVycGxlOiAxNDYsIDEwNywgMTk5O1xuICAtLWRlZmF1bHQtZGVlcC1wdXJwbGU6IDExMCwgNjUsIDE3MTtcbiAgLS1kZWZhdWx0LWluZGlnbzogNjMsIDgxLCAxODE7XG4gIC0tZGVmYXVsdC1ibHVlOiAzMywgMTUwLCAyNDM7XG4gIC0tZGVmYXVsdC1saWdodC1ibHVlOiAzLCAxNjksIDI0NDtcbiAgLS1kZWZhdWx0LWN5YW46IDAsIDE4OCwgMjEyO1xuICAtLWRlZmF1bHQtdGVhbDogMCwgMTUwLCAxMzY7XG4gIC0tZGVmYXVsdC1ncmVlbjogNzYsIDE3NSwgODA7XG4gIC0tZGVmYXVsdC1saWdodC1ncmVlbjogMTM5LCAxOTUsIDc0O1xuICAtLWRlZmF1bHQtbGltZTogMjA1LCAyMjAsIDU3O1xuICAtLWRlZmF1bHQteWVsbG93OiAyNTUsIDIzNSwgNTk7XG4gIC0tZGVmYXVsdC1hbWJlcjogMjU1LCAxOTMsIDc7XG4gIC0tZGVmYXVsdC1vcmFuZ2U6IDI1NSwgMTUyLCAwO1xuICAtLWRlZmF1bHQtZGVlcC1vcmFuZ2U6IDI1NSwgMTExLCAzNDtcbiAgLS1kZWZhdWx0LWJyb3duOiAxMjEsIDg1LCA3MjtcbiAgLS1kZWZhdWx0LWxpZ2h0LWdyZXk6IDE4OSwgMTg5LCAxODk7XG4gIC0tZGVmYXVsdC1ncmV5OiAxNTgsIDE1OCwgMTU4O1xuICAtLWRlZmF1bHQtZGFyay1ncmV5OiA5NiwgOTYsIDk2O1xuICAtLWRlZmF1bHQtYmx1ZS1ncmV5OiA5NiwgMTI1LCAxMzk7XG4gIC0tZGVmYXVsdC1ibGFjazogMCwgMCwgMDtcbiAgLS1kZWZhdWx0LXdoaXRlOiAyNTUsIDI1NSwgMjU1O1xuICAtLWRlZmF1bHQtZGlzYWJsZWQ6IDE4OSwgMTg5LCAxODk7XG5gO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdERhcmtDb2xvckNzcyA9IGNzc2BcbiAgLS1kZWZhdWx0LWRpc2FibGVkOiAxMTEsIDExMSwgMTExO1xuYDtcbiIsImV4cG9ydCBjb25zdCBsb2dvOiBzdHJpbmcgPSAnJWMgV0VBVEhFUi1DT05ESVRJT04tQ0FSRCAlYyAyLjAuMCc7XG5cbmV4cG9ydCBjb25zdCBoYWNzSW1hZ2VQYXRoOiBzdHJpbmcgPSAnL2xvY2FsL2NvbW11bml0eS9oYS1jYXJkLXdlYXRoZXItY29uZGl0aW9ucy9pY29ucyc7XG5leHBvcnQgY29uc3QgbWFuSW1hZ2VQYXRoOiBzdHJpbmcgPSAnL2xvY2FsL2hhLWNhcmQtd2VhdGhlci1jb25kaXRpb25zL2ljb25zJztcblxuZXhwb3J0IGNvbnN0IG9wdENvbnNvbGVQYXJhbTE6IHN0cmluZyA9ICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQ6IGdyZWVuOyBmb250LXdlaWdodDogNzAwOyc7XG5leHBvcnQgY29uc3Qgb3B0Q29uc29sZVBhcmFtMjogc3RyaW5nID0gJ2NvbG9yOiBncmVlbjsgYmFja2dyb3VuZDogd2hpdGU7IGZvbnQtd2VpZ2h0OiA3MDA7JztcbmV4cG9ydCBjb25zdCBvcHRDb25zb2xlUGFyYW0zOiBzdHJpbmcgPSAnY29sb3I6IGJsYWNrOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDcwMDsnO1xuXG5leHBvcnQgY29uc3QgaWNvblRlbXBlcmF0dXJlOiBzdHJpbmcgPSAnbWRpOnRoZXJtb21ldGVyJztcbmV4cG9ydCBjb25zdCBpY29uUHJlY2lwaXRhdGlvbjogc3RyaW5nID0gJ21kaTp3ZWF0aGVyLXJhaW55JztcblxuZXhwb3J0IGNvbnN0IGN3Y0xvY2FsZSA9IHtcbiAgZW46IDAsXG4gIGl0OiAxLFxuICBubDogMixcbiAgZXM6IDMsXG4gIGRlOiA0LFxuICBmcjogNSxcbiAgJ3NyLWxhdG4nOiA2LFxuICBwdDogNyxcbiAgZGE6IDgsXG4gICduby1ubyc6IDksXG4gIGNzOiAxMCxcbiAgcnU6IDExLFxufTtcblxuLy8g8J+MkSDwn4ySIPCfjJMg8J+MlCDwn4yVIPCfjJYg8J+MlyDwn4yYIPCfjJFcbmV4cG9ydCBjb25zdCBjd2NNb29uUGhhc2VJY29ucyA9IHtcbiAgbmV3X21vb246ICfwn4yRJyxcbiAgbmV3OiAn8J+MkScsXG4gIHdheGluZ19jcmVzY2VudDogJ/CfjJInLFxuICBmaXJzdF9xdWFydGVyOiAn8J+MkycsXG4gIHdheGluZ19naWJib3VzOiAn8J+MlCcsXG4gIGZ1bGw6ICfwn4yVJyxcbiAgZnVsbF9tb29uOiAn8J+MlScsXG4gIHdhbmluZ19naWJib3VzOiAn8J+MlicsXG4gIHRoaXJkX3F1YXJ0ZXI6ICfwn4yXJyxcbiAgbGFzdF9xdWFydGVyOiAn8J+MlycsXG4gIHdhbmluZ19jcmVzY2VudDogJ/CfjJgnLFxufTtcbiIsIi8vIGNsZWFyPW9rLCBwYXJ0bHljbG91ZHk9b2ssIGNsb3VkeT1vaywgcGFydGx5Y2xvdWR5LWZvZz1vaywgcGFydGx5Y2xvdWR5LWxpZ2h0LXJhaW49b2ssIHBhcnRseWNsb3VkeS1yYWluPW9rLFxuLy8gbGlnaHQtcmFpbj1vaywgcmFpbnk9b2ssIHNub3d5LXJhaW55PW9rLCBwYXJ0bHljbG91ZHktbGlnaHQtc25vdz1vaywgcGFydGx5Y2xvdWR5LXNub3c9b2ssIGxpZ2h0LXNub3c9b2ssIHNub3d5PW9rLFxuLy8gcGFydGx5Y2xvdWR5LWxpZ2h0bmluZz1vayBvciBsaWdodG5pbmdcblxuZXhwb3J0IGNvbnN0IGN3Y0J1aWVucmFkYXJEYXlJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7XG4gIC8vIGZyZWV6aW5nX3JhaW5faGVhdnk6ICdyYWlueS0zJyxcbiAgLy8gZnJlZXppbmdfcmFpbjogJ3JhaW55LTInLFxuICAvLyBmcmVlemluZ19yYWluX2xpZ2h0OiAncmFpbnktMScsXG4gIC8vIGZyZWV6aW5nX2RyaXp6bGU6ICdyYWluLWFuZC1zbGVldC1taXgnLFxuICAvLyBpY2VfcGVsbGV0c19oZWF2eTogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgLy8gaWNlX3BlbGxldHM6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gIC8vIGljZV9wZWxsZXRzX2xpZ2h0OiAncmFpbi1hbmQtc25vdy1taXgnLFxuICBzbm93eTogJ3Nub3d5LTMnLFxuICAnbGlnaHQtc25vdyc6ICdzbm93eS0yJyxcbiAgJ3Nub3d5LXJhaW55JzogJ3Nub3d5LTEnLFxuICAncGFydGx5Y2xvdWR5LWxpZ2h0LXNub3cnOiAnc25vd3ktMScsXG4gICdwYXJ0bHljbG91ZHktc25vdyc6ICdzbm93eS0xJyxcbiAgLy8gZmx1cnJpZXM6ICd3aW5kJyxcbiAgLy8gdHN0b3JtOiAndHJvcGljYWwtc3Rvcm0nLFxuICAvLyByYWluX2hlYXZ5OiAncmFpbnktMycsXG4gICdwYXJ0bHljbG91ZHktbGlnaHQtcmFpbic6ICdyYWlueS0xJyxcbiAgJ2xpZ2h0LXJhaW4nOiAncmFpbnktMScsXG4gIHJhaW55OiAncmFpbnktMicsXG4gICdwYXJ0bHljbG91ZHktcmFpbic6ICdyYWlueS0xJyxcbiAgLy8gZm9nX2xpZ2h0OiAnaGF6ZScsXG4gICdwYXJ0bHljbG91ZHktZm9nJzogJ2ZvZycsXG4gIGNsb3VkeTogJ2Nsb3VkeS1vcmlnaW5hbCcsXG4gIC8vIG1vc3RseV9jbG91ZHk6ICdjbG91ZHktZGF5LTMnLFxuICBwYXJ0bHljbG91ZHk6ICdjbG91ZHktZGF5LTInLFxuICAncGFydGx5Y2xvdWR5LWxpZ2h0bmluZyc6ICdjbG91ZHktZGF5LTEnLFxuICBsaWdodG5pbmc6ICdjbG91ZHktZGF5LTEnLFxuICAvLyBtb3N0bHlfY2xlYXI6ICdjbG91ZHktZGF5LTEnLFxuICBjbGVhcjogJ2RheScsXG59O1xuXG5leHBvcnQgY29uc3QgY3djQnVpZW5yYWRhck5pZ2h0SWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9ID0ge1xuICAuLi5jd2NCdWllbnJhZGFyRGF5SWNvbnMsXG4gIC8vIGZyZWV6aW5nX3JhaW5faGVhdnk6ICdyYWlueS02JyxcbiAgLy8gZnJlZXppbmdfcmFpbjogJ3JhaW55LTUnLFxuICAvLyBmcmVlemluZ19yYWluX2xpZ2h0OiAncmFpbnktNCcsXG4gIC8vIGZyZWV6aW5nX2RyaXp6bGU6ICdyYWluLWFuZC1zbGVldC1taXgnLFxuICAvLyBpY2VfcGVsbGV0c19oZWF2eTogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgLy8gaWNlX3BlbGxldHM6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gIC8vIGljZV9wZWxsZXRzX2xpZ2h0OiAncmFpbi1hbmQtc25vdy1taXgnLFxuICAvLyBzbm93X2hlYXZ5OiAnc25vd3ktNicsXG4gIC8vIHNub3c6ICdub3d5LTUnLFxuICAvLyBzbm93X2xpZ2h0OiAnbm93eS00JyxcbiAgLy8gZmx1cnJpZXM6ICd3aW5kJyxcbiAgLy8gdHN0b3JtOiAndHJvcGljYWwtc3Rvcm0nLFxuICAvLyByYWluX2hlYXZ5OiAncmFpbnktNicsXG4gIC8vIHJhaW5fbGlnaHQ6ICdyYWlueS00JyxcbiAgLy8gcmFpbjogJ3JhaW55LTUnLFxuICAvLyBkcml6emxlOiAncmFpbnktNCcsXG4gIC8vIGZvZ19saWdodDogJ2hhemUnLFxuICAvLyBmb2c6ICdmb2cnLFxuICAvLyBjbG91ZHk6ICdjbG91ZHknLFxuICAvLyBtb3N0bHlfY2xvdWR5OiAnY2xvdWR5LW5pZ2h0LTMnLFxuICAvLyBwYXJ0bHlfY2xvdWR5OiAnY2xvdWR5LW5pZ2h0LTInLFxuICAvLyBtb3N0bHlfY2xlYXI6ICdjbG91ZHktbmlnaHQtMScsXG4gIC8vIGNsZWFyOiAnbmlnaHQnXG59O1xuIiwiZXhwb3J0IGNvbnN0IGN3Y0NsaW1hY2VsbERheUljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSA9IHtcbiAgZnJlZXppbmdfcmFpbl9oZWF2eTogJ3JhaW55LTMnLFxuICAnaGVhdnkgZnJlZXppbmcgcmFpbic6ICdyYWlueS0zJyxcbiAgZnJlZXppbmdfcmFpbjogJ3JhaW55LTInLFxuICAnZnJlZXppbmcgcmFpbic6ICdyYWlueS0yJyxcbiAgZnJlZXppbmdfcmFpbl9saWdodDogJ3JhaW55LTEnLFxuICAnbGlnaHQgZnJlZXppbmcgcmFpbic6ICdyYWlueS0xJyxcbiAgZnJlZXppbmdfZHJpenpsZTogJ3JhaW4tYW5kLXNsZWV0LW1peCcsXG4gICdmcmVlemluZyBkcml6emxlJzogJ3JhaW4tYW5kLXNsZWV0LW1peCcsXG4gIGljZV9wZWxsZXRzX2hlYXZ5OiAncmFpbi1hbmQtc25vdy1taXgnLFxuICAnaGVhdnkgaWNlIHBlbGxldHMnOiAncmFpbi1hbmQtc25vdy1taXgnLFxuICBpY2VfcGVsbGV0czogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgJ2ljZSBwZWxsZXRzJzogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgaWNlX3BlbGxldHNfbGlnaHQ6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gICdsaWdodCBpY2UgcGVsbGV0cyc6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gIHNub3dfaGVhdnk6ICdzbm93eS0zJyxcbiAgJ2hlYXZ5IHNub3cnOiAnc25vd3ktMycsXG4gIHNub3c6ICdzbm93eS0yJyxcbiAgc25vd19saWdodDogJ3Nub3d5LTEnLFxuICAnbGlnaHQgc25vdyc6ICdzbm93eS0xJyxcbiAgZmx1cnJpZXM6ICd3aW5kJyxcbiAgdHN0b3JtOiAndHJvcGljYWwtc3Rvcm0nLFxuICByYWluX2hlYXZ5OiAncmFpbnktMycsXG4gICdoZWF2eSByYWluJzogJ3JhaW55LTMnLFxuICByYWluX2xpZ2h0OiAncmFpbnktMScsXG4gICdsaWdodCByYWluJzogJ3JhaW55LTEnLFxuICByYWluOiAncmFpbnktMicsXG4gIGRyaXp6bGU6ICdyYWlueS0xJyxcbiAgZm9nX2xpZ2h0OiAnaGF6ZScsXG4gICdsaWdodCBmb2cnOiAnaGF6ZScsXG4gIGZvZzogJ2ZvZycsXG4gIGNsb3VkeTogJ2Nsb3VkeS1vcmlnaW5hbCcsXG4gIG1vc3RseV9jbG91ZHk6ICdjbG91ZHktZGF5LTMnLFxuICAnbW9zdGx5IGNsb3VkeSc6ICdjbG91ZHktZGF5LTMnLFxuICBwYXJ0bHlfY2xvdWR5OiAnY2xvdWR5LWRheS0yJyxcbiAgJ3BhcnRseSBjbG91ZHknOiAnY2xvdWR5LWRheS0yJyxcbiAgbW9zdGx5X2NsZWFyOiAnY2xvdWR5LWRheS0xJyxcbiAgJ21vc3RseSBjbGVhcic6ICdjbG91ZHktZGF5LTEnLFxuICBjbGVhcjogJ2RheScsXG59O1xuXG5leHBvcnQgY29uc3QgY3djQ2xpbWFjZWxsTmlnaHRJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7XG4gIC4uLmN3Y0NsaW1hY2VsbERheUljb25zLFxuICBmcmVlemluZ19yYWluX2hlYXZ5OiAncmFpbnktNicsXG4gICdoZWF2eSBmcmVlemluZyByYWluJzogJ3JhaW55LTYnLFxuICBmcmVlemluZ19yYWluOiAncmFpbnktNScsXG4gICdmcmVlemluZyByYWluJzogJ3JhaW55LTUnLFxuICBmcmVlemluZ19yYWluX2xpZ2h0OiAncmFpbnktNCcsXG4gICdsaWdodCBmcmVlemluZyByYWluJzogJ3JhaW55LTQnLFxuICAvLyBmcmVlemluZ19kcml6emxlOiAncmFpbi1hbmQtc2xlZXQtbWl4JyxcbiAgLy8gaWNlX3BlbGxldHNfaGVhdnk6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gIC8vIGljZV9wZWxsZXRzOiAncmFpbi1hbmQtc25vdy1taXgnLFxuICAvLyBpY2VfcGVsbGV0c19saWdodDogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgc25vd19oZWF2eTogJ3Nub3d5LTYnLFxuICAnaGVhdnkgc25vdyc6ICdzbm93eS02JyxcbiAgc25vdzogJ3Nub3d5LTUnLFxuICBzbm93X2xpZ2h0OiAnc25vd3ktNCcsXG4gICdsaWdodCBzbm93JzogJ3Nub3d5LTQnLFxuICAvLyBmbHVycmllczogJ3dpbmQnLFxuICAvLyB0c3Rvcm06ICd0cm9waWNhbC1zdG9ybScsXG4gIHJhaW5faGVhdnk6ICdyYWlueS02JyxcbiAgJ2hlYXZ5IHJhaW4nOiAncmFpbnktNicsXG4gIHJhaW5fbGlnaHQ6ICdyYWlueS00JyxcbiAgJ2xpZ2h0IHJhaW4nOiAncmFpbnktNCcsXG4gIHJhaW46ICdyYWlueS01JyxcbiAgZHJpenpsZTogJ3JhaW55LTQnLFxuICAvLyBmb2dfbGlnaHQ6ICdoYXplJyxcbiAgLy8gZm9nOiAnZm9nJyxcbiAgLy8gY2xvdWR5OiAnY2xvdWR5JyxcbiAgbW9zdGx5X2Nsb3VkeTogJ2Nsb3VkeS1uaWdodC0zJyxcbiAgJ21vc3RseSBjbG91ZHknOiAnY2xvdWR5LW5pZ2h0LTMnLFxuICBwYXJ0bHlfY2xvdWR5OiAnY2xvdWR5LW5pZ2h0LTInLFxuICAncGFydGx5IGNsb3VkeSc6ICdjbG91ZHktbmlnaHQtMicsXG4gIG1vc3RseV9jbGVhcjogJ2Nsb3VkeS1uaWdodC0xJyxcbiAgJ21vc3RseSBjbGVhcic6ICdjbG91ZHktbmlnaHQtMScsXG4gIGNsZWFyOiAnbmlnaHQnLFxuICBzdW5ueTogJ25pZ2h0Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBjd2NDbGltYWNlbGxEYXlCZzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7XG4gIGZyZWV6aW5nX3JhaW5faGVhdnk6ICdyYWlueS0zJyxcbiAgZnJlZXppbmdfcmFpbjogJ3JhaW55LTInLFxuICBmcmVlemluZ19yYWluX2xpZ2h0OiAncmFpbnktMScsXG4gIGZyZWV6aW5nX2RyaXp6bGU6ICdyYWluLWFuZC1zbGVldC1taXgnLFxuICBpY2VfcGVsbGV0c19oZWF2eTogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgaWNlX3BlbGxldHM6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gIGljZV9wZWxsZXRzX2xpZ2h0OiAncmFpbi1hbmQtc25vdy1taXgnLFxuICBzbm93X2hlYXZ5OiAnc25vd3ktMycsXG4gIHNub3c6ICdzbm93eS0yJyxcbiAgc25vd19saWdodDogJ3Nub3d5LTEnLFxuICBmbHVycmllczogJ3dpbmQnLFxuICB0c3Rvcm06ICd0cm9waWNhbC1zdG9ybScsXG4gIHJhaW5faGVhdnk6ICdyYWlueS0zJyxcbiAgcmFpbl9saWdodDogJ3JhaW55LTEnLFxuICByYWluOiAncmFpbnktMicsXG4gIGRyaXp6bGU6ICdyYWlueS0xJyxcbiAgZm9nX2xpZ2h0OiAnaGF6ZScsXG4gIGZvZzogJ2ZvZycsXG4gIGNsb3VkeTogJ2Nsb3VkeS1vcmlnaW5hbCcsXG4gIG1vc3RseV9jbG91ZHk6ICdkYXktY2xvdWQtMy5qcGcnLFxuICBwYXJ0bHlfY2xvdWR5OiAnZGF5LWNsb3VkLTIuanBnJyxcbiAgbW9zdGx5X2NsZWFyOiAnZGF5LWNsb3VkLTEuanBnJyxcbiAgY2xlYXI6ICdkYXktY2xlYXIuanBnJyxcbn07XG4iLCJleHBvcnQgY29uc3QgY3djRGFya3NreURheUljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSA9IHtcbiAgY2xlYXI6ICdkYXknLFxuICAnY2xlYXItZGF5JzogJ2RheScsXG4gIHJhaW46ICdyYWlueS0yJyxcbiAgc25vdzogJ3Nub3d5LTInLFxuICBzbGVldDogJ3JhaW4tYW5kLXNsZWV0LW1peCcsXG4gIHdpbmQ6ICdjbG91ZHktZGF5LTEnLFxuICBmb2c6ICdmb2cnLFxuICBjbG91ZHk6ICdjbG91ZHktb3JpZ2luYWwnLFxuICAncGFydGx5LWNsb3VkeS1kYXknOiAnY2xvdWR5LWRheS0yJyxcbn07XG5cbmV4cG9ydCBjb25zdCBjd2NEYXJrc2t5TmlnaHRJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7XG4gIC4uLmN3Y0Rhcmtza3lEYXlJY29ucyxcbiAgY2xlYXI6ICduaWdodCcsXG4gICdjbGVhci1uaWdodCc6ICduaWdodCcsXG4gIHdpbmQ6ICdjbG91ZHktbmlnaHQtMScsXG4gICdwYXJ0bHktY2xvdWR5LWRheSc6ICdjbG91ZHktbmlnaHQtMicsXG4gICdwYXJ0bHktY2xvdWR5LW5pZ2h0JzogJ2Nsb3VkeS1uaWdodC0yJyxcbn07XG4iLCJleHBvcnQgY29uc3QgY3djRGVmYXVsdEhhc3NEYXlJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgY2xvdWR5OiAnY2xvdWR5LWRheS0zJyxcbiAgZXhjZXB0aW9uYWw6ICdzZXZlcmUtdGh1bmRlcnN0b3JtJyxcbiAgZm9nOiAnZm9nJyxcbiAgaGFpbDogJ3Nub3ctYW5kLXNsZWV0LW1peCcsXG4gIGxpZ2h0bmluZzogJ3NldmVyZS10aHVuZGVyc3Rvcm0nLFxuICAnbGlnaHRuaW5nLXJhaW55JzogJ3NjYXR0ZXJlZC10aHVuZGVyc3Rvcm1zJyxcbiAgcGFydGx5Y2xvdWR5OiAnY2xvdWR5LWRheS0zJyxcbiAgcG91cmluZzogJ3JhaW55LTYnLFxuICByYWlueTogJ3JhaW55LTUnLFxuICBzbm93eTogJ3Nub3d5LTYnLFxuICAnc25vd3ktcmFpbnknOiAnc25vdy1hbmQtc2xlZXQtbWl4JyxcbiAgc3Vubnk6ICdjbGVhci1kYXknLFxuICB3aW5keTogJ3dpbmQnLFxuICAnd2luZHktdmFyaWFudCc6ICd3aW5kJyxcbn07XG5cbmV4cG9ydCBjb25zdCBjd2NEZWZhdWx0SGFzc05pZ2h0SWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gIC4uLmN3Y0RlZmF1bHRIYXNzRGF5SWNvbnMsXG4gICdjbGVhci1uaWdodCc6ICdjbGVhci1uaWdodCcsXG59O1xuIiwiZXhwb3J0IGNvbnN0IGN3Y09wZW5XZWF0aGVyTWFwRGF5SWNvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9ID0ge1xuICAnY2xlYXIgc2t5JzogJ2RheScsXG4gICdmZXcgY2xvdWRzJzogJ2Nsb3VkeS1kYXktMScsXG4gICdzY2F0dGVyZWQgY2xvdWRzJzogJ2Nsb3VkeS1kYXktMicsXG4gICdicm9rZW4gY2xvdWRzJzogJ2Nsb3VkeS1kYXktMycsXG4gICdzaG93ZXIgcmFpbic6ICdyYWlueS0zJyxcbiAgcmFpbjogJ3JhaW55LTInLFxuICB0aHVuZGVyc3Rvcm06ICd0cm9waWNhbC1zdG9ybScsXG4gIHNub3c6ICdzbm93eS0yJyxcbiAgbWlzdDogJ2ZvZycsXG59O1xuXG5leHBvcnQgY29uc3QgY3djT3BlbldlYXRoZXJNYXBOaWdodEljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSA9IHtcbiAgLi4uY3djT3BlbldlYXRoZXJNYXBEYXlJY29ucyxcbiAgJ2NsZWFyIHNreSc6ICdkYXktbmlnaHQnLFxuICAnZmV3IGNsb3Vkcyc6ICdjbG91ZHktbmlnaHQtMScsXG4gICdzY2F0dGVyZWQgY2xvdWRzJzogJ2Nsb3VkeS1uaWdodC0yJyxcbiAgJ2Jyb2tlbiBjbG91ZHMnOiAnY2xvdWR5LW5pZ2h0LTMnLFxufTtcbiIsIi8vIFBpcmF0ZSBXZWF0aGVyIEljb25zXG4vLyBjbGVhci1kYXksIGNsZWFyLW5pZ2h0LCByYWluLCBzbm93LCBzbGVldCwgd2luZCwgZm9nLCBjbG91ZHksIHBhcnRseS1jbG91ZHktZGF5IGFuZCBwYXJ0bHktY2xvdWR5LW5pZ2h0XG4vLyBtb3N0bHktY2xlYXItZGF5LCBtb3N0bHktY2xlYXItbmlnaHQsIG1vc3RseS1jbG91ZHktZGF5LCBtb3N0bHktY2xvdWR5LW5pZ2h0LCBwb3NzaWJsZS1yYWluLWRheSwgcG9zc2libGUtcmFpbi1uaWdodFxuLy8gcG9zc2libGUtc25vdy1kYXksIHBvc3NpYmxlLXNub3ctbmlnaHQsIHBvc3NpYmxlLXNsZWV0LWRheSwgcG9zc2libGUtc2xlZXQtbmlnaHQsIHBvc3NpYmxlLXByZWNpcGl0YXRpb24tZGF5XG4vLyBwb3NzaWJsZS1wcmVjaXBpdGF0aW9uLW5pZ2h0LCBwcmVjaXBpdGF0aW9uLCBkcml6emxlLCBsaWdodC1yYWluLCBoZWF2eS1yYWluLCBmbHVycmllcywgbGlnaHQtc25vdywgaGVhdnktc25vd1xuLy8gdmVyeS1saWdodC1zbGVldCwgbGlnaHQtc2xlZXQsIGhlYXZ5LXNsZWV0LCBicmVlenksIGRhbmdlcm91cy13aW5kXG5cbmV4cG9ydCBjb25zdCBjd2NEYXl0aW1lUGlyYXRlV2VhdGhlckljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSA9IHtcbiAgZnJlZXppbmdfcmFpbl9oZWF2eTogJ3JhaW55LTMnLFxuICAnaGVhdnkgZnJlZXppbmcgcmFpbic6ICdyYWlueS0zJyxcbiAgZnJlZXppbmdfcmFpbjogJ3JhaW55LTInLFxuICAnZnJlZXppbmcgcmFpbic6ICdyYWlueS0yJyxcbiAgZnJlZXppbmdfcmFpbl9saWdodDogJ3JhaW55LTEnLFxuICAnbGlnaHQgZnJlZXppbmcgcmFpbic6ICdyYWlueS0xJyxcbiAgZnJlZXppbmdfZHJpenpsZTogJ3JhaW4tYW5kLXNsZWV0LW1peCcsXG4gIHNsZWV0OiAncmFpbi1hbmQtc2xlZXQtbWl4JyxcbiAgJ2ZyZWV6aW5nIGRyaXp6bGUnOiAncmFpbi1hbmQtc2xlZXQtbWl4JyxcbiAgaWNlX3BlbGxldHNfaGVhdnk6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gICdoZWF2eSBpY2UgcGVsbGV0cyc6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gIGljZV9wZWxsZXRzOiAncmFpbi1hbmQtc25vdy1taXgnLFxuICAnaWNlIHBlbGxldHMnOiAncmFpbi1hbmQtc25vdy1taXgnLFxuICBpY2VfcGVsbGV0c19saWdodDogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgJ2xpZ2h0IGljZSBwZWxsZXRzJzogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgc25vd19oZWF2eTogJ3Nub3d5LTMnLFxuICAnaGVhdnkgc25vdyc6ICdzbm93eS0zJyxcbiAgc25vdzogJ3Nub3d5LTInLFxuICBzbm93X2xpZ2h0OiAnc25vd3ktMScsXG4gICdsaWdodCBzbm93JzogJ3Nub3d5LTEnLFxuICBmbHVycmllczogJ3dpbmQnLFxuICB0c3Rvcm06ICd0cm9waWNhbC1zdG9ybScsXG4gIHJhaW5faGVhdnk6ICdyYWlueS0zJyxcbiAgJ2hlYXZ5IHJhaW4nOiAncmFpbnktMycsXG4gIHJhaW5fbGlnaHQ6ICdyYWlueS0xJyxcbiAgcmFpbnk6ICdyYWlueS0xJyxcbiAgJ2xpZ2h0IHJhaW4nOiAncmFpbnktMScsXG4gIHJhaW46ICdyYWlueS0yJyxcbiAgZHJpenpsZTogJ3JhaW55LTEnLFxuICBmb2dfbGlnaHQ6ICdoYXplJyxcbiAgJ2xpZ2h0IGZvZyc6ICdoYXplJyxcbiAgZm9nOiAnZm9nJyxcbiAgY2xvdWR5OiAnY2xvdWR5LW9yaWdpbmFsJyxcbiAgbW9zdGx5X2Nsb3VkeTogJ2Nsb3VkeS1kYXktMycsXG4gICdtb3N0bHkgY2xvdWR5JzogJ2Nsb3VkeS1kYXktMycsXG4gIHBhcnRseV9jbG91ZHk6ICdjbG91ZHktZGF5LTInLFxuICBwYXJ0bHljbG91ZHk6ICdjbG91ZHktZGF5LTInLFxuICAncGFydGx5LWNsb3VkeS1kYXknOiAnY2xvdWR5LWRheS0yJyxcbiAgJ3BhcnRseSBjbG91ZHknOiAnY2xvdWR5LWRheS0yJyxcbiAgbW9zdGx5X2NsZWFyOiAnY2xvdWR5LWRheS0xJyxcbiAgJ21vc3RseSBjbGVhcic6ICdjbG91ZHktZGF5LTEnLFxuICBjbGVhcjogJ2RheScsXG4gICdjbGVhci1kYXknOiAnZGF5JyxcbiAgd2luZDogJ3dpbmQnLFxuICB3aW5keTogJ3dpbmQnLFxuICBzdW5ueTogJ2RheScsXG4gICdjbGVhci1uaWdodCc6ICdkYXknLFxufTtcblxuZXhwb3J0IGNvbnN0IGN3Y05pZ2h0bHlQaXJhdGVXZWF0ZXJJY29uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gPSB7XG4gIC4uLmN3Y0RheXRpbWVQaXJhdGVXZWF0aGVySWNvbnMsXG4gIGZyZWV6aW5nX3JhaW5faGVhdnk6ICdyYWlueS02JyxcbiAgJ2hlYXZ5IGZyZWV6aW5nIHJhaW4nOiAncmFpbnktNicsXG4gIGZyZWV6aW5nX3JhaW46ICdyYWlueS01JyxcbiAgJ2ZyZWV6aW5nIHJhaW4nOiAncmFpbnktNScsXG4gIGZyZWV6aW5nX3JhaW5fbGlnaHQ6ICdyYWlueS00JyxcbiAgJ2xpZ2h0IGZyZWV6aW5nIHJhaW4nOiAncmFpbnktNCcsXG4gIC8vIGZyZWV6aW5nX2RyaXp6bGU6ICdyYWluLWFuZC1zbGVldC1taXgnLFxuICAvLyBpY2VfcGVsbGV0c19oZWF2eTogJ3JhaW4tYW5kLXNub3ctbWl4JyxcbiAgLy8gaWNlX3BlbGxldHM6ICdyYWluLWFuZC1zbm93LW1peCcsXG4gIC8vIGljZV9wZWxsZXRzX2xpZ2h0OiAncmFpbi1hbmQtc25vdy1taXgnLFxuICBzbm93X2hlYXZ5OiAnc25vd3ktNicsXG4gICdoZWF2eSBzbm93JzogJ3Nub3d5LTYnLFxuICBzbm93OiAnc25vd3ktNScsXG4gIHNub3dfbGlnaHQ6ICdzbm93eS00JyxcbiAgJ2xpZ2h0IHNub3cnOiAnc25vd3ktNCcsXG4gIC8vIGZsdXJyaWVzOiAnd2luZCcsXG4gIC8vIHRzdG9ybTogJ3Ryb3BpY2FsLXN0b3JtJyxcbiAgcmFpbl9oZWF2eTogJ3JhaW55LTYnLFxuICAnaGVhdnkgcmFpbic6ICdyYWlueS02JyxcbiAgcmFpbl9saWdodDogJ3JhaW55LTQnLFxuICAnbGlnaHQgcmFpbic6ICdyYWlueS00JyxcbiAgcmFpbjogJ3JhaW55LTUnLFxuICBkcml6emxlOiAncmFpbnktNCcsXG4gIC8vIGZvZ19saWdodDogJ2hhemUnLFxuICAvLyBmb2c6ICdmb2cnLFxuICAvLyBjbG91ZHk6ICdjbG91ZHknLFxuICBtb3N0bHlfY2xvdWR5OiAnY2xvdWR5LW5pZ2h0LTMnLFxuICAnbW9zdGx5IGNsb3VkeSc6ICdjbG91ZHktbmlnaHQtMycsXG4gIHBhcnRseV9jbG91ZHk6ICdjbG91ZHktbmlnaHQtMicsXG4gIHBhcnRseWNsb3VkeTogJ2Nsb3VkeS1uaWdodC0yJyxcbiAgJ3BhcnRseS1jbG91ZHktbmlnaHQnOiAnY2xvdWR5LW5pZ2h0LTInLFxuICAncGFydGx5IGNsb3VkeSc6ICdjbG91ZHktbmlnaHQtMicsXG4gIG1vc3RseV9jbGVhcjogJ2Nsb3VkeS1uaWdodC0xJyxcbiAgJ21vc3RseSBjbGVhcic6ICdjbG91ZHktbmlnaHQtMScsXG4gIGNsZWFyOiAnbmlnaHQnLFxuICAnY2xlYXItbmlnaHQnOiAnbmlnaHQnLFxuICBzdW5ueTogJ25pZ2h0Jyxcbn07XG4iLCJpbXBvcnQgeyBjd2NCdWllbnJhZGFyRGF5SWNvbnMsIGN3Y0J1aWVucmFkYXJOaWdodEljb25zIH0gZnJvbSAnLi4vc3JjL2ljb25tb2RlbHMvaW0tYnVpZW5yYWRhcic7XG5pbXBvcnQgeyBjd2NDbGltYWNlbGxEYXlJY29ucywgY3djQ2xpbWFjZWxsTmlnaHRJY29ucyB9IGZyb20gJy4uL3NyYy9pY29ubW9kZWxzL2ltLWNsaW1hY2VsbCc7XG5pbXBvcnQgeyBjd2NEYXJrc2t5RGF5SWNvbnMsIGN3Y0Rhcmtza3lOaWdodEljb25zIH0gZnJvbSAnLi4vc3JjL2ljb25tb2RlbHMvaW0tZGFya3NreSc7XG5pbXBvcnQgeyBjd2NEZWZhdWx0SGFzc0RheUljb25zLCBjd2NEZWZhdWx0SGFzc05pZ2h0SWNvbnMgfSBmcm9tICcuLi9zcmMvaWNvbm1vZGVscy9pbS1oYXNzJztcbmltcG9ydCB7IGN3Y09wZW5XZWF0aGVyTWFwRGF5SWNvbnMsIGN3Y09wZW5XZWF0aGVyTWFwTmlnaHRJY29ucyB9IGZyb20gJy4uL3NyYy9pY29ubW9kZWxzL2ltLW9wZW53ZWF0aGVybWFwJztcbmltcG9ydCB7IGN3Y0RheXRpbWVQaXJhdGVXZWF0aGVySWNvbnMsIGN3Y05pZ2h0bHlQaXJhdGVXZWF0ZXJJY29ucyB9IGZyb20gJy4uL3NyYy9pY29ubW9kZWxzL2ltLXBpcmF0ZXdlYXRoZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFsZXJ0SXRlbSB7XG4gIGVudGl0eTogc3RyaW5nXG4gIGljb24/OiBzdHJpbmcgO1xuICBtaW4/OiBudW1iZXIgO1xuICBtYXg/OiBudW1iZXIgO1xuICBzaG93X2lmX29uPzogYm9vbGVhbiA7XG4gIHNob3dfaWZfZ2U/OiBudW1iZXIgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvbGxlbkl0ZW0ge1xuICBlbnRpdHk6IHN0cmluZyA7XG4gIGljb24/OiBzdHJpbmcgO1xuICBtaW46IG51bWJlciA7XG4gIG1heDogbnVtYmVyIDtcbiAgbG93PzogbnVtYmVyIDtcbiAgaGlnaD86IG51bWJlciA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9sbGVuIHtcbiAgdHJlZT86IFBvbGxlbkl0ZW0gO1xuICB3ZWVkPzogUG9sbGVuSXRlbSA7XG4gIGdyYXNzPzogUG9sbGVuSXRlbSA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWlyUXVhbGl0eSB7XG4gIHBtMjU/OiBzdHJpbmcgO1xuICBwbTEwPzogc3RyaW5nIDtcbiAgbzM/OiBzdHJpbmcgO1xuICBubzI/OiBzdHJpbmcgO1xuICBjbz86IHN0cmluZyA7XG4gIHNvMj86IHN0cmluZyA7XG4gIGVwYV9hcWk/OiBzdHJpbmcgO1xuICBlcGFfcHJpbWFyeV9wb2xsdXRhbnQ/OiBzdHJpbmcgO1xuICBlcGFfaGVhbHRoX2NvbmNlcm4/OiBzdHJpbmcgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFV2IHtcbiAgcHJvdGVjdGlvbl93aW5kb3c/OiBzdHJpbmcgO1xuICBvem9uZV9sZXZlbD86IHN0cmluZyA7XG4gIHV2X2luZGV4Pzogc3RyaW5nIDtcbiAgdXZfbGV2ZWw/OiBzdHJpbmcgO1xuICBtYXhfdXZfaW5kZXg/OiBzdHJpbmcgO1xuICBzZXRfc2tpbl90eXBlXzE/OiBzdHJpbmcgO1xuICBzZXRfc2tpbl90eXBlXzI/OiBzdHJpbmcgO1xuICBzZXRfc2tpbl90eXBlXzM/OiBzdHJpbmcgO1xuICBzZXRfc2tpbl90eXBlXzQ/OiBzdHJpbmcgO1xuICBzZXRfc2tpbl90eXBlXzU/OiBzdHJpbmcgO1xuICBzZXRfc2tpbl90eXBlXzY/OiBzdHJpbmcgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERheXMge1xuICBkYXlfMTogc3RyaW5nIDtcbiAgZGF5XzI6IHN0cmluZyA7XG4gIGRheV8zOiBzdHJpbmcgO1xuICBkYXlfNDogc3RyaW5nIDtcbiAgZGF5XzU6IHN0cmluZyA7XG4gIGRheV82OiBzdHJpbmcgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnQge1xuICBzdW4/OiBzdHJpbmcgO1xuICBtb29uX3BoYXNlPzogc3RyaW5nIDtcbiAgLy8gZGFpbHlfc3VtbWFyeT86IHN0cmluZyA7XG4gIGN1cnJlbnRfY29uZGl0aW9ucz86IHN0cmluZ1xuICBodW1pZGl0eT86IHN0cmluZyA7XG4gIHByZXNzdXJlPzogc3RyaW5nIDtcbiAgdGVtcGVyYXR1cmU/OiBzdHJpbmcgO1xuICBmZWVsc19saWtlPzogc3RyaW5nIDtcbiAgdmlzaWJpbGl0eT86IHN0cmluZyA7XG4gIHdpbmRfYmVhcmluZz86IHN0cmluZyA7XG4gIHdpbmRfc3BlZWQ/OiBzdHJpbmcgO1xuICBwcmVjaXBpdGF0aW9uPzogc3RyaW5nIDtcbiAgZm9yZWNhc3Q/OiBib29sZWFuIDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWNhc3Qge1xuICBtZXRlb2dyYW0/OiBzdHJpbmcgO1xuICB0ZW1wZXJhdHVyZV9oaWdoPzogRGF5cyA7XG4gIHRlbXBlcmF0dXJlX2xvdz86IERheXMgO1xuICBzdW1tYXJ5PzogRGF5cyA7XG4gIGljb25zPzogRGF5cyA7XG4gIHByZWNpcGl0YXRpb25fcHJvYmFiaWxpdHk/OiBEYXlzIDtcbiAgcHJlY2lwaXRhdGlvbl9pbnRlbnNpdHk/OiBEYXlzIDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWF0aGVyIHtcbiAgaWNvbnNfbW9kZWw6IHN0cmluZyA7XG4gIGN1cnJlbnQ6IEN1cnJlbnQgO1xuICBmb3JlY2FzdD86IEZvcmVjYXN0IDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb3VycyB7XG4gIGhvdXJfMTogc3RyaW5nIDtcbiAgaG91cl8yOiBzdHJpbmcgO1xuICBob3VyXzM6IHN0cmluZyA7XG4gIGhvdXJfNDogc3RyaW5nIDtcbiAgaG91cl81OiBzdHJpbmcgO1xuICBob3VyXzY6IHN0cmluZyA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWNvbnNDb25maWcge1xuICBwYXRoOiBzdHJpbmcgO1xuICBpY29uVHlwZTogc3RyaW5nIDtcbiAgaWNvbnNfbW9kZWw6IHN0cmluZyA7XG4gIGljb25zRGF5OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSA7XG4gIGljb25zTmlnaHQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGVybXMge1xuICAgd2luZERpcmVjdGlvbnM7XG4gICB3b3Jkcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBbGVydCB7XG4gIGZpcmVfcmlzaz86IEFsZXJ0SXRlbSA7XG4gIHRodW5kZXJzdG9ybXNfcmlzaz86IEFsZXJ0SXRlbSA7XG4gIGh5ZHJhdWxpY19yaXNrPzogQWxlcnRJdGVtIDtcbiAgaHlkcm9nZW9sb2dpY2FsX3Jpc2s/OiBBbGVydEl0ZW0gO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYSB7XG4gIHN3ZWxsX2RpcmVjdGlvbj86IEhvdXJzIDtcbiAgc3dlbGxfaGVpZ2h0PzogSG91cnMgO1xuICBzd2VsbF9wZXJpb2Q/OiBIb3VycyA7XG4gIHdpbmRfZGlyZWN0aW9uOiBIb3VycyA7XG4gIHdpbmRfc3BlZWQ6IEhvdXJzIDtcbiAgYWlyX3RlbXBlcmF0dXJlOiBIb3VycyA7XG4gIHdhdGVyX3RlbXBlcmF0dXJlOiBIb3VycyA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FyZENvbmZpZyB7XG4gIHR5cGU6IHN0cmluZyA7XG4gIG5hbWU/OiBzdHJpbmcgO1xuICBsYW5ndWFnZT86IHN0cmluZyA7XG4gIGFuaW1hdGlvbj86IGJvb2xlYW4gO1xuICBkaXNwbGF5OiBzdHJpbmdbXVxuICB1dj86IFV2IDtcbiAgYWlyX3F1YWxpdHk/OiBBaXJRdWFsaXR5IDtcbiAgcG9sbGVuPzogUG9sbGVuIDtcbiAgd2VhdGhlcjogV2VhdGhlciA7XG4gIGNhbWVyYT86IHN0cmluZyA7XG4gIGFsZXJ0OiBBbGVydCA7XG4gIHNlYTogU2VhIDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJY29uc01vZGVsQ29uZmlnIHtcbiAgaWNvbnNEYXk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGljb25zTmlnaHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBjb25zdCBpY29uc01vZGVsczogUmVjb3JkPHN0cmluZywgSWNvbnNNb2RlbENvbmZpZz4gPSB7XG4gIHBpcmF0ZXdlYXRoZXI6IHtcbiAgICBpY29uc0RheTogY3djRGF5dGltZVBpcmF0ZVdlYXRoZXJJY29ucyxcbiAgICBpY29uc05pZ2h0OiBjd2NOaWdodGx5UGlyYXRlV2VhdGVySWNvbnMsXG4gIH0sXG4gIGNsaW1hY2VsbDoge1xuICAgIGljb25zRGF5OiBjd2NDbGltYWNlbGxEYXlJY29ucyxcbiAgICBpY29uc05pZ2h0OiBjd2NDbGltYWNlbGxOaWdodEljb25zLFxuICB9LFxuICBkYXJrc2t5OiB7XG4gICAgaWNvbnNEYXk6IGN3Y0Rhcmtza3lEYXlJY29ucyxcbiAgICBpY29uc05pZ2h0OiBjd2NEYXJrc2t5TmlnaHRJY29ucyxcbiAgfSxcbiAgb3BlbndlYXRoZXJtYXA6IHtcbiAgICBpY29uc0RheTogY3djT3BlbldlYXRoZXJNYXBEYXlJY29ucyxcbiAgICBpY29uc05pZ2h0OiBjd2NPcGVuV2VhdGhlck1hcE5pZ2h0SWNvbnMsXG4gIH0sXG4gIGJ1aWVucmFkYXI6IHtcbiAgICBpY29uc0RheTogY3djQnVpZW5yYWRhckRheUljb25zLFxuICAgIGljb25zTmlnaHQ6IGN3Y0J1aWVucmFkYXJOaWdodEljb25zLFxuICB9LFxuICBkZWZhdWx0aGFzczoge1xuICAgIGljb25zRGF5OiBjd2NEZWZhdWx0SGFzc0RheUljb25zLFxuICAgIGljb25zTmlnaHQ6IGN3Y0RlZmF1bHRIYXNzTmlnaHRJY29ucyxcbiAgfSxcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbmltcG9ydCB7IEhvbWVBc3Npc3RhbnQgfSBmcm9tICdjdXN0b20tY2FyZC1oZWxwZXJzL2Rpc3QnO1xuaW1wb3J0IHsgaWNvbnNNb2RlbHMgfSBmcm9tICcuLi8uLi9iYWNrdXAvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEljb25zQ29uZmlnUmVzdWx0IHtcbiAgaWNvbnNNb2RlbDogc3RyaW5nO1xuICBpY29uc0RheTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgaWNvbnNOaWdodDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLy8gZXhwb3J0IGNvbnN0IGdldEVudGl0eVN0YXRlID0gKGhhc3M6IEhvbWVBc3Npc3RhbnQsIGVudGl0eUlkPzogc3RyaW5nKSA9PiAoXG4vLyAgIGVudGl0eUlkID8gaGFzcy5zdGF0ZXNbZW50aXR5SWRdPy5zdGF0ZSA6IHVuZGVmaW5lZFxuLy8gKTtcblxuLyoqXG4gKiBSZXN0aXR1aXNjZSBsYSB0cmFkdXppb25lIGRpIHVuIHRlcm1pbmUgdXNhbmRvIHVuIGRpemlvbmFyaW8sIGluIG1vZG8gY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIFNlIGlsIHRlcm1pbmUgbm9uIMOoIHRyb3ZhdG8sIHJlc3RpdHVpc2NlIGwnb3JpZ2luYWxlLlxuICovXG5leHBvcnQgY29uc3QgdHJhbnNsYXRlID0gKHRlcm06IHN0cmluZywgZGljdGlvbmFyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGRpY3Rpb25hcnkpLmZpbmQoKGspID0+IGsudG9Mb3dlckNhc2UoKSA9PT0gdGVybS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIGtleSA/IGRpY3Rpb25hcnlba2V5XSA6IHRlcm07XG59O1xuXG50eXBlIExvY2FsZUluZm8gPSB7XG4gIGxvY2FsZTogc3RyaW5nO1xuICB0aW1lem9uZTogc3RyaW5nO1xuICBjd2M/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TG9jYWxlSW5mbyA9IChsYW5nOiBzdHJpbmcpOiBMb2NhbGVJbmZvID0+IHtcbiAgY29uc3QgbG9jYWxlTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGVuOiAnZW4tVVMnLFxuICAgIGl0OiAnaXQtSVQnLFxuICAgIG5sOiAnbmwtTkwnLFxuICAgIGVzOiAnZXMtRVMnLFxuICAgIGRlOiAnZGUtREUnLFxuICAgIGZyOiAnZnItRlInLFxuICAgICdzci1sYXRuJzogJ3NyLUxhdG4nLFxuICAgIHB0OiAncHQtUFQnLFxuICAgIGRhOiAnZGEtREsnLFxuICAgICduby1ubyc6ICduYi1OTycsXG4gICAgY3M6ICdjcy1DWicsXG4gICAgcnU6ICdydS1SVScsXG4gIH07XG5cbiAgY29uc3QgdGltZXpvbmVNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgZW46ICdBbWVyaWNhL05ld19Zb3JrJyxcbiAgICBpdDogJ0V1cm9wZS9Sb21lJyxcbiAgICBubDogJ0V1cm9wZS9BbXN0ZXJkYW0nLFxuICAgIGVzOiAnRXVyb3BlL01hZHJpZCcsXG4gICAgZGU6ICdFdXJvcGUvQmVybGluJyxcbiAgICBmcjogJ0V1cm9wZS9QYXJpcycsXG4gICAgJ3NyLWxhdG4nOiAnRXVyb3BlL0JlbGdyYWRlJyxcbiAgICBqYTogJ0FzaWEvVG9reW8nLFxuICAgIHB0OiAnRXVyb3BlL0xpc2JvbicsXG4gICAgZGE6ICdFdXJvcGUvQ29wZW5oYWdlbicsXG4gICAgJ25vLW5vJzogJ0V1cm9wZS9Pc2xvJyxcbiAgICBjczogJ0V1cm9wZS9QcmFndWUnLFxuICAgIHJ1OiAnRXVyb3BlL01vc2NvdycsXG4gIH07XG5cbiAgY29uc3QgY3djTG9jYWxlOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgIGVuOiAwLFxuICAgIGl0OiAxLFxuICAgIG5sOiAyLFxuICAgIGVzOiAzLFxuICAgIGRlOiA0LFxuICAgIGZyOiA1LFxuICAgICdzci1sYXRuJzogNixcbiAgICBwdDogNyxcbiAgICBkYTogOCxcbiAgICAnbm8tbm8nOiA5LFxuICAgIGNzOiAxMCxcbiAgICBydTogMTEsXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBsb2NhbGU6IGxvY2FsZU1hcFtsYW5nXSB8fCBsYW5nLFxuICAgIHRpbWV6b25lOiB0aW1lem9uZU1hcFtsYW5nXSB8fCAnVVRDJyxcbiAgICAuLi4obGFuZyBpbiBjd2NMb2NhbGUgJiYgeyBjd2M6IGN3Y0xvY2FsZVtsYW5nXSB9KSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbGUgPSAobGFuZzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG1hcCA9IHtcbiAgICBpdDogJ2l0LUlUJyxcbiAgICBlbjogJ2VuLVVTJyxcbiAgICBmcjogJ2ZyLUZSJyxcbiAgICBkZTogJ2RlLURFJyxcbiAgICBlczogJ2VzLUVTJyxcbiAgICBqYTogJ2phLUpQJyxcbiAgICB6aDogJ3poLUNOJyxcbiAgICAvLyBBZ2dpdW5naSBhbHRyaSBzZSBzZXJ2b25vXG4gIH07XG4gIHJldHVybiBtYXBbbGFuZ10gfHwgYCR7bGFuZ30tJHtsYW5nLnRvVXBwZXJDYXNlKCl9YDsgLy8gZmFsbGJhY2sgZ2VuZXJpY29cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGb3JtYXR0ZXIgPSAoXG4gIGxvY2FsZTogc3RyaW5nID0gJ2VuLVVTJyxcbiAgZnJhY3Rpb25EaWdpdHM6IG51bWJlciA9IDEsXG4gIHVzZUdyb3VwaW5nOiBib29sZWFuID0gZmFsc2UsXG4pOiBJbnRsLk51bWJlckZvcm1hdCA9PiBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlLCB7XG4gIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogZnJhY3Rpb25EaWdpdHMsXG4gIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZnJhY3Rpb25EaWdpdHMsXG4gIHVzZUdyb3VwaW5nLFxufSk7XG5cbmV4cG9ydCBjb25zdCBmb3JtYXROdW1iZXIgPSAoXG4gIHtcbiAgICBzdHJpbmdOdW1iZXIsXG4gICAgbGFuZyA9ICdlbicsXG4gICAgZnJhY3Rpb25EaWdpdHMgPSAxLFxuICAgIHVzZUdyb3VwaW5nID0gZmFsc2UsXG4gIH06IHtcbiAgICBzdHJpbmdOdW1iZXI6IHN0cmluZztcbiAgICBsYW5nPzogc3RyaW5nO1xuICAgIGZyYWN0aW9uRGlnaXRzPzogbnVtYmVyO1xuICAgIHVzZUdyb3VwaW5nPzogYm9vbGVhbjtcbiAgfSxcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG51bWJlciA9IHBhcnNlRmxvYXQoc3RyaW5nTnVtYmVyKTtcbiAgaWYgKE51bWJlci5pc05hTihudW1iZXIpKSByZXR1cm4gJyc7XG5cbiAgY29uc3QgZWZmZWN0aXZlRm9ybWF0dGVyID0gZ2V0Rm9ybWF0dGVyKGdldExvY2FsZShsYW5nKSwgZnJhY3Rpb25EaWdpdHMsIHVzZUdyb3VwaW5nKTtcbiAgLy8gY29uc29sZS5kZWJ1ZyhgPj4+fHwgJHtudW1iZXJ9ICR7ZWZmZWN0aXZlRm9ybWF0dGVyLmZvcm1hdChudW1iZXIpfWApO1xuICByZXR1cm4gZWZmZWN0aXZlRm9ybWF0dGVyLmZvcm1hdChudW1iZXIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEljb25Nb2RlbERhdGEgPSAoaWNvbnNNb2RlbDogc3RyaW5nKTogSWNvbnNDb25maWdSZXN1bHQgPT4ge1xuICBjb25zdCBtb2RlbE5hbWUgPSBpY29uc01vZGVsLnRvTG93ZXJDYXNlKCkgPz8gJ2NsaW1hY2VsbCc7XG5cbiAgaWYgKG1vZGVsTmFtZSBpbiBpY29uc01vZGVscykge1xuICAgIGNvbnN0IHsgaWNvbnNEYXksIGljb25zTmlnaHQgfSA9IGljb25zTW9kZWxzW21vZGVsTmFtZV07XG4gICAgcmV0dXJuIHtcbiAgICAgIGljb25zTW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgIGljb25zRGF5LFxuICAgICAgaWNvbnNOaWdodCxcbiAgICB9O1xuICB9XG5cbiAgY29uc29sZS53YXJuKGBVbmtub3duIGljb25zIG1vZGVsOiAke21vZGVsTmFtZX0uIEZhbGxpbmcgYmFjayB0byAnY2xpbWFjZWxsJy5gKTtcblxuICBjb25zdCBmYWxsYmFjayA9IGljb25zTW9kZWxzWydjbGltYWNlbGwnXTtcbiAgcmV0dXJuIHtcbiAgICBpY29uc01vZGVsOiAnY2xpbWFjZWxsJyxcbiAgICBpY29uc0RheTogZmFsbGJhY2suaWNvbnNEYXksXG4gICAgaWNvbnNOaWdodDogZmFsbGJhY2suaWNvbnNOaWdodCxcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWQobjogbnVtYmVyIHwgc3RyaW5nLCB3aWR0aDogbnVtYmVyLCB6ID0gJzAnKTogc3RyaW5nIHtcbiAgcmV0dXJuIG4udG9TdHJpbmcoKS5wYWRTdGFydCh3aWR0aCwgeik7XG59XG5cbi8qKlxuICogQ29udmVydGUgdW5hIHN0cmluZ2EgbnVtZXJpY2EgbG9jYWxpenphdGEgaW4gdW4gbnVtZXJvLlxuICogRXNlbXBpbzogJzEuMjM0LDU2JyAoaXQtSVQpIOKGkiAxMjM0LjU2XG4gKiBAcGFyYW0gaW5wdXQgLSBMYSBzdHJpbmdhIG8gbnVtZXJvIGRhIGNvbnZlcnRpcmUuXG4gKiBAcGFyYW0gbG9jYWxlIC0gSWwgbG9jYWxlIGRhIHV0aWxpenphcmUgcGVyIGRldGVybWluYXJlIGkgc2VwYXJhdG9yaS5cbiAqIEByZXR1cm5zIElsIG51bWVybyBjb252ZXJ0aXRvIG8gTmFOIHNlIGxhIGNvbnZlcnNpb25lIGZhbGxpc2NlLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nMk51bWJlciA9IChpbnB1dDogc3RyaW5nIHwgbnVtYmVyLCBsb2NhbGU6IHN0cmluZyA9ICdlbi1VUycpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykgcmV0dXJuIGlucHV0O1xuXG4gIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUpO1xuICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlci5mb3JtYXRUb1BhcnRzKDEyMzQ1NjcuODkpO1xuXG4gIGNvbnN0IGdyb3VwID0gcGFydHMuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAnZ3JvdXAnKT8udmFsdWUgfHwgJyc7XG4gIGNvbnN0IGRlY2ltYWwgPSBwYXJ0cy5maW5kKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdkZWNpbWFsJyk/LnZhbHVlIHx8ICcuJztcblxuICAvLyBSaW11b3ZlIGkgc2VwYXJhdG9yaSBkZWxsZSBtaWdsaWFpYSBlIHNvc3RpdHVpc2NlIGlsIHNlcGFyYXRvcmUgZGVjaW1hbGUgY29uICcuJ1xuICBjb25zdCBub3JtYWxpemVkID0gaW5wdXRcbiAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHtncm91cH1gLCAnZycpLCAnJylcbiAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHtkZWNpbWFsfWApLCAnLicpO1xuXG4gIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RW50aXR5UmF3VmFsdWUgPSAoaGFzczogSG9tZUFzc2lzdGFudCwgZW50aXR5SWQ/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gKFxuICBlbnRpdHlJZCAmJiBoYXNzLnN0YXRlc1tlbnRpdHlJZF0/LnN0YXRlXG4pO1xuXG5leHBvcnQgY29uc3QgZ2V0RW50aXR5UmF3QXR0cmlidXRlID0gKGhhc3M6IEhvbWVBc3Npc3RhbnQsIGVudGl0eUlkOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IChcbiAgZW50aXR5SWQgJiYgaGFzcy5zdGF0ZXNbZW50aXR5SWRdPy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZV1cbik7XG5cbmV4cG9ydCBjb25zdCBnZXRFbnRpdHlOdW1lcmljVmFsdWUgPSAoXG4gIHtcbiAgICBlbnRpdHlJZCxcbiAgICBoYXNzLFxuICAgIGxhbmcgPSAnZW4nLFxuICAgIGRlY2ltYWxzID0gMCxcbiAgfToge1xuICAgIGVudGl0eUlkPzogc3RyaW5nO1xuICAgIGhhc3M/OiBIb21lQXNzaXN0YW50O1xuICAgIGxhbmc/OiBzdHJpbmc7XG4gICAgZGVjaW1hbHM/OiBudW1iZXI7XG4gIH0gPSB7fSxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHN0YXRlID0gaGFzcyAmJiBlbnRpdHlJZCAmJiBoYXNzLnN0YXRlc1tlbnRpdHlJZF0/LnN0YXRlO1xuICByZXR1cm4gc3RhdGUgIT09IHVuZGVmaW5lZCA/IGZvcm1hdE51bWJlcih7IHN0cmluZ051bWJlcjogc3RhdGUsIGZyYWN0aW9uRGlnaXRzOiBkZWNpbWFscywgbGFuZyB9KSA6IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbnRpdHlVbml0ID0gKGhhc3M6IEhvbWVBc3Npc3RhbnQsIGVudGl0eUlkPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IChcbiAgZW50aXR5SWQgJiYgaGFzcy5zdGF0ZXNbZW50aXR5SWRdPy5hdHRyaWJ1dGVzPy51bml0X29mX21lYXN1cmVtZW50XG4pO1xuXG5leHBvcnQgY29uc3QgZ2V0RW50aXR5SWNvbiA9IChoYXNzOiBIb21lQXNzaXN0YW50LCBlbnRpdHlJZD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiAoXG4gIGVudGl0eUlkICYmIGhhc3Muc3RhdGVzW2VudGl0eUlkXT8uYXR0cmlidXRlcz8uaWNvblxuKTtcblxuZXhwb3J0IGNvbnN0IGdldFdpbmREaXJlY3Rpb25zID0gKFxuICB3ZDogbnVtYmVyIHwgc3RyaW5nLFxuICBjd2NMb2NXaW5kRGlyZWN0aW9ucyxcbik6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB3ZE51bWJlciA9IHR5cGVvZiB3ZCA9PT0gJ251bWJlcicgPyB3ZCA6IHBhcnNlRmxvYXQod2QpO1xuXG4gIGlmIChOdW1iZXIuaXNOYU4od2ROdW1iZXIpKSB7XG4gICAgcmV0dXJuIGN3Y0xvY1dpbmREaXJlY3Rpb25zW3dkXSA/PyBudWxsO1xuICB9XG5cbiAgaWYgKHdkTnVtYmVyIDwgMCB8fCB3ZE51bWJlciA+IDM2MCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgd2luZCBkaXJlY3Rpb246ICcke3dkfScuIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAzNjAgZGVncmVlcy5gKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRpcmVjdGlvbnMgPSBbXG4gICAgJ04nLCAnTk5FJywgJ05FJywgJ0VORScsICdFJywgJ0VTRScsXG4gICAgJ1NFJywgJ1NTRScsICdTJywgJ1NTVycsICdTVycsICdXU1cnLFxuICAgICdXJywgJ1dOVycsICdOVycsICdOTlcnLFxuICBdO1xuXG4gIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcigoKHdkTnVtYmVyICsgMTEuMjUpICUgMzYwKSAvIDIyLjUpO1xuXG4gIGNvbnN0IGRpcktleSA9IGRpcmVjdGlvbnNbaW5kZXhdO1xuXG4gIHJldHVybiBjd2NMb2NXaW5kRGlyZWN0aW9uc1tkaXJLZXldID8/IG51bGw7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VFeGlzdChpbWFnZVNyYzogc3RyaW5nLCB0aW1lb3V0ID0gNTAwMCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaW1nLnNyYyA9ICcnOyAvLyBmb3J6YSBzdG9wXG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICB9O1xuICAgIGltZy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgIH07XG4gICAgaW1nLnNyYyA9IGltYWdlU3JjO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRKU09OKGZ1bGxfcGF0aF9maWxlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZnVsbF9wYXRoX2ZpbGUpO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVyciA9IGBFUlJPUiByZXRyaWV2aW5nIEpTT04gZmlsZTogJyR7ZnVsbF9wYXRoX2ZpbGV9Jywgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWA7XG4gICAgICBjb25zb2xlLmluZm8oZXJyKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnIpO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oYExvY2FsZSAnJHtmdWxsX3BhdGhfZmlsZX0nIGxvYWRlZGApO1xuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5pbmZvKGBGZXRjaCBmYWlsZWQgZm9yICcke2Z1bGxfcGF0aF9maWxlfSc6YCwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dJbmZvKG1lc3NhZ2U6IHN0cmluZywgLi4uc3R5bGVzOiB1bmtub3duW10pIHtcbiAgY29uc29sZS5pbmZvKG1lc3NhZ2UsIC4uLihzdHlsZXMubGVuZ3RoID8gc3R5bGVzIDogW10pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTG9jYWxpemVkTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsIGxvY2FsZSA9ICdlbi1VUycpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgcmV0dXJuIHZhbHVlO1xuXG4gIC8vIFNlbXBsaWZpY2F6aW9uZSBzb2xvIHBlciAnaXQtSVQnOiB1c2EgdmlyZ29sYSBjb21lIHNlcGFyYXRvcmUgZGVjaW1hbGVcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnJykucmVwbGFjZSgnLCcsICcuJyk7XG4gIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG59XG4iLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JqZWN0LWN1cmx5LW5ld2xpbmVcbmV4cG9ydCBjb25zdCBjd2NMb2NhbGUgPSB7IGVuOiAwLCBpdDogMSwgbmw6IDIsIGVzOiAzLCBkZTogNCwgZnI6IDUsICdzci1sYXRuJzogNiwgcHQ6IDcsIGRhOiA4LCAnbm8tbm8nOiA5LCBjczogMTAgfTtcblxuLy8gZXhwb3J0IGxldCBjd2NMb2NXaW5kRGlyZWN0aW9ucyA9IHtcbi8vICAgJ04nOiBbJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ1MnXSxcbi8vICAgJ05ORSc6IFsnTk5FJywgJ05ORScsICdOTk8nLCAnTk5FJywgJ05OTycsICdOTkUnLCAnU1NJJ10sXG4vLyAgICdORSc6IFsnTkUnLCAnTkUnLCAnTk8nLCAnTkUnLCAnTk8nLCAnTkUnLCAnU0knXSxcbi8vICAgJ0VORSc6IFsnRU5FJywgJ0VORScsICdPTk8nLCAnRU5FJywgJ09OTycsICdFTkUnLCAnSVNJJ10sXG4vLyAgICdFJzogWydFJywgJ0UnLCAnTycsICdFJywgJ08nLCAnRScsICdJJ10sXG4vLyAgICdFU0UnOiBbJ0VTRScsICdFU0UnLCAnT1pPJywgJ0VTRScsICdPU08nLCAnRVNFJywgJ0lKSSddLFxuLy8gICAnU0UnOiBbJ1NFJywgJ1NFJywgJ1pPJywgJ1NFJywgJ1NPJywgJ1NFJywgJ0pJJ10sXG4vLyAgICdTU0UnOiBbJ1NTRScsICdTU0UnLCAnWlpPJywgJ1NTRScsICdTU08nLCAnU1NFJywgJ0pKSSddLFxuLy8gICAnUyc6IFsnUycsICdTJywgJ1onLCAnUycsICdTJywgJ1MnLCAnSiddLFxuLy8gICAnU1NXJzogWydTU1cnLCAnU1NPJywgJ1paVycsICdTU08nLCAnU1NXJywgJ1NTTycsICdKSlonXSxcbi8vICAgJ1NXJzogWydTVycsICdTTycsICdaVycsICdTTycsICdTVycsICdTTycsICdKWiddLFxuLy8gICAnV1NXJzogWydXU1cnLCAnT1NPJywgJ1daVycsICdPU08nLCAnV1NXJywgJ09TTycsICdaU1onXSxcbi8vICAgJ1cnOiBbJ1cnLCAnTycsICdXJywgJ08nLCAnVycsICdPJywgJ1onXSxcbi8vICAgJ1dOVyc6IFsnV05XJywgJ09OTycsICdXTlcnLCAnT05PJywgJ1dOVycsICdPTk8nLCAnWlNaJ10sXG4vLyAgICdOVyc6IFsnTlcnLCAnTk8nLCAnTlcnLCAnTk8nLCAnTlcnLCAnTk8nLCAnU1onXSxcbi8vICAgJ05OVyc6IFsnTk5XJywgJ05OTycsICdOTlcnLCAnTk5PJywgJ05OVycsICdOTk8nLCAnU1NaJ10sXG4vLyB9O1xuXG4vLyBleHBvcnQgbGV0IGN3Y1Rlcm1zID0ge1xuLy8gICAnRmVlbHMgTGlrZScgOiBbJ0ZlZWxzIExpa2UnLCAnUGVyY2VwaXRhJywgJ1ZvZWx0IEFscycsICdQYXJlY2UgcXVlJywgJ0dlZiZ1dW1sO2hsdCcsXG4vLyAgICAgJ1Jlc3NlbnRpZScsICdTdWJqZWt0aXZuaSBvc2XEh2FqJ10sXG4vLyAgICduZXdfbW9vbic6IFsgJ05ldyBtb29uJywgJ05vdmlsdW5pbycsICdOaWV1d2UgbWFhbicsICdMdW5hIG51ZXZhJywgJ05ldW1vbmQnLFxuLy8gICAgICdOb3V2ZWxsZSBsdW5lJywgJ01sYWQgbWVzZWMnXSxcbi8vICAgJ25ldyc6IFsgJ05ldyBtb29uJywgJ05vdmlsdW5pbycsICdOaWV1d2UgbWFhbicsICdMdW5hIG51ZXZhJywgJ05ldW1vbmQnLFxuLy8gICAgICdOb3V2ZWxsZSBsdW5lJywgJ01sYWQgbWVzZWMnXSxcbi8vICAgJ3dheGluZ19jcmVzY2VudCc6IFsnV2F4aW5nIGNyZXNjZW50JywgJ0x1bmEgY3Jlc2NlbnRlJywgJ1dhc3NlbmRlIHNpa2tlbCcsICdNZWRpYSBsdW5hIGRlIGNlcmEnLCAnWnVuZWhtZW5kZSBTaWNoZWwnLFxuLy8gICAgICdQcmVtaWVyIGNyb2lzc2FudCcsICdQcnZhIG9zbWluYSddLFxuLy8gICAnZmlyc3RfcXVhcnRlcic6IFsnRmlyc3QgcXVhcnRlcicsICdQcmltbyBRdWFydG8nLCAnRWVyc3RlIGt3YXJ0YWFsJywgJ1ByaW1lciB0cmltZXN0cmUnLCAnRXJzdGVzIFZpZXJ0ZWwnLFxuLy8gICAgICdQcmVtaWVyIHF1YXJ0aWVyJywgJ1BydmEgxI1ldHZydCddLFxuLy8gICAnd2F4aW5nX2dpYmJvdXMnOiBbJ1dheGluZyBHaWJib3VzJywgJ0dpYmJvc2EgY3Jlc2NlbnRlJywgJ1dhc3NlbiBHaWJib3VzJywgJ0VuY2VyYWRvIEdpYmJvdXMnLCAnWnVuZWhtZW5kZXIgSGFsYm1vbmQnLFxuLy8gICAgICdHaWJiZXVzZSBjcm9pc3NhbnRlJywgJ1RyZcSHYSBvc21pbmEnXSxcbi8vICAgJ2Z1bGwnOiBbJ0Z1bGwnLCAnTHVuYSBwaWVuYScsICdWb2xsZWRpZycsICdDb21wbGV0bycsICdWb2xsbW9uZCcsXG4vLyAgICAgJ1BsZWluZSBsdW5lJywgJ1B1biBtZXNlYyddLFxuLy8gICAnd2FuaW5nX2dpYmJvdXMnOiBbJ1dhbmluZyBHaWJib3VzJywgJ0dpYmJvc2EgY2FsYW50ZScsICdad2VtbWVuZGUgR2liYm91cycsICdXYW5pbmcgR2liYm91cycsICdBYm5laG1lbmRlciBIYWxibW9uZCcsXG4vLyAgICAgJ0dpYmJldXNlIGTDqWNyb2lzc2FudGUnLCAnUGV0YSBvc21pbmEnXSxcbi8vICAgJ3RoaXJkX3F1YXJ0ZXInOiBbJ1RoaXJkIFF1YXJ0ZXInLCAnVWx0aW1vIHF1YXJ0bycsICdEZXJkZSBLd2FydGllcicsICdUZXJjZXIgY3VhcnRvJywgJ0RyaXR0ZXMgVmllcnRlbCcsXG4vLyAgICAgJ0Rlcm5pZXIgcXVhcnRpZXInLCAnVHJlxIdhIMSNZXR2cnRpbmEnXSxcbi8vICAgJ2xhc3RfcXVhcnRlcic6IFsnTGFzdCBRdWFydGVyJywgJ1VsdGltbyBxdWFydG8nLCAnTGFhdHN0ZSBLd2FydGllcicsICfDmmx0aW1vIGN1YXJ0bycsICdMZXR6dGVzIFZpZXJ0ZWwnLFxuLy8gICAgICdEZXJuaWVyIHF1YXJ0aWVyJywgJ1phZG5qYSDEjWV0dnJ0aW5hJ10sXG4vLyAgICd3YW5pbmdfY3Jlc2NlbnQnOiBbJ1dhbmluZyBDcmVzY2VudCcsICdMdW5hIGNhbGFudGUnLCAnWndlbW1lbmRlIHNpa2tlbCcsICdXYW5pbmcgQ3Jlc2NlbnQnLCAnQWJuZWhtZW5kZSBTaWNoZWwnLFxuLy8gICAgICdMdW5lIGTDqWNyb2lzc2FudGUnLCAnU2VkbWEgb3NtaW5hJ10sXG4vLyB9IDtcblxuLy8g8J+MkSDwn4ySIPCfjJMg8J+MlCDwn4yVIPCfjJYg8J+MlyDwn4yYIPCfjJFcbmV4cG9ydCBjb25zdCBjd2NNb29uUGhhc2VJY29ucyA9IHtcbiAgbmV3X21vb246ICfwn4yRJyxcbiAgbmV3OiAn8J+MkScsXG4gIHdheGluZ19jcmVzY2VudDogJ/CfjJInLFxuICBmaXJzdF9xdWFydGVyOiAn8J+MkycsXG4gIHdheGluZ19naWJib3VzOiAn8J+MlCcsXG4gIGZ1bGw6ICfwn4yVJyxcbiAgZnVsbF9tb29uOiAn8J+MlScsXG4gIHdhbmluZ19naWJib3VzOiAn8J+MlicsXG4gIHRoaXJkX3F1YXJ0ZXI6ICfwn4yXJyxcbiAgbGFzdF9xdWFydGVyOiAn8J+MlycsXG4gIHdhbmluZ19jcmVzY2VudDogJ/CfjJgnLFxufTtcbiIsImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmNvbnN0IGNhcmRTdHlsZSA9IGNzc2BcbiAgaGEtY2FyZCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gIC5oYS1jYXJkLXdlYXRoZXItY29uZGl0aW9ucyB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJhY2tncm91bmQtY29sb3IsICMxYzFjMWMpO1xuICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IsICNmZmZmZmYpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWhhLWNhcmQtYm9yZGVyLXJhZGl1cywgMTJweCk7XG4gICAgYm94LXNoYWRvdzogdmFyKC0taGEtY2FyZC1ib3gtc2hhZG93LCAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjIpKTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG5cbiAgLm5kLWNvbnRhaW5lciB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcGFkZGluZzogMTZweCAyMHB4OyAvKiDihpAgcGFkZGluZyBvcml6em9udGFsZSBwacO5IGFtcGlvICovXG4gICAgZ2FwOiAxMnB4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtaW1hZ2UgMC4zcyBlYXNlLWluLW91dDtcbiAgfVxuXG4gIC8qIEVzZW1waW8gZGkgc3RpbGUgZGluYW1pY28gYWdnaXVudGl2byBzZSBoYWJnSW1hZ2Ugw6ggdW5hIGNsYXNzZSAqL1xuICAubmQtY29udGFpbmVyLnN1bm55IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9sb2NhbC9pbWFnZXMvc3VubnktYmcuanBnJyk7XG4gIH1cblxuICAubmQtY29udGFpbmVyLnJhaW55IHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJy9sb2NhbC9pbWFnZXMvcmFpbnktYmcuanBnJyk7XG4gIH1cblxuICAvKiAtLS0tLS0tLS0tLS0tLSAqL1xuXG5gO1xuXG5leHBvcnQgZGVmYXVsdCBjYXJkU3R5bGU7XG4iLCJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5jb25zdCBzdW1tYXJ5U3R5bGUgPSBjc3NgXG5cbi5zdW1tYXJ5LWdyaWQtY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyOyAvKiA8LS0gMyBjb2xvbm5lIHJlYWxpICovXG4gIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiA2MDBweDtcbiAgLy8gYmFja2dyb3VuZDogIzFjMWMxYztcbiAgLy8gY29sb3I6IHdoaXRlO1xuICBnYXA6IDRweDtcbiAgcGFkZGluZzogMHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvLyBib3JkZXI6IDFweCBzb2xpZCAjNDQ0OyAvKiBkZWJ1ZyAqL1xufVxuXG4uc3VtbWFyeS1jb2wtbGVmdCB7XG4gIGdyaWQtY29sdW1uOiAxO1xuICBncmlkLXJvdzogMSAvIHNwYW4gMjtcbiAgLy8gYmFja2dyb3VuZDogIzJjMmMyYztcbiAgcGFkZGluZy10b3A6IDBweDtcbiAgcGFkZGluZy1yaWdodDogMHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDBweDtcbiAgXG4gIGRpc3BsYXk6IGZsZXg7ICAgICAgICAgICAgICAgICAvKiBBdHRpdmEgRmxleGJveCAqL1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgICAgICAvKiBDZW50cmEgb3JpenpvbnRhbG1lbnRlICovXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7ICAgICAgICAgIC8qIENlbnRyYSB2ZXJ0aWNhbG1lbnRlICovXG5cbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgYXNwZWN0LXJhdGlvOiAxIC8gMTsgLyogb3B6aW9uYWxlOiBtYW50aWVuZSBmb3JtYSBxdWFkcmF0YSAqL1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uc3VtbWFyeS10b3AtcmlnaHQge1xuICBncmlkLWNvbHVtbjogMiAvIHNwYW4gMjsgLyogb2NjdXBhIGNvbG9ubmUgMiBlIDMgKi9cbiAgZ3JpZC1yb3c6IDE7XG4gIC8vIGJhY2tncm91bmQ6ICMzYzNjM2M7XG4gIHBhZGRpbmctdG9wOiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcbiAgcGFkZGluZy1ib3R0b206IDBweDtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG4gIGRpc3BsYXk6IGZsZXg7ICAgICAgICAgICAgLyogYWdnaXVudG8gKi9cbiAgYWxpZ24taXRlbXM6IGNlbnRlcjsgICAgICAvKiBjZW50cmEgdmVydGljYWxtZW50ZSAqL1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7IC8qIGFsbGluZWEgYSBzaW5pc3RyYSAqL1xufVxuXG4uc3VtbWFyeS1ib3R0b20tcmlnaHQtbGVmdCB7XG4gIGdyaWQtY29sdW1uOiAyO1xuICBncmlkLXJvdzogMjtcbiAgLy8gYmFja2dyb3VuZDogIzRjNGM0YztcbiAgcGFkZGluZy10b3A6IDBweDtcbiAgcGFkZGluZy1yaWdodDogOHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcblxuICBkaXNwbGF5OiBmbGV4OyAgICAgICAgICAgICAgICAgLyogQXR0aXZhIEZsZXhib3ggKi9cbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7ICAgICAgLyogQ2VudHJhIG9yaXp6b250YWxtZW50ZSAqL1xuICBhbGlnbi1pdGVtczogY2VudGVyOyAgICAgICAgICAvKiBDZW50cmEgdmVydGljYWxtZW50ZSAqL1xufVxuXG4uc3VtbWFyeS1ib3R0b20tcmlnaHQtcmlnaHQge1xuICBncmlkLWNvbHVtbjogMztcbiAgZ3JpZC1yb3c6IDI7XG4gIC8vIGJhY2tncm91bmQ6ICM1YzVjNWM7XG4gIHBhZGRpbmctdG9wOiAwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcbiAgcGFkZGluZy1ib3R0b206IDBweDtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG59XG5cbi53ZWF0aGVyLWNvbmRpdGlvbi1pY29uIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xuICBvYmplY3QtZml0OiBjb250YWluO1xuICAvLyBtYXgtd2lkdGg6IDEwMCU7XG4gIC8vIG1heC1oZWlnaHQ6IDEwMCU7XG4gIC8vIHdpZHRoOiA3MnB4O1xuICAvLyBoZWlnaHQ6IDcycHg7XG4gIC8vIG9iamVjdC1maXQ6IGNvbnRhaW47XG5cbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTtcbn1cbiAgXG4uc3VtbWFyeS1jb2wtbGVmdDpob3ZlciAud2VhdGhlci1jb25kaXRpb24taWNvbiB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4wNSk7XG59XG5cbi53ZWF0aGVyLWNpdHktbmFtZSB7XG4gIGZvbnQtc2l6ZTogY2xhbXAoMWVtLCAydncsIDEuMmVtKTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbn1cblxuLm1vb24tcm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA2cHg7XG4gIC8vIGZvbnQtc2l6ZTogMC45NWVtO1xuICAvLyBjb2xvcjogI2VlZWVlZTtcbn1cblxuLnN1bW1hcnktbW9vbi1pY29uIHtcbiAgZm9udC1zaXplOiAxLjhlbTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4udGVtcGVyYXR1cmUtYmxvY2sge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xufVxuXG4udGVtcGVyYXR1cmUge1xuICBmb250LXNpemU6IDEuNmVtO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnRlbXAtdW5pdCB7XG4gIGZvbnQtc2l6ZTogMC45NWVtO1xuICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7XG4gIG1hcmdpbi1sZWZ0OiAycHg7XG59XG5cbi5mZWVscy1saWtlIHtcbiAgZm9udC1zaXplOiAwLjg1ZW07XG4gIC8vIGNvbG9yOiAjYWFhYWFhO1xufVxuXG4uc3VtbWFyeS13cmFwcGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtaW4taGVpZ2h0OiAxMDBweDsgLyogb3BwdXJlIGNsYW1wKCkgZGluYW1pY28gKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi5saWdodG5pbmctYmFja2dyb3VuZCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7IC8qIHRvcDogMDsgcmln
gitextract_h_qgsp48/ ├── .eslintignore ├── .eslintrc.json ├── .github/ │ └── workflows/ │ └── codeql.yml ├── .gitignore ├── .npmignore ├── .vscode/ │ └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── dist/ │ ├── ha-card-weather-conditions.js │ └── transl/ │ ├── cs.json │ ├── da.json │ ├── de.json │ ├── en.json │ ├── es.json │ ├── fr.json │ ├── it.json │ ├── nl.json │ ├── no-NO.json │ ├── pt.json │ ├── ru.json │ └── sr-latn.json ├── hacs.json ├── info.md ├── package.json ├── rollup.new.config.mjs ├── src/ │ ├── base/ │ │ └── lovelace-base.ts │ ├── builder/ │ │ ├── b-airquality.ts │ │ ├── b-camera.ts │ │ ├── b-meteoalarm.ts │ │ ├── b-pollen.ts │ │ ├── b-present.ts │ │ ├── b-summary.ts │ │ ├── b-ultraviolet.ts │ │ └── b-weather-forecast.ts │ ├── css/ │ │ ├── css-base-card.ts │ │ ├── css-camera.ts │ │ ├── css-meteoalarm.ts │ │ ├── css-pollen.ts │ │ ├── css-present.ts │ │ ├── css-summary.ts │ │ ├── css-ultraviolet.ts │ │ └── css-weather-forecast.ts │ ├── ha-weather-ecard.ts │ ├── iconmodels/ │ │ ├── im-buienradar.ts │ │ ├── im-climacell.ts │ │ ├── im-darksky.ts │ │ ├── im-hass.ts │ │ ├── im-openweathermap.ts │ │ └── im-pirateweather.ts │ ├── templates/ │ │ ├── t-camera.ts │ │ ├── t-meteoalarm.ts │ │ ├── t-pollen.ts │ │ ├── t-present.ts │ │ ├── t-summary.ts │ │ ├── t-ultraviolet.ts │ │ └── t-weather-forecast.ts │ └── utils/ │ ├── colors.ts │ ├── config-schema.ts │ ├── const.ts │ ├── helper-render.ts │ └── helper.ts └── tsconfig.json
SYMBOL INDEX (170 symbols across 13 files)
FILE: dist/ha-card-weather-conditions.js
function e (line 1) | function e(e,t,i,n){var a,s=arguments.length,o=s<3?t:null===n?n=Object.g...
method constructor (line 7) | constructor(e,t,i){if(this._$cssResult$=!0,i!==n)throw Error("CSSResult ...
method styleSheet (line 7) | get styleSheet(){let e=this.o;const t=this.t;if(i&&void 0===e){const i=v...
method toString (line 7) | toString(){return this.cssText}
method toAttribute (line 12) | toAttribute(e,t){switch(t){case Boolean:e=e?y:null;break;case Object:cas...
method fromAttribute (line 12) | fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case ...
method addInitializer (line 12) | static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}
method observedAttributes (line 12) | static get observedAttributes(){return this.finalize(),this._$Eh&&[...th...
method createProperty (line 12) | static createProperty(e,t=$){if(t.state&&(t.attribute=!1),this._$Ei(),th...
method getPropertyDescriptor (line 12) | static getPropertyDescriptor(e,t,i){const{get:n,set:a}=d(this.prototype,...
method getPropertyOptions (line 12) | static getPropertyOptions(e){return this.elementProperties.get(e)??$}
method _$Ei (line 12) | static _$Ei(){if(this.hasOwnProperty(v("elementProperties")))return;cons...
method finalize (line 12) | static finalize(){if(this.hasOwnProperty(v("finalized")))return;if(this....
method finalizeStyles (line 12) | static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set...
method _$Eu (line 12) | static _$Eu(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeo...
method constructor (line 12) | constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasU...
method _$Ev (line 12) | _$Ev(){this._$ES=new Promise((e=>this.enableUpdating=e)),this._$AL=new M...
method addController (line 12) | addController(e){(this._$EO??=new Set).add(e),void 0!==this.renderRoot&&...
method removeController (line 12) | removeController(e){this._$EO?.delete(e)}
method _$E_ (line 12) | _$E_(){const e=new Map,t=this.constructor.elementProperties;for(const i ...
method createRenderRoot (line 12) | createRenderRoot(){const e=this.shadowRoot??this.attachShadow(this.const...
method connectedCallback (line 12) | connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enabl...
method enableUpdating (line 12) | enableUpdating(e){}
method disconnectedCallback (line 12) | disconnectedCallback(){this._$EO?.forEach((e=>e.hostDisconnected?.()))}
method attributeChangedCallback (line 12) | attributeChangedCallback(e,t,i){this._$AK(e,i)}
method _$ET (line 12) | _$ET(e,t){const i=this.constructor.elementProperties.get(e),n=this.const...
method _$AK (line 12) | _$AK(e,t){const i=this.constructor,n=i._$Eh.get(e);if(void 0!==n&&this._...
method requestUpdate (line 12) | requestUpdate(e,t,i){if(void 0!==e){const n=this.constructor,a=this[e];i...
method C (line 12) | C(e,t,{useDefault:i,reflect:n,wrapped:a},s){i&&!(this._$Ej??=new Map).ha...
method _$EP (line 12) | async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promis...
method scheduleUpdate (line 12) | scheduleUpdate(){return this.performUpdate()}
method performUpdate (line 12) | performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(...
method willUpdate (line 12) | willUpdate(e){}
method _$AE (line 12) | _$AE(e){this._$EO?.forEach((e=>e.hostUpdated?.())),this.hasUpdated||(thi...
method _$EM (line 12) | _$EM(){this._$AL=new Map,this.isUpdatePending=!1}
method updateComplete (line 12) | get updateComplete(){return this.getUpdateComplete()}
method getUpdateComplete (line 12) | getUpdateComplete(){return this._$ES}
method shouldUpdate (line 12) | shouldUpdate(e){return!0}
method update (line 12) | update(e){this._$Eq&&=this._$Eq.forEach((e=>this._$ET(e,this[e]))),this....
method updated (line 12) | updated(e){}
method firstUpdated (line 12) | firstUpdated(e){}
function Z (line 18) | function Z(e,t){if(!T(e)||!e.hasOwnProperty("raw"))throw Error("invalid ...
class Y (line 18) | class Y{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let ...
method constructor (line 18) | constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let a=0,s=...
method createElement (line 18) | static createElement(e,t){const i=I.createElement("template");return i...
function Q (line 18) | function Q(e,t,i=e,n){if(t===V)return t;let a=void 0!==n?i._$Co?.[n]:i._...
class K (line 18) | class K{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this....
method constructor (line 18) | constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}
method parentNode (line 18) | get parentNode(){return this._$AM.parentNode}
method _$AU (line 18) | get _$AU(){return this._$AM._$AU}
method u (line 18) | u(e){const{el:{content:t},parts:i}=this._$AD,n=(e?.creationScope??I).i...
method p (line 18) | p(e){let t=0;for(const i of this._$AV)void 0!==i&&(void 0!==i.strings?...
class G (line 18) | class G{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,i,n...
method _$AU (line 18) | get _$AU(){return this._$AM?._$AU??this._$Cv}
method constructor (line 18) | constructor(e,t,i,n){this.type=2,this._$AH=W,this._$AN=void 0,this._$A...
method parentNode (line 18) | get parentNode(){let e=this._$AA.parentNode;const t=this._$AM;return v...
method startNode (line 18) | get startNode(){return this._$AA}
method endNode (line 18) | get endNode(){return this._$AB}
method _$AI (line 18) | _$AI(e,t=this){e=Q(this,e,t),P(e)?e===W||null==e||""===e?(this._$AH!==...
method O (line 18) | O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}
method T (line 18) | T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}
method _ (line 18) | _(e){this._$AH!==W&&P(this._$AH)?this._$AA.nextSibling.data=e:this.T(I...
method $ (line 18) | $(e){const{values:t,_$litType$:i}=e,n="number"==typeof i?this._$AC(e):...
method _$AC (line 18) | _$AC(e){let t=B.get(e.strings);return void 0===t&&B.set(e.strings,t=ne...
method k (line 18) | k(e){T(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,...
method _$AR (line 18) | _$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e&&e!==this._...
method setConnected (line 18) | setConnected(e){void 0===this._$AM&&(this._$Cv=e,this._$AP?.(e))}
class X (line 18) | class X{get tagName(){return this.element.tagName}get _$AU(){return this...
method tagName (line 18) | get tagName(){return this.element.tagName}
method _$AU (line 18) | get _$AU(){return this._$AM._$AU}
method constructor (line 18) | constructor(e,t,i,n,a){this.type=1,this._$AH=W,this._$AN=void 0,this.e...
method _$AI (line 18) | _$AI(e,t=this,i,n){const a=this.strings;let s=!1;if(void 0===a)e=Q(thi...
method j (line 18) | j(e){e===W?this.element.removeAttribute(this.name):this.element.setAtt...
class ee (line 18) | class ee extends X{constructor(){super(...arguments),this.type=3}j(e){th...
method constructor (line 18) | constructor(){super(...arguments),this.type=3}
method j (line 18) | j(e){this.element[this.name]=e===W?void 0:e}
class te (line 18) | class te extends X{constructor(){super(...arguments),this.type=4}j(e){th...
method constructor (line 18) | constructor(){super(...arguments),this.type=4}
method j (line 18) | j(e){this.element.toggleAttribute(this.name,!!e&&e!==W)}
class ie (line 18) | class ie extends X{constructor(e,t,i,n,a){super(e,t,i,n,a),this.type=5}_...
method constructor (line 18) | constructor(e,t,i,n,a){super(e,t,i,n,a),this.type=5}
method _$AI (line 18) | _$AI(e,t=this){if((e=Q(this,e,t,0)??W)===V)return;const i=this._$AH,n=...
method handleEvent (line 18) | handleEvent(e){"function"==typeof this._$AH?this._$AH.call(this.option...
class ne (line 18) | class ne{constructor(e,t,i){this.element=e,this.type=6,this._$AN=void 0,...
method constructor (line 18) | constructor(e,t,i){this.element=e,this.type=6,this._$AN=void 0,this._$...
method _$AU (line 18) | get _$AU(){return this._$AM._$AU}
method _$AI (line 18) | _$AI(e){Q(this,e)}
class oe (line 23) | class oe extends x{constructor(){super(...arguments),this.renderOptions=...
method constructor (line 23) | constructor(){super(...arguments),this.renderOptions={host:this},this....
method createRenderRoot (line 23) | createRenderRoot(){const e=super.createRenderRoot();return this.render...
method update (line 23) | update(e){const t=this.render();this.hasUpdated||(this.renderOptions.i...
method connectedCallback (line 23) | connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(...
method disconnectedCallback (line 23) | disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConn...
method render (line 23) | render(){return V}
method set (line 29) | set(i){const a=t.get.call(this);t.set.call(this,i),this.requestUpdate(n,...
method init (line 29) | init(t){return void 0!==t&&this.C(n,void 0,e,t),t}
function de (line 34) | function de(e){return(t,i)=>"object"==typeof i?ce(e,t,i):((e,t,i)=>{cons...
function Ve (line 61) | function Ve(e,t=5e3){return new Promise((i=>{const n=new Image,a=setTime...
function We (line 61) | function We(e,...t){console.info(e,...t.length?t:[])}
function Be (line 61) | function Be(e,t="en-US"){if("number"==typeof e)return e;const i=e.replac...
function it (line 651) | function it(e){return!!e&&e.themes.darkMode}
function nt (line 651) | async function nt(){const[e,t]=await Promise.all([Ve(`${me}/static/cloud...
class at (line 651) | class at extends oe{constructor(){super(...arguments),this.isPanel=!1,th...
method constructor (line 651) | constructor(){super(...arguments),this.isPanel=!1,this.editMode=!1,thi...
method updated (line 651) | updated(e){if(super.updated(e),e.has("hass")&&this.hass){const t=it(e....
method styles (line 651) | static get styles(){return[o`
method setConfig (line 668) | async setConfig(e){if(!e)throw this.invalidConfig=!0,new Error("Invali...
method getCardSize (line 668) | getCardSize(){return 1}
method _loadTranslations (line 668) | _loadTranslations(e){try{const t=JSON.parse(this._translations[_e[e]])...
method _detectDataSections (line 668) | _detectDataSections(e){this._hasPresent=!!e.weather?.present,this._has...
method _setupIcons (line 668) | _setupIcons(e){if(this._iconsConfig={path:this._imagesPath,iconType:th...
method render (line 668) | render(){return this.invalidConfig?F`
method constructor (line 854) | constructor(){super(...arguments),this._translations=kt,this._imagesPath...
method _render (line 854) | _render(){return F`
method _buildTemplate (line 860) | _buildTemplate(){let e=F``,t=F``,i=F``,n=F``,a=F``,s=F``,o=F``,r=F``,l=F...
method _handlePopup (line 871) | _handlePopup(e,t){e.stopPropagation();const i=new Event("hass-more-info"...
FILE: src/base/lovelace-base.ts
type iTerms (line 35) | interface iTerms {
type iIconsConfig (line 40) | interface iIconsConfig {
type iLovelaceCard (line 48) | interface iLovelaceCard extends HTMLElement {
function computeDarkMode (line 56) | function computeDarkMode(hass?: HomeAssistant): boolean {
function preloadResources (line 67) | async function preloadResources(): Promise<{ translations: any[]; imageP...
method updated (line 146) | protected updated(changedProps: PropertyValues): void {
method styles (line 157) | static get styles(): CSSResultGroup {
method setConfig (line 172) | public async setConfig(config: iCardConfig) {
method getCardSize (line 202) | public getCardSize(): number | Promise<number> {
method _loadTranslations (line 206) | private _loadTranslations(lang: string) {
method _detectDataSections (line 237) | private _detectDataSections(config: iCardConfig) {
method _setupIcons (line 253) | private _setupIcons(iconsModel?: string) {
method render (line 274) | public render(): TemplateResult {
FILE: src/builder/b-airquality.ts
function getAQIColor (line 14) | function getAQIColor(aqi: number): string {
FILE: src/ha-weather-ecard.ts
class HaCardWeatherConditions (line 22) | class HaCardWeatherConditions extends LovelaceBaseElement {
method _render (line 28) | protected _render(): TemplateResult {
method _buildTemplate (line 38) | private _buildTemplate(): TemplateResult {
method _handlePopup (line 145) | protected _handlePopup(e: Event, entityId: string) {
FILE: src/templates/t-meteoalarm.ts
type iWeatherMeteoDPCAlarmDataInterface (line 3) | interface iWeatherMeteoDPCAlarmDataInterface {
FILE: src/templates/t-pollen.ts
type iPollenData (line 3) | interface iPollenData {
constant LEVEL_NAMES (line 8) | const LEVEL_NAMES = ['basso', 'moderato', 'alto', 'molto-alto', 'estremo'];
FILE: src/templates/t-present.ts
type iRenderDataItem (line 4) | interface iRenderDataItem {
type WeatherData (line 11) | interface WeatherData {
type iAirQualityData (line 27) | interface iAirQualityData {
FILE: src/templates/t-summary.ts
type WeatherSummaryInterface (line 3) | interface WeatherSummaryInterface {
FILE: src/templates/t-ultraviolet.ts
type RenderDataItem (line 3) | interface RenderDataItem {
type RenderData (line 8) | interface RenderData {
type RenderSkinData (line 16) | interface RenderSkinData {
FILE: src/templates/t-weather-forecast.ts
type iForecastDataItem (line 5) | interface iForecastDataItem {
FILE: src/utils/colors.ts
constant COLORS (line 4) | const COLORS = [
function computeRgbColor (line 33) | function computeRgbColor(color: string): string {
function capitalizeFirstLetter (line 50) | function capitalizeFirstLetter(string) {
function computeColorName (line 54) | function computeColorName(color: string): string {
FILE: src/utils/config-schema.ts
type iLovelaceCardConfig (line 1) | interface iLovelaceCardConfig {
type iPresentData (line 9) | interface iPresentData {
type iTimeSlots (line 28) | interface iTimeSlots {
type iDailyForecast (line 37) | interface iDailyForecast {
type iHourlyForecast (line 47) | interface iHourlyForecast {
type iMarineHourlyForecast (line 57) | interface iMarineHourlyForecast {
type iMarineDailyForecast (line 67) | interface iMarineDailyForecast {
type iDPCAlert (line 74) | interface iDPCAlert {
type iWeather (line 80) | interface iWeather {
type iUltraviolet (line 95) | interface iUltraviolet {
type iPollenItem (line 109) | interface iPollenItem {
type iPollen (line 114) | interface iPollen {
type iAirQuality (line 120) | interface iAirQuality {
type iCardConfig (line 132) | interface iCardConfig {
FILE: src/utils/helper.ts
type IconsConfigResult (line 5) | interface IconsConfigResult {
type LocaleInfo (line 24) | type LocaleInfo = {
function pad (line 151) | function pad(n: number | string, width: number, z = '0'): string {
function imageExist (line 240) | function imageExist(imageSrc: string, timeout = 5000): Promise<boolean> {
function loadJSON (line 260) | async function loadJSON(full_path_file: string): Promise<string> {
function logInfo (line 276) | function logInfo(message: string, ...styles: unknown[]) {
function parseLocalizedNumber (line 280) | function parseLocalizedNumber(value: string | number, locale = 'en-US'):...
Condensed preview — 63 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (545K chars).
[
{
"path": ".eslintignore",
"chars": 89,
"preview": "backup/\ndist/\nnode_modules/\nrollup.config.mjs\nrollup.config copy.js\nrollup.new.config.mjs"
},
{
"path": ".eslintrc.json",
"chars": 1083,
"preview": "{\n \"root\": true,\n \"parser\": \"@typescript-eslint/parser\",\n \"parserOptions\": {\n \"ecmaVersion\": 2022,\n \"sourceType"
},
{
"path": ".github/workflows/codeql.yml",
"chars": 841,
"preview": "name: \"CodeQL\"\n\non:\n push:\n branches: [ \"master\" ]\n pull_request:\n branches: [ \"master\" ]\n schedule:\n - cron"
},
{
"path": ".gitignore",
"chars": 155,
"preview": "# ####### ####### #######\n# Folders\n\n.idea\n__pycache__\n/node_modules/\n/.rpt2_cache/\n/trash/\n/backup/\n\n# ####### ####### "
},
{
"path": ".npmignore",
"chars": 23,
"preview": "# OS X\n.DS_Store\nbackup"
},
{
"path": ".vscode/settings.json",
"chars": 347,
"preview": "{\n \"eslint.enable\": true,\n \"eslint.validate\": [\n \"javascript\",\n \"javascriptreact\",\n \"typescript\",\n "
},
{
"path": "CHANGELOG.md",
"chars": 2366,
"preview": "# HA (Lovelace) Card Weather Conditions\n\nThe format is based on [Keep a Changelog](http://keepachangelog.com/)\nand this "
},
{
"path": "LICENSE",
"chars": 1111,
"preview": "MIT License\n\nCopyright (c) 2019 Renato Rossi, https://www.linkedin.com/in/renatorossi/\n\nPermission is hereby granted, fr"
},
{
"path": "README.md",
"chars": 32111,
"preview": "# Weather Conditions Card\nha-card-weather-conditions is a powerful and flexible Lovelace card for Home Assistant. It int"
},
{
"path": "dist/ha-card-weather-conditions.js",
"chars": 346589,
"preview": "function e(e,t,i,n){var a,s=arguments.length,o=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if(\"object\"==type"
},
{
"path": "dist/transl/cs.json",
"chars": 728,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"S\",\n \"NNE\": \"SSV\",\n \"NE\": \"SV\",\n \"ENE\": \"VSV\",\n \"E\": \"V\",\n \"ESE\":"
},
{
"path": "dist/transl/da.json",
"chars": 739,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\",\n \"NNE\": \"NNØ\",\n \"NE\": \"NØ\",\n \"ENE\": \"ØNØ\",\n \"E\": \"Ø\",\n \"ESE\":"
},
{
"path": "dist/transl/de.json",
"chars": 760,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\", \n \"NNE\": \"NNO\", \n \"NE\": \"NO\",\n \"ENE\": \"ONO\", \n \"E\": \"O\", \n \"E"
},
{
"path": "dist/transl/en.json",
"chars": 724,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\",\n \"NNE\": \"NNE\",\n \"NE\": \"NE\",\n \"ENE\": \"ENE\",\n \"E\": \"E\",\n \"ESE\":"
},
{
"path": "dist/transl/es.json",
"chars": 643,
"preview": "{\n\"cwcLocWindDirections\": {\n\"N\": \"N\",\n\"NNE\": \"NNE\",\n\"NE\": \"NE\",\n\"ENE\": \"ENE\",\n\"E\": \"E\",\n\"ESE\": \"ESE\",\n\"SE\": \"SE\",\n\"SSE\":"
},
{
"path": "dist/transl/fr.json",
"chars": 777,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\",\n \"NNE\": \"NNE\",\n \"NE\": \"NE\",\n \"ENE\": \"ENE\",\n \"E\": \"E\",\n \"ESE\":"
},
{
"path": "dist/transl/it.json",
"chars": 757,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\", \n \"NNE\": \"NNE\",\n \"NE\": \"NE\", \n \"ENE\": \"ENE\", \n \"E\": \"E\",\n \"ES"
},
{
"path": "dist/transl/nl.json",
"chars": 756,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\",\n \"NNE\": \"NNO\",\n \"NE\": \"NO\",\n \"ENE\": \"ONO\",\n \"E\": \"O\",\n \"ESE\":"
},
{
"path": "dist/transl/no-NO.json",
"chars": 739,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\",\n \"NNE\": \"NNØ\",\n \"NE\": \"NØ\",\n \"ENE\": \"ØNØ\",\n \"E\": \"Ø\",\n \"ESE\":"
},
{
"path": "dist/transl/pt.json",
"chars": 741,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"N\",\n \"NNE\": \"NNE\",\n \"NE\": \"NE\",\n \"ENE\": \"ENE\",\n \"E\": \"E\",\n \"ESE\":"
},
{
"path": "dist/transl/ru.json",
"chars": 747,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"С\",\n \"NNE\": \"ССВ\",\n \"NE\": \"СВ\",\n \"ENE\": \"ВСВ\",\n \"E\": \"В\",\n \"ESE\":"
},
{
"path": "dist/transl/sr-latn.json",
"chars": 738,
"preview": "{\n \"cwcLocWindDirections\": {\n \"N\": \"S\",\n \"NNE\": \"SSI\",\n \"NE\": \"SI\",\n \"ENE\": \"ISI\",\n \"E\": \"I\",\n \"ESE\":"
},
{
"path": "hacs.json",
"chars": 152,
"preview": "{\n \"name\": \"HA (Lovelace) Card Weather Conditions\",\n \"domains\": [\"weather\"],\n \"render_readme\": false,\n \"filename\": \""
},
{
"path": "info.md",
"chars": 30895,
"preview": "# Weather Conditions Card\nha-card-weather-conditions is a powerful and flexible Lovelace card for Home Assistant. It int"
},
{
"path": "package.json",
"chars": 1970,
"preview": "{\n \"name\": \"ha-card-weather-conditions\",\n \"version\": \"2.0.0\",\n \"description\": \"Home Assistant lovelace card for displ"
},
{
"path": "rollup.new.config.mjs",
"chars": 1229,
"preview": "import resolve from '@rollup/plugin-node-resolve'; // ✅ nuovo package\nimport typescript from '@rollup/plugin-typescript'"
},
{
"path": "src/base/lovelace-base.ts",
"chars": 8308,
"preview": "/* eslint-disable no-underscore-dangle */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n css,\n CSSR"
},
{
"path": "src/builder/b-airquality.ts",
"chars": 3562,
"preview": "/* eslint-disable camelcase */\n/* eslint-disable no-else-return */\n/* eslint-disable object-curly-newline */\nimport { Ho"
},
{
"path": "src/builder/b-camera.ts",
"chars": 606,
"preview": "import { HomeAssistant } from 'custom-card-helpers/dist';\nimport { iTerms } from '../base/lovelace-base';\nimport renderC"
},
{
"path": "src/builder/b-meteoalarm.ts",
"chars": 4879,
"preview": "/* eslint-disable camelcase */\n/* eslint-disable quote-props */\nimport { HomeAssistant } from 'custom-card-helpers/dist'"
},
{
"path": "src/builder/b-pollen.ts",
"chars": 1060,
"preview": "import { HomeAssistant } from 'custom-card-helpers/dist';\nimport { iPollen } from '../utils/config-schema';\nimport { get"
},
{
"path": "src/builder/b-present.ts",
"chars": 5557,
"preview": "/* eslint-disable camelcase */\nimport { HomeAssistant } from 'custom-card-helpers/dist';\nimport {\n getEntityNumericValu"
},
{
"path": "src/builder/b-summary.ts",
"chars": 1957,
"preview": "import { HomeAssistant } from 'custom-card-helpers/dist';\n\nimport renderWeatherSummary from '../templates/t-summary';\nim"
},
{
"path": "src/builder/b-ultraviolet.ts",
"chars": 2847,
"preview": "import { HomeAssistant } from 'custom-card-helpers/dist';\n\nimport { getEntityNumericValue, getEntityRawValue, pad } from"
},
{
"path": "src/builder/b-weather-forecast.ts",
"chars": 10378,
"preview": "import { HomeAssistant } from 'custom-card-helpers/dist';\nimport { getWeatherIcon } from '../utils/helper-render';\nimpor"
},
{
"path": "src/css/css-base-card.ts",
"chars": 1134,
"preview": "import { css } from 'lit';\n\nconst cardStyle = css`\n ha-card {\n cursor: pointer;\n position: relative;\n width: 1"
},
{
"path": "src/css/css-camera.ts",
"chars": 467,
"preview": "import { css } from 'lit';\n\nconst cameraStyle = css`\n .camera-container {\n margin-top: 10px;\n width: 100%;\n di"
},
{
"path": "src/css/css-meteoalarm.ts",
"chars": 641,
"preview": "import { css } from 'lit';\n\nconst meteodcpalarmStyle = css`\n.meteodcpalarm-grid-container {\n display: flex;\n flex-wrap"
},
{
"path": "src/css/css-pollen.ts",
"chars": 1346,
"preview": "import { css } from 'lit';\n\nconst pollenStyle = css`\n.pollen-grid-container {\n display: grid;\n grid-template-columns: "
},
{
"path": "src/css/css-present.ts",
"chars": 564,
"preview": "import { css } from 'lit';\n\nconst presentStyle = css`\n.present-grid-container {\n display: flex;\n flex-direction: colum"
},
{
"path": "src/css/css-summary.ts",
"chars": 4215,
"preview": "import { css } from 'lit';\n\nconst summaryStyle = css`\n\n.summary-grid-container {\n position: relative;\n z-index: 1;\n d"
},
{
"path": "src/css/css-ultraviolet.ts",
"chars": 1688,
"preview": "import { css } from 'lit';\n\nconst ultravioletStyle = css`\n.ultraviolet-grid-container {\n display: flex;\n flex-directio"
},
{
"path": "src/css/css-weather-forecast.ts",
"chars": 1483,
"preview": "import { css } from 'lit';\n\nconst weatherForecastStyle = css`\n\n.weather-forecast-grid-container {\n display: grid;\n gri"
},
{
"path": "src/ha-weather-ecard.ts",
"chars": 4626,
"preview": "/* eslint-disable no-underscore-dangle */\nimport { html, TemplateResult } from 'lit';\nimport { customElement } from 'lit"
},
{
"path": "src/iconmodels/im-buienradar.ts",
"chars": 2059,
"preview": "// clear=ok, partlycloudy=ok, cloudy=ok, partlycloudy-fog=ok, partlycloudy-light-rain=ok, partlycloudy-rain=ok,\n// light"
},
{
"path": "src/iconmodels/im-climacell.ts",
"chars": 3057,
"preview": "export const cwcClimacellDayIcons: { [key: string]: string; } = {\n freezing_rain_heavy: 'rainy-3',\n 'heavy freezing ra"
},
{
"path": "src/iconmodels/im-darksky.ts",
"chars": 529,
"preview": "export const cwcDarkskyDayIcons: { [key: string]: string; } = {\n clear: 'day',\n 'clear-day': 'day',\n rain: 'rainy-2',"
},
{
"path": "src/iconmodels/im-hass.ts",
"chars": 595,
"preview": "export const cwcDefaultHassDayIcons: { [key: string]: string } = {\n cloudy: 'cloudy-day-3',\n exceptional: 'severe-thun"
},
{
"path": "src/iconmodels/im-openweathermap.ts",
"chars": 564,
"preview": "export const cwcOpenWeatherMapDayIcons: { [key: string]: string; } = {\n 'clear sky': 'day',\n 'few clouds': 'cloudy-day"
},
{
"path": "src/iconmodels/im-pirateweather.ts",
"chars": 3216,
"preview": "// Pirate Weather Icons\n// clear-day, clear-night, rain, snow, sleet, wind, fog, cloudy, partly-cloudy-day and partly-cl"
},
{
"path": "src/templates/t-camera.ts",
"chars": 547,
"preview": "import { html } from 'lit';\n\nconst renderCamera = (\n handlePopup: (e: Event, entityId: string) => void,\n cameraId: str"
},
{
"path": "src/templates/t-meteoalarm.ts",
"chars": 842,
"preview": "import { html } from 'lit';\n\nexport interface iWeatherMeteoDPCAlarmDataInterface {\n event?: string,\n severity?: string"
},
{
"path": "src/templates/t-pollen.ts",
"chars": 1304,
"preview": "import { html } from 'lit';\n\nexport interface iPollenData {\n name: string;\n value: number;\n}\n\nconst LEVEL_NAMES = ['ba"
},
{
"path": "src/templates/t-present.ts",
"chars": 5260,
"preview": "import { html } from 'lit';\nimport { getLocale, parseLocalizedNumber } from '../utils/helper';\n\nexport interface iRender"
},
{
"path": "src/templates/t-summary.ts",
"chars": 3943,
"preview": "import { html, nothing } from 'lit';\n\nexport interface WeatherSummaryInterface {\n title?: string;\n moonText?: string |"
},
{
"path": "src/templates/t-ultraviolet.ts",
"chars": 3789,
"preview": "import { html } from 'lit';\n\nexport interface RenderDataItem {\n value?: number | string | Date;\n unit?: string;\n icon"
},
{
"path": "src/templates/t-weather-forecast.ts",
"chars": 4687,
"preview": "/* eslint-disable max-len */\n/* eslint-disable camelcase */\nimport { html } from 'lit';\n\nexport interface iForecastDataI"
},
{
"path": "src/utils/colors.ts",
"chars": 2033,
"preview": "import { css } from 'lit';\nimport * as Color from 'color';\n\nexport const COLORS = [\n 'primary',\n 'accent',\n 'red',\n "
},
{
"path": "src/utils/config-schema.ts",
"chars": 3532,
"preview": "export interface iLovelaceCardConfig {\n index?: number; // Indice della card all'interno della vista (opzionale).\n vie"
},
{
"path": "src/utils/const.ts",
"chars": 1072,
"preview": "export const logo: string = '%c WEATHER-CONDITION-CARD %c 2.0.0';\n\nexport const hacsImagePath: string = '/local/communit"
},
{
"path": "src/utils/helper-render.ts",
"chars": 2178,
"preview": "import { css } from 'lit';\n// import { HomeAssistant } from 'custom-card-helpers/dist';\n\nimport { cwcMoonPhaseIcons } fr"
},
{
"path": "src/utils/helper.ts",
"chars": 7914,
"preview": "/* eslint-disable camelcase */\nimport { HomeAssistant } from 'custom-card-helpers/dist';\nimport { iconsModels } from '.."
},
{
"path": "tsconfig.json",
"chars": 703,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"es2020\",\n \"module\": \"esnext\",\n \"moduleResolution\": \"node\",\n \"lib\": [\"es"
}
]
About this extraction
This page contains the full source code of the r-renato/ha-card-weather-conditions GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 63 files (518.5 KB), approximately 255.0k tokens, and a symbol index with 170 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.