add some initial stuff
This commit is contained in:
		
							
								
								
									
										13
									
								
								song_of_the_day/Data/DataContext.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								song_of_the_day/Data/DataContext.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class DataContext : DbContext
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public static DataContext Instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public DbSet<User> Users { get; set; }
 | 
				
			||||||
 | 
					    public DbSet<Song> Songs { get; set; }
 | 
				
			||||||
 | 
					    public DbSet<SongSuggestion> SongSuggestions { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 | 
				
			||||||
 | 
					        => optionsBuilder.UseNpgsql(@"Host=192.168.1.108:5477;Username=sotd;Password=SotdP0stgresP4ss;Database=sotd");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										120
									
								
								song_of_the_day/Data/Migrations/20250402205033_InitialCreate.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								song_of_the_day/Data/Migrations/20250402205033_InitialCreate.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
				
			|||||||
 | 
					// <auto-generated />
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Migrations;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
 | 
				
			||||||
 | 
					using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#nullable disable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace song_of_the_day.DataMigrations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [DbContext(typeof(DataContext))]
 | 
				
			||||||
 | 
					    [Migration("20250402205033_InitialCreate")]
 | 
				
			||||||
 | 
					    partial class InitialCreate
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <inheritdoc />
 | 
				
			||||||
 | 
					        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					#pragma warning disable 612, 618
 | 
				
			||||||
 | 
					            modelBuilder
 | 
				
			||||||
 | 
					                .HasAnnotation("ProductVersion", "9.0.3")
 | 
				
			||||||
 | 
					                .HasAnnotation("Relational:MaxIdentifierLength", 63);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("Song", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("SongId")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SongId"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Artist")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Name")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Url")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("Songs");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SongSuggestion", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("Id")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<DateTime>("Date")
 | 
				
			||||||
 | 
					                        .HasColumnType("timestamp with time zone");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int>("SongId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int>("UserId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("Id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("SongSuggestions");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("User", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("UserId")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("UserId"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Name")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("SignalId")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("Users");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SongSuggestion", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("Song", "Song")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("SongId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasOne("User", "User")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("UserId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("Song");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("User");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					#pragma warning restore 612, 618
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Migrations;
 | 
				
			||||||
 | 
					using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#nullable disable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace song_of_the_day.DataMigrations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /// <inheritdoc />
 | 
				
			||||||
 | 
					    public partial class InitialCreate : Migration
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <inheritdoc />
 | 
				
			||||||
 | 
					        protected override void Up(MigrationBuilder migrationBuilder)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            migrationBuilder.CreateTable(
 | 
				
			||||||
 | 
					                name: "Songs",
 | 
				
			||||||
 | 
					                columns: table => new
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    SongId = table.Column<int>(type: "integer", nullable: false)
 | 
				
			||||||
 | 
					                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
 | 
				
			||||||
 | 
					                    Name = table.Column<string>(type: "text", nullable: false),
 | 
				
			||||||
 | 
					                    Artist = table.Column<string>(type: "text", nullable: false),
 | 
				
			||||||
 | 
					                    Url = table.Column<string>(type: "text", nullable: false)
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                constraints: table =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    table.PrimaryKey("PK_Songs", x => x.SongId);
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.CreateTable(
 | 
				
			||||||
 | 
					                name: "Users",
 | 
				
			||||||
 | 
					                columns: table => new
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    UserId = table.Column<int>(type: "integer", nullable: false)
 | 
				
			||||||
 | 
					                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
 | 
				
			||||||
 | 
					                    SignalId = table.Column<string>(type: "text", nullable: false),
 | 
				
			||||||
 | 
					                    Name = table.Column<string>(type: "text", nullable: false)
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                constraints: table =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    table.PrimaryKey("PK_Users", x => x.UserId);
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.CreateTable(
 | 
				
			||||||
 | 
					                name: "SongSuggestions",
 | 
				
			||||||
 | 
					                columns: table => new
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Id = table.Column<int>(type: "integer", nullable: false)
 | 
				
			||||||
 | 
					                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
 | 
				
			||||||
 | 
					                    UserId = table.Column<int>(type: "integer", nullable: false),
 | 
				
			||||||
 | 
					                    SongId = table.Column<int>(type: "integer", nullable: false),
 | 
				
			||||||
 | 
					                    Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                constraints: table =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    table.PrimaryKey("PK_SongSuggestions", x => x.Id);
 | 
				
			||||||
 | 
					                    table.ForeignKey(
 | 
				
			||||||
 | 
					                        name: "FK_SongSuggestions_Songs_SongId",
 | 
				
			||||||
 | 
					                        column: x => x.SongId,
 | 
				
			||||||
 | 
					                        principalTable: "Songs",
 | 
				
			||||||
 | 
					                        principalColumn: "SongId",
 | 
				
			||||||
 | 
					                        onDelete: ReferentialAction.Cascade);
 | 
				
			||||||
 | 
					                    table.ForeignKey(
 | 
				
			||||||
 | 
					                        name: "FK_SongSuggestions_Users_UserId",
 | 
				
			||||||
 | 
					                        column: x => x.UserId,
 | 
				
			||||||
 | 
					                        principalTable: "Users",
 | 
				
			||||||
 | 
					                        principalColumn: "UserId",
 | 
				
			||||||
 | 
					                        onDelete: ReferentialAction.Cascade);
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.CreateIndex(
 | 
				
			||||||
 | 
					                name: "IX_SongSuggestions_SongId",
 | 
				
			||||||
 | 
					                table: "SongSuggestions",
 | 
				
			||||||
 | 
					                column: "SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.CreateIndex(
 | 
				
			||||||
 | 
					                name: "IX_SongSuggestions_UserId",
 | 
				
			||||||
 | 
					                table: "SongSuggestions",
 | 
				
			||||||
 | 
					                column: "UserId");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <inheritdoc />
 | 
				
			||||||
 | 
					        protected override void Down(MigrationBuilder migrationBuilder)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            migrationBuilder.DropTable(
 | 
				
			||||||
 | 
					                name: "SongSuggestions");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.DropTable(
 | 
				
			||||||
 | 
					                name: "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.DropTable(
 | 
				
			||||||
 | 
					                name: "Users");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										117
									
								
								song_of_the_day/Data/Migrations/DataContextModelSnapshot.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								song_of_the_day/Data/Migrations/DataContextModelSnapshot.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					// <auto-generated />
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
 | 
				
			||||||
 | 
					using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#nullable disable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace song_of_the_day.DataMigrations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [DbContext(typeof(DataContext))]
 | 
				
			||||||
 | 
					    partial class DataContextModelSnapshot : ModelSnapshot
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        protected override void BuildModel(ModelBuilder modelBuilder)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					#pragma warning disable 612, 618
 | 
				
			||||||
 | 
					            modelBuilder
 | 
				
			||||||
 | 
					                .HasAnnotation("ProductVersion", "9.0.3")
 | 
				
			||||||
 | 
					                .HasAnnotation("Relational:MaxIdentifierLength", 63);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("Song", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("SongId")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SongId"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Artist")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Name")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Url")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("Songs");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SongSuggestion", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("Id")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<DateTime>("Date")
 | 
				
			||||||
 | 
					                        .HasColumnType("timestamp with time zone");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int>("SongId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int>("UserId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("Id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("SongSuggestions");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("User", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("UserId")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("UserId"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Name")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("SignalId")
 | 
				
			||||||
 | 
					                        .IsRequired()
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("Users");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SongSuggestion", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("Song", "Song")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("SongId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasOne("User", "User")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("UserId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("Song");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("User");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					#pragma warning restore 612, 618
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								song_of_the_day/Data/Song.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								song_of_the_day/Data/Song.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Song
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public int SongId { get; set; }
 | 
				
			||||||
 | 
					    public string Name { get; set; }
 | 
				
			||||||
 | 
					    public string Artist { get; set; }
 | 
				
			||||||
 | 
					    public string Url { get; set; }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										10
									
								
								song_of_the_day/Data/SongSuggestion.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								song_of_the_day/Data/SongSuggestion.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class SongSuggestion
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public int Id { get; set;}
 | 
				
			||||||
 | 
					    public User User { get; set; }
 | 
				
			||||||
 | 
					    public Song Song { get; set; }
 | 
				
			||||||
 | 
					    public DateTime Date { get; set; }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										8
									
								
								song_of_the_day/Data/User.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								song_of_the_day/Data/User.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class User
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public int UserId { get; set; }
 | 
				
			||||||
 | 
					    public string SignalId { get; set; }
 | 
				
			||||||
 | 
					    public string Name { get; set; }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								song_of_the_day/MessengerIntegration/SignalIntegration.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								song_of_the_day/MessengerIntegration/SignalIntegration.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					public class SignalIntegration
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public static SignalIntegration Instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public SignalIntegration(string uri, int port, string phoneNumber)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        var http = new HttpClient() { 
 | 
				
			||||||
 | 
					            BaseAddress = new Uri("http://" + uri + ":" + port) 
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        apiClient = new song_of_the_day.swaggerClient(http);
 | 
				
			||||||
 | 
					        apiClient.BaseUrl = "";
 | 
				
			||||||
 | 
					        this.phoneNumber = phoneNumber;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private song_of_the_day.swaggerClient apiClient;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private string phoneNumber;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public async Task ListGroups()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Console.WriteLine("listing groups");
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            ICollection<song_of_the_day.GroupEntry> groupEntries = await apiClient.GroupsAllAsync(this.phoneNumber);
 | 
				
			||||||
 | 
					            Console.WriteLine($"{groupEntries.Count} groups");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        catch (Exception ex) {
 | 
				
			||||||
 | 
					            Console.WriteLine("Exception: " + ex.Message);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        Console.WriteLine("listing groups done");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										26
									
								
								song_of_the_day/Pages/Error.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								song_of_the_day/Pages/Error.cshtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					@page
 | 
				
			||||||
 | 
					@model ErrorModel
 | 
				
			||||||
 | 
					@{
 | 
				
			||||||
 | 
					    ViewData["Title"] = "Error";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h1 class="text-danger">Error.</h1>
 | 
				
			||||||
 | 
					<h2 class="text-danger">An error occurred while processing your request.</h2>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@if (Model.ShowRequestId)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    <p>
 | 
				
			||||||
 | 
					        <strong>Request ID:</strong> <code>@Model.RequestId</code>
 | 
				
			||||||
 | 
					    </p>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<h3>Development Mode</h3>
 | 
				
			||||||
 | 
					<p>
 | 
				
			||||||
 | 
					    Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
 | 
					<p>
 | 
				
			||||||
 | 
					    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
 | 
				
			||||||
 | 
					    It can result in displaying sensitive information from exceptions to end users.
 | 
				
			||||||
 | 
					    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
 | 
				
			||||||
 | 
					    and restarting the app.
 | 
				
			||||||
 | 
					</p>
 | 
				
			||||||
							
								
								
									
										27
									
								
								song_of_the_day/Pages/Error.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								song_of_the_day/Pages/Error.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					using System.Diagnostics;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.RazorPages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace sotd.Pages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
 | 
				
			||||||
 | 
					[IgnoreAntiforgeryToken]
 | 
				
			||||||
 | 
					public class ErrorModel : PageModel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public string? RequestId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private readonly ILogger<ErrorModel> _logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public ErrorModel(ILogger<ErrorModel> logger)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _logger = logger;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void OnGet()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								song_of_the_day/Pages/Index.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								song_of_the_day/Pages/Index.cshtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					@page
 | 
				
			||||||
 | 
					@model IndexModel
 | 
				
			||||||
 | 
					@{
 | 
				
			||||||
 | 
					    ViewData["Title"] = "Home page";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="text-center">
 | 
				
			||||||
 | 
					    <h1 class="display-4">Welcome</h1>
 | 
				
			||||||
 | 
					    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										19
									
								
								song_of_the_day/Pages/Index.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								song_of_the_day/Pages/Index.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.RazorPages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace sotd.Pages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class IndexModel : PageModel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    private readonly ILogger<IndexModel> _logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public IndexModel(ILogger<IndexModel> logger)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _logger = logger;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void OnGet()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										8
									
								
								song_of_the_day/Pages/Privacy.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								song_of_the_day/Pages/Privacy.cshtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					@page
 | 
				
			||||||
 | 
					@model PrivacyModel
 | 
				
			||||||
 | 
					@{
 | 
				
			||||||
 | 
					    ViewData["Title"] = "Privacy Policy";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					<h1>@ViewData["Title"]</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<p>Use this page to detail your site's privacy policy.</p>
 | 
				
			||||||
							
								
								
									
										19
									
								
								song_of_the_day/Pages/Privacy.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								song_of_the_day/Pages/Privacy.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.Mvc.RazorPages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace sotd.Pages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class PrivacyModel : PageModel
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    private readonly ILogger<PrivacyModel> _logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public PrivacyModel(ILogger<PrivacyModel> logger)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        _logger = logger;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void OnGet()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										52
									
								
								song_of_the_day/Pages/Shared/_Layout.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								song_of_the_day/Pages/Shared/_Layout.cshtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <meta charset="utf-8" />
 | 
				
			||||||
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
				
			||||||
 | 
					    <title>@ViewData["Title"] - sotd</title>
 | 
				
			||||||
 | 
					    <script type="importmap"></script>
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
 | 
				
			||||||
 | 
					    <link rel="stylesheet" href="~/sotd.styles.css" asp-append-version="true" />
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					    <header>
 | 
				
			||||||
 | 
					        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
 | 
				
			||||||
 | 
					            <div class="container">
 | 
				
			||||||
 | 
					                <a class="navbar-brand" asp-area="" asp-page="/Index">sotd</a>
 | 
				
			||||||
 | 
					                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
 | 
				
			||||||
 | 
					                        aria-expanded="false" aria-label="Toggle navigation">
 | 
				
			||||||
 | 
					                    <span class="navbar-toggler-icon"></span>
 | 
				
			||||||
 | 
					                </button>
 | 
				
			||||||
 | 
					                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
 | 
				
			||||||
 | 
					                    <ul class="navbar-nav flex-grow-1">
 | 
				
			||||||
 | 
					                        <li class="nav-item">
 | 
				
			||||||
 | 
					                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
 | 
				
			||||||
 | 
					                        </li>
 | 
				
			||||||
 | 
					                        <li class="nav-item">
 | 
				
			||||||
 | 
					                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
 | 
				
			||||||
 | 
					                        </li>
 | 
				
			||||||
 | 
					                    </ul>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </nav>
 | 
				
			||||||
 | 
					    </header>
 | 
				
			||||||
 | 
					    <div class="container">
 | 
				
			||||||
 | 
					        <main role="main" class="pb-3">
 | 
				
			||||||
 | 
					            @RenderBody()
 | 
				
			||||||
 | 
					        </main>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <footer class="border-top footer text-muted">
 | 
				
			||||||
 | 
					        <div class="container">
 | 
				
			||||||
 | 
					            © 2025 - sotd - <a asp-area="" asp-page="/Privacy">Privacy</a>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </footer>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script src="~/lib/jquery/dist/jquery.min.js"></script>
 | 
				
			||||||
 | 
					    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
 | 
				
			||||||
 | 
					    <script src="~/js/site.js" asp-append-version="true"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @await RenderSectionAsync("Scripts", required: false)
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										48
									
								
								song_of_the_day/Pages/Shared/_Layout.cshtml.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								song_of_the_day/Pages/Shared/_Layout.cshtml.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					/* Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
 | 
				
			||||||
 | 
					for details on configuring this project to bundle and minify static web assets. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.navbar-brand {
 | 
				
			||||||
 | 
					  white-space: normal;
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  word-break: break-all;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a {
 | 
				
			||||||
 | 
					  color: #0077cc;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.btn-primary {
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  background-color: #1b6ec2;
 | 
				
			||||||
 | 
					  border-color: #1861ac;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  background-color: #1b6ec2;
 | 
				
			||||||
 | 
					  border-color: #1861ac;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.border-top {
 | 
				
			||||||
 | 
					  border-top: 1px solid #e5e5e5;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.border-bottom {
 | 
				
			||||||
 | 
					  border-bottom: 1px solid #e5e5e5;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.box-shadow {
 | 
				
			||||||
 | 
					  box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button.accept-policy {
 | 
				
			||||||
 | 
					  font-size: 1rem;
 | 
				
			||||||
 | 
					  line-height: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.footer {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  bottom: 0;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  white-space: nowrap;
 | 
				
			||||||
 | 
					  line-height: 60px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
 | 
				
			||||||
 | 
					<script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script>
 | 
				
			||||||
							
								
								
									
										3
									
								
								song_of_the_day/Pages/_ViewImports.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								song_of_the_day/Pages/_ViewImports.cshtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					@using sotd
 | 
				
			||||||
 | 
					@namespace sotd.Pages
 | 
				
			||||||
 | 
					@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
 | 
				
			||||||
							
								
								
									
										3
									
								
								song_of_the_day/Pages/_ViewStart.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								song_of_the_day/Pages/_ViewStart.cshtml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					@{
 | 
				
			||||||
 | 
					    Layout = "_Layout";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,35 +1,40 @@
 | 
				
			|||||||
using CommandLine;
 | 
					
 | 
				
			||||||
 | 
					using Scalar.AspNetCore;
 | 
				
			||||||
 | 
					using Microsoft.AspNetCore.OpenApi;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Program
 | 
					DataContext.Instance = new DataContext();
 | 
				
			||||||
 | 
					var groupId = "group.Wmk1UTVQTnh0Sjd6a0xiOGhnTnMzZlNkc2p2Q3c0SXJiQkU2eDlNU0hyTT0=";
 | 
				
			||||||
 | 
					SignalIntegration.Instance = new SignalIntegration("192.168.1.108", 8719, "+4367762751895");
 | 
				
			||||||
 | 
					await SignalIntegration.Instance.ListGroups();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var builder = WebApplication.CreateBuilder(args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Add services to the container.
 | 
				
			||||||
 | 
					builder.Services.AddRazorPages();
 | 
				
			||||||
 | 
					builder.Services.AddOpenApi();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var app = builder.Build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Configure the HTTP request pipeline.
 | 
				
			||||||
 | 
					if (!app.Environment.IsDevelopment())
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public class Options
 | 
					    app.UseExceptionHandler("/Error");
 | 
				
			||||||
    {
 | 
					}
 | 
				
			||||||
        [Option('v', "verbose", Required = false, HelpText = "Set output to verbose messages.")]
 | 
					else
 | 
				
			||||||
        public bool Verbose { get; set; }
 | 
					{
 | 
				
			||||||
    }
 | 
					    app.MapOpenApi();
 | 
				
			||||||
 | 
					    app.MapScalarApiReference();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static void Main(string[] args)
 | 
					app.UseRouting();
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Parser.Default.ParseArguments<Options>(args)
 | 
					 | 
				
			||||||
                .WithParsed<Options>(o =>
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    if (o.Verbose)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        Console.WriteLine($"Verbose output enabled. Current Arguments: -v {o.Verbose}");
 | 
					 | 
				
			||||||
                        Console.WriteLine("Quick Start Example! App is in Verbose mode!");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    else
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        Console.WriteLine($"Current Arguments: -v {o.Verbose}");
 | 
					 | 
				
			||||||
                        Console.WriteLine("Quick Start Example!");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    EntryPoint(o);
 | 
					app.UseAuthorization();
 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static void EntryPoint(Options o)
 | 
					app.MapStaticAssets();
 | 
				
			||||||
    {
 | 
					app.MapRazorPages()
 | 
				
			||||||
        Console.WriteLine("Hello world!");
 | 
					   .WithStaticAssets();
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
}
 | 
					app.Run();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//Console.WriteLine("Size: " + DataContext.Instance.Songs.Count());
 | 
				
			||||||
 | 
					//await SignalIntegration.Instance.ListGroups();
 | 
				
			||||||
							
								
								
									
										14
									
								
								song_of_the_day/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								song_of_the_day/Properties/launchSettings.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "$schema": "https://json.schemastore.org/launchsettings.json",
 | 
				
			||||||
 | 
					  "profiles": {
 | 
				
			||||||
 | 
					    "http": {
 | 
				
			||||||
 | 
					      "commandName": "Project",
 | 
				
			||||||
 | 
					      "dotnetRunMessages": true,
 | 
				
			||||||
 | 
					      "launchBrowser": true,
 | 
				
			||||||
 | 
					      "applicationUrl": "http://localhost:5150",
 | 
				
			||||||
 | 
					      "environmentVariables": {
 | 
				
			||||||
 | 
					        "ASPNETCORE_ENVIRONMENT": "Development"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								song_of_the_day/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								song_of_the_day/appsettings.Development.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "DetailedErrors": true,
 | 
				
			||||||
 | 
					  "Logging": {
 | 
				
			||||||
 | 
					    "LogLevel": {
 | 
				
			||||||
 | 
					      "Default": "Information",
 | 
				
			||||||
 | 
					      "Microsoft.AspNetCore": "Warning"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								song_of_the_day/appsettings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								song_of_the_day/appsettings.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "Logging": {
 | 
				
			||||||
 | 
					    "LogLevel": {
 | 
				
			||||||
 | 
					      "Default": "Information",
 | 
				
			||||||
 | 
					      "Microsoft.AspNetCore": "Warning"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "AllowedHosts": "*"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,15 +1,23 @@
 | 
				
			|||||||
<Project Sdk="Microsoft.NET.Sdk">
 | 
					<Project Sdk="Microsoft.NET.Sdk.Web">
 | 
				
			||||||
 | 
					 | 
				
			||||||
  <PropertyGroup>
 | 
					  <PropertyGroup>
 | 
				
			||||||
    <OutputType>Exe</OutputType>
 | 
					 | 
				
			||||||
    <TargetFramework>net9.0</TargetFramework>
 | 
					    <TargetFramework>net9.0</TargetFramework>
 | 
				
			||||||
    <ImplicitUsings>enable</ImplicitUsings>
 | 
					    <ImplicitUsings>enable</ImplicitUsings>
 | 
				
			||||||
    <Nullable>enable</Nullable>
 | 
					    <Nullable>enable</Nullable>
 | 
				
			||||||
    <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
 | 
					    <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <PackageReference Include="CommandLineParser" Version="2.9.1" />
 | 
					    <PackageReference Include="CommandLineParser" Version="2.9.1" />
 | 
				
			||||||
 | 
					    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.3" />
 | 
				
			||||||
 | 
					    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.3">
 | 
				
			||||||
 | 
					      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
 | 
				
			||||||
 | 
					      <PrivateAssets>all</PrivateAssets>
 | 
				
			||||||
 | 
					    </PackageReference>
 | 
				
			||||||
 | 
					    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
 | 
				
			||||||
 | 
					    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
 | 
				
			||||||
 | 
					    <PackageReference Include="NSwag.ApiDescription.Client" Version="13.0.5" />
 | 
				
			||||||
 | 
					    <PackageReference Include="Scalar.AspNetCore" Version="2.1.*" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
</Project>
 | 
					    <OpenApiReference Include="swagger.json" SourceUrl="https://bbernhard.github.io/signal-cli-rest-api/src/docs/swagger.json" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					</Project>
 | 
				
			||||||
							
								
								
									
										24
									
								
								song_of_the_day/song_of_the_day.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								song_of_the_day/song_of_the_day.sln
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					Microsoft Visual Studio Solution File, Format Version 12.00
 | 
				
			||||||
 | 
					# Visual Studio Version 17
 | 
				
			||||||
 | 
					VisualStudioVersion = 17.5.2.0
 | 
				
			||||||
 | 
					MinimumVisualStudioVersion = 10.0.40219.1
 | 
				
			||||||
 | 
					Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "song_of_the_day", "song_of_the_day.csproj", "{96ED3132-FB45-87F0-B615-BDF3CC5687DA}"
 | 
				
			||||||
 | 
					EndProject
 | 
				
			||||||
 | 
					Global
 | 
				
			||||||
 | 
						GlobalSection(SolutionConfigurationPlatforms) = preSolution
 | 
				
			||||||
 | 
							Debug|Any CPU = Debug|Any CPU
 | 
				
			||||||
 | 
							Release|Any CPU = Release|Any CPU
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
						GlobalSection(ProjectConfigurationPlatforms) = postSolution
 | 
				
			||||||
 | 
							{96ED3132-FB45-87F0-B615-BDF3CC5687DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 | 
				
			||||||
 | 
							{96ED3132-FB45-87F0-B615-BDF3CC5687DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
 | 
				
			||||||
 | 
							{96ED3132-FB45-87F0-B615-BDF3CC5687DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
 | 
				
			||||||
 | 
							{96ED3132-FB45-87F0-B615-BDF3CC5687DA}.Release|Any CPU.Build.0 = Release|Any CPU
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
						GlobalSection(SolutionProperties) = preSolution
 | 
				
			||||||
 | 
							HideSolutionNode = FALSE
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
						GlobalSection(ExtensibilityGlobals) = postSolution
 | 
				
			||||||
 | 
							SolutionGuid = {1F6BFC7D-9DFD-4212-B02C-17FDEE26A5CD}
 | 
				
			||||||
 | 
						EndGlobalSection
 | 
				
			||||||
 | 
					EndGlobal
 | 
				
			||||||
							
								
								
									
										2885
									
								
								song_of_the_day/swagger.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2885
									
								
								song_of_the_day/swagger.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										31
									
								
								song_of_the_day/wwwroot/css/site.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								song_of_the_day/wwwroot/css/site.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					html {
 | 
				
			||||||
 | 
					  font-size: 14px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media (min-width: 768px) {
 | 
				
			||||||
 | 
					  html {
 | 
				
			||||||
 | 
					    font-size: 16px;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
 | 
				
			||||||
 | 
					  box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					html {
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  min-height: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body {
 | 
				
			||||||
 | 
					  margin-bottom: 60px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
 | 
				
			||||||
 | 
					  color: var(--bs-secondary-color);
 | 
				
			||||||
 | 
					  text-align: end;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
 | 
				
			||||||
 | 
					  text-align: start;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								song_of_the_day/wwwroot/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								song_of_the_day/wwwroot/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 5.3 KiB  | 
							
								
								
									
										4
									
								
								song_of_the_day/wwwroot/js/site.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								song_of_the_day/wwwroot/js/site.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					// Please see documentation at https://learn.microsoft.com/aspnet/core/client-side/bundling-and-minification
 | 
				
			||||||
 | 
					// for details on configuring this project to bundle and minify static web assets.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Write your JavaScript code.
 | 
				
			||||||
							
								
								
									
										22
									
								
								song_of_the_day/wwwroot/lib/bootstrap/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								song_of_the_day/wwwroot/lib/bootstrap/LICENSE
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2011-2021 Twitter, Inc.
 | 
				
			||||||
 | 
					Copyright (c) 2011-2021 The Bootstrap Authors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
							
								
								
									
										4085
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4085
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										4084
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4084
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										597
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										597
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,597 @@
 | 
				
			|||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
 | 
				
			||||||
 | 
					 * Copyright 2011-2024 The Bootstrap Authors
 | 
				
			||||||
 | 
					 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					:root,
 | 
				
			||||||
 | 
					[data-bs-theme=light] {
 | 
				
			||||||
 | 
					  --bs-blue: #0d6efd;
 | 
				
			||||||
 | 
					  --bs-indigo: #6610f2;
 | 
				
			||||||
 | 
					  --bs-purple: #6f42c1;
 | 
				
			||||||
 | 
					  --bs-pink: #d63384;
 | 
				
			||||||
 | 
					  --bs-red: #dc3545;
 | 
				
			||||||
 | 
					  --bs-orange: #fd7e14;
 | 
				
			||||||
 | 
					  --bs-yellow: #ffc107;
 | 
				
			||||||
 | 
					  --bs-green: #198754;
 | 
				
			||||||
 | 
					  --bs-teal: #20c997;
 | 
				
			||||||
 | 
					  --bs-cyan: #0dcaf0;
 | 
				
			||||||
 | 
					  --bs-black: #000;
 | 
				
			||||||
 | 
					  --bs-white: #fff;
 | 
				
			||||||
 | 
					  --bs-gray: #6c757d;
 | 
				
			||||||
 | 
					  --bs-gray-dark: #343a40;
 | 
				
			||||||
 | 
					  --bs-gray-100: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-gray-200: #e9ecef;
 | 
				
			||||||
 | 
					  --bs-gray-300: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-gray-400: #ced4da;
 | 
				
			||||||
 | 
					  --bs-gray-500: #adb5bd;
 | 
				
			||||||
 | 
					  --bs-gray-600: #6c757d;
 | 
				
			||||||
 | 
					  --bs-gray-700: #495057;
 | 
				
			||||||
 | 
					  --bs-gray-800: #343a40;
 | 
				
			||||||
 | 
					  --bs-gray-900: #212529;
 | 
				
			||||||
 | 
					  --bs-primary: #0d6efd;
 | 
				
			||||||
 | 
					  --bs-secondary: #6c757d;
 | 
				
			||||||
 | 
					  --bs-success: #198754;
 | 
				
			||||||
 | 
					  --bs-info: #0dcaf0;
 | 
				
			||||||
 | 
					  --bs-warning: #ffc107;
 | 
				
			||||||
 | 
					  --bs-danger: #dc3545;
 | 
				
			||||||
 | 
					  --bs-light: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-dark: #212529;
 | 
				
			||||||
 | 
					  --bs-primary-rgb: 13, 110, 253;
 | 
				
			||||||
 | 
					  --bs-secondary-rgb: 108, 117, 125;
 | 
				
			||||||
 | 
					  --bs-success-rgb: 25, 135, 84;
 | 
				
			||||||
 | 
					  --bs-info-rgb: 13, 202, 240;
 | 
				
			||||||
 | 
					  --bs-warning-rgb: 255, 193, 7;
 | 
				
			||||||
 | 
					  --bs-danger-rgb: 220, 53, 69;
 | 
				
			||||||
 | 
					  --bs-light-rgb: 248, 249, 250;
 | 
				
			||||||
 | 
					  --bs-dark-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-primary-text-emphasis: #052c65;
 | 
				
			||||||
 | 
					  --bs-secondary-text-emphasis: #2b2f32;
 | 
				
			||||||
 | 
					  --bs-success-text-emphasis: #0a3622;
 | 
				
			||||||
 | 
					  --bs-info-text-emphasis: #055160;
 | 
				
			||||||
 | 
					  --bs-warning-text-emphasis: #664d03;
 | 
				
			||||||
 | 
					  --bs-danger-text-emphasis: #58151c;
 | 
				
			||||||
 | 
					  --bs-light-text-emphasis: #495057;
 | 
				
			||||||
 | 
					  --bs-dark-text-emphasis: #495057;
 | 
				
			||||||
 | 
					  --bs-primary-bg-subtle: #cfe2ff;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-subtle: #e2e3e5;
 | 
				
			||||||
 | 
					  --bs-success-bg-subtle: #d1e7dd;
 | 
				
			||||||
 | 
					  --bs-info-bg-subtle: #cff4fc;
 | 
				
			||||||
 | 
					  --bs-warning-bg-subtle: #fff3cd;
 | 
				
			||||||
 | 
					  --bs-danger-bg-subtle: #f8d7da;
 | 
				
			||||||
 | 
					  --bs-light-bg-subtle: #fcfcfd;
 | 
				
			||||||
 | 
					  --bs-dark-bg-subtle: #ced4da;
 | 
				
			||||||
 | 
					  --bs-primary-border-subtle: #9ec5fe;
 | 
				
			||||||
 | 
					  --bs-secondary-border-subtle: #c4c8cb;
 | 
				
			||||||
 | 
					  --bs-success-border-subtle: #a3cfbb;
 | 
				
			||||||
 | 
					  --bs-info-border-subtle: #9eeaf9;
 | 
				
			||||||
 | 
					  --bs-warning-border-subtle: #ffe69c;
 | 
				
			||||||
 | 
					  --bs-danger-border-subtle: #f1aeb5;
 | 
				
			||||||
 | 
					  --bs-light-border-subtle: #e9ecef;
 | 
				
			||||||
 | 
					  --bs-dark-border-subtle: #adb5bd;
 | 
				
			||||||
 | 
					  --bs-white-rgb: 255, 255, 255;
 | 
				
			||||||
 | 
					  --bs-black-rgb: 0, 0, 0;
 | 
				
			||||||
 | 
					  --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
 | 
				
			||||||
 | 
					  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
 | 
				
			||||||
 | 
					  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
 | 
				
			||||||
 | 
					  --bs-body-font-family: var(--bs-font-sans-serif);
 | 
				
			||||||
 | 
					  --bs-body-font-size: 1rem;
 | 
				
			||||||
 | 
					  --bs-body-font-weight: 400;
 | 
				
			||||||
 | 
					  --bs-body-line-height: 1.5;
 | 
				
			||||||
 | 
					  --bs-body-color: #212529;
 | 
				
			||||||
 | 
					  --bs-body-color-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-body-bg: #fff;
 | 
				
			||||||
 | 
					  --bs-body-bg-rgb: 255, 255, 255;
 | 
				
			||||||
 | 
					  --bs-emphasis-color: #000;
 | 
				
			||||||
 | 
					  --bs-emphasis-color-rgb: 0, 0, 0;
 | 
				
			||||||
 | 
					  --bs-secondary-color: rgba(33, 37, 41, 0.75);
 | 
				
			||||||
 | 
					  --bs-secondary-color-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-secondary-bg: #e9ecef;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-rgb: 233, 236, 239;
 | 
				
			||||||
 | 
					  --bs-tertiary-color: rgba(33, 37, 41, 0.5);
 | 
				
			||||||
 | 
					  --bs-tertiary-color-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg-rgb: 248, 249, 250;
 | 
				
			||||||
 | 
					  --bs-heading-color: inherit;
 | 
				
			||||||
 | 
					  --bs-link-color: #0d6efd;
 | 
				
			||||||
 | 
					  --bs-link-color-rgb: 13, 110, 253;
 | 
				
			||||||
 | 
					  --bs-link-decoration: underline;
 | 
				
			||||||
 | 
					  --bs-link-hover-color: #0a58ca;
 | 
				
			||||||
 | 
					  --bs-link-hover-color-rgb: 10, 88, 202;
 | 
				
			||||||
 | 
					  --bs-code-color: #d63384;
 | 
				
			||||||
 | 
					  --bs-highlight-color: #212529;
 | 
				
			||||||
 | 
					  --bs-highlight-bg: #fff3cd;
 | 
				
			||||||
 | 
					  --bs-border-width: 1px;
 | 
				
			||||||
 | 
					  --bs-border-style: solid;
 | 
				
			||||||
 | 
					  --bs-border-color: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
 | 
				
			||||||
 | 
					  --bs-border-radius: 0.375rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-sm: 0.25rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-lg: 0.5rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-xl: 1rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-xxl: 2rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-2xl: var(--bs-border-radius-xxl);
 | 
				
			||||||
 | 
					  --bs-border-radius-pill: 50rem;
 | 
				
			||||||
 | 
					  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
 | 
				
			||||||
 | 
					  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
 | 
				
			||||||
 | 
					  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
 | 
				
			||||||
 | 
					  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
 | 
				
			||||||
 | 
					  --bs-focus-ring-width: 0.25rem;
 | 
				
			||||||
 | 
					  --bs-focus-ring-opacity: 0.25;
 | 
				
			||||||
 | 
					  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);
 | 
				
			||||||
 | 
					  --bs-form-valid-color: #198754;
 | 
				
			||||||
 | 
					  --bs-form-valid-border-color: #198754;
 | 
				
			||||||
 | 
					  --bs-form-invalid-color: #dc3545;
 | 
				
			||||||
 | 
					  --bs-form-invalid-border-color: #dc3545;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[data-bs-theme=dark] {
 | 
				
			||||||
 | 
					  color-scheme: dark;
 | 
				
			||||||
 | 
					  --bs-body-color: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-body-color-rgb: 222, 226, 230;
 | 
				
			||||||
 | 
					  --bs-body-bg: #212529;
 | 
				
			||||||
 | 
					  --bs-body-bg-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-emphasis-color: #fff;
 | 
				
			||||||
 | 
					  --bs-emphasis-color-rgb: 255, 255, 255;
 | 
				
			||||||
 | 
					  --bs-secondary-color: rgba(222, 226, 230, 0.75);
 | 
				
			||||||
 | 
					  --bs-secondary-color-rgb: 222, 226, 230;
 | 
				
			||||||
 | 
					  --bs-secondary-bg: #343a40;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-rgb: 52, 58, 64;
 | 
				
			||||||
 | 
					  --bs-tertiary-color: rgba(222, 226, 230, 0.5);
 | 
				
			||||||
 | 
					  --bs-tertiary-color-rgb: 222, 226, 230;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg: #2b3035;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg-rgb: 43, 48, 53;
 | 
				
			||||||
 | 
					  --bs-primary-text-emphasis: #6ea8fe;
 | 
				
			||||||
 | 
					  --bs-secondary-text-emphasis: #a7acb1;
 | 
				
			||||||
 | 
					  --bs-success-text-emphasis: #75b798;
 | 
				
			||||||
 | 
					  --bs-info-text-emphasis: #6edff6;
 | 
				
			||||||
 | 
					  --bs-warning-text-emphasis: #ffda6a;
 | 
				
			||||||
 | 
					  --bs-danger-text-emphasis: #ea868f;
 | 
				
			||||||
 | 
					  --bs-light-text-emphasis: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-dark-text-emphasis: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-primary-bg-subtle: #031633;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-subtle: #161719;
 | 
				
			||||||
 | 
					  --bs-success-bg-subtle: #051b11;
 | 
				
			||||||
 | 
					  --bs-info-bg-subtle: #032830;
 | 
				
			||||||
 | 
					  --bs-warning-bg-subtle: #332701;
 | 
				
			||||||
 | 
					  --bs-danger-bg-subtle: #2c0b0e;
 | 
				
			||||||
 | 
					  --bs-light-bg-subtle: #343a40;
 | 
				
			||||||
 | 
					  --bs-dark-bg-subtle: #1a1d20;
 | 
				
			||||||
 | 
					  --bs-primary-border-subtle: #084298;
 | 
				
			||||||
 | 
					  --bs-secondary-border-subtle: #41464b;
 | 
				
			||||||
 | 
					  --bs-success-border-subtle: #0f5132;
 | 
				
			||||||
 | 
					  --bs-info-border-subtle: #087990;
 | 
				
			||||||
 | 
					  --bs-warning-border-subtle: #997404;
 | 
				
			||||||
 | 
					  --bs-danger-border-subtle: #842029;
 | 
				
			||||||
 | 
					  --bs-light-border-subtle: #495057;
 | 
				
			||||||
 | 
					  --bs-dark-border-subtle: #343a40;
 | 
				
			||||||
 | 
					  --bs-heading-color: inherit;
 | 
				
			||||||
 | 
					  --bs-link-color: #6ea8fe;
 | 
				
			||||||
 | 
					  --bs-link-hover-color: #8bb9fe;
 | 
				
			||||||
 | 
					  --bs-link-color-rgb: 110, 168, 254;
 | 
				
			||||||
 | 
					  --bs-link-hover-color-rgb: 139, 185, 254;
 | 
				
			||||||
 | 
					  --bs-code-color: #e685b5;
 | 
				
			||||||
 | 
					  --bs-highlight-color: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-highlight-bg: #664d03;
 | 
				
			||||||
 | 
					  --bs-border-color: #495057;
 | 
				
			||||||
 | 
					  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
 | 
				
			||||||
 | 
					  --bs-form-valid-color: #75b798;
 | 
				
			||||||
 | 
					  --bs-form-valid-border-color: #75b798;
 | 
				
			||||||
 | 
					  --bs-form-invalid-color: #ea868f;
 | 
				
			||||||
 | 
					  --bs-form-invalid-border-color: #ea868f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*,
 | 
				
			||||||
 | 
					*::before,
 | 
				
			||||||
 | 
					*::after {
 | 
				
			||||||
 | 
					  box-sizing: border-box;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media (prefers-reduced-motion: no-preference) {
 | 
				
			||||||
 | 
					  :root {
 | 
				
			||||||
 | 
					    scroll-behavior: smooth;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body {
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  font-family: var(--bs-body-font-family);
 | 
				
			||||||
 | 
					  font-size: var(--bs-body-font-size);
 | 
				
			||||||
 | 
					  font-weight: var(--bs-body-font-weight);
 | 
				
			||||||
 | 
					  line-height: var(--bs-body-line-height);
 | 
				
			||||||
 | 
					  color: var(--bs-body-color);
 | 
				
			||||||
 | 
					  text-align: var(--bs-body-text-align);
 | 
				
			||||||
 | 
					  background-color: var(--bs-body-bg);
 | 
				
			||||||
 | 
					  -webkit-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hr {
 | 
				
			||||||
 | 
					  margin: 1rem 0;
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					  border: 0;
 | 
				
			||||||
 | 
					  border-top: var(--bs-border-width) solid;
 | 
				
			||||||
 | 
					  opacity: 0.25;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h6, h5, h4, h3, h2, h1 {
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  font-weight: 500;
 | 
				
			||||||
 | 
					  line-height: 1.2;
 | 
				
			||||||
 | 
					  color: var(--bs-heading-color);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h1 {
 | 
				
			||||||
 | 
					  font-size: calc(1.375rem + 1.5vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h1 {
 | 
				
			||||||
 | 
					    font-size: 2.5rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h2 {
 | 
				
			||||||
 | 
					  font-size: calc(1.325rem + 0.9vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h2 {
 | 
				
			||||||
 | 
					    font-size: 2rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h3 {
 | 
				
			||||||
 | 
					  font-size: calc(1.3rem + 0.6vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h3 {
 | 
				
			||||||
 | 
					    font-size: 1.75rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h4 {
 | 
				
			||||||
 | 
					  font-size: calc(1.275rem + 0.3vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h4 {
 | 
				
			||||||
 | 
					    font-size: 1.5rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h5 {
 | 
				
			||||||
 | 
					  font-size: 1.25rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h6 {
 | 
				
			||||||
 | 
					  font-size: 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					p {
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abbr[title] {
 | 
				
			||||||
 | 
					  -webkit-text-decoration: underline dotted;
 | 
				
			||||||
 | 
					  text-decoration: underline dotted;
 | 
				
			||||||
 | 
					  cursor: help;
 | 
				
			||||||
 | 
					  -webkit-text-decoration-skip-ink: none;
 | 
				
			||||||
 | 
					  text-decoration-skip-ink: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					address {
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					  font-style: normal;
 | 
				
			||||||
 | 
					  line-height: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ol,
 | 
				
			||||||
 | 
					ul {
 | 
				
			||||||
 | 
					  padding-left: 2rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ol,
 | 
				
			||||||
 | 
					ul,
 | 
				
			||||||
 | 
					dl {
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ol ol,
 | 
				
			||||||
 | 
					ul ul,
 | 
				
			||||||
 | 
					ol ul,
 | 
				
			||||||
 | 
					ul ol {
 | 
				
			||||||
 | 
					  margin-bottom: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dt {
 | 
				
			||||||
 | 
					  font-weight: 700;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dd {
 | 
				
			||||||
 | 
					  margin-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  margin-left: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					blockquote {
 | 
				
			||||||
 | 
					  margin: 0 0 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					b,
 | 
				
			||||||
 | 
					strong {
 | 
				
			||||||
 | 
					  font-weight: bolder;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					small {
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mark {
 | 
				
			||||||
 | 
					  padding: 0.1875em;
 | 
				
			||||||
 | 
					  color: var(--bs-highlight-color);
 | 
				
			||||||
 | 
					  background-color: var(--bs-highlight-bg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub,
 | 
				
			||||||
 | 
					sup {
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  font-size: 0.75em;
 | 
				
			||||||
 | 
					  line-height: 0;
 | 
				
			||||||
 | 
					  vertical-align: baseline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub {
 | 
				
			||||||
 | 
					  bottom: -0.25em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sup {
 | 
				
			||||||
 | 
					  top: -0.5em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a {
 | 
				
			||||||
 | 
					  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
 | 
				
			||||||
 | 
					  text-decoration: underline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					a:hover {
 | 
				
			||||||
 | 
					  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a:not([href]):not([class]), a:not([href]):not([class]):hover {
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					  text-decoration: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pre,
 | 
				
			||||||
 | 
					code,
 | 
				
			||||||
 | 
					kbd,
 | 
				
			||||||
 | 
					samp {
 | 
				
			||||||
 | 
					  font-family: var(--bs-font-monospace);
 | 
				
			||||||
 | 
					  font-size: 1em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pre {
 | 
				
			||||||
 | 
					  display: block;
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					  overflow: auto;
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					pre code {
 | 
				
			||||||
 | 
					  font-size: inherit;
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					  word-break: normal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					code {
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					  color: var(--bs-code-color);
 | 
				
			||||||
 | 
					  word-wrap: break-word;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					a > code {
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kbd {
 | 
				
			||||||
 | 
					  padding: 0.1875rem 0.375rem;
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					  color: var(--bs-body-bg);
 | 
				
			||||||
 | 
					  background-color: var(--bs-body-color);
 | 
				
			||||||
 | 
					  border-radius: 0.25rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					kbd kbd {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  font-size: 1em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					figure {
 | 
				
			||||||
 | 
					  margin: 0 0 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					img,
 | 
				
			||||||
 | 
					svg {
 | 
				
			||||||
 | 
					  vertical-align: middle;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table {
 | 
				
			||||||
 | 
					  caption-side: bottom;
 | 
				
			||||||
 | 
					  border-collapse: collapse;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					caption {
 | 
				
			||||||
 | 
					  padding-top: 0.5rem;
 | 
				
			||||||
 | 
					  padding-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  color: var(--bs-secondary-color);
 | 
				
			||||||
 | 
					  text-align: left;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					th {
 | 
				
			||||||
 | 
					  text-align: inherit;
 | 
				
			||||||
 | 
					  text-align: -webkit-match-parent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					thead,
 | 
				
			||||||
 | 
					tbody,
 | 
				
			||||||
 | 
					tfoot,
 | 
				
			||||||
 | 
					tr,
 | 
				
			||||||
 | 
					td,
 | 
				
			||||||
 | 
					th {
 | 
				
			||||||
 | 
					  border-color: inherit;
 | 
				
			||||||
 | 
					  border-style: solid;
 | 
				
			||||||
 | 
					  border-width: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label {
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button {
 | 
				
			||||||
 | 
					  border-radius: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button:focus:not(:focus-visible) {
 | 
				
			||||||
 | 
					  outline: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input,
 | 
				
			||||||
 | 
					button,
 | 
				
			||||||
 | 
					select,
 | 
				
			||||||
 | 
					optgroup,
 | 
				
			||||||
 | 
					textarea {
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  font-family: inherit;
 | 
				
			||||||
 | 
					  font-size: inherit;
 | 
				
			||||||
 | 
					  line-height: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button,
 | 
				
			||||||
 | 
					select {
 | 
				
			||||||
 | 
					  text-transform: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[role=button] {
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					select {
 | 
				
			||||||
 | 
					  word-wrap: normal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					select:disabled {
 | 
				
			||||||
 | 
					  opacity: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
 | 
				
			||||||
 | 
					  display: none !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button,
 | 
				
			||||||
 | 
					[type=button],
 | 
				
			||||||
 | 
					[type=reset],
 | 
				
			||||||
 | 
					[type=submit] {
 | 
				
			||||||
 | 
					  -webkit-appearance: button;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					button:not(:disabled),
 | 
				
			||||||
 | 
					[type=button]:not(:disabled),
 | 
				
			||||||
 | 
					[type=reset]:not(:disabled),
 | 
				
			||||||
 | 
					[type=submit]:not(:disabled) {
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-moz-focus-inner {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  border-style: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					textarea {
 | 
				
			||||||
 | 
					  resize: vertical;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fieldset {
 | 
				
			||||||
 | 
					  min-width: 0;
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  border: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					legend {
 | 
				
			||||||
 | 
					  float: left;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  font-size: calc(1.275rem + 0.3vw);
 | 
				
			||||||
 | 
					  line-height: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  legend {
 | 
				
			||||||
 | 
					    font-size: 1.5rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					legend + * {
 | 
				
			||||||
 | 
					  clear: left;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-fields-wrapper,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-text,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-minute,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-hour-field,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-day-field,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-month-field,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-year-field {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-inner-spin-button {
 | 
				
			||||||
 | 
					  height: auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[type=search] {
 | 
				
			||||||
 | 
					  -webkit-appearance: textfield;
 | 
				
			||||||
 | 
					  outline-offset: -2px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* rtl:raw:
 | 
				
			||||||
 | 
					[type="tel"],
 | 
				
			||||||
 | 
					[type="url"],
 | 
				
			||||||
 | 
					[type="email"],
 | 
				
			||||||
 | 
					[type="number"] {
 | 
				
			||||||
 | 
					  direction: ltr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					::-webkit-search-decoration {
 | 
				
			||||||
 | 
					  -webkit-appearance: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-color-swatch-wrapper {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-file-upload-button {
 | 
				
			||||||
 | 
					  font: inherit;
 | 
				
			||||||
 | 
					  -webkit-appearance: button;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::file-selector-button {
 | 
				
			||||||
 | 
					  font: inherit;
 | 
				
			||||||
 | 
					  -webkit-appearance: button;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					output {
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iframe {
 | 
				
			||||||
 | 
					  border: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					summary {
 | 
				
			||||||
 | 
					  display: list-item;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					progress {
 | 
				
			||||||
 | 
					  vertical-align: baseline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[hidden] {
 | 
				
			||||||
 | 
					  display: none !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*# sourceMappingURL=bootstrap-reboot.css.map */
 | 
				
			||||||
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										594
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										594
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,594 @@
 | 
				
			|||||||
 | 
					/*!
 | 
				
			||||||
 | 
					 * Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
 | 
				
			||||||
 | 
					 * Copyright 2011-2024 The Bootstrap Authors
 | 
				
			||||||
 | 
					 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					:root,
 | 
				
			||||||
 | 
					[data-bs-theme=light] {
 | 
				
			||||||
 | 
					  --bs-blue: #0d6efd;
 | 
				
			||||||
 | 
					  --bs-indigo: #6610f2;
 | 
				
			||||||
 | 
					  --bs-purple: #6f42c1;
 | 
				
			||||||
 | 
					  --bs-pink: #d63384;
 | 
				
			||||||
 | 
					  --bs-red: #dc3545;
 | 
				
			||||||
 | 
					  --bs-orange: #fd7e14;
 | 
				
			||||||
 | 
					  --bs-yellow: #ffc107;
 | 
				
			||||||
 | 
					  --bs-green: #198754;
 | 
				
			||||||
 | 
					  --bs-teal: #20c997;
 | 
				
			||||||
 | 
					  --bs-cyan: #0dcaf0;
 | 
				
			||||||
 | 
					  --bs-black: #000;
 | 
				
			||||||
 | 
					  --bs-white: #fff;
 | 
				
			||||||
 | 
					  --bs-gray: #6c757d;
 | 
				
			||||||
 | 
					  --bs-gray-dark: #343a40;
 | 
				
			||||||
 | 
					  --bs-gray-100: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-gray-200: #e9ecef;
 | 
				
			||||||
 | 
					  --bs-gray-300: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-gray-400: #ced4da;
 | 
				
			||||||
 | 
					  --bs-gray-500: #adb5bd;
 | 
				
			||||||
 | 
					  --bs-gray-600: #6c757d;
 | 
				
			||||||
 | 
					  --bs-gray-700: #495057;
 | 
				
			||||||
 | 
					  --bs-gray-800: #343a40;
 | 
				
			||||||
 | 
					  --bs-gray-900: #212529;
 | 
				
			||||||
 | 
					  --bs-primary: #0d6efd;
 | 
				
			||||||
 | 
					  --bs-secondary: #6c757d;
 | 
				
			||||||
 | 
					  --bs-success: #198754;
 | 
				
			||||||
 | 
					  --bs-info: #0dcaf0;
 | 
				
			||||||
 | 
					  --bs-warning: #ffc107;
 | 
				
			||||||
 | 
					  --bs-danger: #dc3545;
 | 
				
			||||||
 | 
					  --bs-light: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-dark: #212529;
 | 
				
			||||||
 | 
					  --bs-primary-rgb: 13, 110, 253;
 | 
				
			||||||
 | 
					  --bs-secondary-rgb: 108, 117, 125;
 | 
				
			||||||
 | 
					  --bs-success-rgb: 25, 135, 84;
 | 
				
			||||||
 | 
					  --bs-info-rgb: 13, 202, 240;
 | 
				
			||||||
 | 
					  --bs-warning-rgb: 255, 193, 7;
 | 
				
			||||||
 | 
					  --bs-danger-rgb: 220, 53, 69;
 | 
				
			||||||
 | 
					  --bs-light-rgb: 248, 249, 250;
 | 
				
			||||||
 | 
					  --bs-dark-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-primary-text-emphasis: #052c65;
 | 
				
			||||||
 | 
					  --bs-secondary-text-emphasis: #2b2f32;
 | 
				
			||||||
 | 
					  --bs-success-text-emphasis: #0a3622;
 | 
				
			||||||
 | 
					  --bs-info-text-emphasis: #055160;
 | 
				
			||||||
 | 
					  --bs-warning-text-emphasis: #664d03;
 | 
				
			||||||
 | 
					  --bs-danger-text-emphasis: #58151c;
 | 
				
			||||||
 | 
					  --bs-light-text-emphasis: #495057;
 | 
				
			||||||
 | 
					  --bs-dark-text-emphasis: #495057;
 | 
				
			||||||
 | 
					  --bs-primary-bg-subtle: #cfe2ff;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-subtle: #e2e3e5;
 | 
				
			||||||
 | 
					  --bs-success-bg-subtle: #d1e7dd;
 | 
				
			||||||
 | 
					  --bs-info-bg-subtle: #cff4fc;
 | 
				
			||||||
 | 
					  --bs-warning-bg-subtle: #fff3cd;
 | 
				
			||||||
 | 
					  --bs-danger-bg-subtle: #f8d7da;
 | 
				
			||||||
 | 
					  --bs-light-bg-subtle: #fcfcfd;
 | 
				
			||||||
 | 
					  --bs-dark-bg-subtle: #ced4da;
 | 
				
			||||||
 | 
					  --bs-primary-border-subtle: #9ec5fe;
 | 
				
			||||||
 | 
					  --bs-secondary-border-subtle: #c4c8cb;
 | 
				
			||||||
 | 
					  --bs-success-border-subtle: #a3cfbb;
 | 
				
			||||||
 | 
					  --bs-info-border-subtle: #9eeaf9;
 | 
				
			||||||
 | 
					  --bs-warning-border-subtle: #ffe69c;
 | 
				
			||||||
 | 
					  --bs-danger-border-subtle: #f1aeb5;
 | 
				
			||||||
 | 
					  --bs-light-border-subtle: #e9ecef;
 | 
				
			||||||
 | 
					  --bs-dark-border-subtle: #adb5bd;
 | 
				
			||||||
 | 
					  --bs-white-rgb: 255, 255, 255;
 | 
				
			||||||
 | 
					  --bs-black-rgb: 0, 0, 0;
 | 
				
			||||||
 | 
					  --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
 | 
				
			||||||
 | 
					  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
 | 
				
			||||||
 | 
					  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
 | 
				
			||||||
 | 
					  --bs-body-font-family: var(--bs-font-sans-serif);
 | 
				
			||||||
 | 
					  --bs-body-font-size: 1rem;
 | 
				
			||||||
 | 
					  --bs-body-font-weight: 400;
 | 
				
			||||||
 | 
					  --bs-body-line-height: 1.5;
 | 
				
			||||||
 | 
					  --bs-body-color: #212529;
 | 
				
			||||||
 | 
					  --bs-body-color-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-body-bg: #fff;
 | 
				
			||||||
 | 
					  --bs-body-bg-rgb: 255, 255, 255;
 | 
				
			||||||
 | 
					  --bs-emphasis-color: #000;
 | 
				
			||||||
 | 
					  --bs-emphasis-color-rgb: 0, 0, 0;
 | 
				
			||||||
 | 
					  --bs-secondary-color: rgba(33, 37, 41, 0.75);
 | 
				
			||||||
 | 
					  --bs-secondary-color-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-secondary-bg: #e9ecef;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-rgb: 233, 236, 239;
 | 
				
			||||||
 | 
					  --bs-tertiary-color: rgba(33, 37, 41, 0.5);
 | 
				
			||||||
 | 
					  --bs-tertiary-color-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg-rgb: 248, 249, 250;
 | 
				
			||||||
 | 
					  --bs-heading-color: inherit;
 | 
				
			||||||
 | 
					  --bs-link-color: #0d6efd;
 | 
				
			||||||
 | 
					  --bs-link-color-rgb: 13, 110, 253;
 | 
				
			||||||
 | 
					  --bs-link-decoration: underline;
 | 
				
			||||||
 | 
					  --bs-link-hover-color: #0a58ca;
 | 
				
			||||||
 | 
					  --bs-link-hover-color-rgb: 10, 88, 202;
 | 
				
			||||||
 | 
					  --bs-code-color: #d63384;
 | 
				
			||||||
 | 
					  --bs-highlight-color: #212529;
 | 
				
			||||||
 | 
					  --bs-highlight-bg: #fff3cd;
 | 
				
			||||||
 | 
					  --bs-border-width: 1px;
 | 
				
			||||||
 | 
					  --bs-border-style: solid;
 | 
				
			||||||
 | 
					  --bs-border-color: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
 | 
				
			||||||
 | 
					  --bs-border-radius: 0.375rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-sm: 0.25rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-lg: 0.5rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-xl: 1rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-xxl: 2rem;
 | 
				
			||||||
 | 
					  --bs-border-radius-2xl: var(--bs-border-radius-xxl);
 | 
				
			||||||
 | 
					  --bs-border-radius-pill: 50rem;
 | 
				
			||||||
 | 
					  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
 | 
				
			||||||
 | 
					  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
 | 
				
			||||||
 | 
					  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
 | 
				
			||||||
 | 
					  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
 | 
				
			||||||
 | 
					  --bs-focus-ring-width: 0.25rem;
 | 
				
			||||||
 | 
					  --bs-focus-ring-opacity: 0.25;
 | 
				
			||||||
 | 
					  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);
 | 
				
			||||||
 | 
					  --bs-form-valid-color: #198754;
 | 
				
			||||||
 | 
					  --bs-form-valid-border-color: #198754;
 | 
				
			||||||
 | 
					  --bs-form-invalid-color: #dc3545;
 | 
				
			||||||
 | 
					  --bs-form-invalid-border-color: #dc3545;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[data-bs-theme=dark] {
 | 
				
			||||||
 | 
					  color-scheme: dark;
 | 
				
			||||||
 | 
					  --bs-body-color: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-body-color-rgb: 222, 226, 230;
 | 
				
			||||||
 | 
					  --bs-body-bg: #212529;
 | 
				
			||||||
 | 
					  --bs-body-bg-rgb: 33, 37, 41;
 | 
				
			||||||
 | 
					  --bs-emphasis-color: #fff;
 | 
				
			||||||
 | 
					  --bs-emphasis-color-rgb: 255, 255, 255;
 | 
				
			||||||
 | 
					  --bs-secondary-color: rgba(222, 226, 230, 0.75);
 | 
				
			||||||
 | 
					  --bs-secondary-color-rgb: 222, 226, 230;
 | 
				
			||||||
 | 
					  --bs-secondary-bg: #343a40;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-rgb: 52, 58, 64;
 | 
				
			||||||
 | 
					  --bs-tertiary-color: rgba(222, 226, 230, 0.5);
 | 
				
			||||||
 | 
					  --bs-tertiary-color-rgb: 222, 226, 230;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg: #2b3035;
 | 
				
			||||||
 | 
					  --bs-tertiary-bg-rgb: 43, 48, 53;
 | 
				
			||||||
 | 
					  --bs-primary-text-emphasis: #6ea8fe;
 | 
				
			||||||
 | 
					  --bs-secondary-text-emphasis: #a7acb1;
 | 
				
			||||||
 | 
					  --bs-success-text-emphasis: #75b798;
 | 
				
			||||||
 | 
					  --bs-info-text-emphasis: #6edff6;
 | 
				
			||||||
 | 
					  --bs-warning-text-emphasis: #ffda6a;
 | 
				
			||||||
 | 
					  --bs-danger-text-emphasis: #ea868f;
 | 
				
			||||||
 | 
					  --bs-light-text-emphasis: #f8f9fa;
 | 
				
			||||||
 | 
					  --bs-dark-text-emphasis: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-primary-bg-subtle: #031633;
 | 
				
			||||||
 | 
					  --bs-secondary-bg-subtle: #161719;
 | 
				
			||||||
 | 
					  --bs-success-bg-subtle: #051b11;
 | 
				
			||||||
 | 
					  --bs-info-bg-subtle: #032830;
 | 
				
			||||||
 | 
					  --bs-warning-bg-subtle: #332701;
 | 
				
			||||||
 | 
					  --bs-danger-bg-subtle: #2c0b0e;
 | 
				
			||||||
 | 
					  --bs-light-bg-subtle: #343a40;
 | 
				
			||||||
 | 
					  --bs-dark-bg-subtle: #1a1d20;
 | 
				
			||||||
 | 
					  --bs-primary-border-subtle: #084298;
 | 
				
			||||||
 | 
					  --bs-secondary-border-subtle: #41464b;
 | 
				
			||||||
 | 
					  --bs-success-border-subtle: #0f5132;
 | 
				
			||||||
 | 
					  --bs-info-border-subtle: #087990;
 | 
				
			||||||
 | 
					  --bs-warning-border-subtle: #997404;
 | 
				
			||||||
 | 
					  --bs-danger-border-subtle: #842029;
 | 
				
			||||||
 | 
					  --bs-light-border-subtle: #495057;
 | 
				
			||||||
 | 
					  --bs-dark-border-subtle: #343a40;
 | 
				
			||||||
 | 
					  --bs-heading-color: inherit;
 | 
				
			||||||
 | 
					  --bs-link-color: #6ea8fe;
 | 
				
			||||||
 | 
					  --bs-link-hover-color: #8bb9fe;
 | 
				
			||||||
 | 
					  --bs-link-color-rgb: 110, 168, 254;
 | 
				
			||||||
 | 
					  --bs-link-hover-color-rgb: 139, 185, 254;
 | 
				
			||||||
 | 
					  --bs-code-color: #e685b5;
 | 
				
			||||||
 | 
					  --bs-highlight-color: #dee2e6;
 | 
				
			||||||
 | 
					  --bs-highlight-bg: #664d03;
 | 
				
			||||||
 | 
					  --bs-border-color: #495057;
 | 
				
			||||||
 | 
					  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
 | 
				
			||||||
 | 
					  --bs-form-valid-color: #75b798;
 | 
				
			||||||
 | 
					  --bs-form-valid-border-color: #75b798;
 | 
				
			||||||
 | 
					  --bs-form-invalid-color: #ea868f;
 | 
				
			||||||
 | 
					  --bs-form-invalid-border-color: #ea868f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*,
 | 
				
			||||||
 | 
					*::before,
 | 
				
			||||||
 | 
					*::after {
 | 
				
			||||||
 | 
					  box-sizing: border-box;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@media (prefers-reduced-motion: no-preference) {
 | 
				
			||||||
 | 
					  :root {
 | 
				
			||||||
 | 
					    scroll-behavior: smooth;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					body {
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  font-family: var(--bs-body-font-family);
 | 
				
			||||||
 | 
					  font-size: var(--bs-body-font-size);
 | 
				
			||||||
 | 
					  font-weight: var(--bs-body-font-weight);
 | 
				
			||||||
 | 
					  line-height: var(--bs-body-line-height);
 | 
				
			||||||
 | 
					  color: var(--bs-body-color);
 | 
				
			||||||
 | 
					  text-align: var(--bs-body-text-align);
 | 
				
			||||||
 | 
					  background-color: var(--bs-body-bg);
 | 
				
			||||||
 | 
					  -webkit-text-size-adjust: 100%;
 | 
				
			||||||
 | 
					  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hr {
 | 
				
			||||||
 | 
					  margin: 1rem 0;
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					  border: 0;
 | 
				
			||||||
 | 
					  border-top: var(--bs-border-width) solid;
 | 
				
			||||||
 | 
					  opacity: 0.25;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h6, h5, h4, h3, h2, h1 {
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  font-weight: 500;
 | 
				
			||||||
 | 
					  line-height: 1.2;
 | 
				
			||||||
 | 
					  color: var(--bs-heading-color);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h1 {
 | 
				
			||||||
 | 
					  font-size: calc(1.375rem + 1.5vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h1 {
 | 
				
			||||||
 | 
					    font-size: 2.5rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h2 {
 | 
				
			||||||
 | 
					  font-size: calc(1.325rem + 0.9vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h2 {
 | 
				
			||||||
 | 
					    font-size: 2rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h3 {
 | 
				
			||||||
 | 
					  font-size: calc(1.3rem + 0.6vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h3 {
 | 
				
			||||||
 | 
					    font-size: 1.75rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h4 {
 | 
				
			||||||
 | 
					  font-size: calc(1.275rem + 0.3vw);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  h4 {
 | 
				
			||||||
 | 
					    font-size: 1.5rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h5 {
 | 
				
			||||||
 | 
					  font-size: 1.25rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h6 {
 | 
				
			||||||
 | 
					  font-size: 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					p {
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abbr[title] {
 | 
				
			||||||
 | 
					  -webkit-text-decoration: underline dotted;
 | 
				
			||||||
 | 
					  text-decoration: underline dotted;
 | 
				
			||||||
 | 
					  cursor: help;
 | 
				
			||||||
 | 
					  -webkit-text-decoration-skip-ink: none;
 | 
				
			||||||
 | 
					  text-decoration-skip-ink: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					address {
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					  font-style: normal;
 | 
				
			||||||
 | 
					  line-height: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ol,
 | 
				
			||||||
 | 
					ul {
 | 
				
			||||||
 | 
					  padding-right: 2rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ol,
 | 
				
			||||||
 | 
					ul,
 | 
				
			||||||
 | 
					dl {
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ol ol,
 | 
				
			||||||
 | 
					ul ul,
 | 
				
			||||||
 | 
					ol ul,
 | 
				
			||||||
 | 
					ul ol {
 | 
				
			||||||
 | 
					  margin-bottom: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dt {
 | 
				
			||||||
 | 
					  font-weight: 700;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dd {
 | 
				
			||||||
 | 
					  margin-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  margin-right: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					blockquote {
 | 
				
			||||||
 | 
					  margin: 0 0 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					b,
 | 
				
			||||||
 | 
					strong {
 | 
				
			||||||
 | 
					  font-weight: bolder;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					small {
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mark {
 | 
				
			||||||
 | 
					  padding: 0.1875em;
 | 
				
			||||||
 | 
					  color: var(--bs-highlight-color);
 | 
				
			||||||
 | 
					  background-color: var(--bs-highlight-bg);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub,
 | 
				
			||||||
 | 
					sup {
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  font-size: 0.75em;
 | 
				
			||||||
 | 
					  line-height: 0;
 | 
				
			||||||
 | 
					  vertical-align: baseline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub {
 | 
				
			||||||
 | 
					  bottom: -0.25em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sup {
 | 
				
			||||||
 | 
					  top: -0.5em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a {
 | 
				
			||||||
 | 
					  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
 | 
				
			||||||
 | 
					  text-decoration: underline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					a:hover {
 | 
				
			||||||
 | 
					  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a:not([href]):not([class]), a:not([href]):not([class]):hover {
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					  text-decoration: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pre,
 | 
				
			||||||
 | 
					code,
 | 
				
			||||||
 | 
					kbd,
 | 
				
			||||||
 | 
					samp {
 | 
				
			||||||
 | 
					  font-family: var(--bs-font-monospace);
 | 
				
			||||||
 | 
					  font-size: 1em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pre {
 | 
				
			||||||
 | 
					  display: block;
 | 
				
			||||||
 | 
					  margin-top: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 1rem;
 | 
				
			||||||
 | 
					  overflow: auto;
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					pre code {
 | 
				
			||||||
 | 
					  font-size: inherit;
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					  word-break: normal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					code {
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					  color: var(--bs-code-color);
 | 
				
			||||||
 | 
					  word-wrap: break-word;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					a > code {
 | 
				
			||||||
 | 
					  color: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kbd {
 | 
				
			||||||
 | 
					  padding: 0.1875rem 0.375rem;
 | 
				
			||||||
 | 
					  font-size: 0.875em;
 | 
				
			||||||
 | 
					  color: var(--bs-body-bg);
 | 
				
			||||||
 | 
					  background-color: var(--bs-body-color);
 | 
				
			||||||
 | 
					  border-radius: 0.25rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					kbd kbd {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  font-size: 1em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					figure {
 | 
				
			||||||
 | 
					  margin: 0 0 1rem;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					img,
 | 
				
			||||||
 | 
					svg {
 | 
				
			||||||
 | 
					  vertical-align: middle;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					table {
 | 
				
			||||||
 | 
					  caption-side: bottom;
 | 
				
			||||||
 | 
					  border-collapse: collapse;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					caption {
 | 
				
			||||||
 | 
					  padding-top: 0.5rem;
 | 
				
			||||||
 | 
					  padding-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  color: var(--bs-secondary-color);
 | 
				
			||||||
 | 
					  text-align: right;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					th {
 | 
				
			||||||
 | 
					  text-align: inherit;
 | 
				
			||||||
 | 
					  text-align: -webkit-match-parent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					thead,
 | 
				
			||||||
 | 
					tbody,
 | 
				
			||||||
 | 
					tfoot,
 | 
				
			||||||
 | 
					tr,
 | 
				
			||||||
 | 
					td,
 | 
				
			||||||
 | 
					th {
 | 
				
			||||||
 | 
					  border-color: inherit;
 | 
				
			||||||
 | 
					  border-style: solid;
 | 
				
			||||||
 | 
					  border-width: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label {
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button {
 | 
				
			||||||
 | 
					  border-radius: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button:focus:not(:focus-visible) {
 | 
				
			||||||
 | 
					  outline: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					input,
 | 
				
			||||||
 | 
					button,
 | 
				
			||||||
 | 
					select,
 | 
				
			||||||
 | 
					optgroup,
 | 
				
			||||||
 | 
					textarea {
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  font-family: inherit;
 | 
				
			||||||
 | 
					  font-size: inherit;
 | 
				
			||||||
 | 
					  line-height: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button,
 | 
				
			||||||
 | 
					select {
 | 
				
			||||||
 | 
					  text-transform: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[role=button] {
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					select {
 | 
				
			||||||
 | 
					  word-wrap: normal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					select:disabled {
 | 
				
			||||||
 | 
					  opacity: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
 | 
				
			||||||
 | 
					  display: none !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button,
 | 
				
			||||||
 | 
					[type=button],
 | 
				
			||||||
 | 
					[type=reset],
 | 
				
			||||||
 | 
					[type=submit] {
 | 
				
			||||||
 | 
					  -webkit-appearance: button;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					button:not(:disabled),
 | 
				
			||||||
 | 
					[type=button]:not(:disabled),
 | 
				
			||||||
 | 
					[type=reset]:not(:disabled),
 | 
				
			||||||
 | 
					[type=submit]:not(:disabled) {
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-moz-focus-inner {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  border-style: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					textarea {
 | 
				
			||||||
 | 
					  resize: vertical;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fieldset {
 | 
				
			||||||
 | 
					  min-width: 0;
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  border: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					legend {
 | 
				
			||||||
 | 
					  float: right;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  margin-bottom: 0.5rem;
 | 
				
			||||||
 | 
					  font-size: calc(1.275rem + 0.3vw);
 | 
				
			||||||
 | 
					  line-height: inherit;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					@media (min-width: 1200px) {
 | 
				
			||||||
 | 
					  legend {
 | 
				
			||||||
 | 
					    font-size: 1.5rem;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					legend + * {
 | 
				
			||||||
 | 
					  clear: right;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-fields-wrapper,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-text,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-minute,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-hour-field,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-day-field,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-month-field,
 | 
				
			||||||
 | 
					::-webkit-datetime-edit-year-field {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-inner-spin-button {
 | 
				
			||||||
 | 
					  height: auto;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[type=search] {
 | 
				
			||||||
 | 
					  -webkit-appearance: textfield;
 | 
				
			||||||
 | 
					  outline-offset: -2px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[type="tel"],
 | 
				
			||||||
 | 
					[type="url"],
 | 
				
			||||||
 | 
					[type="email"],
 | 
				
			||||||
 | 
					[type="number"] {
 | 
				
			||||||
 | 
					  direction: ltr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					::-webkit-search-decoration {
 | 
				
			||||||
 | 
					  -webkit-appearance: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-color-swatch-wrapper {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-file-upload-button {
 | 
				
			||||||
 | 
					  font: inherit;
 | 
				
			||||||
 | 
					  -webkit-appearance: button;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::file-selector-button {
 | 
				
			||||||
 | 
					  font: inherit;
 | 
				
			||||||
 | 
					  -webkit-appearance: button;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					output {
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					iframe {
 | 
				
			||||||
 | 
					  border: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					summary {
 | 
				
			||||||
 | 
					  display: list-item;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					progress {
 | 
				
			||||||
 | 
					  vertical-align: baseline;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[hidden] {
 | 
				
			||||||
 | 
					  display: none !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
 | 
				
			||||||
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										5402
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5402
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										5393
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5393
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										12057
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12057
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										12030
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12030
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.min.css.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										6314
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6314
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										7
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.min.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										4447
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4447
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										7
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.min.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										4494
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4494
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										7
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/bootstrap/dist/js/bootstrap.min.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) .NET Foundation and Contributors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
							
								
								
									
										435
									
								
								song_of_the_day/wwwroot/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										435
									
								
								song_of_the_day/wwwroot/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,435 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @license
 | 
				
			||||||
 | 
					 * Unobtrusive validation support library for jQuery and jQuery Validate
 | 
				
			||||||
 | 
					 * Copyright (c) .NET Foundation. All rights reserved.
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 | 
				
			||||||
 | 
					 * @version v4.0.0
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
 | 
				
			||||||
 | 
					/*global document: false, jQuery: false */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(function (factory) {
 | 
				
			||||||
 | 
					    if (typeof define === 'function' && define.amd) {
 | 
				
			||||||
 | 
					        // AMD. Register as an anonymous module.
 | 
				
			||||||
 | 
					        define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
 | 
				
			||||||
 | 
					    } else if (typeof module === 'object' && module.exports) {
 | 
				
			||||||
 | 
					        // CommonJS-like environments that support module.exports     
 | 
				
			||||||
 | 
					        module.exports = factory(require('jquery-validation'));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        // Browser global
 | 
				
			||||||
 | 
					        jQuery.validator.unobtrusive = factory(jQuery);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}(function ($) {
 | 
				
			||||||
 | 
					    var $jQval = $.validator,
 | 
				
			||||||
 | 
					        adapters,
 | 
				
			||||||
 | 
					        data_validation = "unobtrusiveValidation";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setValidationValues(options, ruleName, value) {
 | 
				
			||||||
 | 
					        options.rules[ruleName] = value;
 | 
				
			||||||
 | 
					        if (options.message) {
 | 
				
			||||||
 | 
					            options.messages[ruleName] = options.message;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function splitAndTrim(value) {
 | 
				
			||||||
 | 
					        return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function escapeAttributeValue(value) {
 | 
				
			||||||
 | 
					        // As mentioned on http://api.jquery.com/category/selectors/
 | 
				
			||||||
 | 
					        return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function getModelPrefix(fieldName) {
 | 
				
			||||||
 | 
					        return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function appendModelPrefix(value, prefix) {
 | 
				
			||||||
 | 
					        if (value.indexOf("*.") === 0) {
 | 
				
			||||||
 | 
					            value = value.replace("*.", prefix);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return value;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function onError(error, inputElement) {  // 'this' is the form element
 | 
				
			||||||
 | 
					        var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
 | 
				
			||||||
 | 
					            replaceAttrValue = container.attr("data-valmsg-replace"),
 | 
				
			||||||
 | 
					            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        container.removeClass("field-validation-valid").addClass("field-validation-error");
 | 
				
			||||||
 | 
					        error.data("unobtrusiveContainer", container);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (replace) {
 | 
				
			||||||
 | 
					            container.empty();
 | 
				
			||||||
 | 
					            error.removeClass("input-validation-error").appendTo(container);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            error.hide();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function onErrors(event, validator) {  // 'this' is the form element
 | 
				
			||||||
 | 
					        var container = $(this).find("[data-valmsg-summary=true]"),
 | 
				
			||||||
 | 
					            list = container.find("ul");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (list && list.length && validator.errorList.length) {
 | 
				
			||||||
 | 
					            list.empty();
 | 
				
			||||||
 | 
					            container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $.each(validator.errorList, function () {
 | 
				
			||||||
 | 
					                $("<li />").html(this.message).appendTo(list);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function onSuccess(error) {  // 'this' is the form element
 | 
				
			||||||
 | 
					        var container = error.data("unobtrusiveContainer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (container) {
 | 
				
			||||||
 | 
					            var replaceAttrValue = container.attr("data-valmsg-replace"),
 | 
				
			||||||
 | 
					                replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            container.addClass("field-validation-valid").removeClass("field-validation-error");
 | 
				
			||||||
 | 
					            error.removeData("unobtrusiveContainer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (replace) {
 | 
				
			||||||
 | 
					                container.empty();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function onReset(event) {  // 'this' is the form element
 | 
				
			||||||
 | 
					        var $form = $(this),
 | 
				
			||||||
 | 
					            key = '__jquery_unobtrusive_validation_form_reset';
 | 
				
			||||||
 | 
					        if ($form.data(key)) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // Set a flag that indicates we're currently resetting the form.
 | 
				
			||||||
 | 
					        $form.data(key, true);
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            $form.data("validator").resetForm();
 | 
				
			||||||
 | 
					        } finally {
 | 
				
			||||||
 | 
					            $form.removeData(key);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $form.find(".validation-summary-errors")
 | 
				
			||||||
 | 
					            .addClass("validation-summary-valid")
 | 
				
			||||||
 | 
					            .removeClass("validation-summary-errors");
 | 
				
			||||||
 | 
					        $form.find(".field-validation-error")
 | 
				
			||||||
 | 
					            .addClass("field-validation-valid")
 | 
				
			||||||
 | 
					            .removeClass("field-validation-error")
 | 
				
			||||||
 | 
					            .removeData("unobtrusiveContainer")
 | 
				
			||||||
 | 
					            .find(">*")  // If we were using valmsg-replace, get the underlying error
 | 
				
			||||||
 | 
					            .removeData("unobtrusiveContainer");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function validationInfo(form) {
 | 
				
			||||||
 | 
					        var $form = $(form),
 | 
				
			||||||
 | 
					            result = $form.data(data_validation),
 | 
				
			||||||
 | 
					            onResetProxy = $.proxy(onReset, form),
 | 
				
			||||||
 | 
					            defaultOptions = $jQval.unobtrusive.options || {},
 | 
				
			||||||
 | 
					            execInContext = function (name, args) {
 | 
				
			||||||
 | 
					                var func = defaultOptions[name];
 | 
				
			||||||
 | 
					                func && $.isFunction(func) && func.apply(form, args);
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!result) {
 | 
				
			||||||
 | 
					            result = {
 | 
				
			||||||
 | 
					                options: {  // options structure passed to jQuery Validate's validate() method
 | 
				
			||||||
 | 
					                    errorClass: defaultOptions.errorClass || "input-validation-error",
 | 
				
			||||||
 | 
					                    errorElement: defaultOptions.errorElement || "span",
 | 
				
			||||||
 | 
					                    errorPlacement: function () {
 | 
				
			||||||
 | 
					                        onError.apply(form, arguments);
 | 
				
			||||||
 | 
					                        execInContext("errorPlacement", arguments);
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    invalidHandler: function () {
 | 
				
			||||||
 | 
					                        onErrors.apply(form, arguments);
 | 
				
			||||||
 | 
					                        execInContext("invalidHandler", arguments);
 | 
				
			||||||
 | 
					                    },
 | 
				
			||||||
 | 
					                    messages: {},
 | 
				
			||||||
 | 
					                    rules: {},
 | 
				
			||||||
 | 
					                    success: function () {
 | 
				
			||||||
 | 
					                        onSuccess.apply(form, arguments);
 | 
				
			||||||
 | 
					                        execInContext("success", arguments);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                attachValidation: function () {
 | 
				
			||||||
 | 
					                    $form
 | 
				
			||||||
 | 
					                        .off("reset." + data_validation, onResetProxy)
 | 
				
			||||||
 | 
					                        .on("reset." + data_validation, onResetProxy)
 | 
				
			||||||
 | 
					                        .validate(this.options);
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                validate: function () {  // a validation function that is called by unobtrusive Ajax
 | 
				
			||||||
 | 
					                    $form.validate();
 | 
				
			||||||
 | 
					                    return $form.valid();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            $form.data(data_validation, result);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $jQval.unobtrusive = {
 | 
				
			||||||
 | 
					        adapters: [],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        parseElement: function (element, skipAttach) {
 | 
				
			||||||
 | 
					            /// <summary>
 | 
				
			||||||
 | 
					            /// Parses a single HTML element for unobtrusive validation attributes.
 | 
				
			||||||
 | 
					            /// </summary>
 | 
				
			||||||
 | 
					            /// <param name="element" domElement="true">The HTML element to be parsed.</param>
 | 
				
			||||||
 | 
					            /// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
 | 
				
			||||||
 | 
					            /// validation to the form. If parsing just this single element, you should specify true.
 | 
				
			||||||
 | 
					            /// If parsing several elements, you should specify false, and manually attach the validation
 | 
				
			||||||
 | 
					            /// to the form when you are finished. The default is false.</param>
 | 
				
			||||||
 | 
					            var $element = $(element),
 | 
				
			||||||
 | 
					                form = $element.parents("form")[0],
 | 
				
			||||||
 | 
					                valInfo, rules, messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!form) {  // Cannot do client-side validation without a form
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            valInfo = validationInfo(form);
 | 
				
			||||||
 | 
					            valInfo.options.rules[element.name] = rules = {};
 | 
				
			||||||
 | 
					            valInfo.options.messages[element.name] = messages = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $.each(this.adapters, function () {
 | 
				
			||||||
 | 
					                var prefix = "data-val-" + this.name,
 | 
				
			||||||
 | 
					                    message = $element.attr(prefix),
 | 
				
			||||||
 | 
					                    paramValues = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (message !== undefined) {  // Compare against undefined, because an empty message is legal (and falsy)
 | 
				
			||||||
 | 
					                    prefix += "-";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    $.each(this.params, function () {
 | 
				
			||||||
 | 
					                        paramValues[this] = $element.attr(prefix + this);
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    this.adapt({
 | 
				
			||||||
 | 
					                        element: element,
 | 
				
			||||||
 | 
					                        form: form,
 | 
				
			||||||
 | 
					                        message: message,
 | 
				
			||||||
 | 
					                        params: paramValues,
 | 
				
			||||||
 | 
					                        rules: rules,
 | 
				
			||||||
 | 
					                        messages: messages
 | 
				
			||||||
 | 
					                    });
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $.extend(rules, { "__dummy__": true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (!skipAttach) {
 | 
				
			||||||
 | 
					                valInfo.attachValidation();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        parse: function (selector) {
 | 
				
			||||||
 | 
					            /// <summary>
 | 
				
			||||||
 | 
					            /// Parses all the HTML elements in the specified selector. It looks for input elements decorated
 | 
				
			||||||
 | 
					            /// with the [data-val=true] attribute value and enables validation according to the data-val-*
 | 
				
			||||||
 | 
					            /// attribute values.
 | 
				
			||||||
 | 
					            /// </summary>
 | 
				
			||||||
 | 
					            /// <param name="selector" type="String">Any valid jQuery selector.</param>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
 | 
				
			||||||
 | 
					            // element with data-val=true
 | 
				
			||||||
 | 
					            var $selector = $(selector),
 | 
				
			||||||
 | 
					                $forms = $selector.parents()
 | 
				
			||||||
 | 
					                    .addBack()
 | 
				
			||||||
 | 
					                    .filter("form")
 | 
				
			||||||
 | 
					                    .add($selector.find("form"))
 | 
				
			||||||
 | 
					                    .has("[data-val=true]");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $selector.find("[data-val=true]").each(function () {
 | 
				
			||||||
 | 
					                $jQval.unobtrusive.parseElement(this, true);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $forms.each(function () {
 | 
				
			||||||
 | 
					                var info = validationInfo(this);
 | 
				
			||||||
 | 
					                if (info) {
 | 
				
			||||||
 | 
					                    info.attachValidation();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    adapters = $jQval.unobtrusive.adapters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    adapters.add = function (adapterName, params, fn) {
 | 
				
			||||||
 | 
					        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
 | 
				
			||||||
 | 
					        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
 | 
				
			||||||
 | 
					        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
 | 
				
			||||||
 | 
					        /// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
 | 
				
			||||||
 | 
					        /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
 | 
				
			||||||
 | 
					        /// mmmm is the parameter name).</param>
 | 
				
			||||||
 | 
					        /// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
 | 
				
			||||||
 | 
					        /// attributes into jQuery Validate rules and/or messages.</param>
 | 
				
			||||||
 | 
					        /// <returns type="jQuery.validator.unobtrusive.adapters" />
 | 
				
			||||||
 | 
					        if (!fn) {  // Called with no params, just a function
 | 
				
			||||||
 | 
					            fn = params;
 | 
				
			||||||
 | 
					            params = [];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.push({ name: adapterName, params: params, adapt: fn });
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    adapters.addBool = function (adapterName, ruleName) {
 | 
				
			||||||
 | 
					        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
 | 
				
			||||||
 | 
					        /// the jQuery Validate validation rule has no parameter values.</summary>
 | 
				
			||||||
 | 
					        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
 | 
				
			||||||
 | 
					        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
 | 
				
			||||||
 | 
					        /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
 | 
				
			||||||
 | 
					        /// of adapterName will be used instead.</param>
 | 
				
			||||||
 | 
					        /// <returns type="jQuery.validator.unobtrusive.adapters" />
 | 
				
			||||||
 | 
					        return this.add(adapterName, function (options) {
 | 
				
			||||||
 | 
					            setValidationValues(options, ruleName || adapterName, true);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
 | 
				
			||||||
 | 
					        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
 | 
				
			||||||
 | 
					        /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
 | 
				
			||||||
 | 
					        /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
 | 
				
			||||||
 | 
					        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
 | 
				
			||||||
 | 
					        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
 | 
				
			||||||
 | 
					        /// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
 | 
				
			||||||
 | 
					        /// have a minimum value.</param>
 | 
				
			||||||
 | 
					        /// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
 | 
				
			||||||
 | 
					        /// have a maximum value.</param>
 | 
				
			||||||
 | 
					        /// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
 | 
				
			||||||
 | 
					        /// have both a minimum and maximum value.</param>
 | 
				
			||||||
 | 
					        /// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
 | 
				
			||||||
 | 
					        /// contains the minimum value. The default is "min".</param>
 | 
				
			||||||
 | 
					        /// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
 | 
				
			||||||
 | 
					        /// contains the maximum value. The default is "max".</param>
 | 
				
			||||||
 | 
					        /// <returns type="jQuery.validator.unobtrusive.adapters" />
 | 
				
			||||||
 | 
					        return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
 | 
				
			||||||
 | 
					            var min = options.params.min,
 | 
				
			||||||
 | 
					                max = options.params.max;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (min && max) {
 | 
				
			||||||
 | 
					                setValidationValues(options, minMaxRuleName, [min, max]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (min) {
 | 
				
			||||||
 | 
					                setValidationValues(options, minRuleName, min);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if (max) {
 | 
				
			||||||
 | 
					                setValidationValues(options, maxRuleName, max);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    adapters.addSingleVal = function (adapterName, attribute, ruleName) {
 | 
				
			||||||
 | 
					        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
 | 
				
			||||||
 | 
					        /// the jQuery Validate validation rule has a single value.</summary>
 | 
				
			||||||
 | 
					        /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
 | 
				
			||||||
 | 
					        /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
 | 
				
			||||||
 | 
					        /// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
 | 
				
			||||||
 | 
					        /// The default is "val".</param>
 | 
				
			||||||
 | 
					        /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
 | 
				
			||||||
 | 
					        /// of adapterName will be used instead.</param>
 | 
				
			||||||
 | 
					        /// <returns type="jQuery.validator.unobtrusive.adapters" />
 | 
				
			||||||
 | 
					        return this.add(adapterName, [attribute || "val"], function (options) {
 | 
				
			||||||
 | 
					            setValidationValues(options, ruleName || adapterName, options.params[attribute]);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $jQval.addMethod("__dummy__", function (value, element, params) {
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $jQval.addMethod("regex", function (value, element, params) {
 | 
				
			||||||
 | 
					        var match;
 | 
				
			||||||
 | 
					        if (this.optional(element)) {
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        match = new RegExp(params).exec(value);
 | 
				
			||||||
 | 
					        return (match && (match.index === 0) && (match[0].length === value.length));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
 | 
				
			||||||
 | 
					        var match;
 | 
				
			||||||
 | 
					        if (nonalphamin) {
 | 
				
			||||||
 | 
					            match = value.match(/\W/g);
 | 
				
			||||||
 | 
					            match = match && match.length >= nonalphamin;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return match;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ($jQval.methods.extension) {
 | 
				
			||||||
 | 
					        adapters.addSingleVal("accept", "mimtype");
 | 
				
			||||||
 | 
					        adapters.addSingleVal("extension", "extension");
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        // for backward compatibility, when the 'extension' validation method does not exist, such as with versions
 | 
				
			||||||
 | 
					        // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
 | 
				
			||||||
 | 
					        // validating the extension, and ignore mime-type validations as they are not supported.
 | 
				
			||||||
 | 
					        adapters.addSingleVal("extension", "extension", "accept");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    adapters.addSingleVal("regex", "pattern");
 | 
				
			||||||
 | 
					    adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
 | 
				
			||||||
 | 
					    adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
 | 
				
			||||||
 | 
					    adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
 | 
				
			||||||
 | 
					    adapters.add("equalto", ["other"], function (options) {
 | 
				
			||||||
 | 
					        var prefix = getModelPrefix(options.element.name),
 | 
				
			||||||
 | 
					            other = options.params.other,
 | 
				
			||||||
 | 
					            fullOtherName = appendModelPrefix(other, prefix),
 | 
				
			||||||
 | 
					            element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        setValidationValues(options, "equalTo", element);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    adapters.add("required", function (options) {
 | 
				
			||||||
 | 
					        // jQuery Validate equates "required" with "mandatory" for checkbox elements
 | 
				
			||||||
 | 
					        if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
 | 
				
			||||||
 | 
					            setValidationValues(options, "required", true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
 | 
				
			||||||
 | 
					        var value = {
 | 
				
			||||||
 | 
					            url: options.params.url,
 | 
				
			||||||
 | 
					            type: options.params.type || "GET",
 | 
				
			||||||
 | 
					            data: {}
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					            prefix = getModelPrefix(options.element.name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
 | 
				
			||||||
 | 
					            var paramName = appendModelPrefix(fieldName, prefix);
 | 
				
			||||||
 | 
					            value.data[paramName] = function () {
 | 
				
			||||||
 | 
					                var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
 | 
				
			||||||
 | 
					                // For checkboxes and radio buttons, only pick up values from checked fields.
 | 
				
			||||||
 | 
					                if (field.is(":checkbox")) {
 | 
				
			||||||
 | 
					                    return field.filter(":checked").val() || field.filter(":hidden").val() || '';
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else if (field.is(":radio")) {
 | 
				
			||||||
 | 
					                    return field.filter(":checked").val() || '';
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                return field.val();
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        setValidationValues(options, "remote", value);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
 | 
				
			||||||
 | 
					        if (options.params.min) {
 | 
				
			||||||
 | 
					            setValidationValues(options, "minlength", options.params.min);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (options.params.nonalphamin) {
 | 
				
			||||||
 | 
					            setValidationValues(options, "nonalphamin", options.params.nonalphamin);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (options.params.regex) {
 | 
				
			||||||
 | 
					            setValidationValues(options, "regex", options.params.regex);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    adapters.add("fileextensions", ["extensions"], function (options) {
 | 
				
			||||||
 | 
					        setValidationValues(options, "extension", options.params.extensions);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $(function () {
 | 
				
			||||||
 | 
					        $jQval.unobtrusive.parse(document);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return $jQval.unobtrusive;
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										22
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/LICENSE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/LICENSE.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					=====================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright Jörn Zaefferer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
							
								
								
									
										1505
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/additional-methods.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1505
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/additional-methods.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/additional-methods.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1703
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/jquery.validate.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1703
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/jquery.validate.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								song_of_the_day/wwwroot/lib/jquery-validation/dist/jquery.validate.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										21
									
								
								song_of_the_day/wwwroot/lib/jquery/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								song_of_the_day/wwwroot/lib/jquery/LICENSE.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright OpenJS Foundation and other contributors, https://openjsf.org/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
							
								
								
									
										10716
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10716
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.min.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.min.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										8617
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.slim.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8617
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.slim.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.slim.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.slim.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.slim.min.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								song_of_the_day/wwwroot/lib/jquery/dist/jquery.slim.min.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user