Full Code of inket/stts for AI

master 2bd78c67e090 cached
167 files
17.1 MB
911.6k tokens
13 symbols
1 requests
Download .txt
Showing preview only (3,647K chars total). Download the full file or copy to clipboard to get everything.
Repository: inket/stts
Branch: master
Commit: 2bd78c67e090
Files: 167
Total size: 17.1 MB

Directory structure:
gitextract_a2ozbqvp/

├── .bundle/
│   └── config
├── .gitattributes
├── .gitignore
├── .swiftlint.yml
├── Cartfile
├── Cartfile.resolved
├── Gemfile
├── LICENSE
├── README.md
├── Resources/
│   ├── AppIcon.icon/
│   │   └── icon.json
│   ├── Assets.xcassets/
│   │   └── Contents.json
│   ├── Base.lproj/
│   │   └── MainMenu.xib
│   ├── Info.plist
│   └── services.json
├── Scripts/
│   ├── generate_adobe_services.swift
│   ├── generate_apple_services.swift
│   ├── generate_aws_services.swift
│   ├── generate_azure_devops_services.swift
│   ├── generate_azure_services.swift
│   ├── generate_google_services.swift
│   ├── generate_salesforce_services.swift
│   └── generate_services_plist.sh
├── extract.rb
├── openai.html
├── sort.rb
├── stts/
│   ├── AppDelegate.swift
│   ├── AppearanceObserver.swift
│   ├── BottomBar.swift
│   ├── CustomScrollView.swift
│   ├── DataLoader.swift
│   ├── EditorTableView/
│   │   └── EditorTableCell.swift
│   ├── Extensions/
│   │   ├── Atomic.swift
│   │   ├── NSScreenExtensions.swift
│   │   ├── StringExtensions.swift
│   │   └── TaskExtensions.swift
│   ├── HeadlessHTMLRenderer.swift
│   ├── Icons.swift
│   ├── Preferences/
│   │   ├── PreferencesGeneralView.swift
│   │   ├── PreferencesServicesView.swift
│   │   └── PreferencesWindow.swift
│   ├── Preferences.swift
│   ├── PreferencesWindow/
│   │   ├── NSAppearance+Extensions.swift
│   │   ├── PreferencesAboutView.swift
│   │   ├── PreferencesSidebarMenu.swift
│   │   └── PreferencesWindowController.swift
│   ├── ServiceLoader/
│   │   ├── AppDefinedServiceDefinitionProvider.swift
│   │   ├── BundleServiceDefinitionProvider.swift
│   │   ├── ServiceDefinition.swift
│   │   ├── ServiceDefinitionProvider.swift
│   │   ├── ServiceLoader.swift
│   │   ├── ServicesStructure.swift
│   │   └── UserDefinedServiceDefinitionProvider.swift
│   ├── ServiceTableView/
│   │   ├── ServiceTableRowView.swift
│   │   ├── ServiceTableViewController.swift
│   │   ├── StatusIndicator.swift
│   │   └── StatusTableCell.swift
│   ├── Services/
│   │   ├── Algolia.swift
│   │   ├── AzureAll.swift
│   │   ├── AzureDevOpsAll.swift
│   │   ├── Beanstalk.swift
│   │   ├── Broadcom.swift
│   │   ├── Evernote.swift
│   │   ├── Fastly.swift
│   │   ├── Firebase.swift
│   │   ├── Generated/
│   │   │   ├── AWSServices.swift
│   │   │   ├── AdobeServices.swift
│   │   │   ├── AppleServices.swift
│   │   │   ├── AzureDevOpsServices.swift
│   │   │   ├── AzureServices.swift
│   │   │   ├── FirebaseServices.swift
│   │   │   ├── GoogleCloudPlatformServices.swift
│   │   │   └── SalesforceProducts.swift
│   │   ├── GoogleCloudPlatformAll.swift
│   │   ├── MiroAll.swift
│   │   ├── Okta.swift
│   │   ├── OracleNetSuite.swift
│   │   ├── PagerDuty/
│   │   │   └── PagerDuty.swift
│   │   ├── PayPal/
│   │   │   ├── PayPalAPIProduction.swift
│   │   │   ├── PayPalAPISandbox.swift
│   │   │   ├── PayPalProductProduction.swift
│   │   │   └── PayPalProductSandbox.swift
│   │   ├── PlayStation Network/
│   │   │   ├── PSNAmerica.swift
│   │   │   ├── PSNAsia.swift
│   │   │   └── PSNEurope.swift
│   │   ├── SendbirdAll.swift
│   │   ├── SignalWire.swift
│   │   ├── Slack.swift
│   │   ├── Stripe.swift
│   │   ├── Super/
│   │   │   ├── AWSService.swift
│   │   │   ├── AWSStore.swift
│   │   │   ├── Adobe.swift
│   │   │   ├── AdobeStore.swift
│   │   │   ├── Apple.swift
│   │   │   ├── AppleDeveloper.swift
│   │   │   ├── AppleStore.swift
│   │   │   ├── Azure.swift
│   │   │   ├── AzureDevOps.swift
│   │   │   ├── AzureDevOpsStore.swift
│   │   │   ├── AzureStore.swift
│   │   │   ├── BetterStackService.swift
│   │   │   ├── BetterUptimeService.swift
│   │   │   ├── CStateService.swift
│   │   │   ├── CachetService.swift
│   │   │   ├── ExanaService.swift
│   │   │   ├── FirebaseService.swift
│   │   │   ├── FirebaseStatusDashboardStore.swift
│   │   │   ├── GoogleCloudPlatform.swift
│   │   │   ├── GoogleStatusDashboardStore.swift
│   │   │   ├── IncidentIOService.swift
│   │   │   ├── IndependentService.swift
│   │   │   ├── InstatusService.swift
│   │   │   ├── LambStatusService.swift
│   │   │   ├── MiroService.swift
│   │   │   ├── PagerDutyService.swift
│   │   │   ├── PayPal.swift
│   │   │   ├── PlayStationNetwork.swift
│   │   │   ├── Salesforce.swift
│   │   │   ├── SalesforceCategories.swift
│   │   │   ├── SalesforceStore.swift
│   │   │   ├── SendbirdService.swift
│   │   │   ├── Service.swift
│   │   │   ├── ServiceStore.swift
│   │   │   ├── Site24x7Service.swift
│   │   │   ├── SorryService.swift
│   │   │   ├── StatusCakeService.swift
│   │   │   ├── StatusCastService.swift
│   │   │   ├── StatusHubService.swift
│   │   │   ├── StatusPageService.swift
│   │   │   ├── StatusioV1Service.swift
│   │   │   ├── StatuspalService.swift
│   │   │   └── UptimeDotComService.swift
│   │   ├── UptimeDotCom/
│   │   │   ├── JSDelivr.swift
│   │   │   ├── Recurly.swift
│   │   │   └── UptimeDotCom.swift
│   │   └── Zendesk.swift
│   ├── SwitchableTableViewController.swift
│   └── stts.entitlements
├── stts.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── swiftpm/
│   │           └── Package.resolved
│   └── xcshareddata/
│       └── xcschemes/
│           └── stts.xcscheme
└── sttsTests/
    ├── AdobeTests.swift
    ├── BetterStackTests.swift
    ├── Helpers/
    │   └── TestBundle.swift
    ├── IncidentIOTests.swift
    ├── Info.plist
    ├── InstatusTests.swift
    ├── MiroTests.swift
    ├── Mocks/
    │   ├── ResponseOverridingURLSession.swift
    │   └── ResponseSizeTrackingURLSession.swift
    ├── PagerDutyTests.swift
    ├── Resources/
    │   ├── adobe-analytics-minor.json
    │   ├── aiven-minor.html
    │   ├── buildjet-good.html
    │   ├── eyloo-major.html
    │   ├── linear-good.html
    │   ├── mastodonsocial-major.html
    │   ├── miro-good.html
    │   ├── miro-issue.html
    │   ├── openai-major.html
    │   ├── pagerduty-good.html
    │   ├── pagerduty-minor.html
    │   ├── rollbar-good.html
    │   └── whereby-good.html
    ├── StringExtensionsTests.swift
    └── sttsTests.swift

================================================
FILE CONTENTS
================================================

================================================
FILE: .bundle/config
================================================
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_FORCE_RUBY_PLATFORM: "true"


================================================
FILE: .gitattributes
================================================
sttsTests/Resources/** linguist-vendored


================================================
FILE: .gitignore
================================================

# Created by https://www.gitignore.io/api/swift

### Swift ###
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## Build generated
build/
DerivedData/

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/

## Other
*.moved-aside
*.xcuserstate

## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM

## Playgrounds
timeline.xctimeline
playground.xcworkspace

# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
.build/

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
Carthage/Checkouts
Carthage/Build

# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

# Ignore App Store assets (screenshots)
App Store

# Ruby vendor
vendor

# Claude
CLAUDE.md
.claude/


================================================
FILE: .swiftlint.yml
================================================
excluded:
  - Pods
  - Carthage
line_length:
    warning: 120
    ignores_comments: true
    ignores_interpolated_strings: true
disabled_rules:
  - type_body_length
  - function_body_length
  - nesting
  - identifier_name
  - file_length
  - for_where
  - blanket_disable_command


================================================
FILE: Cartfile
================================================
github "inket/StartAtLogin"


================================================
FILE: Cartfile.resolved
================================================
github "inket/StartAtLogin" "v6.0.0"


================================================
FILE: Gemfile
================================================
source 'https://rubygems.org'

gem 'xcodeproj'
gem 'synx'


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2016 Mahdi Bchetnia

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
================================================
## stts ![](https://img.shields.io/badge/Swift-5-orange.svg)

stts is a macOS app for monitoring the status of cloud services.

<img src="https://i.imgur.com/OAK3hR0.png" width="218" height="324" />

With a click of the menubar icon, you can see the status of your favorite services. You can also be notified when a service goes down or gets restored.

stts is designed to be unobtrusive, only giving you the information you need and allowing you to access the status page with a single click.

stts can be downloaded from the Mac App Store [here](https://itunes.apple.com/app/stts/id1187772509?l=en&mt=12).

### Support the project

<a href="https://www.buymeacoffee.com/mahdibchatnia" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="48" width="173" ></a>

### Contribute

Most services can be added automatically with the included extract script:

```sh
# If you haven't already, clone the repo
git clone https://github.com/inket/stts.git
cd stts

# Install dependencies and run the extract script
bundle install
bundle exec ruby extract.rb <url>

# Example:
bundle exec ruby extract.rb https://status.notion.so/
```

For services that cannot be added with the script, feel free to create an issue.

#### Contact

[@inket](https://github.com/inket) / [@inket](https://twitter.com/inket) on Twitter / [mahdi.jp](https://mahdi.jp)


================================================
FILE: Resources/AppIcon.icon/icon.json
================================================
{
  "fill" : {
    "linear-gradient" : [
      "display-p3:0.27726,0.27726,0.27726,1.00000",
      "display-p3:0.18033,0.18033,0.18033,1.00000"
    ]
  },
  "groups" : [
    {
      "blend-mode" : "normal",
      "blur-material" : null,
      "hidden" : false,
      "layers" : [
        {
          "blend-mode" : "normal",
          "fill-specializations" : [
            {
              "value" : {
                "linear-gradient" : [
                  "display-p3:0.99663,0.99663,0.99663,1.00000",
                  "display-p3:0.89697,0.89697,0.89697,1.00000"
                ]
              }
            },
            {
              "appearance" : "dark",
              "value" : {
                "linear-gradient" : [
                  "display-p3:0.99663,0.99663,0.99663,1.00000",
                  "display-p3:0.89697,0.89697,0.89697,1.00000"
                ]
              }
            }
          ],
          "glass" : true,
          "hidden" : false,
          "image-name" : "noun-activity-680031.svg",
          "name" : "noun-activity-680031",
          "opacity" : 0.9,
          "position" : {
            "scale" : 6,
            "translation-in-points" : [
              30,
              90
            ]
          }
        }
      ],
      "lighting" : "individual",
      "shadow" : {
        "kind" : "neutral",
        "opacity" : 0.5
      },
      "specular" : false,
      "translucency" : {
        "enabled" : false,
        "value" : 0.5
      }
    }
  ],
  "supported-platforms" : {
    "circles" : [
      "watchOS"
    ],
    "squares" : "shared"
  }
}

================================================
FILE: Resources/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Resources/Base.lproj/MainMenu.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="16097" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
    <dependencies>
        <deployment identifier="macosx"/>
        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16097"/>
    </dependencies>
    <objects>
        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
            <connections>
                <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
            </connections>
        </customObject>
        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
        <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="stts" customModuleProvider="target"/>
        <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
        <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
            <items>
                <menuItem title="stts" id="1Xt-HY-uBw">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="stts" systemMenu="apple" id="uQy-DD-JDr">
                        <items>
                            <menuItem title="About stts" id="5kV-Vb-QxS">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
                                </connections>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
                            <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
                            <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
                            <menuItem title="Services" id="NMo-om-nkz">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
                            <menuItem title="Hide stts" keyEquivalent="h" id="Olw-nP-bQN">
                                <connections>
                                    <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
                                <connections>
                                    <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Show All" id="Kd2-mp-pUS">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
                                </connections>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
                            <menuItem title="Quit stts" keyEquivalent="q" id="4sb-4s-VLi">
                                <connections>
                                    <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
                                </connections>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
                <menuItem title="File" id="dMs-cI-mzQ">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="File" id="bib-Uj-vzu">
                        <items>
                            <menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
                                <connections>
                                    <action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
                                <connections>
                                    <action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Open Recent" id="tXI-mr-wws">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
                                    <items>
                                        <menuItem title="Clear Menu" id="vNY-rz-j42">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
                            <menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
                                <connections>
                                    <action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
                                <connections>
                                    <action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
                                <connections>
                                    <action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
                                <connections>
                                    <action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
                                </connections>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
                            <menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
                                <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
                                <connections>
                                    <action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
                                <connections>
                                    <action selector="print:" target="-1" id="qaZ-4w-aoO"/>
                                </connections>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
                <menuItem title="Edit" id="5QF-Oa-p0T">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="Edit" id="W48-6f-4Dl">
                        <items>
                            <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
                                <connections>
                                    <action selector="undo:" target="-1" id="M6e-cu-g7V"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
                                <connections>
                                    <action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
                                </connections>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
                            <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
                                <connections>
                                    <action selector="cut:" target="-1" id="YJe-68-I9s"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
                                <connections>
                                    <action selector="copy:" target="-1" id="G1f-GL-Joy"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
                                <connections>
                                    <action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
                                <connections>
                                    <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Delete" id="pa3-QI-u2k">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
                                <connections>
                                    <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
                                </connections>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
                            <menuItem title="Find" id="4EN-yA-p0u">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Find" id="1b7-l0-nxx">
                                    <items>
                                        <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
                                            <connections>
                                                <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
                                            <connections>
                                                <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
                                            <connections>
                                                <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
                                            <connections>
                                                <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
                                            <connections>
                                                <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
                                            <connections>
                                                <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                            <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
                                    <items>
                                        <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
                                            <connections>
                                                <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
                                            <connections>
                                                <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
                                        <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                            <menuItem title="Substitutions" id="9ic-FL-obx">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
                                    <items>
                                        <menuItem title="Show Substitutions" id="z6F-FW-3nz">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
                                        <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Smart Quotes" id="hQb-2v-fYv">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Smart Dashes" id="rgM-f4-ycn">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Smart Links" id="cwL-P1-jid">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Data Detectors" id="tRr-pd-1PS">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Text Replacement" id="HFQ-gK-NFA">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                            <menuItem title="Transformations" id="2oI-Rn-ZJC">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
                                    <items>
                                        <menuItem title="Make Upper Case" id="vmV-6d-7jI">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Make Lower Case" id="d9M-CD-aMd">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Capitalize" id="UEZ-Bs-lqG">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                            <menuItem title="Speech" id="xrE-MZ-jX0">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
                                    <items>
                                        <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
                <menuItem title="Format" id="jxT-CU-nIS">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="Format" id="GEO-Iw-cKr">
                        <items>
                            <menuItem title="Font" id="Gi5-1S-RQB">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
                                    <items>
                                        <menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
                                            <connections>
                                                <action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
                                            <connections>
                                                <action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
                                            <connections>
                                                <action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
                                            <connections>
                                                <action selector="underline:" target="-1" id="FYS-2b-JAY"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
                                        <menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
                                            <connections>
                                                <action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
                                            <connections>
                                                <action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
                                        <menuItem title="Kern" id="jBQ-r6-VK2">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <menu key="submenu" title="Kern" id="tlD-Oa-oAM">
                                                <items>
                                                    <menuItem title="Use Default" id="GUa-eO-cwY">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Use None" id="cDB-IK-hbR">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Tighten" id="46P-cB-AYj">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Loosen" id="ogc-rX-tC1">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
                                                        </connections>
                                                    </menuItem>
                                                </items>
                                            </menu>
                                        </menuItem>
                                        <menuItem title="Ligatures" id="o6e-r0-MWq">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
                                                <items>
                                                    <menuItem title="Use Default" id="agt-UL-0e3">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Use None" id="J7y-lM-qPV">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Use All" id="xQD-1f-W4t">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
                                                        </connections>
                                                    </menuItem>
                                                </items>
                                            </menu>
                                        </menuItem>
                                        <menuItem title="Baseline" id="OaQ-X3-Vso">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <menu key="submenu" title="Baseline" id="ijk-EB-dga">
                                                <items>
                                                    <menuItem title="Use Default" id="3Om-Ey-2VK">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Superscript" id="Rqc-34-cIF">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Subscript" id="I0S-gh-46l">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Raise" id="2h7-ER-AoG">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem title="Lower" id="1tx-W0-xDw">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
                                                        </connections>
                                                    </menuItem>
                                                </items>
                                            </menu>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
                                        <menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
                                            <connections>
                                                <action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
                                        <menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
                                            <connections>
                                                <action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
                                            <connections>
                                                <action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                            <menuItem title="Text" id="Fal-I4-PZk">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <menu key="submenu" title="Text" id="d9c-me-L2H">
                                    <items>
                                        <menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
                                            <connections>
                                                <action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
                                            <connections>
                                                <action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Justify" id="J5U-5w-g23">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
                                            <connections>
                                                <action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
                                        <menuItem title="Writing Direction" id="H1b-Si-o9J">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
                                                <items>
                                                    <menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                    </menuItem>
                                                    <menuItem id="YGs-j5-SAR">
                                                        <string key="title">	Default</string>
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem id="Lbh-J2-qVU">
                                                        <string key="title">	Left to Right</string>
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem id="jFq-tB-4Kx">
                                                        <string key="title">	Right to Left</string>
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
                                                    <menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                    </menuItem>
                                                    <menuItem id="Nop-cj-93Q">
                                                        <string key="title">	Default</string>
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem id="BgM-ve-c93">
                                                        <string key="title">	Left to Right</string>
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
                                                        </connections>
                                                    </menuItem>
                                                    <menuItem id="RB4-Sm-HuC">
                                                        <string key="title">	Right to Left</string>
                                                        <modifierMask key="keyEquivalentModifierMask"/>
                                                        <connections>
                                                            <action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
                                                        </connections>
                                                    </menuItem>
                                                </items>
                                            </menu>
                                        </menuItem>
                                        <menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
                                        <menuItem title="Show Ruler" id="vLm-3I-IUL">
                                            <modifierMask key="keyEquivalentModifierMask"/>
                                            <connections>
                                                <action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
                                            <connections>
                                                <action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
                                            </connections>
                                        </menuItem>
                                        <menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
                                            <connections>
                                                <action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
                                            </connections>
                                        </menuItem>
                                    </items>
                                </menu>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
                <menuItem title="View" id="H8h-7b-M4v">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="View" id="HyV-fh-RgO">
                        <items>
                            <menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
                                <connections>
                                    <action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
                                </connections>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
                <menuItem title="Window" id="aUF-d1-5bR">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
                        <items>
                            <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
                                <connections>
                                    <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
                                </connections>
                            </menuItem>
                            <menuItem title="Zoom" id="R4o-n2-Eq4">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
                                </connections>
                            </menuItem>
                            <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
                            <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
                                <modifierMask key="keyEquivalentModifierMask"/>
                                <connections>
                                    <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
                                </connections>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
                <menuItem title="Help" id="wpr-3q-Mcd">
                    <modifierMask key="keyEquivalentModifierMask"/>
                    <menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
                        <items>
                            <menuItem title="stts Help" keyEquivalent="?" id="FKE-Sm-Kum">
                                <connections>
                                    <action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
                                </connections>
                            </menuItem>
                        </items>
                    </menu>
                </menuItem>
            </items>
            <point key="canvasLocation" x="139" y="154"/>
        </menu>
    </objects>
</document>


================================================
FILE: Resources/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIconFile</key>
	<string>AppIcon.icon</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>$(MARKETING_VERSION)</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>$(CURRENT_PROJECT_VERSION)</string>
	<key>ITSAppUsesNonExemptEncryption</key>
	<false/>
	<key>LSApplicationCategoryType</key>
	<string>public.app-category.utilities</string>
	<key>LSMinimumSystemVersion</key>
	<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
	<key>LSUIElement</key>
	<true/>
	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSExceptionDomains</key>
		<dict>
			<key>status.aws.amazon.com</key>
			<dict>
				<key>NSExceptionMinimumTLSVersion</key>
				<string>TLSv1.0</string>
				<key>NSExceptionRequiresForwardSecrecy</key>
				<false/>
			</dict>
			<key>status.beanstalkapp.com</key>
			<dict>
				<key>NSExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
			<key>status.evernote.com</key>
			<dict>
				<key>NSExceptionAllowsInsecureHTTPLoads</key>
				<true/>
			</dict>
		</dict>
	</dict>
	<key>NSHumanReadableCopyright</key>
	<string>Copyright © 2016 Mahdi Bchetnia. All rights reserved.</string>
	<key>NSMainNibFile</key>
	<string>MainMenu</string>
	<key>NSPrincipalClass</key>
	<string>NSApplication</string>
</dict>
</plist>


================================================
FILE: Resources/services.json
================================================
{
  "betterstack": [
    {
      "name": "Better Stack",
      "url": "https://status.betterstack.com",
      "old_names": [
        "BetterStack"
      ]
    },
    {
      "name": "BuildJet",
      "url": "https://status.buildjet.com"
    },
    {
      "name": "Keygen",
      "url": "https://status.keygen.sh"
    },
    {
      "name": "Runway: App Store Connect",
      "url": "https://runway-asc.betteruptime.com",
      "old_names": [
        "RunwayASC"
      ]
    },
    {
      "name": "Unraid",
      "url": "https://status.unraid.net"
    }
  ],
  "betteruptime": [
    {
      "name": "Plausible Analytics",
      "url": "https://status.plausible.io",
      "old_names": [
        "PlausibleAnalytics"
      ]
    },
    {
      "name": "Runway",
      "url": "https://status.runway.team"
    },
  ],
  "cstate": [
    {
      "name": "Civo",
      "url": "https://status.civo.com/"
    }
  ],
  "incidentio": [
    {
      "name": "Aiven",
      "url": "https://status.aiven.io"
    },
    {
      "name": "Brevo",
      "url": "https://status.brevo.com",
      "old_names": [
        "Sendinblue"
      ]
    },
    {
      "name": "Code Climate",
      "url": "https://status.codeclimate.com",
      "old_names": [
        "CodeClimate"
      ]
    },
    {
      "name": "HashiCorp",
      "url": "https://status.hashicorp.com"
    },
    {
      "name": "Intercom - AU Hosting",
      "url": "https://www.intercomstatus.com/au-hosting",
      "old_names": [
        "IntercomAU"
      ]
    },
    {
      "name": "Intercom - EU Hosting",
      "url": "https://www.intercomstatus.com/eu-hosting",
      "old_names": [
        "IntercomEU"
      ]
    },
    {
      "name": "Intercom - US Hosting",
      "url": "https://www.intercomstatus.com/us-hosting",
      "old_names": [
        "IntercomUS",
        "Intercom"
      ]
    },
    {
      "name": "Linear",
      "url": "https://linearstatus.com"
    },
    {
      "name": "OneSignal",
      "url": "https://status.onesignal.com"
    },
    {
      "name": "OpenAI",
      "url": "https://status.openai.com"
    },
    {
      "name": "Rollbar",
      "url": "https://status.rollbar.com"
    },
    {
      "name": "Strategic Roadmaps",
      "url": "https://status.roadmunk.com",
      "old_names": [
        "Roadmunk"
      ]
    },
    {
      "name": "Tempo",
      "url": "https://status.tempo.io"
    },
    {
      "name": "Zapier",
      "url": "https://status.zapier.com"
    }
  ],
  "instatus": [
    {
      "name": "Bitmovin",
      "url": "https://status.bitmovin.com"
    },
    {
      "name": "Instatus",
      "url": "https://instat.us"
    },
    {
      "name": "Primcloud",
      "url": "https://primcloud.instatus.com"
    },
    {
      "name": "Railway",
      "url": "https://status.railway.app"
    },
    {
      "name": "Sketch",
      "url": "https://status.sketch.com"
    },
    {
      "name": "Threader",
      "url": "https://threader.instatus.com"
    },
    {
      "name": "Whereby",
      "url": "https://wherebystatus.com"
    },
    {
      "name": "mastodon.social",
      "url": "https://status.mastodon.social",
      "old_names": [
        "MastodonSocial"
      ]
    }
  ],
  "lamb": [
    {
      "name": "Codacy",
      "url": "https://status.codacy.com"
    }
  ],
  "miro": [
    {
      "name": "Miro (AU)",
      "url": "https://status.miro.com/au",
      "subservice": true
    },
    {
      "name": "Miro (EU)",
      "url": "https://status.miro.com/eu",
      "subservice": true
    },
    {
      "name": "Miro (US)",
      "url": "https://status.miro.com/us",
      "subservice": true
    }
  ],
  "site24x7": [
    {
      "name": "Canonical",
      "url": "https://status.canonical.com",
      "id": "KNms6QK9ewuzz-7xUsPsN927u5djVcb3oZX1-zOu_go="
    },
    {
      "name": "Site24x7",
      "url": "https://status.site24x7.com",
      "id": "7Ca9wFlVF-AlbjpE2tzER6FUegHamCQNyZF5CbAffCs="
    }
  ],
  "sorry": [
    {
      "name": "Pingdom",
      "url": "https://status.pingdom.com",
      "id": "2273"
    },
    {
      "name": "Pipedrive",
      "url": "https://status.pipedrive.com",
      "id": "2754"
    },
    {
      "name": "Postmark",
      "url": "https://status.postmarkapp.com",
      "id": "12903"
    }
  ],
  "statusiov1": [
    {
      "name": "ClickUp",
      "url": "https://status.clickup.com",
      "id": "5b6e0963c662144d00913a09"
    },
    {
      "name": "CoreWeave",
      "url": "https://status.coreweave.com",
      "id": "5e126e998f2f032e1f8f0f4b"
    },
    {
      "name": "Dashlane",
      "url": "https://status.dashlane.com",
      "id": "5aabcb89fccc4b04d3774443"
    },
    {
      "name": "Docker",
      "url": "https://status.docker.com",
      "id": "533c6539221ae15e3f000031"
    },
    {
      "name": "GitLab",
      "url": "https://status.gitlab.com",
      "id": "5b36dc6502d06804c08349f7"
    },
    {
      "name": "Let's Encrypt",
      "url": "https://letsencrypt.status.io",
      "id": "55957a99e800baa4470002da",
      "old_names": [
        "LetsEncrypt"
      ]
    },
    {
      "name": "OneLogin (EU)",
      "url": "https://status.eu.onelogin.com",
      "id": "54da2ea0e6bd61bf0d00002b",
      "old_names": [
        "OneLoginEU"
      ]
    },
    {
      "name": "OneLogin (US)",
      "url": "https://status.us.onelogin.com",
      "id": "538511e2ce5cb97537000144",
      "old_names": [
        "OneLoginUS"
      ]
    },
    {
      "name": "Roblox",
      "url": "https://status.roblox.com",
      "id": "59db90dbcdeb2f04dadcf16d"
    },
    {
      "name": "SumoLogic",
      "url": "https://status.sumologic.com",
      "id": "5ea1c7ba3f2f1604b93ca38e"
    }
  ],
  "statuscake": [
    {
      "name": "MailChimp",
      "url": "https://status.mailchimp.com",
      "id": "58JncZazfp"
    }
  ],
  "statuscast": [
    {
      "name": "8x8",
      "url": "https://status.8x8.com",
      "hasCurrentStatus": false,
      "old_names": [
        "EightXEight"
      ]
    },
    {
      "name": "Airship (EU)",
      "url": "https://status.airship.eu",
      "hasCurrentStatus": true,
      "old_names": [
        "AirshipEU"
      ]
    },
    {
      "name": "Airship (US)",
      "url": "https://status.airship.com",
      "hasCurrentStatus": true,
      "old_names": [
        "AirshipUS",
        "UrbanAirship"
      ]
    },
    {
      "name": "Campaign Monitor",
      "url": "https://status.campaignmonitor.com",
      "hasCurrentStatus": true,
      "old_names": [
        "CampaignMonitor"
      ]
    },
    {
      "name": "StatusCast",
      "url": "https://status.statuscast.com",
      "hasCurrentStatus": false
    }
  ],
  "statushub": [
    {
      "name": "WP Engine",
      "url": "https://wpenginestatus.com",
      "old_names": [
        "WPEngine"
      ]
    }
  ],
  "statuspage": [
    {
      "name": "1Password",
      "url": "https://1password.statuspage.io",
      "id": "z5s8xghvb0vf",
      "old_names": [
        "OnePassword"
      ]
    },
    {
      "name": "Acoustic",
      "url": "https://status.goacoustic.com",
      "id": "rx9084q34820"
    },
    {
      "name": "Acquia",
      "url": "https://status.acquia.com",
      "id": "c3bdbqpxhzcc"
    },
    {
      "name": "Airbase",
      "url": "https://status.airbase.com",
      "id": "pc6tsj7kht1c"
    },
    {
      "name": "Alert Logic",
      "url": "https://status.alertlogic.com",
      "id": "bkbjcmdhhfbp",
      "old_names": [
        "AlertLogic"
      ]
    },
    {
      "name": "Anthropic",
      "url": "https://status.anthropic.com",
      "id": "tymt9n04zgry"
    },
    {
      "name": "Aptible",
      "url": "https://status.aptible.com",
      "id": "fmwgqnbnbc4r"
    },
    {
      "name": "Asana",
      "url": "https://trust.asana.com",
      "id": "w58858w0sjxx"
    },
    {
      "name": "Atlassian Access",
      "url": "https://access.status.atlassian.com",
      "id": "5qmgwsxwsz78",
      "old_names": [
        "AtlassianAccess"
      ]
    },
    {
      "name": "Atlassian Developer",
      "url": "https://developer.status.atlassian.com",
      "id": "n8766lc3ybbs",
      "old_names": [
        "AtlassianDeveloper"
      ]
    },
    {
      "name": "Atlassian Partners",
      "url": "https://partners.status.atlassian.com",
      "id": "tfc0vzc0cq1n",
      "old_names": [
        "AtlassianPartners"
      ]
    },
    {
      "name": "Atlassian Statuspage",
      "url": "https://metastatuspage.com",
      "id": "y2j98763l56x",
      "host": "metastatuspage.com",
      "old_names": [
        "StatusPage",
        "Statuspage"
      ]
    },
    {
      "name": "Atlassian Support",
      "url": "https://support.status.atlassian.com",
      "id": "3tbw4lb9t3qp",
      "old_names": [
        "AtlassianSupport"
      ]
    },
    {
      "name": "AuroraSolar",
      "url": "https://status.aurorasolar.com",
      "id": "vbgjcnqcyyw7"
    },
    {
      "name": "Auth0",
      "url": "https://status.auth0.com",
      "id": "8q60stg1rk7l"
    },
    {
      "name": "Authorize.Net",
      "url": "https://status.authorize.net",
      "id": "06v575cbzlpr",
      "old_names": [
        "AuthorizeNet"
      ]
    },
    {
      "name": "Avalara",
      "url": "https://status.avalara.com",
      "id": "m10fpsk86bhy"
    },
    {
      "name": "Basecamp",
      "url": "https://www.basecampstatus.com",
      "id": "thc30769z1m9"
    },
    {
      "name": "BigCommerce",
      "url": "https://status.bigcommerce.com",
      "id": "qbn4dyd29jby"
    },
    {
      "name": "Bitbucket",
      "url": "https://bitbucket.status.atlassian.com",
      "id": "bqlf8qjztdtr",
      "old_names": [
        "BitBucket"
      ]
    },
    {
      "name": "Bitrise",
      "url": "https://status.bitrise.io",
      "id": "1q8r4n02vb2k"
    },
    {
      "name": "Blend",
      "url": "https://status.blend.com",
      "id": "wp6n3nr9gm7w"
    },
    {
      "name": "Bolt",
      "url": "https://status.bolt.com",
      "id": "hgyc600tg2jq"
    },
    {
      "name": "Box",
      "url": "https://status.box.com",
      "id": "208q92hckwws"
    },
    {
      "name": "Branch",
      "url": "https://status.branch.io",
      "id": "74brn6fz1jt2"
    },
    {
      "name": "Bugsnag",
      "url": "https://status.bugsnag.com",
      "id": "6xl1gdp6yn0x"
    },
    {
      "name": "Buildkite",
      "url": "https://www.buildkitestatus.com",
      "id": "ltljpr68dygn"
    },
    {
      "name": "Bullhorn",
      "url": "https://status.bullhorn.com",
      "id": "cdxw86qkmw3x"
    },
    {
      "name": "Chargebee",
      "url": "https://status.chargebee.com",
      "id": "7h56br5y94wh"
    },
    {
      "name": "Checkly",
      "url": "https://is.checkly.online",
      "id": "nq8lf8mrmvw6"
    },
    {
      "name": "CircleCI",
      "url": "https://status.circleci.com",
      "id": "6w4r0ttlx5ft"
    },
    {
      "name": "Click",
      "url": "https://status.clicksoftware.com",
      "id": "57wtfpyjb9p3"
    },
    {
      "name": "Cloud66",
      "url": "https://status.cloud66.com",
      "id": "mpfrt81d47gt"
    },
    {
      "name": "CloudAMQP",
      "url": "https://status.cloudamqp.com",
      "id": "2126xm8ctzlk"
    },
    {
      "name": "CloudApp",
      "url": "https://status.getcloudapp.com",
      "id": "jv7lgzmdfxr1"
    },
    {
      "name": "Cloudflare",
      "url": "https://www.cloudflarestatus.com",
      "id": "yh6f0r4529hb"
    },
    {
      "name": "Cloudinary",
      "url": "https://status.cloudinary.com",
      "id": "d8rszhl2bj7r"
    },
    {
      "name": "Clubhouse",
      "url": "https://status.clubhouse.io",
      "id": "27fcn0qntr9w"
    },
    {
      "name": "CocoaPods",
      "url": "https://status.cocoapods.org",
      "id": "7k11xygtyyyg"
    },
    {
      "name": "Codecov",
      "url": "https://status.codecov.io",
      "id": "wdzsn5dlywj9"
    },
    {
      "name": "CoderPad",
      "url": "https://status.coderpad.io",
      "id": "29rb067ttd9j"
    },
    {
      "name": "Coinbase",
      "url": "https://status.coinbase.com",
      "id": "kr0djjh0jyy9"
    },
    {
      "name": "Compass",
      "url": "https://compass.status.atlassian.com",
      "id": "6b7xgjptl20c"
    },
    {
      "name": "Confluence",
      "url": "https://confluence.status.atlassian.com",
      "id": "4g2my7tbhjsq"
    },
    {
      "name": "Confluent Cloud",
      "url": "https://status.confluent.cloud",
      "id": "3yz1tdpdnjl3",
      "old_names": [
        "ConfluentCloud"
      ]
    },
    {
      "name": "Contentful",
      "url": "https://www.contentfulstatus.com",
      "id": "4bv17htq00cz"
    },
    {
      "name": "Coveralls",
      "url": "https://status.coveralls.io",
      "id": "3h72wtpg5fqs"
    },
    {
      "name": "Cursor",
      "url": "https://status.cursor.com/",
      "id": "0tp9ssgtptvs"
    },
    {
      "name": "Customer.io",
      "url": "https://status.customerio.com",
      "id": "w4qr97njbszt",
      "old_names": [
        "Customerio"
      ]
    },
    {
      "name": "Cybersource",
      "url": "https://status.cybersource.com",
      "id": "ttbtd8wrjg1b"
    },
    {
      "name": "Cypress",
      "url": "https://www.cypressstatus.com/",
      "id": "prr339fdc8ry"
    },
    {
      "name": "DNSimple",
      "url": "https://dnsimple.statuspage.io",
      "id": "tjym90yyv2zt"
    },
    {
      "name": "Datadog",
      "url": "https://status.datadoghq.com",
      "id": "1k6wzpspjf99"
    },
    {
      "name": "Datadog (EU)",
      "url": "https://status.datadoghq.eu",
      "id": "5by3sysm209d",
      "old_names": [
        "DatadogEU"
      ]
    },
    {
      "name": "DeepSeek",
      "url": "https://status.deepseek.com",
      "id": "0db0rq26tg1l"
    },
    {
      "name": "Dialpad",
      "url": "https://status.dialpad.com",
      "id": "80trk830s0hg"
    },
    {
      "name": "DigitalOcean",
      "url": "https://status.digitalocean.com",
      "id": "w4cz49tckxhp"
    },
    {
      "name": "Discord",
      "url": "https://status.discordapp.com",
      "id": "srhpyqt94yxb"
    },
    {
      "name": "Doppler",
      "url": "https://www.dopplerstatus.com",
      "id": "05hwsyqkr9z7"
    },
    {
      "name": "Dropbox",
      "url": "https://status.dropbox.com",
      "id": "t34htyd6jblf"
    },
    {
      "name": "Duo",
      "url": "https://status.duo.com",
      "id": "qrxf5mzbrsxw"
    },
    {
      "name": "Dwolla",
      "url": "https://status.dwolla.com",
      "id": "tnynfs0nwlgr"
    },
    {
      "name": "EasyPost",
      "url": "https://www.easypoststatus.com",
      "id": "n1jtz5983249"
    },
    {
      "name": "Egnyte",
      "url": "https://status.egnyte.com",
      "id": "jr196z1ns266"
    },
    {
      "name": "Elastic Cloud",
      "url": "https://cloud-status.elastic.co",
      "id": "8wpbdv4sl8gv",
      "old_names": [
        "ElasticCloud"
      ]
    },
    {
      "name": "Emailable",
      "url": "https://status.emailable.com",
      "id": "ntzxwsjy15bq"
    },
    {
      "name": "Engine Yard",
      "url": "https://status.engineyard.com",
      "id": "76sphw1bc50q",
      "old_names": [
        "EngineYard"
      ]
    },
    {
      "name": "Equinix Metal",
      "url": "https://status.equinixmetal.com",
      "id": "39f8vhy6rw5d",
      "old_names": [
        "EquinixMetal",
        "Packet"
      ]
    },
    {
      "name": "Figma",
      "url": "https://status.figma.com",
      "id": "rxpksf93ynw6"
    },
    {
      "name": "Files.com",
      "url": "https://status.files.com",
      "id": "qcl58pn3j90b",
      "old_names": [
        "FilesCom",
        "Lumanox"
      ]
    },
    {
      "name": "Filestack",
      "url": "https://status.filestack.com",
      "id": "z8cjgbr8sqmh"
    },
    {
      "name": "Fivetran",
      "url": "https://status.fivetran.com",
      "id": "2lfd8mfks09w"
    },
    {
      "name": "Fleek",
      "url": "https://status.fleek.xyz",
      "id": "0flwwyd0s5n2"
    },
    {
      "name": "Fly.io",
      "url": "https://status.flyio.net",
      "id": "65rccr4mbblw",
      "old_names": [
        "Flyio"
      ]
    },
    {
      "name": "FreeAgent",
      "url": "https://status.freeagent.com",
      "id": "tn2dcgpy021r"
    },
    {
      "name": "Gandi.net",
      "url": "https://status.gandi.net",
      "id": "xnm08yh10bv5",
      "old_names": [
        "Gandi"
      ]
    },
    {
      "name": "GitHub",
      "url": "https://www.githubstatus.com",
      "id": "kctbh9vrtdwd"
    },
    {
      "name": "HelloSign / HelloFax",
      "url": "https://status.hellosign.com",
      "id": "djw9397fmqd1",
      "old_names": [
        "HelloSignHelloFax"
      ]
    },
    {
      "name": "HouseCanary",
      "url": "https://status.housecanary.com/",
      "id": "pkkpjjckfnnb"
    },
    {
      "name": "HubSpot",
      "url": "https://status.hubspot.com",
      "id": "8b9w1wwq3g7d"
    },
    {
      "name": "Internet Computer",
      "url": "https://status.internetcomputer.org",
      "id": "kc2llmsd16bk",
      "old_names": [
        "InternetComputer"
      ]
    },
    {
      "name": "JAMF",
      "url": "https://status.jamf.com",
      "id": "5z7bmx2nb2yj"
    },
    {
      "name": "Jira Align",
      "url": "https://jira-align.status.atlassian.com",
      "id": "jrg4crndtsgz",
      "old_names": [
        "JiraAlign"
      ]
    },
    {
      "name": "Jira Product Discovery",
      "url": "https://jira-product-discovery.status.atlassian.com",
      "id": "qmzzdxyvmbmk",
      "old_names": [
        "JiraProductDiscovery"
      ]
    },
    {
      "name": "Jira Service Management",
      "url": "https://jira-service-management.status.atlassian.com",
      "id": "pv54g7ltsc24",
      "old_names": [
        "JiraServiceManagement"
      ]
    },
    {
      "name": "Jira Software",
      "url": "https://jira-software.status.atlassian.com",
      "id": "7yh3h3y0c0x1",
      "old_names": [
        "JiraSoftware"
      ]
    },
    {
      "name": "Jira Work Management",
      "url": "https://jira-work-management.status.atlassian.com",
      "id": "s6f0gm5gcpmy",
      "old_names": [
        "JiraWorkManagement"
      ]
    },
    {
      "name": "JumpCloud",
      "url": "https://status.jumpcloud.com",
      "id": "nflr6k3n1c0h"
    },
    {
      "name": "KeenIO",
      "url": "https://status.keen.io",
      "id": "z3mvdbpvy7yh"
    },
    {
      "name": "Keeper Security",
      "url": "https://statuspage.keeper.io",
      "id": "wg5bvczw1rtf",
      "old_names": [
        "KeeperSecurity"
      ]
    },
    {
      "name": "Kentik",
      "url": "https://status.kentik.com",
      "id": "25fy3sprxcv3"
    },
    {
      "name": "Kustomer",
      "url": "https://status.kustomer.com",
      "id": "lhn2sb4njk08"
    },
    {
      "name": "LastPass",
      "url": "https://status.lastpass.com",
      "id": "ytnz8gj3wjpg"
    },
    {
      "name": "Lattice",
      "url": "https://status.lattice.com",
      "id": "gj13f8gmt9b6"
    },
    {
      "name": "LaunchDarkly",
      "url": "https://status.launchdarkly.com",
      "id": "9404kdk7lkn7"
    },
    {
      "name": "Lever",
      "url": "https://status.lever.co",
      "id": "34ygfdwr11jd"
    },
    {
      "name": "LinkedIn API",
      "url": "https://linkedin.statuspage.io",
      "id": "mxfydrt8b8xw",
      "old_names": [
        "LinkedInAPI"
      ]
    },
    {
      "name": "Linode",
      "url": "https://status.linode.com",
      "id": "8dn0wstr1chc"
    },
    {
      "name": "Lob",
      "url": "https://lob.statuspage.io",
      "id": "2xkb3rfdd3lg"
    },
    {
      "name": "Loggly",
      "url": "https://status.loggly.com",
      "id": "701xnxqmhdh3"
    },
    {
      "name": "Loom",
      "url": "https://loom.status.atlassian.com",
      "id": "j9r9w5bcs26w"
    },
    {
      "name": "Mailgun",
      "url": "https://status.mailgun.com",
      "id": "6jp439mdyy0k"
    },
    {
      "name": "Mapbox",
      "url": "https://status.mapbox.com",
      "id": "l363gv8nm9gc"
    },
    {
      "name": "Medium",
      "url": "https://medium.statuspage.io",
      "id": "q9n7m9kv0533"
    },
    {
      "name": "MeridianLink",
      "url": "https://status.meridianlink.com",
      "id": "n1pskh7dw1c1"
    },
    {
      "name": "MessageBird",
      "url": "https://status.messagebird.com",
      "id": "xf8120tyqx8n"
    },
    {
      "name": "Mixpanel",
      "url": "https://status.mixpanel.com",
      "id": "x4m91ldrf511"
    },
    {
      "name": "Mode Analytics",
      "url": "https://status.modeanalytics.com",
      "id": "th35d4vb90h8",
      "old_names": [
        "ModeAnalytics"
      ]
    },
    {
      "name": "MongoDB Cloud",
      "url": "https://status.cloud.mongodb.com",
      "id": "smhnl3lt74kc",
      "old_names": [
        "MongoDBCloud"
      ]
    },
    {
      "name": "Mozilla",
      "url": "https://status.services.mozilla.com",
      "id": "29l4z1kld06b",
      "old_names": [
        "FirefoxRelay"
      ]
    },
    {
      "name": "Mural",
      "url": "https://status.mural.co",
      "id": "dbk70dpy3n7h"
    },
    {
      "name": "Nasdaq Data Link",
      "url": "https://status.data.nasdaq.com",
      "id": "dyfxchz1hcb1",
      "old_names": [
        "NasdaqDataLink",
        "Quandl"
      ]
    },
    {
      "name": "Netlify",
      "url": "https://www.netlifystatus.com",
      "id": "83dz7syz0j3x"
    },
    {
      "name": "New Relic",
      "url": "https://status.newrelic.com",
      "id": "nwg5xmnm9d17",
      "old_names": [
        "NewRelic"
      ]
    },
    {
      "name": "Notion",
      "url": "https://status.notion.so",
      "id": "kgl53swp0yg1"
    },
    {
      "name": "Opsgenie",
      "url": "https://opsgenie.status.atlassian.com",
      "id": "t05vdsszxwtq"
    },
    {
      "name": "Pantheon",
      "url": "https://status.pantheon.io",
      "id": "80f0zgsx80zh"
    },
    {
      "name": "Papertrail",
      "url": "https://www.papertrailstatus.com",
      "id": "0n5jhb30j32t"
    },
    {
      "name": "Pardot",
      "url": "https://trust.pardot.com",
      "id": "j0hnsfnqtllz"
    },
    {
      "name": "Pendo",
      "url": "https://status.pendo.io",
      "id": "qxvy69hcwh22"
    },
    {
      "name": "Planning Center",
      "url": "https://status.planningcenter.com",
      "id": "mj14zc034yxl",
      "old_names": [
        "PlanningCenter"
      ]
    },
    {
      "name": "Platform.sh",
      "url": "https://status.platform.sh",
      "id": "l2x5n4czt1ph",
      "old_names": [
        "PlatformSH"
      ]
    },
    {
      "name": "PlayFab",
      "url": "https://status.playfab.com",
      "id": "hndmlgmdcpdk"
    },
    {
      "name": "Poka",
      "url": "https://www.pokastatus.io",
      "id": "6gqznhly63gc"
    },
    {
      "name": "Productboard",
      "url": "https://status.productboard.com",
      "id": "wwwnvh1nlpt1"
    },
    {
      "name": "Proton",
      "url": "https://status.proton.me",
      "id": "wy8ls9q1ttmm",
      "old_names": [
        "ProtonMail"
      ]
    },
    {
      "name": "PubNub",
      "url": "https://status.pubnub.com",
      "id": "j2pr9thwz01t"
    },
    {
      "name": "Pusher",
      "url": "https://status.pusher.com",
      "id": "p6t5x7tdq8yq"
    },
    {
      "name": "Python",
      "url": "https://status.python.org",
      "id": "2p66nmmycsj3"
    },
    {
      "name": "QuickBooks",
      "url": "https://status.quickbooks.intuit.com",
      "id": "2dv2gqw9hrgc"
    },
    {
      "name": "ReadMe",
      "url": "https://www.readmestatus.com",
      "id": "nz3r09cr7dk1"
    },
    {
      "name": "Recruiterbox",
      "url": "https://status.recruiterbox.com",
      "id": "mnlrk0049tgf"
    },
    {
      "name": "Red Hat",
      "url": "https://status.redhat.com",
      "id": "dn6mqn7xvzz3",
      "old_names": [
        "RedHat"
      ]
    },
    {
      "name": "Reddit",
      "url": "https://www.redditstatus.com",
      "id": "2kbc0d48tv3j"
    },
    {
      "name": "RevenueCat",
      "url": "https://status.revenuecat.com",
      "id": "d7wjfp7kgjkd"
    },
    {
      "name": "Robin",
      "url": "https://status.robinpowered.com",
      "id": "4hy25vm4h6fc"
    },
    {
      "name": "Robinhood",
      "url": "https://status.robinhood.com",
      "id": "49plxygx5s1k"
    },
    {
      "name": "RubyGems",
      "url": "https://status.rubygems.org",
      "id": "pclby00q90vc"
    },
    {
      "name": "Sauce Labs",
      "url": "https://status.saucelabs.com",
      "id": "kd2w7ghdk56w",
      "old_names": [
        "SauceLabs"
      ]
    },
    {
      "name": "Scaleway",
      "url": "https://status.scaleway.com",
      "id": "s2kbtscly3pj"
    },
    {
      "name": "SecurID",
      "url": "https://status.securid.com",
      "id": "1xw7gmwkm0bg"
    },
    {
      "name": "Segment",
      "url": "https://status.segment.com",
      "id": "yzw83vcxbysq"
    },
    {
      "name": "Semaphore",
      "url": "https://status.semaphoreci.com",
      "id": "zq6qk8cct5d8"
    },
    {
      "name": "SendGrid",
      "url": "https://status.sendgrid.com",
      "id": "3tgl2vf85cht"
    },
    {
      "name": "Sentry",
      "url": "https://status.sentry.io",
      "id": "t687h3m0nh65"
    },
    {
      "name": "Shopify",
      "url": "https://www.shopifystatus.com",
      "id": "d33g96wd23dd"
    },
    {
      "name": "Smarty",
      "url": "https://status.smarty.com",
      "id": "q1z5r94tnt56",
      "old_names": [
        "SmartyStreets"
      ]
    },
    {
      "name": "Snowflake",
      "url": "https://status.snowflake.com",
      "id": "94s7z8vpy1n8"
    },
    {
      "name": "Snyk",
      "url": "https://snyk.statuspage.io",
      "id": "myj6w6kw42c6"
    },
    {
      "name": "Squarespace",
      "url": "https://status.squarespace.com",
      "id": "1jkhm1drpysj"
    },
    {
      "name": "Stream",
      "url": "https://status.getstream.io",
      "id": "gsms7w17y9wc"
    },
    {
      "name": "Teleport Cloud",
      "url": "https://status.teleport.sh",
      "id": "j16wc0h3wc86",
      "old_names": [
        "TeleportCloud"
      ]
    },
    {
      "name": "Temporal",
      "url": "https://status.temporal.io",
      "id": "dnmfkqzkp304"
    },
    {
      "name": "TravisCI",
      "url": "https://www.traviscistatus.com",
      "id": "pnpcptp8xh9k"
    },
    {
      "name": "Trello",
      "url": "https://trello.status.atlassian.com",
      "id": "h5frqhb041yq"
    },
    {
      "name": "Twilio",
      "url": "https://status.twilio.com",
      "id": "gpkpyklzq55q"
    },
    {
      "name": "Twitch",
      "url": "https://status.twitch.tv",
      "id": "yfj40zdsk34s"
    },
    {
      "name": "Tyk",
      "url": "https://status.tyk.io/",
      "id": "wygv0lcrzvq7"
    },
    {
      "name": "Typeform",
      "url": "https://status.typeform.com",
      "id": "fv5fyw3p7k8n"
    },
    {
      "name": "Unsplash",
      "url": "https://status.unsplash.com",
      "id": "gcw6g25tpdkv"
    },
    {
      "name": "VMware Workspace ONE",
      "url": "https://status.workspaceone.com",
      "id": "3l65ysrm5cly",
      "old_names": [
        "VMwareWorkspaceONE"
      ]
    },
    {
      "name": "Vercel",
      "url": "https://www.vercel-status.com",
      "id": "lvglq8h0mdyh"
    },
    {
      "name": "VictorOps",
      "url": "https://status.victorops.com",
      "id": "tj7j024mr40d"
    },
    {
      "name": "Vimeo",
      "url": "https://www.vimeostatus.com",
      "id": "sccqh0pnqrh8"
    },
    {
      "name": "Visual Studio App Center",
      "url": "https://status.appcenter.ms",
      "id": "kkc10kz2t8yc",
      "old_names": [
        "VisualStudioAppCenter"
      ]
    },
    {
      "name": "Wasabi",
      "url": "https://status.wasabi.com",
      "id": "2r1tdgqr8ld5"
    },
    {
      "name": "WeTransfer",
      "url": "https://wetransfer.statuspage.io",
      "id": "sc26zwwp3c0r"
    },
    {
      "name": "Wiz",
      "url": "https://status.wiz.io/",
      "id": "bgx79l11xfsj"
    },
    {
      "name": "Wodby",
      "url": "https://status.wodby.com",
      "id": "hmm9v8wzw86x"
    },
    {
      "name": "Workflowy",
      "url": "https://status.workflowy.com",
      "id": "m8f43n57h83g"
    },
    {
      "name": "Xandr",
      "url": "https://status.xandr.com",
      "id": "z7jb4dcjs0nl"
    },
    {
      "name": "Zoom",
      "url": "https://status.zoom.us",
      "id": "14qjgk812kgk"
    },
    {
      "name": "Zwift",
      "url": "https://status.zwift.com",
      "id": "sj50pfj5p1yv"
    },
    {
      "name": "bunny.net",
      "url": "https://status.bunny.net",
      "id": "jggkjgplmcdc",
      "old_names": [
        "Bunnynet"
      ]
    },
    {
      "name": "imgix",
      "url": "https://status.imgix.com",
      "id": "032k0f0j3bsz",
      "old_names": [
        "Imgix"
      ]
    },
    {
      "name": "logz.io",
      "url": "https://status.logz.io",
      "id": "flbqdmg201t4",
      "old_names": [
        "LogzIO"
      ]
    },
    {
      "name": "npm",
      "url": "https://status.npmjs.org",
      "id": "wyvgptkd90hm",
      "old_names": [
        "NPM"
      ]
    }
  ],
  "statuspal": [
    {
      "name": "Booxi",
      "url": "https://status.booxi.com"
    },
    {
      "name": "Exoscale",
      "url": "https://exoscalestatus.com"
    },
    {
      "name": "Unity",
      "url": "https://status.unity.com"
    }
  ],
  "sendbird": [
    {
      "name": "Sendbird (Canada)",
      "url": "https://status-canada.sendbird.com",
      "id": "xnlfmklffhwg",
      "subservice": true,
      "old_names": [
        "SendbirdCanada"
      ]
    },
    {
      "name": "Sendbird (Frankfurt)",
      "url": "https://status-frankfurt.sendbird.com/",
      "id": "qt3xhnxvn2sw",
      "subservice": true,
      "old_names": [
        "SendbirdFrankfurt"
      ]
    },
    {
      "name": "Sendbird (Mumbai)",
      "url": "https://status-mumbai.sendbird.com/",
      "id": "sng1ltdy77pf",
      "subservice": true,
      "old_names": [
        "SendbirdMumbai"
      ]
    },
    {
      "name": "Sendbird (North Virginia 2)",
      "url": "https://status-nvirginia2.sendbird.com/",
      "id": "nwc3tc3ghc55",
      "subservice": true,
      "old_names": [
        "SendbirdNorthVirginia2"
      ]
    },
    {
      "name": "Sendbird (North Virginia)",
      "url": "https://status-nvirginia1.sendbird.com/",
      "id": "xlrzypr8w8p5",
      "subservice": true,
      "old_names": [
        "SendbirdNorthVirginia"
      ]
    },
    {
      "name": "Sendbird (Oregon)",
      "url": "https://status-oregon.sendbird.com/",
      "id": "phbv0js99n45",
      "subservice": true,
      "old_names": [
        "SendbirdOregon"
      ]
    },
    {
      "name": "Sendbird (Seoul)",
      "url": "https://status-seoul.sendbird.com/",
      "id": "6r983tc47nw4",
      "subservice": true,
      "old_names": [
        "SendbirdSeoul"
      ]
    },
    {
      "name": "Sendbird (Singapore 2)",
      "url": "https://status-singapore2.sendbird.com/",
      "id": "2knm7ggfmh3s",
      "subservice": true,
      "old_names": [
        "SendbirdSingapore2"
      ]
    },
    {
      "name": "Sendbird (Singapore)",
      "url": "https://status-singapore.sendbird.com/",
      "id": "phbv0js99n45",
      "subservice": true,
      "old_names": [
        "SendbirdSingapore"
      ]
    },
    {
      "name": "Sendbird (Sydney)",
      "url": "https://status-sydney.sendbird.com/",
      "id": "dy9hbf5scsg1",
      "subservice": true,
      "old_names": [
        "SendbirdSydney"
      ]
    },
    {
      "name": "Sendbird (Tokyo)",
      "url": "https://status-tokyo.sendbird.com/",
      "id": "rfx6f11vcjtc",
      "subservice": true,
      "old_names": [
        "SendbirdTokyo"
      ]
    }
  ]
}


================================================
FILE: Scripts/generate_adobe_services.swift
================================================
#!/usr/bin/swift

import Foundation

struct Cloud {
    let id: String
    let name: String
    let products: [Product]

    init?(dictionary: [String: Any], productsMap: [String: Product]) {
        guard
            let id = dictionary["id"] as? String,
            let name = dictionary["name"] as? String,
            let productIDs = dictionary["cloudProducts"] as? [String]
        else {
            return nil
        }

        self.id = id
        self.name = name
        products = productIDs.compactMap { productsMap[$0] }
    }
}

struct Product {
    let id: String
    let name: String

    init?(dictionary: [String: Any]) {
        guard
            let id = dictionary["id"] as? String,
            let name = dictionary["name"] as? String
        else {
            return nil
        }

        self.id = id
        self.name = name
    }
}

struct AdobeService {
    enum ServiceType {
        case category
        case service
        case subService
    }

    let id: String

    let parentName: String
    let name: String
    let type: ServiceType

    var className: String {
        var sanitizedName = name
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
        return sanitizedName
            .components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }

    init(id: String, parentName: String, name: String, type: ServiceType) {
        self.id = id
        self.parentName = parentName
        self.type = type

        if !name.hasPrefix("Adobe") {
            self.name = "Adobe \(name)"
        } else {
            self.name = name
        }
    }

    var output: String {
        switch type {
        case .category:
            return """
            final class \(className)All: \(className), ServiceCategory {
                let categoryName = "\(name)"
                let subServiceSuperclass: AnyObject.Type = Base\(className).self

                let name = "\(name) (All)"
                let id = "\(id)"
            }
            """
        case .service:
            return """
            final class \(className): \(parentName) {
                let name = "\(name)"
                let id = "\(id)"
            }
            """
        case .subService:
            return """
            final class \(className): \(parentName), SubService {
                let name = "\(name)"
                let id = "\(id)"
            }
            """
        }
    }
}

extension String {
    func capitalized(firstLetterOnly: Bool) -> String {
        return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
    }
}

func envVariable(forKey key: String) -> String {
    guard let variable = ProcessInfo.processInfo.environment[key] else {
        print("error: Environment variable '\(key)' not set")
        exit(1)
    }

    return variable
}

func discoverServices() -> [AdobeService] {
    var dataResult: Data?

    let semaphore = DispatchSemaphore(value: 0)
    let url = URL(string: "https://data.status.adobe.com/adobestatus/SnowServiceRegistry")!

    URLSession.shared.dataTask(with: url) { data, _, _ in
        dataResult = data
        semaphore.signal()
    }.resume()

    _ = semaphore.wait(timeout: .now() + .seconds(10))

    guard
        let data = dataResult,
        let structure = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
    else {
        print("warning: Build script generate_adobe_services could not retrieve list of Adobe services")
        exit(0)
    }

    let productsDictionary = (structure["products"] as? [String: Any]) ?? [:]
    let productsMap = productsDictionary.compactMapValues { (value: Any) -> Product? in
        guard let dict = value as? [String: Any] else { return nil }
        return Product(dictionary: dict)
    }

    let cloudsDictionary = (structure["clouds"] as? [String: Any]) ?? [:]
    let clouds = cloudsDictionary.compactMap { (_, value) -> Cloud? in
        guard let dict = value as? [String: Any] else { return nil }
        return Cloud(dictionary: dict, productsMap: productsMap)
    }

    var uniqueNames = Set<String>()

    // Create the categories from the clouds
    var categories = [String: AdobeService]()
    clouds.forEach { cloud in
        var name = cloud.name

        if uniqueNames.contains(name) {
            name = "\(name) (\(cloud.id))"
        }
        uniqueNames.insert(name)

        let category = AdobeService(id: cloud.id, parentName: "", name: name, type: .category)
        categories[cloud.id] = category

        // Create the subservices from the products
        cloud.products.forEach { product in
            var name = product.name

            if uniqueNames.contains(name) {
                name = "\(name) (\(product.id))"
            }
            uniqueNames.insert(name)

            let subService = AdobeService(id: product.id, parentName: category.className, name: name, type: .subService)
            categories[product.id] = subService
        }
    }

    let result: [AdobeService] = categories.values.sorted {
        $0.name.caseInsensitiveCompare($1.name) != .orderedDescending
    }

    return result
}

func main() {
    let srcRoot = envVariable(forKey: "SRCROOT")
    let outputPath = "\(srcRoot)/stts/Services/Generated/AdobeServices.swift"
    let services = discoverServices()

    let header = """
    // This file is generated by generate_adobe_services.swift and should not be modified manually.
    // swiftlint:disable superfluous_disable_command type_name

    import Foundation

    """

    let content = services.map { $0.output }.joined(separator: "\n\n")
    let footer = ""

    let output = [header, content, footer].joined(separator: "\n")

    // swiftlint:disable:next force_try
    try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)

    print("Finished generating Adobe services.")
}

main()


================================================
FILE: Scripts/generate_apple_services.swift
================================================
#!/usr/bin/swift

import Foundation

private struct AppleResponseData: Codable {
    struct Service: Codable {
        let serviceName: String
    }

    let services: [Service]
}

struct AppleService {
    enum ServiceType {
        case category
        case subService
    }

    let parentName: String
    var name: String
    let serviceName: String
    let type: ServiceType

    var className: String {
        var sanitizedName = name
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "+", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ",", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "|", with: "")
        return sanitizedName
            .components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }

    init(parentName: String, name: String, type: ServiceType) {
        self.parentName = parentName
        self.type = type
        self.serviceName = name

        if !name.hasPrefix("Apple") {
            self.name = "Apple \(name)"
        } else {
            self.name = name
        }
    }

    var output: String {
        switch type {
        case .category:
            return """
            final class \(className)All: \(className), ServiceCategory {
                let categoryName = "\(name)"
                let subServiceSuperclass: AnyObject.Type = Base\(className).self

                let name = "\(name) (All)"
                let serviceName = "*"
            }
            """
        case .subService:
            return """
            final class \(className): \(parentName), SubService {
                let name = "\(name)"
                let serviceName = "\(serviceName)"
            }
            """
        }
    }
}

extension String {
    func capitalized(firstLetterOnly: Bool) -> String {
        return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
    }

    var innerJSONString: String {
        let callbackPrefix = "jsonCallback("
        let callbackSuffix = ");"

        let trimmedString = trimmingCharacters(in: .whitespacesAndNewlines)

        guard trimmedString.hasPrefix(callbackPrefix) && trimmedString.hasSuffix(callbackSuffix) else { return self }

        return String(trimmedString[
            trimmedString.index(trimmedString.startIndex, offsetBy: callbackPrefix.count) ..<
            trimmedString.index(trimmedString.endIndex, offsetBy: -callbackSuffix.count)
        ])
    }
}

func envVariable(forKey key: String) -> String {
    guard let variable = ProcessInfo.processInfo.environment[key] else {
        print("error: Environment variable '\(key)' not set")
        exit(1)
    }

    return variable
}

func discoverServices(url: String, categoryName: String, categoryClassName: String) -> [AppleService] {
    var dataResult: Data?

    let semaphore = DispatchSemaphore(value: 0)
    let url = URL(string: url)!

    URLSession.shared.dataTask(with: url) { data, _, _ in
        dataResult = data
        semaphore.signal()
    }.resume()

    _ = semaphore.wait(timeout: .now() + .seconds(10))

    guard
        let data = dataResult,
        let jsonData = String(data: data, encoding: .utf8)?.innerJSONString.data(using: .utf8),
        let responseData = try? JSONDecoder().decode(AppleResponseData.self, from: jsonData)
    else {
        print("warning: Build script generate_apple_services could not retrieve list of \(categoryName) services")
        exit(0)
    }

    let result: [AppleService] =
        [AppleService(parentName: "", name: categoryName, type: .category)] +
        responseData.services.map {
            AppleService(parentName: categoryClassName, name: $0.serviceName, type: .subService)
    }
    return result
}

func main() {
    let srcRoot = envVariable(forKey: "SRCROOT")
    let outputPath = "\(srcRoot)/stts/Services/Generated/AppleServices.swift"

    let services = discoverServices(
        url: "https://www.apple.com/support/systemstatus/data/system_status_en_US.js",
        categoryName: "Apple",
        categoryClassName: "Apple"
    )
    var developerServices = discoverServices(
        url: "https://www.apple.com/support/systemstatus/data/developer/system_status_en_US.js",
        categoryName: "Apple Developer",
        categoryClassName: "AppleDeveloper"
    )

    // Fix name collisions
    let serviceNames = services.map { $0.name }
    developerServices = developerServices.map {
        if serviceNames.contains($0.name) {
            var renamedService = $0
            renamedService.name = "\($0.name) (Developer)"
            return renamedService
        } else {
            return $0
        }
    }

    let header = """
    // This file is generated by generate_apple_services.swift and should not be modified manually.
    // swiftlint:disable superfluous_disable_command type_name

    import Foundation

    """

    let content = (services + developerServices).map { $0.output }.joined(separator: "\n\n")
    let footer = ""

    let output = [header, content, footer].joined(separator: "\n")

    // swiftlint:disable:next force_try
    try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)

    print("Finished generating Apple services.")
}

main()


================================================
FILE: Scripts/generate_aws_services.swift
================================================
#!/usr/bin/swift

import Foundation

extension String {
    func capitalized(firstLetterOnly: Bool) -> String {
        return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
    }
}

func envVariable(forKey key: String) -> String {
    guard let variable = ProcessInfo.processInfo.environment[key] else {
        print("error: Environment variable '\(key)' not set")
        exit(1)
    }

    return variable
}

struct Service: Codable {
    enum CodingKeys: String, CodingKey {
        case id = "service"
        case name = "service_name"
        case regionName = "region_name"
        case regionID = "region_id"
    }

    let id: String
    let name: String
    let regionName: String?
    let regionID: String?
}

protocol OutputService {
    var output: String { get }
    var sortingName: String { get }
}

class OutputNamedService: OutputService {
    let name: String
    var ids = Set<String>()

    var sortingName: String {
        usableName
    }

    var usableName: String {
        var result = name
        if !result.hasPrefix("Amazon "), !result.hasPrefix("AWS ") {
            result = "AWS \(name)"
        }
        return result
    }

    var className: String {
        var sanitizedName = usableName
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
        return sanitizedName
            .components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }

    var output: String {
        """
        final class \(className): AWSNamedService, SubService {
            let name = "\(usableName)"
            let ids = Set<String>([
                "\(ids.sorted().joined(separator: "\",\n        \""))"
            ])
        }
        """
    }

    init(initialService: Service) {
        name = initialService.name
        add(initialService)
    }

    func add(_ service: Service) {
        ids.insert(service.id)
    }
}

class OutputRegion: OutputService {
    let id: String
    let name: String

    var sortingName: String {
        "111\(usableName)"
    }

    var usableName: String {
        "AWS (\(name))"
    }

    var className: String {
        var sanitizedName = usableName
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
        return sanitizedName
            .components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }

    var output: String {
        """
        final class \(className): AWSRegionService, SubService {
            let id = "\(id)"
            let name = "\(usableName)"
        }
        """
    }

    init(id: String, name: String) {
        self.id = id
        self.name = name
    }
}

func discoverServices() -> [OutputService] {
    var dataResult: Data?

    let semaphore = DispatchSemaphore(value: 0)
    let url = URL(string: "https://d3s31nlw3sm5l8.cloudfront.net/services.json")!
    URLSession.shared.dataTask(with: url) { data, _, _ in
        dataResult = data
        semaphore.signal()
    }.resume()

    _ = semaphore.wait(timeout: .now() + .seconds(10))

    guard
        let data = dataResult,
        let services = try? JSONDecoder().decode([Service].self, from: data)
    else {
        print("warning: Build script generate_aws_services could not retrieve list of AWS services")
        exit(0)
    }

    var servicesByName: [String: OutputNamedService] = [:]
    var regions: [String: OutputRegion] = [:]

    services.forEach {
        let namedService = servicesByName[$0.name] ?? OutputNamedService(initialService: $0)
        namedService.add($0)
        servicesByName[$0.name] = namedService

        if let regionID = $0.regionID, let regionName = $0.regionName {
            if regions[regionID] == nil {
                regions[regionID] = OutputRegion(id: regionID, name: regionName)
            }
        }
    }

    let namedServices: [OutputService] = [OutputNamedService](servicesByName.values)
    let regionServices: [OutputService] = [OutputRegion](regions.values)
    return namedServices + regionServices
}

func main() {
    let srcRoot = envVariable(forKey: "SRCROOT")
    let outputPath = "\(srcRoot)/stts/Services/Generated/AWSServices.swift"
    let services = discoverServices()

    let header = """
    // This file is generated by generate_aws_services.swift and should not be modified manually.
    // swiftlint:disable superfluous_disable_command type_name

    import Foundation

    final class AWSRegions: AWSAllService, ServiceCategory {
        let categoryName = "Amazon Web Services (by region)"
        let subServiceSuperclass: AnyObject.Type = BaseAWSRegionService.self

        let name = "AWS Regions (All)"
    }

    final class AWSServices: AWSAllService, ServiceCategory {
        let categoryName = "Amazon Web Services"
        let subServiceSuperclass: AnyObject.Type = BaseAWSNamedService.self

        let name = "AWS (All)"
    }

    """

    let content = services.sorted(by: { one, two in
        one.sortingName < two.sortingName
    }).map { $0.output }.joined(separator: "\n\n")
    let footer = ""

    let output = [header, content, footer].joined(separator: "\n")

    debugPrint(output)
    // swiftlint:disable:next force_try
    try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)

    print("Finished generating AWS services.")
}

main()


================================================
FILE: Scripts/generate_azure_devops_services.swift
================================================
#!/usr/bin/swift

import Foundation

struct AzureDevOpsService {
    let serviceName: String

    var friendlyName: String {
        let friendlyServiceName = serviceName.components(separatedBy: " ").map {
            $0.capitalized(firstLetterOnly: true)
        }.joined(separator: " ")

        return "Azure DevOps \(friendlyServiceName)"
    }

    var className: String {
        var sanitizedName = serviceName
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        sanitizedName = sanitizedName.components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
        return "AzureDevOps\(sanitizedName)"
    }

    var output: String {
        return """
        final class \(className): AzureDevOps, SubService {
            let name = "\(friendlyName)"
            let serviceName = "\(serviceName)"
        }
        """
    }
}

extension String {
    subscript(_ range: NSRange) -> String {
        // Why we still have to do this shit in 2019 I don't know
        let start = self.index(self.startIndex, offsetBy: range.lowerBound)
        let end = self.index(self.startIndex, offsetBy: range.upperBound)
        let subString = self[start..<end]
        return String(subString)
    }

    func capitalized(firstLetterOnly: Bool) -> String {
        return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
    }
}

struct AzureDevOpsDataProviders: Codable {
    struct ResponseData: Codable {
        struct MetadataProvider: Codable {
            let services: [[String: String]]

            var serviceNames: [String] {
                return services.compactMap { $0["id"] }
            }
        }

        enum CodingKeys: String, CodingKey {
            case metadataProvider = "ms.vss-status-web.public-status-metadata-data-provider"
        }

        let metadataProvider: MetadataProvider
    }

    let data: ResponseData
}

func envVariable(forKey key: String) -> String {
    guard let variable = ProcessInfo.processInfo.environment[key] else {
        print("error: Environment variable '\(key)' not set")
        exit(1)
    }

    return variable
}

func discoverServices() -> [AzureDevOpsService] {
    var result = [AzureDevOpsService]()

    var dataResult: Data?

    let semaphore = DispatchSemaphore(value: 0)
    URLSession.shared.dataTask(with: URL(string: "https://status.dev.azure.com")!) { data, _, _ in
        dataResult = data
        semaphore.signal()
    }.resume()

    _ = semaphore.wait(timeout: .now() + .seconds(10))

    guard let data = dataResult, let body = String(data: data, encoding: .utf8) as NSString? else {
        print("warning: Build script generate_azure_devops_services could not retrieve list of Azure DevOps services")
        exit(0)
    }

    // swiftlint:disable:next force_try
    let regex = try! NSRegularExpression(
        pattern: "<script id=\"dataProviders\".*?>(.*?)</script>",
        options: [.caseInsensitive, .dotMatchesLineSeparators]
    )

    let range = NSRange(location: 0, length: body.length)
    regex.enumerateMatches(in: body as String, options: [], range: range) { textCheckingResult, _, _ in
        guard let textCheckingResult = textCheckingResult, textCheckingResult.numberOfRanges == 2 else { return }

        let json = body.substring(with: textCheckingResult.range(at: 1))
        let jsonData = json.data(using: .utf8)!
        guard let decodedProviders = try? JSONDecoder().decode(AzureDevOpsDataProviders.self, from: jsonData) else {
            print(
                "warning: Build script generate_azure_devops_services could not retrieve list of Azure DevOps services"
            )
            exit(0)
        }

        decodedProviders.data.metadataProvider.serviceNames.forEach {
            result.append(AzureDevOpsService(serviceName: $0))
        }
    }

    return result
}

func main() {
    let srcRoot = envVariable(forKey: "SRCROOT")
    let outputPath = "\(srcRoot)/stts/Services/Generated/AzureDevOpsServices.swift"
    let services = discoverServices()

    let header = """
    // This file is generated by generate_azure_devops_services.swift and should not be modified manually.
    // swiftlint:disable superfluous_disable_command type_name

    import Foundation

    """

    let content = services.map { $0.output }.joined(separator: "\n\n")
    let footer = ""

    let output = [header, content, footer].joined(separator: "\n")

    // swiftlint:disable:next force_try
    try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)

    print("Finished generating Azure DevOps services.")
}

main()


================================================
FILE: Scripts/generate_azure_services.swift
================================================
#!/usr/bin/swift

import Foundation

struct AzureZone {
    let serviceName: String
    let zoneIdentifier: String

    var className: String {
        var sanitizedName = serviceName
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        return sanitizedName.components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }

    init(identifier: String, serviceName: String) {
        zoneIdentifier = identifier

        if !serviceName.hasPrefix("Azure") {
            self.serviceName = "Azure \(serviceName)"
        } else {
            self.serviceName = serviceName
        }
    }

    var output: String {
        return """
        final class \(className): Azure, SubService {
            let name = "\(serviceName)"
            let zoneIdentifier = "\(zoneIdentifier)"
        }
        """
    }
}

extension String {
    subscript(_ range: NSRange) -> String {
        // Why we still have to do this shit in 2019 I don't know
        let start = self.index(self.startIndex, offsetBy: range.lowerBound)
        let end = self.index(self.startIndex, offsetBy: range.upperBound)
        let subString = self[start..<end]
        return String(subString)
    }

    func capitalized(firstLetterOnly: Bool) -> String {
        return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
    }
}

func envVariable(forKey key: String) -> String {
    guard let variable = ProcessInfo.processInfo.environment[key] else {
        print("error: Environment variable '\(key)' not set")
        exit(1)
    }

    return variable
}

func discoverZones() -> [AzureZone] {
    var result = [AzureZone]()

    var dataResult: Data?

    let semaphore = DispatchSemaphore(value: 0)
    URLSession.shared.dataTask(with: URL(string: "https://status.azure.com/en-us/status")!) { data, _, _ in
        dataResult = data
        semaphore.signal()
    }.resume()

    _ = semaphore.wait(timeout: .now() + .seconds(10))

    guard let data = dataResult, var body = String(data: data, encoding: .utf8) else {
        print("warning: Build script generate_azure_services could not retrieve list of Azure zones")
        exit(0)
    }

    body = body.replacingOccurrences(of: "\n", with: "")

    // swiftlint:disable:next force_try
    let regex = try! NSRegularExpression(
        pattern: "li role=\"presentation\".*?data-zone-name=\"(.*?)\".*?data-event-property=\"(.*?)\"",
        options: [.caseInsensitive, .dotMatchesLineSeparators]
    )

    // Some tabs in the Azure status website do not correspond to actual zones, so we exclude them
    let excludedZoneIdentifiers = Set(["current-impact"])

    let range = NSRange(location: 0, length: body.count)
    regex.enumerateMatches(in: body, options: [], range: range) { textCheckingResult, _, _ in
        guard let textCheckingResult = textCheckingResult, textCheckingResult.numberOfRanges == 3 else { return }

        let identifier = body[textCheckingResult.range(at: 1)]
        let serviceName = body[textCheckingResult.range(at: 2)]

        if excludedZoneIdentifiers.contains(identifier) == false {
            result.append(AzureZone(identifier: identifier, serviceName: serviceName))
        }
    }

    return result
}

func main() {
    let srcRoot = envVariable(forKey: "SRCROOT")
    let outputPath = "\(srcRoot)/stts/Services/Generated/AzureServices.swift"
    let zones = discoverZones()

    let header = """
    // This file is generated by generate_azure_services.swift and should not be modified manually.
    // swiftlint:disable superfluous_disable_command type_name

    import Foundation

    """

    let content = zones.map { $0.output }.joined(separator: "\n\n")
    let footer = ""

    let output = [header, content, footer].joined(separator: "\n")

    // swiftlint:disable:next force_try
    try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)

    print("Finished generating Azure services.")
}

main()


================================================
FILE: Scripts/generate_google_services.swift
================================================
#!/usr/bin/swift

import Foundation

enum GooglePlatform: CaseIterable {
    case cloudPlatform
    case firebase

    var url: URL {
        switch self {
        case .cloudPlatform:
            // swiftlint:disable:next force_unwrapping
            return URL(string: "https://status.cloud.google.com")!
        case .firebase:
            // swiftlint:disable:next force_unwrapping
            return URL(string: "https://status.firebase.google.com")!
        }
    }

    func outputPath(root: String) -> String {
        switch self {
        case .cloudPlatform:
            return "\(root)/stts/Services/Generated/GoogleCloudPlatformServices.swift"
        case .firebase:
            return "\(root)/stts/Services/Generated/FirebaseServices.swift"
        }
    }
}

protocol Service {
    var serviceName: String { get }
    var className: String { get }
    var output: String { get }
}

extension Service {
    var className: String {
        var sanitizedName = serviceName
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
        return sanitizedName.components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }
}

struct GCPService: Service {
    let serviceName: String
    let dashboardName: String

    init(dashboardName: String) {
        self.dashboardName = dashboardName

        if !dashboardName.hasPrefix("Google") {
            serviceName = "Google \(dashboardName)"
        } else {
            serviceName = dashboardName
        }

    }

    var output: String {
        return """
        final class \(className): GoogleCloudPlatform, SubService {
            let name = "\(serviceName)"
            let dashboardName = "\(dashboardName)"
        }
        """
    }
}

struct FirebaseService: Service {
    let serviceName: String

    init(dashboardName: String) {
        if !dashboardName.hasPrefix("Firebase") {
            serviceName = "Firebase \(dashboardName)"
        } else {
            serviceName = dashboardName
        }
    }

    var output: String {
        return """
        final class \(className): FirebaseService, SubService {
            let name = "\(serviceName)"
        }
        """
    }
}

extension String {
    subscript(_ range: NSRange) -> String {
        // Why we still have to do this shit in 2019 I don't know
        let start = self.index(self.startIndex, offsetBy: range.lowerBound)
        let end = self.index(self.startIndex, offsetBy: range.upperBound)
        let subString = self[start..<end]
        return String(subString)
    }

    func capitalized(firstLetterOnly: Bool) -> String {
        return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
    }
}

func envVariable(forKey key: String) -> String {
    guard let variable = ProcessInfo.processInfo.environment[key] else {
        print("error: Environment variable '\(key)' not set")
        exit(1)
    }

    return variable
}

func discoverServices(for platform: GooglePlatform) -> [Service] {
    var result = [Service]()

    var dataResult: Data?

    let semaphore = DispatchSemaphore(value: 0)
    URLSession.shared.dataTask(with: platform.url) { data, _, _ in
        dataResult = data
        semaphore.signal()
    }.resume()

    _ = semaphore.wait(timeout: .now() + .seconds(10))

    guard let data = dataResult, var body = String(data: data, encoding: .utf8) else {
        print("""
            warning: Build script generate_google_services could not retrieve
            list of Google Cloud Platform/Firebase services
        """)

        exit(0)
    }

    body = body.replacingOccurrences(of: "\n", with: "")

    let regex: NSRegularExpression
    switch platform {
    case .cloudPlatform:
        // swiftlint:disable:next force_try
        regex = try! NSRegularExpression(
            pattern: "__product\">[\\s\\n]*(.+?)[\\s\\n]*<.*?\\/th>",
            options: [.caseInsensitive, .dotMatchesLineSeparators]
        )
    case .firebase:
        // swiftlint:disable:next force_try
        regex = try! NSRegularExpression(
            pattern: "class=\"product-name\">.*?[\\s\\n]*([^>]*?)[\\s\\n]*<\\/",
            options: [.caseInsensitive, .dotMatchesLineSeparators]
        )
    }

    let range = NSRange(location: 0, length: body.count)
    regex.enumerateMatches(in: body, options: [], range: range) { textCheckingResult, _, _ in
        guard let textCheckingResult = textCheckingResult, textCheckingResult.numberOfRanges == 2 else { return }

        let serviceName = body[textCheckingResult.range(at: 1)]

        switch platform {
        case .cloudPlatform:
            result.append(GCPService(dashboardName: serviceName))
        case .firebase:
            result.append(FirebaseService(dashboardName: serviceName))
        }
    }

    return result
}

func main() {
    let srcRoot = envVariable(forKey: "SRCROOT")

    GooglePlatform.allCases.forEach { platform in
        let services = discoverServices(for: platform)

        let header = """
        // This file is generated by generate_google_services.swift and should not be modified manually.
        // swiftlint:disable superfluous_disable_command type_name

        import Foundation

        """

        let content = services.map { $0.output }.joined(separator: "\n\n")
        let footer = ""

        let output = [header, content, footer].joined(separator: "\n")

        // swiftlint:disable:next force_try
        try! output.write(toFile: platform.outputPath(root: srcRoot), atomically: true, encoding: .utf8)
    }

    print("Finished generating Google services.")
}

main()


================================================
FILE: Scripts/generate_salesforce_services.swift
================================================
#!/usr/bin/swift

import Foundation

enum Location: String {
    case na = "NA"
    case emea = "EMEA"
    case apac = "APAC"
    case all = "ALL"

    var suffix: String {
        switch self {
        case .na, .emea, .apac:
            return "(\(rawValue))"
        case .all:
            return "(All Regions)"
        }
    }

    var classFormat: String {
        switch self {
        case .na, .emea, .apac:
            return rawValue
        case .all:
            return "All"
        }
    }

    var appFormat: String {
        switch self {
        case .na, .emea, .apac:
            return rawValue
        case .all:
            return "*"
        }
    }
}

struct SalesforceProductRegion {
    let name: String
    let key: String
    let location: Location

    var className: String {
        var sanitizedName = name
        sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
        sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
        sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
        return sanitizedName.components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }

    var classNameWithRegion: String {
        "\(className) \(location.classFormat)"
            .components(separatedBy: " ")
            .map { $0.capitalized(firstLetterOnly: true) }
            .joined(separator: "")
    }

    var serviceName: String {
        "\(name) \(location.suffix)"
    }

    init(key: String, location: Location) {
        self.key = key
        self.location = location

        switch key {
        case "Salesforce_Services":
            name = "Salesforce Services"
        case "Marketing_Cloud":
            name = "Salesforce Marketing Cloud"
        case "B2C_Commerce_Cloud":
            name = "Salesforce B2C Commerce Cloud"
        case "Social_Studio":
            name = "Salesforce Social Studio"
        case "Community_Cloud":
            name = "Salesforce Experience Cloud"
        default:
            // Keep it instead of failing so that we notice when new products are added.
            name = key
        }
    }

    var superOutput: String {
        """
        typealias \(className) =
            Base\(className) & RequiredServiceProperties & SalesforceStoreService

        class Base\(className): BaseSalesforceCategory {
            static var store = SalesforceStore(key: "\(key)")
            let url = URL(string: "https://status.salesforce.com/products/\(key)")!
        }
        """
    }

    var output: String {
        let commonDefinitions: [String] = [
            "let name = \"\(serviceName)\"",
            "let key = \"\(key)\"",
            "let location = \"\(location.appFormat)\""
        ]

        if location == .all {
            return """
            final class \(classNameWithRegion): \(className), ServiceCategory {
                let categoryName = "\(name)"
                let subServiceSuperclass: AnyObject.Type = Base\(className).self

                \(commonDefinitions.joined(separator: "\n    "))
            }
            """
        } else {
            return """
            final class \(classNameWithRegion): \(className), SubService {
                \(commonDefinitions.joined(separator: "\n    "))
            }
            """
        }
    }
}

struct Instance: Codable {
    enum CodingKeys: String, CodingKey {
        case location
        case products = "Products"
    }

    let location: String
    let products: [Product]
}

struct Product: Codable {
    let key: String
}

extension String {
    func capitalized(firstLetterOnly: Bool) -> String {
        return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
    }
}

func envVariable(forKey key: String) -> String {
    guard let variable = ProcessInfo.processInfo.environment[key] else {
        print("error: Environment variable '\(key)' not set")
        exit(1)
    }

    return variable
}

func discoverProducts() -> [SalesforceProductRegion] {
    var result = [SalesforceProductRegion]()

    var dataResult: Data?

    let semaphore = DispatchSemaphore(value: 0)
    let url = URL(string: "https://api.status.salesforce.com/v1/instances?childProducts=false")!
    URLSession.shared.dataTask(with: url) { data, _, _ in
        dataResult = data
        semaphore.signal()
    }.resume()

    _ = semaphore.wait(timeout: .now() + .seconds(10))

    guard let data = dataResult, let instances = try? JSONDecoder().decode([Instance].self, from: data) else {
        print("warning: Build script generate_salesforce_services could not retrieve list of Salesforce products")
        exit(0)
    }

    var productsSet = Set<String>()
    var productsAndRegions: [String: Set<String>] = [:]
    instances.forEach {
        guard let product = $0.products.first else { return }

        var regions = productsAndRegions[product.key] ?? Set<String>()
        regions.insert($0.location)
        productsAndRegions[product.key] = regions

        productsSet.insert(product.key)
    }

    let sortedProducts = productsSet.sorted()

    sortedProducts.forEach { productKey in
        result.append(SalesforceProductRegion(key: productKey, location: .all))

        productsAndRegions[productKey]?.sorted().forEach {
            guard let location = Location(rawValue: $0) else { return }
            result.append(SalesforceProductRegion(key: productKey, location: location))
        }
    }

    return result
}

func generateProducts(from products: [SalesforceProductRegion]) {
    let srcRoot = envVariable(forKey: "SRCROOT")
    let outputPath = "\(srcRoot)/stts/Services/Generated/SalesforceProducts.swift"

    let header = """
    // This file is generated by generate_salesforce_services.swift and should not be modified manually.
    // swiftlint:disable superfluous_disable_command type_name

    import Foundation

    """

    let content = products.map { $0.output }.joined(separator: "\n\n")
    let footer = ""

    let output = [header, content, footer].joined(separator: "\n")

    // swiftlint:disable:next force_try
    try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
}

func generateSuper(from products: [SalesforceProductRegion]) {
    let srcRoot = envVariable(forKey: "SRCROOT")
    let outputPath = "\(srcRoot)/stts/Services/Super/SalesforceCategories.swift"

    let header = """
    // This file is generated by generate_salesforce_services.swift and should not be modified manually.
    // swiftlint:disable superfluous_disable_command type_name

    import Foundation

    """

    let content = products.filter { $0.location == .all }.map { $0.superOutput }.joined(separator: "\n\n")
    let footer = ""

    let output = [header, content, footer].joined(separator: "\n")

    // swiftlint:disable:next force_try
    try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
}

func main() {
    let products = discoverProducts()

    generateProducts(from: products)
    generateSuper(from: products)

    print("Finished generating Salesforce services.")
}

main()


================================================
FILE: Scripts/generate_services_plist.sh
================================================
#!/bin/sh

RESOURCES_PATH="$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH"
SERVICES_PLIST="$RESOURCES_PATH/services.plist"

# Retrieve the list of services
REGULAR_SERVICES=$(find "$SRCROOT/stts/Services" -name "*.swift" -not -path "*Super*" -not -path "*Generated*" | awk -F/ '{ print $NF }' | sed s/.swift//g | sort | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g')
GENERATED_SERVICES=$(find "$SRCROOT/stts/Services/Generated" -name "*.swift" -print0 | xargs -0 cat | grep "class " | sed s/'final class '//g | sed s/'class '//g | sed 's/:.*//' | tr '\n' ' ')
SERVICES="$REGULAR_SERVICES $GENERATED_SERVICES"

# Create the services plist file
echo "{}" > "$SERVICES_PLIST"

# Write the list of services into the plist file as an array
defaults write "$SERVICES_PLIST" "services" -array $SERVICES

# Remove all quarantine attributes as they block submissions to App Store
xattr -c "$SERVICES_PLIST"


================================================
FILE: extract.rb
================================================
require 'net/https'
require 'xcodeproj'
require 'json'
require 'synx'

@project_file = "stts.xcodeproj"

def source_for(url)
    uri = URI.parse(url)
    path = uri.path == "" ? "/" : uri.path
    result = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') { |http| http.get(path) }
    result.code.to_i == 200 ? result.body : nil
end

def extract_instatus(source, custom_name)
    data = source.scan(/__NEXT_DATA__.*?(\{.*?\})<\/script>/mi).flatten.first
    return false if data == nil || data.empty?

    site = JSON.parse(data)["props"]["pageProps"]["site"]

    custom_domain = site["customDomain"]
    if custom_domain && custom_domain != ""
        domain = custom_domain
    else
        domain = "#{site["subdomain"]}.instatus.com"
    end

    name = custom_name || site["name"]
    url = "https://#{domain}"
    safe_name = sanitized_name(name)

    definitions = [
        "let url = URL(string: \"#{url}\")!"
    ]

    definitions.unshift("let name = \"#{name}\"") if safe_name != name

    create_file "stts/Services/Instatus/#{safe_name}.swift", <<-INSTATUS
//
//  #{safe_name}.swift
//  stts
//

import Foundation

class #{safe_name}: InstatusService {
    #{definitions.join("\n    ")}
}
    INSTATUS

    return true
end

def extract_statuspage(url, custom_name)
    source = source_for("#{url}/api/v2/summary.json")
    return false unless source

    page = JSON.parse(source)["page"]
    id = page["id"]
    name = custom_name || page["name"]
    safe_name = sanitized_name(name)

    definitions = [
        "let url = URL(string: \"#{url}\")!",
        "let statusPageID = \"#{id}\""
    ]

    definitions.unshift("let name = \"#{name}\"") if safe_name != name

    create_file "stts/Services/StatusPage/#{safe_name}.swift", <<-STATUSPAGE
//
//  #{safe_name}.swift
//  stts
//

import Foundation

class #{safe_name}: StatusPageService {
    #{definitions.join("\n    ")}
}
    STATUSPAGE

    true
end

def extract_site24x7(url, source, custom_name)
    encrypted_status_page_id = source.scan(/"enc_statuspage_id":.*?"(.*?)"/mi).flatten.first
    return false if encrypted_status_page_id == nil || encrypted_status_page_id.empty?

    if custom_name == nil || custom_name.empty?
        puts "Site24x7 service detected! Please provide the service name since it cannot be automatically found."
        puts
        puts "Usage:"
        puts "bundle exec ruby extract.rb <url> <name>"
        exit(1)
    end

    id = encrypted_status_page_id
    safe_name = sanitized_name(custom_name)

    definitions = [
        "let url = URL(string: \"#{url}\")!",
        "let encryptedStatusPageID = \"#{id}\""
    ]

    definitions.unshift("let name = \"#{custom_name}\"") if safe_name != custom_name

    create_file "stts/Services/Site24x7/#{safe_name}.swift", <<-SITE24X7
//
//  #{safe_name}.swift
//  stts
//

import Foundation

class #{safe_name}: Site24x7Service {
    #{definitions.join("\n    ")}
}
    SITE24X7

    true
end

def extract_cstate(url, custom_name)
    source = source_for("#{url}/index.json")
    return false unless source

    data = JSON.parse(source)
    return false unless data["cStateVersion"] != nil

    name = custom_name || better_name(data["title"])
    base_url = data["baseURL"] || url

    safe_name = sanitized_name(name)

    definitions = [
        "let url = URL(string: \"#{base_url}\")!"
    ]

    definitions.unshift("let name = \"#{name}\"") if safe_name != name

    create_file "stts/Services/CState/#{safe_name}.swift", <<-CSTATE
//
//  #{safe_name}.swift
//  stts
//

import Foundation

class #{safe_name}: CStateService {
    #{definitions.join("\n    ")}
}
    CSTATE

    true
end

def create_file(path, content)
    File.open(path, "w") do |f|
        f.write(content)
    end

    puts "Updated #{path}"

    # Open the existing Xcode project
    project = Xcodeproj::Project.open(@project_file)

    # Add a file to the project
    file_name = path.split("/").last
    group = project.main_group

    path.split("/")[0..-2].each do |group_name|
        group = group[group_name] if group[group_name]
    end

    if group.files.map(&:path).include?(file_name)
        puts "Skipped adding #{file_name} to project: already exists"
        return
    end

    # Get the file reference for the file to add
    file = group.new_file(file_name)

    # Add the file reference to the target
    main_target = project.targets.first
    main_target.add_file_references([file])

    # Sort it
    project.main_group.sort_recursively_by_type

    # Save it
    project.save

    puts "Added #{file_name} to project"
end

def better_name(name)
    name.gsub(/(\'|\‘)?\sstatus$/i, "")
end

def sanitized_name(name)
    new_name = name.gsub(" & ", "And")
        .gsub("/", "")
        .gsub(":", "")
        .gsub("-", "")
        .gsub(".", "")
        .gsub("(", "")
        .gsub(")", "")
        .gsub("+", "")
        .gsub(",", "")
        .gsub(/(\'|\‘)?\sstatus$/i, "")

    words = new_name.split(" ").map do |word|
        # capitalize, first character only (CamelCase)
        word[0].upcase + word[1..-1]
    end

    words.join("")
end

def finish
    puts "Done!"

    puts "Running synx..."
    run_synx

    exit
end

def fail_params
    puts "Usage:"
    puts "bundle exec ruby extract.rb <url>"
    puts
    puts "Example:"
    puts "bundle exec ruby extract.rb https://status.notion.so/"
    exit 1
end

def fail_network
    puts "Could not check that link :("
    puts "Network issue or invalid link?"
    exit 1
end

def fail
    puts "No service found :("
    puts "Maybe create a ticket? https://github.com/inket/stts/issues"
    exit 1
end

def run_synx
    project = Synx::Project.open(@project_file)
    project.sync(
        prune: true,
        quiet: true,
        no_color: false,
        no_default_exclusions: false,
        no_sort_by_name: false,
        group_exclusions: []
    )
end

if Process.uid == 0
    puts "Cannot run extract script as root.".red
    exit 1
end

url = ARGV[0]
url = url.strip if url
fail_params unless url && url != ""

custom_name = ARGV[1]
custom_name = custom_name.strip if custom_name
custom_name = nil if custom_name == ""

url = "https://#{url}" if URI.parse(url).scheme == nil
source = source_for(url)

fail_network unless source

finish if extract_instatus(source, custom_name)
finish if extract_site24x7(url, source, custom_name)
finish if extract_statuspage(url, custom_name)
finish if extract_cstate(url, custom_name)

fail


================================================
FILE: openai.html
================================================
<!DOCTYPE html><html lang="en" class="inter_48f560a7-module__FmDrPW__className h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=3840&amp;q=75 3840w" imageSizes="100vw"/><link rel="stylesheet" href="/_next/static/chunks/665f62a6c30acc6c.css?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/081ff82a2bab5048.css?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/9e00295b23fa92cb.css?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/026754e95891a404.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH"/><script src="/_next/static/chunks/e7ff85ad2d18b625.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/5566283649f53d20.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/b4053b1dd34bef99.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/turbopack-e15aaa85e69655f1.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/ea59b1a51894dbe6.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/d384171cf7a30a07.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/2953506f51149cba.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/6d7aaad3f6c1fcd4.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/d2ce492b6f5820b2.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/698c98e88cd6d44a.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/0b24667fe3cb7e1c.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/65ade3a01f57f237.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/6744e5affbd1f630.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/0f6ece3e504fe79d.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/b32284605a182f22.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/ffc3e3479a355f1d.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/1e79b578d1c55e1f.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><meta name="next-size-adjust" content=""/><meta name="theme-color" content="#15171c"/><meta name="color-scheme" content="dark"/><title>OpenAI Status</title><meta name="robots" content="index, follow"/><link rel="canonical" href="https://status.openai.com"/><link rel="alternate" type="application/rss+xml" href="https://status.openai.com/feed.rss"/><link rel="alternate" type="application/atom+xml" href="https://status.openai.com/feed.atom"/><meta property="og:title" content="OpenAI Status"/><meta property="og:description" content="Latest service status for OpenAI"/><meta property="og:url" content="https://status.openai.com"/><meta property="og:site_name" content="OpenAI Status"/><meta property="og:locale" content="en-US"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="OpenAI Status"/><meta name="twitter:description" content="Latest service status for OpenAI"/><link rel="icon" href="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fv0bc3jd3.png&amp;w=96&amp;h=96&amp;q=100" sizes="96x96" type="image/png"/><link rel="icon" href="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fv0bc3jd3.png&amp;w=32&amp;h=32&amp;q=100" sizes="32x32" type="image/png"/><link rel="icon" href="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fv0bc3jd3.png&amp;w=16&amp;h=16&amp;q=100" sizes="16x16" type="image/png"/><meta name="sentry-trace" content="fe003ebeeb2c71066aac1aff2d282d59-375d817b962669b0-0"/><meta name="baggage" content="sentry-environment=production,sentry-release=647d867a20fa721d8e560e1558a0c0732db81927,sentry-public_key=5d578c0eb4bd4811adf4f2176db9a1c8,sentry-trace_id=fe003ebeeb2c71066aac1aff2d282d59,sentry-org_id=494704,sentry-sampled=false,sentry-sample_rand=0.5603115302301942,sentry-sample_rate=0"/><script src="/_next/static/chunks/a6dad97d9634a72d.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" noModule=""></script></head><body class="bg-white dark:bg-global h-full" style="background-color:#ffffff"><div hidden=""><!--$--><!--/$--></div><!--$--><!--/$--><div class="min-h-screen flex flex-col"><div class="flex flex-col container px-4 py-2 space-y-4 mx-auto md:px-2 md:max-w-[718px] md:py-4 md:space-y-6 flex-1 AppWrapper-module-scss-module__vWjDVa__withSelection"><div class="flex-1 sm:px-4 py-2 space-y-6"><div class="flex items-center min-h-[36px] mt-2" data-testid="status-page-header"><div class="flex items-center grow h-6 relative"><a class="cursor-pointer touch-manipulation" href="https://status.openai.com/"><h1 class="text-2xl text-slate-900 dark:text-slate-100 font-medium"><img alt="OpenAI" decoding="async" data-nimg="fill" class="max-w-[initial] object-scale-down object-left" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="100vw" srcSet="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=640&amp;q=75 640w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=750&amp;q=75 750w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=828&amp;q=75 828w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=1080&amp;q=75 1080w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=1200&amp;q=75 1200w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=1920&amp;q=75 1920w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=2048&amp;q=75 2048w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=3840&amp;q=75 3840w" src="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&amp;w=3840&amp;q=75"/></h1></a></div><div class="sm:inline-flex items-center space-x-4"><button title="Subscribe to updates" type="button" class="transition text-sm focus:outline-none px-2.5 py-1.5 Button-module-scss-module__cwkHSa__primary">Subscribe to updates</button></div></div><div data-testid="heads-up" class="rounded-lg p-px shadow-sm dark:shadow-none ContentBox-module-scss-module__Pj3ila__default"><div class="relative rounded-[7px] bg-white dark:bg-global"><div class="ContentBox-module-scss-module__Pj3ila__header rounded-t-[7px] text-base font-medium px-4 py-3.5"><li class="flex items-center text-slate-900 dark:text-slate-50 py-0.5"><svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="mr-2 text-slate-500 dark:text-slate-300"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.63422 2.19162C9.17333 1.27158 7.86032 1.27138 7.39915 2.19121L7.39914 2.19122L2.13614 12.6882L1.46569 12.3521L2.13614 12.6882C1.7194 13.5194 2.32373 14.4985 3.25356 14.4985H13.7748C14.7044 14.4985 15.3087 13.5198 14.8924 12.6887L14.8924 12.6887L9.63423 2.19163L9.63422 2.19162ZM6.05824 1.51891C7.07287 -0.504787 9.96145 -0.504211 10.9754 1.5198L10.9754 1.51981L16.2336 12.0169L16.2336 12.0169C17.1495 13.8454 15.82 15.9985 13.7748 15.9985H3.25356C1.20794 15.9985 -0.121611 13.8446 0.795244 12.0159L6.05824 1.51892L6.05824 1.51891ZM8.51342 4.99848C9.06571 4.99848 9.51342 5.4462 9.51342 5.99848V7.99848C9.51342 8.55077 9.06571 8.99848 8.51342 8.99848C7.96114 8.99848 7.51342 8.55077 7.51342 7.99848V5.99848C7.51342 5.4462 7.96114 4.99848 8.51342 4.99848ZM9.51342 11.9985C9.51342 12.5508 9.06571 12.9985 8.51342 12.9985C7.96114 12.9985 7.51342 12.5508 7.51342 11.9985C7.51342 11.4462 7.96114 10.9985 8.51342 10.9985C9.06571 10.9985 9.51342 11.4462 9.51342 11.9985Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.63422 2.19162C9.17333 1.27158 7.86032 1.27138 7.39915 2.19121L7.39914 2.19122L2.13614 12.6882L1.46569 12.3521L2.13614 12.6882C1.7194 13.5194 2.32373 14.4985 3.25356 14.4985H13.7748C14.7044 14.4985 15.3087 13.5198 14.8924 12.6887L14.8924 12.6887L9.63423 2.19163L9.63422 2.19162ZM6.05824 1.51891C7.07287 -0.504787 9.96145 -0.504211 10.9754 1.5198L10.9754 1.51981L16.2336 12.0169L16.2336 12.0169C17.1495 13.8454 15.82 15.9985 13.7748 15.9985H3.25356C1.20794 15.9985 -0.121611 13.8446 0.795244 12.0159L6.05824 1.51892L6.05824 1.51891ZM8.51342 4.99848C9.06571 4.99848 9.51342 5.4462 9.51342 5.99848V7.99848C9.51342 8.55077 9.06571 8.99848 8.51342 8.99848C7.96114 8.99848 7.51342 8.55077 7.51342 7.99848V5.99848C7.51342 5.4462 7.96114 4.99848 8.51342 4.99848ZM9.51342 11.9985C9.51342 12.5508 9.06571 12.9985 8.51342 12.9985C7.96114 12.9985 7.51342 12.5508 7.51342 11.9985C7.51342 11.4462 7.96114 10.9985 8.51342 10.9985C9.06571 10.9985 9.51342 11.4462 9.51342 11.9985Z" fill="currentColor"></path></svg>We’re currently experiencing issues</li></div><div class="text-slate-900 dark:text-slate-100"><div class="text-sm"><div class="flex flex-col"><div class="p-1"><div class="bg-transparent !rounded w-auto rounded-lg bg-default border border-transparent hover:bg-slate-50 dark:hover:bg-slate-800/60 transition"><a class="p-3 flex w-full cursor-pointer touch-manipulation" href="/incidents/01KKWW47249GJZZP9ZGR1PTHV5"><div class="flex flex-row gap-2 w-full"><svg class="animate-pulse mr-[3px] ml-1 mt-1.5 text-icon-full-outage" width="9" height="8" viewBox="0 0 9 8" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="4.5" cy="4" r="4" fill="currentColor"></circle></svg><div class="flex flex-col space-y-2"><div class="flex items-center text-slate-900 dark:text-slate-200 font-medium">Elevated errors for sign-in and account creation</div><div class="text-slate-900 dark:text-slate-200 font-normal"><div class="break-words"><div><p class="mb-[10px] last:mb-0 whitespace-pre-line"><span class="">We have applied the mitigation and are monitoring the recovery.</span></p></div></div></div><div class="text-slate-500"><span>Monitoring</span><span class="px-2">·</span><div class="inline"><span>Ongoing for <var duration>12</var> hours</span></div></div></div></div></a></div></div></div></div></div></div></div><div data-testid="system-status" class="rounded-lg p-px shadow-sm dark:shadow-none ContentBox-module-scss-module__Pj3ila__default"><div class="relative rounded-[7px] bg-white dark:bg-global"><div class="ContentBox-module-scss-module__Pj3ila__header rounded-t-[7px] text-base font-medium px-4 py-3.5"><div class="flex md:items-center justify-between md:flex-row flex-col md:gap-2 gap-4 items-start"><div class="flex items-center space-x-4"><h2 class="text-slate-900 dark:text-slate-50">System status</h2><div class="hidden md:flex items-center text-sm font-normal space-x-1 mt-[1px] text-slate-500"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="6" height="10" class="text-slate-300 dark:text-slate-500 w-4 h-4 font-semibold cursor-pointer transition text-slate-400 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300"><path d="M15.75 19.5L8.25 12l7.5-7.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="select-none flex justify-center whitespace-nowrap text-slate-400 dark:text-slate-500">Dec 2025<span class="px-1">-</span>Mar 2026</div><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="text-slate-300 dark:text-slate-500 w-4 h-4 font-semibold cursor-not-allowed !text-slate-100 dark:!text-slate-700"><path d="M8.25 4.5l7.5 7.5-7.5 7.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg></div></div></div></div></div><div class="text-slate-900 dark:text-slate-100"><div class="divide-y divide-solid text-sm divide-slate-50 dark:divide-slate-800"><div class="p-4 md:pt-3 md:pb-3 text-sm"><div><div class="h-7 flex flex-grow items-center text-medium"><div style="opacity:1;width:auto"><div><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-[16px] h-[16px] mr-2 text-icon-operational"><path xmlns="http://www.w3.org/2000/svg" d="M8 0C3.589 0 0 3.589 0 8C0 12.411 3.589 16 8 16C12.411 16 16 12.411 16 8C16 3.589 12.411 0 8 0ZM11.947 5.641C10.088 7.023 8.512 8.931 7.264 11.31C7.135 11.557 6.879 11.712 6.6 11.712C6.323 11.715 6.062 11.555 5.933 11.305C5.358 10.188 4.715 9.28 3.968 8.529C3.676 8.236 3.677 7.76 3.971 7.468C4.263 7.176 4.739 7.176 5.032 7.471C5.605 8.047 6.122 8.699 6.595 9.443C7.834 7.398 9.329 5.717 11.053 4.436C11.385 4.19 11.855 4.258 12.102 4.591C12.349 4.923 12.28 5.394 11.947 5.641Z" fill="currentColor"></path></svg></div></div><div class="hidden md:flex space-x-2 flex-grow items-center text-md"><div class="flex space-x-1.5 items-center"><h3 class="font-medium text-slate-900 dark:text-slate-100">APIs</h3><div class="transition text-slate-300 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300 mt-[1px] hidden md:block"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path></svg></div></div><div class="flex flex-row items-center cursor-pointer group transition"></div></div><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">12 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span><div class="flex-grow"></div><div class="ml-2 font-normal flex flex-row items-center gap-1 text-slate-400"><div style="opacity:0"><span class="whitespace-nowrap"><var percentage>99.76</var>% uptime</span></div></div></div><div class="flex md:hidden items-center text-md min-w-[0px]"><h3 class="font-medium">APIs</h3><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">12 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span></div></div><div class="hidden md:flex"><div class="w-full" style="height:auto;opacity:1;margin-top:4px;visibility:visible;overflow:visible"><div class="text-slate-500"><svg width="100%" height="16" viewBox="0 0 668 16" class="mb-1"><rect x="0" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="7.34065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="14.68131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="22.021978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="29.36263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="36.7032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="44.043956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="51.38461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="58.72527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="66.06593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="73.4065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="80.74725274725274" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="88.08791208791209" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="95.42857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="102.76923076923076" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="110.1098901098901" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="117.45054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="124.79120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="132.13186813186812" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="139.47252747252747" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="146.8131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="154.15384615384616" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="161.4945054945055" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="168.83516483516482" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="176.17582417582418" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="183.5164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="190.85714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="198.1978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="205.53846153846152" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="212.87912087912088" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="220.2197802197802" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="227.56043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="234.9010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="242.24175824175822" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="249.58241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="256.9230769230769" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="264.26373626373623" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="271.6043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="278.94505494505495" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="286.2857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="293.6263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="300.96703296703294" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="308.3076923076923" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="315.64835164835165" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="322.989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="330.3296703296703" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="337.67032967032964" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="345.010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="352.35164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="359.6923076923077" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="367.032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="374.37362637362634" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="381.7142857142857" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="389.05494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="396.3956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="403.7362637362637" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="411.07692307692304" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="418.4175824175824" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="425.75824175824175" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="433.0989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="440.4395604395604" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="447.78021978021974" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="455.1208791208791" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="462.46153846153845" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="469.8021978021978" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="477.1428571428571" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="484.48351648351644" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="491.8241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="499.16483516483515" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="506.5054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="513.8461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="521.1868131868132" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="528.5274725274725" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="535.8681318681319" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="543.2087912087912" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="550.5494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="557.8901098901099" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="565.2307692307692" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="572.5714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="579.9120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="587.2527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="594.5934065934066" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="601.9340659340659" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="609.2747252747253" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="616.6153846153846" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="623.9560439560439" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="631.2967032967033" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="638.6373626373626" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="645.978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="653.3186813186813" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="660.6593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect></svg></div></div></div></div></div><div class="p-4 md:pt-3 md:pb-3 text-sm"><div><div class="h-7 flex flex-grow items-center text-medium"><div style="opacity:1;width:auto"><div><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-[16px] h-[16px] mr-2 text-icon-operational"><path xmlns="http://www.w3.org/2000/svg" d="M8 0C3.589 0 0 3.589 0 8C0 12.411 3.589 16 8 16C12.411 16 16 12.411 16 8C16 3.589 12.411 0 8 0ZM11.947 5.641C10.088 7.023 8.512 8.931 7.264 11.31C7.135 11.557 6.879 11.712 6.6 11.712C6.323 11.715 6.062 11.555 5.933 11.305C5.358 10.188 4.715 9.28 3.968 8.529C3.676 8.236 3.677 7.76 3.971 7.468C4.263 7.176 4.739 7.176 5.032 7.471C5.605 8.047 6.122 8.699 6.595 9.443C7.834 7.398 9.329 5.717 11.053 4.436C11.385 4.19 11.855 4.258 12.102 4.591C12.349 4.923 12.28 5.394 11.947 5.641Z" fill="currentColor"></path></svg></div></div><div class="hidden md:flex space-x-2 flex-grow items-center text-md"><div class="flex space-x-1.5 items-center"><h3 class="font-medium text-slate-900 dark:text-slate-100">ChatGPT</h3><div class="transition text-slate-300 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300 mt-[1px] hidden md:block"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path></svg></div></div><div class="flex flex-row items-center cursor-pointer group transition"></div></div><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">13 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span><div class="flex-grow"></div><div class="ml-2 font-normal flex flex-row items-center gap-1 text-slate-400"><div style="opacity:0"><span class="whitespace-nowrap"><var percentage>99.08</var>% uptime</span></div></div></div><div class="flex md:hidden items-center text-md min-w-[0px]"><h3 class="font-medium">ChatGPT</h3><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">13 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span></div></div><div class="hidden md:flex"><div class="w-full" style="height:auto;opacity:1;margin-top:4px;visibility:visible;overflow:visible"><div class="text-slate-500"><svg width="100%" height="16" viewBox="0 0 668 16" class="mb-1"><rect x="0" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="7.34065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="14.68131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="22.021978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="29.36263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="36.7032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="44.043956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="51.38461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="58.72527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="66.06593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="73.4065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="80.74725274725274" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="88.08791208791209" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="95.42857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="102.76923076923076" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="110.1098901098901" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="117.45054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="124.79120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="132.13186813186812" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="139.47252747252747" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="146.8131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="154.15384615384616" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="161.4945054945055" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="168.83516483516482" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="176.17582417582418" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="183.5164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="190.85714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="198.1978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="205.53846153846152" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="212.87912087912088" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="220.2197802197802" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="227.56043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="234.9010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="242.24175824175822" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="249.58241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="256.9230769230769" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="264.26373626373623" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="271.6043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="278.94505494505495" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="286.2857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="293.6263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="300.96703296703294" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="308.3076923076923" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="315.64835164835165" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="322.989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="330.3296703296703" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="337.67032967032964" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="345.010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="352.35164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="359.6923076923077" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="367.032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="374.37362637362634" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="381.7142857142857" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="389.05494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="396.3956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="403.7362637362637" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="411.07692307692304" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="418.4175824175824" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="425.75824175824175" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="433.0989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="440.4395604395604" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="447.78021978021974" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillFullOutage"></rect><rect x="455.1208791208791" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="462.46153846153845" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="469.8021978021978" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="477.1428571428571" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="484.48351648351644" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="491.8241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="499.16483516483515" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="506.5054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="513.8461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="521.1868131868132" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="528.5274725274725" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="535.8681318681319" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="543.2087912087912" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="550.5494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="557.8901098901099" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="565.2307692307692" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="572.5714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="579.9120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="587.2527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="594.5934065934066" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="601.9340659340659" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="609.2747252747253" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="616.6153846153846" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="623.9560439560439" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="631.2967032967033" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="638.6373626373626" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="645.978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="653.3186813186813" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="660.6593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect></svg></div></div></div></div></div><div class="p-4 md:pt-3 md:pb-3 text-sm"><div><div class="h-7 flex flex-grow items-center text-medium"><div style="opacity:1;width:auto"><div><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-[16px] h-[16px] mr-2 text-icon-operational"><path xmlns="http://www.w3.org/2000/svg" d="M8 0C3.589 0 0 3.589 0 8C0 12.411 3.589 16 8 16C12.411 16 16 12.411 16 8C16 3.589 12.411 0 8 0ZM11.947 5.641C10.088 7.023 8.512 8.931 7.264 11.31C7.135 11.557 6.879 11.712 6.6 11.712C6.323 11.715 6.062 11.555 5.933 11.305C5.358 10.188 4.715 9.28 3.968 8.529C3.676 8.236 3.677 7.76 3.971 7.468C4.263 7.176 4.739 7.176 5.032 7.471C5.605 8.047 6.122 8.699 6.595 9.443C7.834 7.398 9.329 5.717 11.053 4.436C11.385 4.19 11.855 4.258 12.102 4.591C12.349 4.923 12.28 5.394 11.947 5.641Z" fill="currentColor"></path></svg></div></div><div class="hidden md:flex space-x-2 flex-grow items-center text-md"><div class="flex space-x-1.5 items-center"><h3 class="font-medium text-slate-900 dark:text-slate-100">Sora</h3><div class="transition text-slate-300 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300 mt-[1px] hidden md:block"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path></svg></div></div><div class="flex flex-row items-center cursor-pointer group transition"></div></div><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">5 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span><div class="flex-grow"></div><div class="ml-2 font-normal flex flex-row items-center gap-1 text-slate-400"><div style="opacity:0"><span class="whitespace-nowrap"><var percentage>99.98</var>% uptime</span></div></div></div><div class="flex md:hidden items-center text-md min-w-[0px]"><h3 class="font-medium">Sora</h3><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">5 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span></div></div><div class="hidden md:flex"><div class="w-full" style="height:auto;opacity:1;margin-top:4px;visibility:visible;overflow:visible"><div class="text-slate-500"><svg width="100%" height="16" viewBox="0 0 668 16" class="mb-1"><rect x="0" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="7.34065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillFullOutage"></rect><rect x="14.68131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="22.021978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="29.36263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="36.7032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="44.043956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="51.38461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="58.72527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="66.06593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="73.4065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="80.74725274725274" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="88.08791208791209" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="95.42857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="102.76923076923076" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="110.1098901098901" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="117.45054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="124.79120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="132.13186813186812" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="139.47252747252747" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="146.8131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="154.15384615384616" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="161.4945054945055" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="168.83516483516482" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="176.17582417582418" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="183.5164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="190.85714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="198.1978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="205.53846153846152" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="212.87912087912088" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="220.2197802197802" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="227.56043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="234.9010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="242.24175824175822" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="249.58241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="256.9230769230769" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="264.26373626373623" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="271.6043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="278.94505494505495" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="286.2857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="293.6263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="300.96703296703294" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="308.3076923076923" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="315.64835164835165" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="322.989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="330.3296703296703" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="337.67032967032964" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><r
Download .txt
gitextract_a2ozbqvp/

├── .bundle/
│   └── config
├── .gitattributes
├── .gitignore
├── .swiftlint.yml
├── Cartfile
├── Cartfile.resolved
├── Gemfile
├── LICENSE
├── README.md
├── Resources/
│   ├── AppIcon.icon/
│   │   └── icon.json
│   ├── Assets.xcassets/
│   │   └── Contents.json
│   ├── Base.lproj/
│   │   └── MainMenu.xib
│   ├── Info.plist
│   └── services.json
├── Scripts/
│   ├── generate_adobe_services.swift
│   ├── generate_apple_services.swift
│   ├── generate_aws_services.swift
│   ├── generate_azure_devops_services.swift
│   ├── generate_azure_services.swift
│   ├── generate_google_services.swift
│   ├── generate_salesforce_services.swift
│   └── generate_services_plist.sh
├── extract.rb
├── openai.html
├── sort.rb
├── stts/
│   ├── AppDelegate.swift
│   ├── AppearanceObserver.swift
│   ├── BottomBar.swift
│   ├── CustomScrollView.swift
│   ├── DataLoader.swift
│   ├── EditorTableView/
│   │   └── EditorTableCell.swift
│   ├── Extensions/
│   │   ├── Atomic.swift
│   │   ├── NSScreenExtensions.swift
│   │   ├── StringExtensions.swift
│   │   └── TaskExtensions.swift
│   ├── HeadlessHTMLRenderer.swift
│   ├── Icons.swift
│   ├── Preferences/
│   │   ├── PreferencesGeneralView.swift
│   │   ├── PreferencesServicesView.swift
│   │   └── PreferencesWindow.swift
│   ├── Preferences.swift
│   ├── PreferencesWindow/
│   │   ├── NSAppearance+Extensions.swift
│   │   ├── PreferencesAboutView.swift
│   │   ├── PreferencesSidebarMenu.swift
│   │   └── PreferencesWindowController.swift
│   ├── ServiceLoader/
│   │   ├── AppDefinedServiceDefinitionProvider.swift
│   │   ├── BundleServiceDefinitionProvider.swift
│   │   ├── ServiceDefinition.swift
│   │   ├── ServiceDefinitionProvider.swift
│   │   ├── ServiceLoader.swift
│   │   ├── ServicesStructure.swift
│   │   └── UserDefinedServiceDefinitionProvider.swift
│   ├── ServiceTableView/
│   │   ├── ServiceTableRowView.swift
│   │   ├── ServiceTableViewController.swift
│   │   ├── StatusIndicator.swift
│   │   └── StatusTableCell.swift
│   ├── Services/
│   │   ├── Algolia.swift
│   │   ├── AzureAll.swift
│   │   ├── AzureDevOpsAll.swift
│   │   ├── Beanstalk.swift
│   │   ├── Broadcom.swift
│   │   ├── Evernote.swift
│   │   ├── Fastly.swift
│   │   ├── Firebase.swift
│   │   ├── Generated/
│   │   │   ├── AWSServices.swift
│   │   │   ├── AdobeServices.swift
│   │   │   ├── AppleServices.swift
│   │   │   ├── AzureDevOpsServices.swift
│   │   │   ├── AzureServices.swift
│   │   │   ├── FirebaseServices.swift
│   │   │   ├── GoogleCloudPlatformServices.swift
│   │   │   └── SalesforceProducts.swift
│   │   ├── GoogleCloudPlatformAll.swift
│   │   ├── MiroAll.swift
│   │   ├── Okta.swift
│   │   ├── OracleNetSuite.swift
│   │   ├── PagerDuty/
│   │   │   └── PagerDuty.swift
│   │   ├── PayPal/
│   │   │   ├── PayPalAPIProduction.swift
│   │   │   ├── PayPalAPISandbox.swift
│   │   │   ├── PayPalProductProduction.swift
│   │   │   └── PayPalProductSandbox.swift
│   │   ├── PlayStation Network/
│   │   │   ├── PSNAmerica.swift
│   │   │   ├── PSNAsia.swift
│   │   │   └── PSNEurope.swift
│   │   ├── SendbirdAll.swift
│   │   ├── SignalWire.swift
│   │   ├── Slack.swift
│   │   ├── Stripe.swift
│   │   ├── Super/
│   │   │   ├── AWSService.swift
│   │   │   ├── AWSStore.swift
│   │   │   ├── Adobe.swift
│   │   │   ├── AdobeStore.swift
│   │   │   ├── Apple.swift
│   │   │   ├── AppleDeveloper.swift
│   │   │   ├── AppleStore.swift
│   │   │   ├── Azure.swift
│   │   │   ├── AzureDevOps.swift
│   │   │   ├── AzureDevOpsStore.swift
│   │   │   ├── AzureStore.swift
│   │   │   ├── BetterStackService.swift
│   │   │   ├── BetterUptimeService.swift
│   │   │   ├── CStateService.swift
│   │   │   ├── CachetService.swift
│   │   │   ├── ExanaService.swift
│   │   │   ├── FirebaseService.swift
│   │   │   ├── FirebaseStatusDashboardStore.swift
│   │   │   ├── GoogleCloudPlatform.swift
│   │   │   ├── GoogleStatusDashboardStore.swift
│   │   │   ├── IncidentIOService.swift
│   │   │   ├── IndependentService.swift
│   │   │   ├── InstatusService.swift
│   │   │   ├── LambStatusService.swift
│   │   │   ├── MiroService.swift
│   │   │   ├── PagerDutyService.swift
│   │   │   ├── PayPal.swift
│   │   │   ├── PlayStationNetwork.swift
│   │   │   ├── Salesforce.swift
│   │   │   ├── SalesforceCategories.swift
│   │   │   ├── SalesforceStore.swift
│   │   │   ├── SendbirdService.swift
│   │   │   ├── Service.swift
│   │   │   ├── ServiceStore.swift
│   │   │   ├── Site24x7Service.swift
│   │   │   ├── SorryService.swift
│   │   │   ├── StatusCakeService.swift
│   │   │   ├── StatusCastService.swift
│   │   │   ├── StatusHubService.swift
│   │   │   ├── StatusPageService.swift
│   │   │   ├── StatusioV1Service.swift
│   │   │   ├── StatuspalService.swift
│   │   │   └── UptimeDotComService.swift
│   │   ├── UptimeDotCom/
│   │   │   ├── JSDelivr.swift
│   │   │   ├── Recurly.swift
│   │   │   └── UptimeDotCom.swift
│   │   └── Zendesk.swift
│   ├── SwitchableTableViewController.swift
│   └── stts.entitlements
├── stts.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── swiftpm/
│   │           └── Package.resolved
│   └── xcshareddata/
│       └── xcschemes/
│           └── stts.xcscheme
└── sttsTests/
    ├── AdobeTests.swift
    ├── BetterStackTests.swift
    ├── Helpers/
    │   └── TestBundle.swift
    ├── IncidentIOTests.swift
    ├── Info.plist
    ├── InstatusTests.swift
    ├── MiroTests.swift
    ├── Mocks/
    │   ├── ResponseOverridingURLSession.swift
    │   └── ResponseSizeTrackingURLSession.swift
    ├── PagerDutyTests.swift
    ├── Resources/
    │   ├── adobe-analytics-minor.json
    │   ├── aiven-minor.html
    │   ├── buildjet-good.html
    │   ├── eyloo-major.html
    │   ├── linear-good.html
    │   ├── mastodonsocial-major.html
    │   ├── miro-good.html
    │   ├── miro-issue.html
    │   ├── openai-major.html
    │   ├── pagerduty-good.html
    │   ├── pagerduty-minor.html
    │   ├── rollbar-good.html
    │   └── whereby-good.html
    ├── StringExtensionsTests.swift
    └── sttsTests.swift
Download .txt
SYMBOL INDEX (13 symbols across 1 files)

FILE: extract.rb
  function source_for (line 8) | def source_for(url)
  function extract_instatus (line 15) | def extract_instatus(source, custom_name)
  function extract_statuspage (line 54) | def extract_statuspage(url, custom_name)
  function extract_site24x7 (line 86) | def extract_site24x7(url, source, custom_name)
  function extract_cstate (line 124) | def extract_cstate(url, custom_name)
  function create_file (line 158) | def create_file(path, content)
  function better_name (line 197) | def better_name(name)
  function sanitized_name (line 201) | def sanitized_name(name)
  function finish (line 221) | def finish
  function fail_params (line 230) | def fail_params
  function fail_network (line 239) | def fail_network
  function fail (line 245) | def fail
  function run_synx (line 251) | def run_synx
Condensed preview — 167 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,959K chars).
[
  {
    "path": ".bundle/config",
    "chars": 68,
    "preview": "---\nBUNDLE_PATH: \"vendor/bundle\"\nBUNDLE_FORCE_RUBY_PLATFORM: \"true\"\n"
  },
  {
    "path": ".gitattributes",
    "chars": 41,
    "preview": "sttsTests/Resources/** linguist-vendored\n"
  },
  {
    "path": ".gitignore",
    "chars": 1582,
    "preview": "\n# Created by https://www.gitignore.io/api/swift\n\n### Swift ###\n# Xcode\n#\n# gitignore contributors: remember to update G"
  },
  {
    "path": ".swiftlint.yml",
    "chars": 280,
    "preview": "excluded:\n  - Pods\n  - Carthage\nline_length:\n    warning: 120\n    ignores_comments: true\n    ignores_interpolated_string"
  },
  {
    "path": "Cartfile",
    "chars": 28,
    "preview": "github \"inket/StartAtLogin\"\n"
  },
  {
    "path": "Cartfile.resolved",
    "chars": 37,
    "preview": "github \"inket/StartAtLogin\" \"v6.0.0\"\n"
  },
  {
    "path": "Gemfile",
    "chars": 58,
    "preview": "source 'https://rubygems.org'\n\ngem 'xcodeproj'\ngem 'synx'\n"
  },
  {
    "path": "LICENSE",
    "chars": 1071,
    "preview": "MIT License\n\nCopyright (c) 2016 Mahdi Bchetnia\n\nPermission is hereby granted, free of charge, to any person obtaining a "
  },
  {
    "path": "README.md",
    "chars": 1399,
    "preview": "## stts ![](https://img.shields.io/badge/Swift-5-orange.svg)\n\nstts is a macOS app for monitoring the status of cloud ser"
  },
  {
    "path": "Resources/AppIcon.icon/icon.json",
    "chars": 1597,
    "preview": "{\n  \"fill\" : {\n    \"linear-gradient\" : [\n      \"display-p3:0.27726,0.27726,0.27726,1.00000\",\n      \"display-p3:0.18033,0"
  },
  {
    "path": "Resources/Assets.xcassets/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Resources/Base.lproj/MainMenu.xib",
    "chars": 48702,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
  },
  {
    "path": "Resources/Info.plist",
    "chars": 1843,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Resources/services.json",
    "chars": 31755,
    "preview": "{\n  \"betterstack\": [\n    {\n      \"name\": \"Better Stack\",\n      \"url\": \"https://status.betterstack.com\",\n      \"old_names"
  },
  {
    "path": "Scripts/generate_adobe_services.swift",
    "chars": 6428,
    "preview": "#!/usr/bin/swift\n\nimport Foundation\n\nstruct Cloud {\n    let id: String\n    let name: String\n    let products: [Product]\n"
  },
  {
    "path": "Scripts/generate_apple_services.swift",
    "chars": 5843,
    "preview": "#!/usr/bin/swift\n\nimport Foundation\n\nprivate struct AppleResponseData: Codable {\n    struct Service: Codable {\n        l"
  },
  {
    "path": "Scripts/generate_aws_services.swift",
    "chars": 6387,
    "preview": "#!/usr/bin/swift\n\nimport Foundation\n\nextension String {\n    func capitalized(firstLetterOnly: Bool) -> String {\n        "
  },
  {
    "path": "Scripts/generate_azure_devops_services.swift",
    "chars": 4824,
    "preview": "#!/usr/bin/swift\n\nimport Foundation\n\nstruct AzureDevOpsService {\n    let serviceName: String\n\n    var friendlyName: Stri"
  },
  {
    "path": "Scripts/generate_azure_services.swift",
    "chars": 4176,
    "preview": "#!/usr/bin/swift\n\nimport Foundation\n\nstruct AzureZone {\n    let serviceName: String\n    let zoneIdentifier: String\n\n    "
  },
  {
    "path": "Scripts/generate_google_services.swift",
    "chars": 6053,
    "preview": "#!/usr/bin/swift\n\nimport Foundation\n\nenum GooglePlatform: CaseIterable {\n    case cloudPlatform\n    case firebase\n\n    v"
  },
  {
    "path": "Scripts/generate_salesforce_services.swift",
    "chars": 7166,
    "preview": "#!/usr/bin/swift\n\nimport Foundation\n\nenum Location: String {\n    case na = \"NA\"\n    case emea = \"EMEA\"\n    case apac = \""
  },
  {
    "path": "Scripts/generate_services_plist.sh",
    "chars": 903,
    "preview": "#!/bin/sh\n\nRESOURCES_PATH=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH\"\nSERVICES_PLIST=\"$RESOURCES_PATH/servi"
  },
  {
    "path": "extract.rb",
    "chars": 6476,
    "preview": "require 'net/https'\nrequire 'xcodeproj'\nrequire 'json'\nrequire 'synx'\n\n@project_file = \"stts.xcodeproj\"\n\ndef source_for("
  },
  {
    "path": "openai.html",
    "chars": 254943,
    "preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
  },
  {
    "path": "sort.rb",
    "chars": 235,
    "preview": "require 'xcodeproj'\n\n# Open the existing Xcode project\nproject_file = \"stts.xcodeproj\"\nproject = Xcodeproj::Project.open"
  },
  {
    "path": "stts/AppDelegate.swift",
    "chars": 5333,
    "preview": "//\n//  AppDelegate.swift\n//  stts\n//\n\nimport Cocoa\nimport MBPopup\nimport PreferencesWindow\nimport Reachability\n\n@NSAppli"
  },
  {
    "path": "stts/AppearanceObserver.swift",
    "chars": 1565,
    "preview": "//\n//  Appearance.swift\n//  stts\n//\n\nimport Cocoa\n\nprotocol AppearanceObserver: AnyObject {\n    func changeAppearance(to"
  },
  {
    "path": "stts/BottomBar.swift",
    "chars": 5388,
    "preview": "//\n//  BottomBar.swift\n//  stts\n//\n\nimport Cocoa\n\nenum BottomBarStatus {\n    case undetermined\n    case updating\n    cas"
  },
  {
    "path": "stts/CustomScrollView.swift",
    "chars": 203,
    "preview": "//\n//  CustomScrollView.swift\n//  stts\n//\n\nimport Cocoa\n\nclass CustomScrollView: NSScrollView {\n    var topConstraint: N"
  },
  {
    "path": "stts/DataLoader.swift",
    "chars": 3130,
    "preview": "//\n//  Loading.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nprivate var _sharedWithoutCaching: URLSession?\n\nextens"
  },
  {
    "path": "stts/EditorTableView/EditorTableCell.swift",
    "chars": 6962,
    "preview": "//\n//  EditorTableCell.swift\n//  stts\n//\n\nimport Cocoa\nimport SFSafeSymbols\n\nfinal class EditorTableCell: NSTableCellVie"
  },
  {
    "path": "stts/Extensions/Atomic.swift",
    "chars": 968,
    "preview": "//\n//  Atomic.swift\n//  stts\n//\n\nimport Foundation\nimport os.lock\n\nprivate final class UnfairLock {\n    private var _loc"
  },
  {
    "path": "stts/Extensions/NSScreenExtensions.swift",
    "chars": 994,
    "preview": "//\n//  NSScreenExtensions.swift\n//  stts\n//\n\nimport Cocoa\n\nextension NSScreen {\n    static var usableHeightOfActiveScree"
  },
  {
    "path": "stts/Extensions/StringExtensions.swift",
    "chars": 3950,
    "preview": "//\n//  StringExtensions.swift\n//  stts\n//\n\nimport Cocoa\n\nextension String {\n    var innerJSONString: String {\n        le"
  },
  {
    "path": "stts/Extensions/TaskExtensions.swift",
    "chars": 290,
    "preview": "//\n//  Task.swift\n//  stts\n//\n\nimport Foundation\n\npublic extension Task where Success == Never, Failure == Never {\n    s"
  },
  {
    "path": "stts/HeadlessHTMLRenderer.swift",
    "chars": 2568,
    "preview": "//\n//  HeadlessHTMLRenderer.swift\n//  stts\n//\n\nimport Cocoa\nimport WebKit\n\n// Because some services obfuscate the javasc"
  },
  {
    "path": "stts/Icons.swift",
    "chars": 18803,
    "preview": "//\n//  Icons.swift\n//  stts\n//\n\nimport Cocoa\n\nclass CheckmarkIcon: NSView {\n    var color: NSColor = NSColor(calibratedR"
  },
  {
    "path": "stts/Preferences/PreferencesGeneralView.swift",
    "chars": 7937,
    "preview": "//\n//  PreferencesGeneralView.swift\n//  stts\n//\n\nimport Cocoa\nimport PreferencesWindow\n\nclass PreferencesGeneralView: Ve"
  },
  {
    "path": "stts/Preferences/PreferencesServicesView.swift",
    "chars": 14441,
    "preview": "//\n//  PreferencesServicesView.swift\n//  stts\n//\n\nimport Cocoa\nimport PreferencesWindow\nimport Combine\n\nfinal class Pref"
  },
  {
    "path": "stts/Preferences/PreferencesWindow.swift",
    "chars": 2099,
    "preview": "//\n//  PreferencesWindow.swift\n//  stts\n//\n\nimport Cocoa\nimport PreferencesWindow\nimport SFSafeSymbols\n\nfinal class Pref"
  },
  {
    "path": "stts/Preferences.swift",
    "chars": 3286,
    "preview": "//\n//  Preferences.swift\n//  stts\n//\n\nimport Foundation\n\nclass Preferences {\n    private let serviceLoader: ServiceLoade"
  },
  {
    "path": "stts/PreferencesWindow/NSAppearance+Extensions.swift",
    "chars": 187,
    "preview": "//\n//  NSAppearance+Extensions.swift\n//  PreferencesWindow\n//\n\nimport Cocoa\n\nextension NSAppearance {\n    var isDarkMode"
  },
  {
    "path": "stts/PreferencesWindow/PreferencesAboutView.swift",
    "chars": 4308,
    "preview": "//\n//  PreferencesAboutView.swift\n//  PreferencesWindow\n//\n\nimport Cocoa\n\npublic struct AboutContent {\n    public struct"
  },
  {
    "path": "stts/PreferencesWindow/PreferencesSidebarMenu.swift",
    "chars": 744,
    "preview": "//\n//  PreferencesSidebarMenu.swift\n//  PreferencesWindow\n//\n\nimport Cocoa\nimport SFSafeSymbols\n\npublic protocol Prefere"
  },
  {
    "path": "stts/PreferencesWindow/PreferencesWindowController.swift",
    "chars": 10609,
    "preview": "//\n//  PreferencesWindowController.swift\n//  PreferencesWindow\n//\n\nimport Cocoa\nimport SFSafeSymbols\n\npublic class Prefe"
  },
  {
    "path": "stts/ServiceLoader/AppDefinedServiceDefinitionProvider.swift",
    "chars": 628,
    "preview": "//\n//  AppDefinedServiceDefinitionProvider.swift\n//  stts\n//\n\nimport Foundation\n\nenum AppDefinedServiceDefinitionProvide"
  },
  {
    "path": "stts/ServiceLoader/BundleServiceDefinitionProvider.swift",
    "chars": 759,
    "preview": "//\n//  BundleServiceDefinitionProvider.swift\n//  stts\n//\n\nimport Foundation\n\nenum BundleServiceDefinitionProviderError: "
  },
  {
    "path": "stts/ServiceLoader/ServiceDefinition.swift",
    "chars": 3012,
    "preview": "//\n//  ServiceDefinition.swift\n//  stts\n//\n\nimport Foundation\n\nprotocol ServiceDefinition: CodableServiceDefinition {\n  "
  },
  {
    "path": "stts/ServiceLoader/ServiceDefinitionProvider.swift",
    "chars": 1201,
    "preview": "//\n//  ServiceDefinitionProvider.swift\n//  stts\n//\n\nimport Foundation\n\nprotocol ServiceDefinitionProvider {\n    func def"
  },
  {
    "path": "stts/ServiceLoader/ServiceLoader.swift",
    "chars": 1810,
    "preview": "//\n//  ServiceLoader.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class ServiceLoader {\n    private let providers: [Servi"
  },
  {
    "path": "stts/ServiceLoader/ServicesStructure.swift",
    "chars": 2660,
    "preview": "//\n//  ServicesStructure.swift\n//  stts\n//\n\nimport Foundation\n\nstruct ServicesStructure: Codable {\n    enum CodingKeys: "
  },
  {
    "path": "stts/ServiceLoader/UserDefinedServiceDefinitionProvider.swift",
    "chars": 1109,
    "preview": "//\n//  UserDefinedServiceDefinitionProvider.swift\n//  stts\n//\n\nimport Foundation\n\n// swiftlint:disable:next type_name\nen"
  },
  {
    "path": "stts/ServiceTableView/ServiceTableRowView.swift",
    "chars": 2050,
    "preview": "//\n//  ServiceTableRowView.swift\n//  stts\n//\n\nimport Cocoa\n\nclass ServiceTableRowView: NSTableRowView {\n    var showSepa"
  },
  {
    "path": "stts/ServiceTableView/ServiceTableViewController.swift",
    "chars": 10372,
    "preview": "//\n//  ServiceTableViewController.swift\n//  stts\n//\n\nimport Cocoa\nimport MBPopup\nimport PreferencesWindow\n\nclass Service"
  },
  {
    "path": "stts/ServiceTableView/StatusIndicator.swift",
    "chars": 1649,
    "preview": "//\n//  StatusIndicator.swift\n//  stts\n//\n\nimport Cocoa\n\nclass StatusIndicator: NSView {\n    var checkmarkIcon = Checkmar"
  },
  {
    "path": "stts/ServiceTableView/StatusTableCell.swift",
    "chars": 4444,
    "preview": "//\n//  StatusTableCell.swift\n//  stts\n//\n\nimport Cocoa\n\nclass StatusTableCell: NSTableCellView {\n    let statusIndicator"
  },
  {
    "path": "stts/Services/Algolia.swift",
    "chars": 1880,
    "preview": "//\n//  Algolia.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Algolia: IndependentService {\n    private enum A"
  },
  {
    "path": "stts/Services/AzureAll.swift",
    "chars": 257,
    "preview": "//\n//  AzureAll.swift\n//  stts\n//\n\nimport Foundation\n\nclass AzureAll: Azure, ServiceCategory {\n    let categoryName = \"A"
  },
  {
    "path": "stts/Services/AzureDevOpsAll.swift",
    "chars": 284,
    "preview": "//\n//  AzureDevOpsAll.swift\n//  stts\n//\n\nimport Foundation\n\nclass AzureDevOpsAll: AzureDevOps, ServiceCategory {\n    let"
  },
  {
    "path": "stts/Services/Beanstalk.swift",
    "chars": 1274,
    "preview": "//\n//  Beanstalk.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Beanstalk: IndependentService {\n    let url = "
  },
  {
    "path": "stts/Services/Broadcom.swift",
    "chars": 1866,
    "preview": "//\n//  Broadcom.swift\n//  stts\n//\n\nimport Foundation\n\nclass Broadcom: IndependentService {\n    let url = URL(string: \"ht"
  },
  {
    "path": "stts/Services/Evernote.swift",
    "chars": 1000,
    "preview": "//\n//  Evernote.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Evernote: IndependentService {\n    let url = UR"
  },
  {
    "path": "stts/Services/Fastly.swift",
    "chars": 4285,
    "preview": "//\n//  Fastly.swift\n//  stts\n\nimport Foundation\nimport Kanna\n\nclass Fastly: IndependentService {\n    let url = URL(strin"
  },
  {
    "path": "stts/Services/Firebase.swift",
    "chars": 249,
    "preview": "//\n//  FirebaseAll.swift\n//  stts\n//\n\nimport Foundation\n\nclass Firebase: FirebaseService, ServiceCategory {\n    let cate"
  },
  {
    "path": "stts/Services/Generated/AWSServices.swift",
    "chars": 237988,
    "preview": "// This file is generated by generate_aws_services.swift and should not be modified manually.\n// swiftlint:disable super"
  },
  {
    "path": "stts/Services/Generated/AdobeServices.swift",
    "chars": 10897,
    "preview": "// This file is generated by generate_adobe_services.swift and should not be modified manually.\n// swiftlint:disable sup"
  },
  {
    "path": "stts/Services/Generated/AppleServices.swift",
    "chars": 18766,
    "preview": "// This file is generated by generate_apple_services.swift and should not be modified manually.\n// swiftlint:disable sup"
  },
  {
    "path": "stts/Services/Generated/AzureDevOpsServices.swift",
    "chars": 1146,
    "preview": "// This file is generated by generate_azure_devops_services.swift and should not be modified manually.\n// swiftlint:disa"
  },
  {
    "path": "stts/Services/Generated/AzureServices.swift",
    "chars": 1026,
    "preview": "// This file is generated by generate_azure_services.swift and should not be modified manually.\n// swiftlint:disable sup"
  },
  {
    "path": "stts/Services/Generated/FirebaseServices.swift",
    "chars": 2507,
    "preview": "// This file is generated by generate_google_services.swift and should not be modified manually.\n// swiftlint:disable su"
  },
  {
    "path": "stts/Services/Generated/GoogleCloudPlatformServices.swift",
    "chars": 29321,
    "preview": "// This file is generated by generate_google_services.swift and should not be modified manually.\n// swiftlint:disable su"
  },
  {
    "path": "stts/Services/Generated/SalesforceProducts.swift",
    "chars": 7951,
    "preview": "// This file is generated by generate_salesforce_services.swift and should not be modified manually.\n// swiftlint:disabl"
  },
  {
    "path": "stts/Services/GoogleCloudPlatformAll.swift",
    "chars": 308,
    "preview": "//\n//  GoogleCloudPlatformAll.swift\n//  stts\n//\n\nimport Foundation\n\nclass GoogleCloudPlatformAll: GoogleCloudPlatform, S"
  },
  {
    "path": "stts/Services/MiroAll.swift",
    "chars": 2165,
    "preview": "//\n//  MiroAll.swift\n//  stts\n\nimport Foundation\nimport Kanna\n\nclass MiroAll: IndependentService, ServiceCategory {\n    "
  },
  {
    "path": "stts/Services/Okta.swift",
    "chars": 2518,
    "preview": "//\n//  Okta.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Okta: IndependentService {\n    private struct Incid"
  },
  {
    "path": "stts/Services/OracleNetSuite.swift",
    "chars": 1291,
    "preview": "//\n//  OracleNetSuite.swift\n//  stts\n//\n\nimport Foundation\n\nprivate struct NetSuiteResponse: Codable {\n    struct NetSui"
  },
  {
    "path": "stts/Services/PagerDuty/PagerDuty.swift",
    "chars": 158,
    "preview": "//\n//  PagerDuty.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PagerDuty: PagerDutyService {\n    let url = URL(strin"
  },
  {
    "path": "stts/Services/PayPal/PayPalAPIProduction.swift",
    "chars": 190,
    "preview": "//\n//  PayPalAPIProduction.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PayPalAPIProduction: PayPal {\n    let name "
  },
  {
    "path": "stts/Services/PayPal/PayPalAPISandbox.swift",
    "chars": 191,
    "preview": "//\n//  PayPalAPISandbox.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PayPalAPISandbox: PayPal {\n    let name = \"Pay"
  },
  {
    "path": "stts/Services/PayPal/PayPalProductProduction.swift",
    "chars": 206,
    "preview": "//\n//  PayPalProductProduction.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PayPalProductProduction: PayPal {\n    l"
  },
  {
    "path": "stts/Services/PayPal/PayPalProductSandbox.swift",
    "chars": 207,
    "preview": "//\n//  PayPalProductSandbox.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PayPalProductSandbox: PayPal {\n    let nam"
  },
  {
    "path": "stts/Services/PlayStation Network/PSNAmerica.swift",
    "chars": 199,
    "preview": "//\n//  PSNAmerica.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PSNAmerica: PlayStationNetwork {\n    let region: Pla"
  },
  {
    "path": "stts/Services/PlayStation Network/PSNAsia.swift",
    "chars": 191,
    "preview": "//\n//  PSNAsia.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PSNAsia: PlayStationNetwork {\n    let region: PlayStati"
  },
  {
    "path": "stts/Services/PlayStation Network/PSNEurope.swift",
    "chars": 196,
    "preview": "//\n//  PSNEurope.swift\n//  stts\n//\n\nimport Foundation\n\nfinal class PSNEurope: PlayStationNetwork {\n    let region: PlayS"
  },
  {
    "path": "stts/Services/SendbirdAll.swift",
    "chars": 1735,
    "preview": "//\n//  SendbirdAll.swift\n//  SendbirdAll\n//\n\nimport Foundation\n\nclass SendbirdAll: IndependentService, ServiceCategory {"
  },
  {
    "path": "stts/Services/SignalWire.swift",
    "chars": 1692,
    "preview": "//\n//  SignalWire.swift\n//  stts\n//\n\nimport Foundation\n\nclass SignalWire: IndependentService {\n    let url = URL(string:"
  },
  {
    "path": "stts/Services/Slack.swift",
    "chars": 1536,
    "preview": "//\n//  Slack.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Slack: IndependentService {\n    private enum Slack"
  },
  {
    "path": "stts/Services/Stripe.swift",
    "chars": 1357,
    "preview": "//\n//  Stripe.swift\n//  stts\n//\n\nimport Foundation\n\nprivate struct StripeCurrentStatus: Codable {\n    enum Status: Strin"
  },
  {
    "path": "stts/Services/Super/AWSService.swift",
    "chars": 1644,
    "preview": "//\n//  AWSService.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias AWSAllService = BaseAWSAllService & RequiredServicePro"
  },
  {
    "path": "stts/Services/Super/AWSStore.swift",
    "chars": 6206,
    "preview": "//\n//  AWSStore.swift\n//  stts\n//\n\nimport Foundation\n\n// When all is good, the response from currentevents is empty; luc"
  },
  {
    "path": "stts/Services/Super/Adobe.swift",
    "chars": 1264,
    "preview": "//\n//  Adobe.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias AdobeCreativeCloud = BaseAdobeCreativeCloud & RequiredServi"
  },
  {
    "path": "stts/Services/Super/AdobeStore.swift",
    "chars": 9383,
    "preview": "//\n//  AdobeStore.swift\n//  stts\n//\n\nimport Foundation\n\nprotocol AdobeStoreService {\n    var id: String { get }\n}\n\npriva"
  },
  {
    "path": "stts/Services/Super/Apple.swift",
    "chars": 647,
    "preview": "//\n//  Apple.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias Apple = BaseApple & RequiredServiceProperties & AppleStoreS"
  },
  {
    "path": "stts/Services/Super/AppleDeveloper.swift",
    "chars": 719,
    "preview": "//\n//  AppleDeveloper.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias AppleDeveloper = BaseAppleDeveloper & RequiredServ"
  },
  {
    "path": "stts/Services/Super/AppleStore.swift",
    "chars": 4082,
    "preview": "//\n//  AppleStore.swift\n//  stts\n//\n\nimport Foundation\n\nprotocol AppleStoreService {\n    var serviceName: String { get }"
  },
  {
    "path": "stts/Services/Super/Azure.swift",
    "chars": 550,
    "preview": "//\n//  Azure.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias Azure = BaseAzure & RequiredServiceProperties & AzureStoreS"
  },
  {
    "path": "stts/Services/Super/AzureDevOps.swift",
    "chars": 601,
    "preview": "//\n//  AzureDevOpsDevOps.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias AzureDevOps = BaseAzureDevOps & RequiredService"
  },
  {
    "path": "stts/Services/Super/AzureDevOpsStore.swift",
    "chars": 3343,
    "preview": "//\n//  AzureDevOpsStore.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol AzureDevOpsStoreService {\n    var se"
  },
  {
    "path": "stts/Services/Super/AzureStore.swift",
    "chars": 2358,
    "preview": "//\n//  AzureStore.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol AzureStoreService {\n    var name: String {"
  },
  {
    "path": "stts/Services/Super/BetterStackService.swift",
    "chars": 4013,
    "preview": "//\n//  BetterStackService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass BetterStackServiceDefinition: Codable"
  },
  {
    "path": "stts/Services/Super/BetterUptimeService.swift",
    "chars": 3326,
    "preview": "//\n//  BetterUptimeService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass BetterUptimeServiceDefinition: Codab"
  },
  {
    "path": "stts/Services/Super/CStateService.swift",
    "chars": 2491,
    "preview": "//\n//  CStateService.swift\n//  stts\n//\n\nimport Foundation\n\nclass CStateServiceDefinition: CodableServiceDefinition, Serv"
  },
  {
    "path": "stts/Services/Super/CachetService.swift",
    "chars": 2260,
    "preview": "//\n//  CachetService.swift\n//  stts\n//\n\nimport Foundation\n\nclass CachetServiceDefinition: CodableServiceDefinition, Serv"
  },
  {
    "path": "stts/Services/Super/ExanaService.swift",
    "chars": 3900,
    "preview": "//\n//  ExanaService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass ExanaServiceDefinition: CodableServiceDefin"
  },
  {
    "path": "stts/Services/Super/FirebaseService.swift",
    "chars": 1193,
    "preview": "//\n//  Firebase.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias FirebaseService = BaseFirebaseService & RequiredServiceP"
  },
  {
    "path": "stts/Services/Super/FirebaseStatusDashboardStore.swift",
    "chars": 3222,
    "preview": "//\n//  FirebaseStatusDashboardStore.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol FirebaseStatusDashboardS"
  },
  {
    "path": "stts/Services/Super/GoogleCloudPlatform.swift",
    "chars": 741,
    "preview": "//\n//  GoogleCloudPlatform.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias GoogleCloudPlatform = BaseGoogleCloudPlatform"
  },
  {
    "path": "stts/Services/Super/GoogleStatusDashboardStore.swift",
    "chars": 3462,
    "preview": "//\n//  GoogleStatusDashboardStore.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol GoogleStatusDashboardStore"
  },
  {
    "path": "stts/Services/Super/IncidentIOService.swift",
    "chars": 3043,
    "preview": "//\n//  IncidentIOService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass IncidentIOServiceDefinition: CodableSe"
  },
  {
    "path": "stts/Services/Super/IndependentService.swift",
    "chars": 2343,
    "preview": "//\n//  IndependentService.swift\n//  stts\n//\n\nimport Foundation\n\nclass IndependentServiceDefinition: CodableServiceDefini"
  },
  {
    "path": "stts/Services/Super/InstatusService.swift",
    "chars": 6845,
    "preview": "//\n//  InstatusService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass InstatusServiceDefinition: CodableServic"
  },
  {
    "path": "stts/Services/Super/LambStatusService.swift",
    "chars": 2126,
    "preview": "//\n//  LambStatusService.swift\n//  stts\n//\n\nimport Foundation\n\nclass LambStatusServiceDefinition: CodableServiceDefiniti"
  },
  {
    "path": "stts/Services/Super/MiroService.swift",
    "chars": 235,
    "preview": "//\n//  MiroService.swift\n//  stts\n//\n\nimport Foundation\n\nclass MiroServiceDefinition: IncidentIOServiceDefinition {\n    "
  },
  {
    "path": "stts/Services/Super/PagerDutyService.swift",
    "chars": 4221,
    "preview": "//\n//  PagerDutyService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\ntypealias PagerDutyService = BasePagerDutySer"
  },
  {
    "path": "stts/Services/Super/PayPal.swift",
    "chars": 3715,
    "preview": "//\n//  PayPal.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias PayPal = BasePayPal & RequiredServiceProperties & Required"
  },
  {
    "path": "stts/Services/Super/PlayStationNetwork.swift",
    "chars": 2233,
    "preview": "//\n//  PlayStationNetwork.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias PlayStationNetwork = BasePlayStationNetwork & "
  },
  {
    "path": "stts/Services/Super/Salesforce.swift",
    "chars": 771,
    "preview": "//\n//  Salesforce.swift\n//  Salesforce\n//\n\nimport Foundation\n\ntypealias Salesforce = BaseSalesforce & RequiredServicePro"
  },
  {
    "path": "stts/Services/Super/SalesforceCategories.swift",
    "chars": 3516,
    "preview": "// This file is generated by generate_salesforce_services.swift and should not be modified manually.\n// swiftlint:disabl"
  },
  {
    "path": "stts/Services/Super/SalesforceStore.swift",
    "chars": 2959,
    "preview": "//\n//  SalesforceStore.swift\n//  SalesforceStore\n//\n\nimport Foundation\n\nprotocol SalesforceStoreService {\n    var key: S"
  },
  {
    "path": "stts/Services/Super/SendbirdService.swift",
    "chars": 262,
    "preview": "//\n//  SendbirdService.swift\n//  SendbirdService\n//\n\nimport Foundation\n\nclass SendbirdServiceDefinition: StatusPageServi"
  },
  {
    "path": "stts/Services/Super/Service.swift",
    "chars": 5140,
    "preview": "//\n//  Service.swift\n//  stts\n//\n\nimport Foundation\n\npublic enum ServiceStatus: Int, Comparable {\n    case undetermined\n"
  },
  {
    "path": "stts/Services/Super/ServiceStore.swift",
    "chars": 1635,
    "preview": "//\n//  ServiceStore.swift\n//  stts\n//\n\nimport Foundation\n\nprotocol InitializableState {\n    init()\n}\n\nextension Dictiona"
  },
  {
    "path": "stts/Services/Super/Site24x7Service.swift",
    "chars": 6483,
    "preview": "//\n//  Site24x7Service.swift\n//  stts\n//\n\nimport Foundation\n\nclass Site24x7ServiceDefinition: CodableServiceDefinition, "
  },
  {
    "path": "stts/Services/Super/SorryService.swift",
    "chars": 2555,
    "preview": "//\n//  SorryService.swift\n//  stts\n//\n\nimport Foundation\n\nclass SorryServiceDefinition: CodableServiceDefinition, Servic"
  },
  {
    "path": "stts/Services/Super/StatusCakeService.swift",
    "chars": 2291,
    "preview": "//\n//  StatusCakeService.swift\n//  stts\n//\n\nimport Foundation\n\nclass StatusCakeServiceDefinition: CodableServiceDefiniti"
  },
  {
    "path": "stts/Services/Super/StatusCastService.swift",
    "chars": 2083,
    "preview": "//\n//  StatusCastService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass StatusCastServiceDefinition: CodableSe"
  },
  {
    "path": "stts/Services/Super/StatusHubService.swift",
    "chars": 2393,
    "preview": "//\n//  StatusHubService.swift\n//  stts\n//\n\nimport Foundation\n\nclass StatusHubServiceDefinition: CodableServiceDefinition"
  },
  {
    "path": "stts/Services/Super/StatusPageService.swift",
    "chars": 6639,
    "preview": "//\n//  StatusPageService.swift\n//  stts\n//\n\nimport Foundation\n\nclass StatusPageServiceDefinition: CodableServiceDefiniti"
  },
  {
    "path": "stts/Services/Super/StatusioV1Service.swift",
    "chars": 2649,
    "preview": "//\n//  StatusioV1Service.swift\n//  stts\n//\n\nimport Foundation\n\nclass StatusioV1ServiceDefinition: CodableServiceDefiniti"
  },
  {
    "path": "stts/Services/Super/StatuspalService.swift",
    "chars": 2148,
    "preview": "//\n//  StatuspalService.swift\n//  stts\n//\n\nimport Foundation\nimport Kanna\n\nclass StatuspalServiceDefinition: CodableServ"
  },
  {
    "path": "stts/Services/Super/UptimeDotComService.swift",
    "chars": 1048,
    "preview": "//\n//  UptimeDotComService.swift\n//  stts\n//\n\nimport Foundation\n\ntypealias UptimeDotComService = BaseUptimeDotComService"
  },
  {
    "path": "stts/Services/UptimeDotCom/JSDelivr.swift",
    "chars": 178,
    "preview": "//\n//  JSDelivr.swift\n//  stts\n//\n\nimport Foundation\n\nclass JSDelivr: UptimeDotComService {\n    let name = \"jsDelivr\"\n  "
  },
  {
    "path": "stts/Services/UptimeDotCom/Recurly.swift",
    "chars": 149,
    "preview": "//\n//  Recurly.swift\n//  stts\n//\n\nimport Foundation\n\nclass Recurly: UptimeDotComService {\n    let url = URL(string: \"htt"
  },
  {
    "path": "stts/Services/UptimeDotCom/UptimeDotCom.swift",
    "chars": 186,
    "preview": "//\n//  UptimeDotCom.swift\n//  stts\n//\n\nimport Foundation\n\nclass UptimeDotCom: UptimeDotComService {\n    let name = \"Upti"
  },
  {
    "path": "stts/Services/Zendesk.swift",
    "chars": 1422,
    "preview": "//\n//  Zendesk.swift\n//  stts\n//\n\nimport Foundation\n\nprivate struct ZendeskIncidentsResponse: Codable {\n    struct Incid"
  },
  {
    "path": "stts/SwitchableTableViewController.swift",
    "chars": 427,
    "preview": "//\n//  SwitchableTableViewController.swift\n//  stts\n//\n\nimport Cocoa\n\nprotocol SwitchableTableViewController: AnyObject "
  },
  {
    "path": "stts/stts.entitlements",
    "chars": 295,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "stts.xcodeproj/project.pbxproj",
    "chars": 101493,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "stts.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "stts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "stts.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "chars": 1191,
    "preview": "{\n  \"originHash\" : \"6757785d4818500b15e48de30606d42ef095eca4264e87c401b91dbf5cd6125b\",\n  \"pins\" : [\n    {\n      \"identit"
  },
  {
    "path": "stts.xcodeproj/xcshareddata/xcschemes/stts.xcscheme",
    "chars": 3660,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2600\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "sttsTests/AdobeTests.swift",
    "chars": 1215,
    "preview": "//\n//  AdobeTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class AdobeTests: XCTestCase {\n    "
  },
  {
    "path": "sttsTests/BetterStackTests.swift",
    "chars": 1565,
    "preview": "//\n//  BetterStackTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class BetterStackTests: XCTes"
  },
  {
    "path": "sttsTests/Helpers/TestBundle.swift",
    "chars": 184,
    "preview": "//\n//  TestBundle.swift\n//  sttsTests\n//\n\nimport Foundation\n\nprivate class TestBundle {}\n\nextension Bundle {\n    static "
  },
  {
    "path": "sttsTests/IncidentIOTests.swift",
    "chars": 4283,
    "preview": "//\n//  IncidentIOTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class IncidentIOTests: XCTestC"
  },
  {
    "path": "sttsTests/Info.plist",
    "chars": 701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "sttsTests/InstatusTests.swift",
    "chars": 2143,
    "preview": "//\n//  InstatusTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class InstatusTests: XCTestCase "
  },
  {
    "path": "sttsTests/MiroTests.swift",
    "chars": 1315,
    "preview": "//\n//  MiroTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class MiroTests: XCTestCase {\n    pr"
  },
  {
    "path": "sttsTests/Mocks/ResponseOverridingURLSession.swift",
    "chars": 1594,
    "preview": "//\n//  ResponseOverridingURLSession.swift\n//  sttsTests\n//\n\nimport Foundation\nimport stts\n\nfinal class ResponseOverridin"
  },
  {
    "path": "sttsTests/Mocks/ResponseSizeTrackingURLSession.swift",
    "chars": 902,
    "preview": "//\n//  ResponseSizeTrackingURLSession.swift\n//  sttsTests\n//\n\nimport Foundation\nimport stts\n\nfinal class ResponseSizeTra"
  },
  {
    "path": "sttsTests/PagerDutyTests.swift",
    "chars": 1257,
    "preview": "//\n//  PagerDutyTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class PagerDutyTests: XCTestCas"
  },
  {
    "path": "sttsTests/Resources/aiven-minor.html",
    "chars": 113422,
    "preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
  },
  {
    "path": "sttsTests/Resources/buildjet-good.html",
    "chars": 64271,
    "preview": "<!DOCTYPE html>\n<html class='h-full light' lang='en' prefix='og: https://ogp.me/ns#'>\n<head>\n<meta content='text/html; c"
  },
  {
    "path": "sttsTests/Resources/eyloo-major.html",
    "chars": 99011,
    "preview": "<!DOCTYPE html>\n<html class='h-full light' lang='en' prefix='og: https://ogp.me/ns#'>\n<head>\n<meta content='text/html; c"
  },
  {
    "path": "sttsTests/Resources/linear-good.html",
    "chars": 232566,
    "preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full dark\"><head><meta charSet=\"utf-8\"/"
  },
  {
    "path": "sttsTests/Resources/mastodonsocial-major.html",
    "chars": 246648,
    "preview": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-s"
  },
  {
    "path": "sttsTests/Resources/miro-good.html",
    "chars": 64581,
    "preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
  },
  {
    "path": "sttsTests/Resources/miro-issue.html",
    "chars": 64581,
    "preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
  },
  {
    "path": "sttsTests/Resources/openai-major.html",
    "chars": 255029,
    "preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
  },
  {
    "path": "sttsTests/Resources/pagerduty-good.html",
    "chars": 464952,
    "preview": "\n<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"utf-8\">\n        <!-- TODO set title -->\n        <title>Status "
  },
  {
    "path": "sttsTests/Resources/pagerduty-minor.html",
    "chars": 467397,
    "preview": "\n<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"utf-8\">\n        <!-- TODO set title -->\n        <title>Status "
  },
  {
    "path": "sttsTests/Resources/rollbar-good.html",
    "chars": 283577,
    "preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
  },
  {
    "path": "sttsTests/Resources/whereby-good.html",
    "chars": 154895,
    "preview": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-s"
  },
  {
    "path": "sttsTests/StringExtensionsTests.swift",
    "chars": 1972,
    "preview": "//\n//  StringExtensionsTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nclass StringExtensionsTests: X"
  },
  {
    "path": "sttsTests/sttsTests.swift",
    "chars": 2802,
    "preview": "//\n//  sttsTests.swift\n//  sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nclass SttsTests: XCTestCase {\n    override"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the inket/stts GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 167 files (17.1 MB), approximately 911.6k tokens, and a symbol index with 13 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.

Copied to clipboard!