diff --git a/.gitignore b/.gitignore index 48e9fa6..2af6faf 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,105 @@ # Delphi history and backups __history/ -*.~* \ No newline at end of file +__recover/ +__recovery/ +Win32/ +Win64/ +*.~* + +__recovery/uMainForm.pas +__recovery/uMainForm.fmx +__recovery/__recovery.ini + + + +Unit Test/__recovery/ + +Unit Test/Win32/Debug/ + +*.skincfg + +*.vlb + +*.res + + +################### +# WEB APP # +################### + +################### +# compiled source # +################### +*.com +*.class +*.dll +*.exe +*.pdb +*.dll.config +*.cache +*.suo +# Include dlls if they’re in the NuGet packages directory +!/packages/*/lib/*.dll +!/packages/*/lib/*/*.dll +# Include dlls if they're in the CommonReferences directory +!*CommonReferences/*.dll +#################### +# VS Upgrade stuff # +#################### +UpgradeLog.XML +_UpgradeReport_Files/ +############### +# Directories # +############### +bin/ +obj/ +TestResults/ +################### +# Web publish log # +################### +*.Publish.xml +############# +# Resharper # +############# +/_ReSharper.* +*.ReSharper.* +############ +# Packages # +############ +# it’s better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +###################### +# Logs and databases # +###################### +*.log +*.sqlite +# OS generated files # +###################### +.DS_Store? +ehthumbs.db +Icon? +Thumbs.db +[Bb]in +[Oo]bj +[Tt]est[Rr]esults +*.suo +*.user +*.[Cc]ache +*[Rr]esharper* +packages +NuGet.exe +_[Ss]cripts +*.exe +*.dll +*.nupkg +*.ncrunchsolution +*.dot[Cc]over \ No newline at end of file diff --git a/Components/Pkg.Json.Components.Update.pas b/Components/Pkg.Json.Components.Update.pas new file mode 100644 index 0000000..7937710 --- /dev/null +++ b/Components/Pkg.Json.Components.Update.pas @@ -0,0 +1,78 @@ +unit Pkg.Json.Components.Update; + +interface + +uses + System.JSON, System.SysUtils, + + Pkg.JSON.ThreadingEx, DTO.GitHUB.ReleaseDTO; + +const + ProgramVersion: double = 3.2; + ProgramUrl = 'https://github.com/JensBorrisholt/Delphi-JsonToDelphiClass'; + HTTP_OK = 200; + +function CheckForUpdate(AOnFinish: TProc): ITaskEx; + +implementation + +uses + System.Net.HttpClient, System.Net.HttpClientComponent; + +function CheckForUpdate(AOnFinish: TProc): ITaskEx; +const + UpdateUrl = 'https://api.github.com/repos/JensBorrisholt/Delphi-JsonToDelphiClass/releases'; + HTTP_OK = 200; +var + ErrorMessage: string; + Releases: TReleases; + Release: TRelease; + Respons: IHTTPResponse; +begin + Result := TTaskEx.Run( + procedure + + begin + Releases := TReleases.Create; + with TNetHTTPClient.Create(nil) do + try + try + Respons := Get(UpdateUrl); + + if Respons.StatusCode = HTTP_OK then + Releases.AsJson := Respons.ContentAsString + else + begin + Release := nil; + Exit; + + + end; + + if Releases.Items.Count >= 0 then + begin + Release := Releases.Items.First; + if JsonToFloat(Release.TagName) <= ProgramVersion then + Release := nil; + end + else + Release := nil; + + ErrorMessage := ''; + except + on e: Exception do + ErrorMessage := e.message; + end; + finally + Free; + end; + end + ).ContinueWithInMainThread( + procedure(const aTask: ITaskEx) + begin + AOnFinish(Release, ErrorMessage); + FreeAndNil(Releases); + end, TTaskContinuationOptions.OnlyOnCompleted); +end; + +end. diff --git a/Components/Pkg.Json.Visualizer.pas b/Components/Pkg.Json.Visualizer.pas new file mode 100644 index 0000000..4171b82 --- /dev/null +++ b/Components/Pkg.Json.Visualizer.pas @@ -0,0 +1,139 @@ +unit Pkg.Json.Visualizer; + +interface + +uses + FMX.TreeView, + + Pkg.Json.Mapper, Pkg.Json.StubField; + +Type + JsonVisualizer = class + private + class procedure InternalFormatTreeViewFields(AItem: TTreeViewItem); + class procedure FormatFields(aTreeView: TTreeView); + class procedure InternalVisualize(aTreeViewItem: TTreeViewItem; aClass: TStubClass; AItemStyleLookup: string); + + public + // Visualizes stub class structure in a treeview + class procedure Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aJsonString: string); overload; + class procedure Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aMapper: TPkgJsonMapper); overload; + end; + +implementation + +uses + System.Sysutils, Pkg.Json.JsonValueHelper; + +{ TJsonVisualizer } + +class procedure JsonVisualizer.Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aJsonString: string); +var + JsonMapper: TPkgJsonMapper; +begin + JsonMapper := TPkgJsonMapper.Create; + try + JsonMapper.Parse(aJsonString); + Visualize(aTreeView, AItemStyleLookup, JsonMapper); + finally + JsonMapper.Free; + end; +end; + +class procedure JsonVisualizer.FormatFields(aTreeView: TTreeView); +begin + if aTreeView.Count = 1 then + InternalFormatTreeViewFields(aTreeView.Items[0]); +end; + +class procedure JsonVisualizer.InternalFormatTreeViewFields(AItem: TTreeViewItem); +var + LItem: TTreeViewItem; + k: Integer; + LSize, LPos: Integer; +begin + LSize := 0; + + // Find max len + for k := 0 to AItem.Count - 1 do + begin + LItem := AItem.Items[k]; + LPos := Pos(':', LItem.Text); + if (LPos > 0) AND (LPos > LSize) then + LSize := LPos; + end; + + for k := 0 to AItem.Count - 1 do + begin + LItem := AItem.Items[k]; + LPos := LSize - Pos(':', LItem.Text); + if (LPos > 0) then + LItem.Text := LItem.Text.Replace(':', StringOfChar(' ', LPos) + ':'); + + InternalFormatTreeViewFields(LItem); + end; + +end; + +class procedure JsonVisualizer.InternalVisualize(aTreeViewItem: TTreeViewItem; aClass: TStubClass; AItemStyleLookup: string); +var + StubField: TStubField; + TreeViewItem: TTreeViewItem; +begin + for StubField in aClass.Items do + begin + TreeViewItem := TTreeViewItem.Create(aTreeViewItem); + TreeViewItem.StyleLookup := AItemStyleLookup; + TreeViewItem.TagObject := StubField; + TreeViewItem.WordWrap := false; + + case StubField.FieldType of + jtObject: + begin + TreeViewItem.Text := StubField.Name + ': {} ' + StubField.TypeAsString; + InternalVisualize(TreeViewItem, (StubField as TStubObjectField).FieldClass, AItemStyleLookup); + end; + + jtArray: + begin + TreeViewItem.Text := StubField.Name + ': [] ' + StubField.TypeAsString; + if (StubField as TStubArrayField).ContainedType = jtObject then + InternalVisualize(TreeViewItem, (StubField as TStubArrayField).FieldClass, AItemStyleLookup); + end; + + else + TreeViewItem.Text := StubField.Name + ': ' + StubField.TypeAsString; + end; + + aTreeViewItem.AddObject(TreeViewItem); + end; +end; + +class procedure JsonVisualizer.Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aMapper: TPkgJsonMapper); +var + TreeViewItem: TTreeViewItem; + RootClass: TStubClass; +begin + aTreeView.Clear; + try + RootClass := aMapper.RootClass; + if RootClass = nil then + exit; + + aTreeView.BeginUpdate; + TreeViewItem := TTreeViewItem.Create(aTreeView); + TreeViewItem.Text := RootClass.Name; + TreeViewItem.TagObject := RootClass; + TreeViewItem.WordWrap := false; + aTreeView.AddObject(TreeViewItem); + InternalVisualize(TreeViewItem, RootClass, AItemStyleLookup); + FormatFields(aTreeView); + finally + aTreeView.ExpandAll; + aTreeView.EndUpdate; + end; + +end; + +end. + diff --git a/DTO/GitHUB/DTO.GitHUB.ReleaseDTO.pas b/DTO/GitHUB/DTO.GitHUB.ReleaseDTO.pas new file mode 100644 index 0000000..bfaaeb6 --- /dev/null +++ b/DTO/GitHUB/DTO.GitHUB.ReleaseDTO.pas @@ -0,0 +1,224 @@ +unit DTO.GitHUB.ReleaseDTO; + +interface + +uses + Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types; + +{$M+} + +type + TAssets = class; + TAuthor = class; + TReactions = class; + + TAssets = class + end; + + TAuthor = class + private + [JSONName('avatar_url')] + FAvatarUrl: string; + [JSONName('events_url')] + FEventsUrl: string; + [JSONName('followers_url')] + FFollowersUrl: string; + [JSONName('following_url')] + FFollowingUrl: string; + [JSONName('gists_url')] + FGistsUrl: string; + [JSONName('gravatar_id')] + FGravatarId: string; + [JSONName('html_url')] + FHtmlUrl: string; + FId: Integer; + FLogin: string; + [JSONName('node_id')] + FNodeId: string; + [JSONName('organizations_url')] + FOrganizationsUrl: string; + [JSONName('received_events_url')] + FReceivedEventsUrl: string; + [JSONName('repos_url')] + FReposUrl: string; + [JSONName('site_admin')] + FSiteAdmin: Boolean; + [JSONName('starred_url')] + FStarredUrl: string; + [JSONName('subscriptions_url')] + FSubscriptionsUrl: string; + FType: string; + FUrl: string; + published + property AvatarUrl: string read FAvatarUrl write FAvatarUrl; + property EventsUrl: string read FEventsUrl write FEventsUrl; + property FollowersUrl: string read FFollowersUrl write FFollowersUrl; + property FollowingUrl: string read FFollowingUrl write FFollowingUrl; + property GistsUrl: string read FGistsUrl write FGistsUrl; + property GravatarId: string read FGravatarId write FGravatarId; + property HtmlUrl: string read FHtmlUrl write FHtmlUrl; + property Id: Integer read FId write FId; + property Login: string read FLogin write FLogin; + property NodeId: string read FNodeId write FNodeId; + property OrganizationsUrl: string read FOrganizationsUrl write FOrganizationsUrl; + property ReceivedEventsUrl: string read FReceivedEventsUrl write FReceivedEventsUrl; + property ReposUrl: string read FReposUrl write FReposUrl; + property SiteAdmin: Boolean read FSiteAdmin write FSiteAdmin; + property StarredUrl: string read FStarredUrl write FStarredUrl; + property SubscriptionsUrl: string read FSubscriptionsUrl write FSubscriptionsUrl; + property &Type: string read FType write FType; + property Url: string read FUrl write FUrl; + end; + + TReactions = class + private + FConfused: Integer; + FEyes: Integer; + FHeart: Integer; + FHooray: Integer; + FLaugh: Integer; + FRocket: Integer; + [JSONName('total_count')] + FTotalCount: Integer; + FUrl: string; + [JSONName('-1')] + F_1: Integer; + published + property Confused: Integer read FConfused write FConfused; + property Eyes: Integer read FEyes write FEyes; + property Heart: Integer read FHeart write FHeart; + property Hooray: Integer read FHooray write FHooray; + property Laugh: Integer read FLaugh write FLaugh; + property Rocket: Integer read FRocket write FRocket; + property TotalCount: Integer read FTotalCount write FTotalCount; + property Url: string read FUrl write FUrl; + property _1: Integer read F_1 write F_1; + end; + + TRelease = class(TJsonDTO) + private + [JSONName('assets'), JSONMarshalled(False)] + FAssetsArray: TArray; + [GenericListReflect] + FAssets: TObjectList; + [JSONName('assets_url')] + FAssetsUrl: string; + FAuthor: TAuthor; + FBody: string; + [SuppressZero, JSONName('created_at')] + FCreatedAt: TDateTime; + FDraft: Boolean; + [JSONName('html_url')] + FHtmlUrl: string; + FId: Integer; + FName: string; + [JSONName('node_id')] + FNodeId: string; + FPrerelease: Boolean; + [SuppressZero, JSONName('published_at')] + FPublishedAt: TDateTime; + FReactions: TReactions; + [JSONName('tag_name')] + FTagName: string; + [JSONName('tarball_url')] + FTarballUrl: string; + [JSONName('target_commitish')] + FTargetCommitish: string; + [JSONName('upload_url')] + FUploadUrl: string; + FUrl: string; + [JSONName('zipball_url')] + FZipballUrl: string; + function GetAssets: TObjectList; + protected + function GetAsJson: string; override; + published + property Assets: TObjectList read GetAssets; + property AssetsUrl: string read FAssetsUrl write FAssetsUrl; + property Author: TAuthor read FAuthor; + property Body: string read FBody write FBody; + property CreatedAt: TDateTime read FCreatedAt write FCreatedAt; + property Draft: Boolean read FDraft write FDraft; + property HtmlUrl: string read FHtmlUrl write FHtmlUrl; + property Id: Integer read FId write FId; + property Name: string read FName write FName; + property NodeId: string read FNodeId write FNodeId; + property Prerelease: Boolean read FPrerelease write FPrerelease; + property PublishedAt: TDateTime read FPublishedAt write FPublishedAt; + property Reactions: TReactions read FReactions; + property TagName: string read FTagName write FTagName; + property TarballUrl: string read FTarballUrl write FTarballUrl; + property TargetCommitish: string read FTargetCommitish write FTargetCommitish; + property UploadUrl: string read FUploadUrl write FUploadUrl; + property Url: string read FUrl write FUrl; + property ZipballUrl: string read FZipballUrl write FZipballUrl; + public + constructor Create; override; + destructor Destroy; override; + end; + + TReleases = class(TJsonDTO) + private + [JSONName('Items'), JSONMarshalled(False)] + FItemsArray: TArray; + [GenericListReflect] + FItems: TObjectList; + function GetItems: TObjectList; + protected + function GetAsJson: string; override; + published + property Items: TObjectList read GetItems; + public + destructor Destroy; override; + end; + +implementation + +{ TItems } + +constructor TRelease.Create; +begin + inherited; + FReactions := TReactions.Create; + FAuthor := TAuthor.Create; +end; + +destructor TRelease.Destroy; +begin + FReactions.Free; + FAuthor.Free; + GetAssets.Free; + inherited; +end; + +function TRelease.GetAssets: TObjectList; +begin + Result := ObjectList(FAssets, FAssetsArray); +end; + +function TRelease.GetAsJson: string; +begin + RefreshArray(FAssets, FAssetsArray); + Result := inherited; +end; + +{ TReleases } + +destructor TReleases.Destroy; +begin + GetItems.Free; + inherited; +end; + +function TReleases.GetItems: TObjectList; +begin + Result := ObjectList(FItems, FItemsArray); +end; + +function TReleases.GetAsJson: string; +begin + RefreshArray(FItems, FItemsArray); + Result := inherited; +end; + +end. diff --git a/Demo Data/Anonymous Array.json b/Demo Data/Anonymous Array.json new file mode 100644 index 0000000..7f24bd2 --- /dev/null +++ b/Demo Data/Anonymous Array.json @@ -0,0 +1,9 @@ +[ + { + "S1":"5102" + }, + { + "S1":"5102", + "S2":"True" + } +] \ No newline at end of file diff --git a/Demo Data/ArrayTest1.json b/Demo Data/ArrayTest1.json new file mode 100644 index 0000000..360cf46 --- /dev/null +++ b/Demo Data/ArrayTest1.json @@ -0,0 +1,11 @@ +{ + "ArrayTest":[ + { + "S1":"5102" + }, + { + "S1":"5102", + "S2":"True" + } + ] +} \ No newline at end of file diff --git a/Demo Data/ArrayTest2.json b/Demo Data/ArrayTest2.json new file mode 100644 index 0000000..5843014 --- /dev/null +++ b/Demo Data/ArrayTest2.json @@ -0,0 +1,10 @@ +{ + "ArrayTest":[ + { + "S1":"5102" + }, + { + "S2":"True" + } + ] +} \ No newline at end of file diff --git a/Demo Data/ArrayTest3.json b/Demo Data/ArrayTest3.json new file mode 100644 index 0000000..d6e6ca1 --- /dev/null +++ b/Demo Data/ArrayTest3.json @@ -0,0 +1,22 @@ +{ + "glossary": { + "title": "example glossary", + "GlossDiv": { + "title": "S", + "GlossList": { + "GlossEntry": { + "ID": "SGML", + "SortAs": "SGML", + "GlossTerm": "Standard Generalized Markup Language", + "Acronym": "SGML", + "Abbrev": "ISO 8879:1986", + "GlossDef": { + "para": "A meta-markup language, used to create markup languages such as DocBook.", + "GlossSeeAlso": ["GML", "XML"] + }, + "GlossSee": "markup" + } + } + } + } +} \ No newline at end of file diff --git a/Demo Data/Empty Anonymous Array.json b/Demo Data/Empty Anonymous Array.json new file mode 100644 index 0000000..609889a --- /dev/null +++ b/Demo Data/Empty Anonymous Array.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/Demo Data/Hypothetical Machine.json b/Demo Data/Hypothetical Machine.json new file mode 100644 index 0000000..1d35a01 --- /dev/null +++ b/Demo Data/Hypothetical Machine.json @@ -0,0 +1,31 @@ +{ + "/": { + "storage": { + "type": "disk", + "device": "/dev/sda1" + }, + "fstype": "btrfs", + "readonly": true + }, + "/var": { + "storage": { + "type": "disk", + "label": "8f3ba6f4-5c70-46ec-83af-0d5434953e5f" + }, + "fstype": "ext4", + "options": [ "nosuid" ] + }, + "/tmp": { + "storage": { + "type": "tmpfs", + "sizeInMB": 64 + } + }, + "/var/www": { + "storage": { + "type": "nfs", + "server": "my.nfs.server", + "remotePath": "/exports/mypath" + } + } +} \ No newline at end of file diff --git a/Demo Data/MailChimp.json b/Demo Data/MailChimp.json new file mode 100644 index 0000000..3213e43 --- /dev/null +++ b/Demo Data/MailChimp.json @@ -0,0 +1,109 @@ +{ + "id": "c266cac4b1560b2e88cc893a9a0a1d2c", + "email_address": "phil@strategyseven.co.uk", + "unique_email_id": "e0b2ed8624", + "web_id": 153925945, + "email_type": "text", + "status": "subscribed", + "merge_fields": { + "FNAME": "Phil", + "LNAME": "Hutchinson", + "ADDRESS": "", + "PHONE": "", + "BIRTHDAY": "", + "MMERGE6": "39999999" + }, + "stats": { + "avg_open_rate": 0, + "avg_click_rate": 0 + }, + "ip_signup": "", + "timestamp_signup": "", + "ip_opt": "82.33.161.254", + "timestamp_opt": "2020-06-24T14:14:23+00:00", + "member_rating": 2, + "last_changed": "2020-06-25T09:07:01+00:00", + "language": "", + "vip": false, + "email_client": "", + "location": { + "latitude": 0, + "longitude": 0, + "gmtoff": 0, + "dstoff": 0, + "country_code": "", + "timezone": "" + }, + "source": "Admin Add", + "tags_count": 1, + "tags": [ + { + "id": 157429, + "name": "New Customer" + } + ], + "list_id": "dc2af4377f", + "_links": [ + { + "rel": "self", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Response.json" + }, + { + "rel": "parent", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/CollectionResponse.json", + "schema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/CollectionLinks\/Lists\/Members.json" + }, + { + "rel": "update", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "PATCH", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Response.json", + "schema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/PATCH.json" + }, + { + "rel": "upsert", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "PUT", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Response.json", + "schema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/PUT.json" + }, + { + "rel": "delete", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "DELETE" + }, + { + "rel": "activity", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/activity", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Activity\/Response.json" + }, + { + "rel": "goals", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/goals", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Goals\/Response.json" + }, + { + "rel": "notes", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/notes", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Notes\/CollectionResponse.json" + }, + { + "rel": "events", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/events", + "method": "POST", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Events\/POST.json" + }, + { + "rel": "delete_permanent", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/actions\/delete-permanent", + "method": "POST" + } + ] +} diff --git a/Demo Data/NonObjectArray.json b/Demo Data/NonObjectArray.json new file mode 100644 index 0000000..db0db1b --- /dev/null +++ b/Demo Data/NonObjectArray.json @@ -0,0 +1,30 @@ +{ + "LastName": "Farhat", + "FirstName": "Joe", + "Mail": "string", + "MailAlias": "string", + "PayId": "string", + "PayId2": "string", + "PayId3": "string", + "PayId4": "string", + "PayId5": "string", + "PayId6": "string", + "Language": "string", + "LocalCurrency": "string", + "LocalCountry": "string", + "ManagerId": "string", + "ReviewerId": "string", + "UserType": 0, + "Vendor": "string", + "UserRole": 0, + "DefaultProjectId": "string", + "IKRatesId": "string", + "AdditionalValidators": [{ + "Mail": "string", + "MinimumAmount": 0.24776703043946879 + }], + "Tags": [ + "string" + ] +} + diff --git a/Demo Data/NonObjectArray2.json b/Demo Data/NonObjectArray2.json new file mode 100644 index 0000000..6853abc --- /dev/null +++ b/Demo Data/NonObjectArray2.json @@ -0,0 +1,5 @@ + { + "options":[ + 5 + ] + } diff --git a/Demo Data/NullProperty.json b/Demo Data/NullProperty.json new file mode 100644 index 0000000..7cc8130 --- /dev/null +++ b/Demo Data/NullProperty.json @@ -0,0 +1,7 @@ +[ + { + "createdAt": null, + "updatedAt": "2013-05-28T15:47:57.962Z", + "username": "jacquelyn88" + } +] \ No newline at end of file diff --git a/Demo Data/StringTest.json b/Demo Data/StringTest.json new file mode 100644 index 0000000..b452816 --- /dev/null +++ b/Demo Data/StringTest.json @@ -0,0 +1,13 @@ +{ + "StringTest":[ + { + "S1":"5102", + "S2":"True", + "S3":"Test", + "s4":5102, + "s5":true, + "s6":"Test", + "s7":"2012-04-23T18:25:43.511Z" + } + ] +} \ No newline at end of file diff --git a/Demo Data/Suppress Zero.json b/Demo Data/Suppress Zero.json new file mode 100644 index 0000000..a293793 --- /dev/null +++ b/Demo Data/Suppress Zero.json @@ -0,0 +1,4 @@ +{ + "timestamp_opt": "", + "last_changed": "2020-06-25T09:07:01+00:00" +} \ No newline at end of file diff --git a/Demo Data/Unicode Test.json b/Demo Data/Unicode Test.json new file mode 100644 index 0000000..870b5cc --- /dev/null +++ b/Demo Data/Unicode Test.json @@ -0,0 +1,20 @@ +{ + "Category":{ + "name":"Categoria Teste", + "description":"Categoria de Teste da Loja", + "slug":"categoria-teste", + "order":"2", + "title":"Categoria de Teste", + "small_description":"Categoria de Teste da Loja", + "has_acceptance_term":"1", + "acceptance_term":"Eu aceito os termos de uso ...", + "metatag":{ + "keywords":"categoria teste 123", + "description":"categoria teste da loja 123" + }, + "property":[ + "Característica Teste 1 123", + "Característica Teste 2 123" + ] + } +} \ No newline at end of file diff --git a/Demo Data/WebAPP Test.json b/Demo Data/WebAPP Test.json new file mode 100644 index 0000000..58311fe --- /dev/null +++ b/Demo Data/WebAPP Test.json @@ -0,0 +1 @@ +{"web-app":{"servlet":[{"init-param":{"cachePackageTagsRefresh":60,"cachePackageTagsStore":200,"cachePackageTagsTrack":200,"cachePagesDirtyRead":10,"cachePagesRefresh":10,"cachePagesStore":100,"cachePagesTrack":200,"cacheTemplatesRefresh":15,"cacheTemplatesStore":50,"cacheTemplatesTrack":100,"configGlossary:adminEmail":"ksm@pobox.com","configGlossary:installationAt":"Philadelphia, PA","configGlossary:poweredBy":"Cofax","configGlossary:poweredByIcon":"/images/cofax.gif","configGlossary:staticPath":"/content/static","dataStoreClass":"org.cofax.SqlDataStore","dataStoreConnUsageLimit":100,"dataStoreDriver":"com.microsoft.jdbc.sqlserver.SQLServerDriver","dataStoreInitConns":10,"dataStoreLogFile":"/usr/local/tomcat/logs/datastore.log","dataStoreLogLevel":"debug","dataStoreMaxConns":100,"dataStoreName":"cofax","dataStorePassword":"dataStoreTestQuery","dataStoreTestQuery":"SET NOCOUNT ON;select test='test';","dataStoreUrl":"jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon","dataStoreUser":"sa","defaultFileTemplate":"articleTemplate.htm","defaultListTemplate":"listTemplate.htm","jspFileTemplate":"articleTemplate.jsp","jspListTemplate":"listTemplate.jsp","maxUrlLength":500,"redirectionClass":"org.cofax.SqlRedirection","searchEngineFileTemplate":"forSearchEngines.htm","searchEngineListTemplate":"forSearchEnginesList.htm","searchEngineRobotsDb":"WEB-INF/robots.db","templateLoaderClass":"org.cofax.FilesTemplateLoader","templateOverridePath":"","templatePath":"templates","templateProcessorClass":"org.cofax.WysiwygTemplate","useDataStore":true,"useJSP":false},"servlet-class":"org.cofax.cds.CDSServlet","servlet-name":"cofaxCDS"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cds.EmailServlet","servlet-name":"cofaxEmail"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cds.AdminServlet","servlet-name":"cofaxAdmin"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cds.FileServlet","servlet-name":"fileServlet"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"toolstemplates/","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cms.CofaxToolsServlet","servlet-name":"cofaxTools"}],"servlet-mapping":{"cofaxAdmin":"/admin/*","cofaxCDS":"/","cofaxEmail":"/cofaxutil/aemail/*","cofaxTools":"/tools/*","fileServlet":"/static/*"},"taglib":{"taglib-location":"/WEB-INF/tlds/cofax.tld","taglib-uri":"cofax.tld"}}} \ No newline at end of file diff --git a/Demo Generator/DemoProject.rc b/Demo Generator/DemoProject.rc new file mode 100644 index 0000000..24ca419 --- /dev/null +++ b/Demo Generator/DemoProject.rc @@ -0,0 +1 @@ +DemoTemplate ZipFile "./DemoTemplate.zip" diff --git a/Demo Generator/DemoTemplate.zip b/Demo Generator/DemoTemplate.zip new file mode 100644 index 0000000..3457545 Binary files /dev/null and b/Demo Generator/DemoTemplate.zip differ diff --git a/Demo Generator/Pkg.Json.DemoGenerator.pas b/Demo Generator/Pkg.Json.DemoGenerator.pas new file mode 100644 index 0000000..b7d649b --- /dev/null +++ b/Demo Generator/Pkg.Json.DemoGenerator.pas @@ -0,0 +1,234 @@ +unit Pkg.Json.DemoGenerator; + +interface + +uses + System.SysUtils, Pkg.Json.Mapper, Pkg.Json.Settings; + +{$M+} + +type + TDestinationFrameWork = (dfBoth, dfVCL, dfFMX); + + TDemoGenerator = class + private + FRootDirectory: string; + FJsonMapper: TPkgJsonMapper; + FTDestinationFrameWork: TDestinationFrameWork; + FDestinationClassName: string; + FDestinationUnitName: string; + FJson: string; + FFileName: TFilename; + FDestinationDirectory: string; + procedure Validate; + procedure ExtractZipFile; + procedure GenerateFrameWorkINC; + procedure UpdateDemoProject; + procedure ModifyDemoHelper; + procedure SetRootDirectory(const Value: string); + procedure SetDestinationDirectory(const Value: string); + published + property RootDirectory: string read FRootDirectory write SetRootDirectory; + property DestinationDirectory: string read FDestinationDirectory write SetDestinationDirectory; + property DestinationFrameWork: TDestinationFrameWork read FTDestinationFrameWork write FTDestinationFrameWork; + property DestinationClassName: string read FDestinationClassName write FDestinationClassName; + property DestinationUnitName: string read FDestinationUnitName write FDestinationUnitName; + property Json: string read FJson write FJson; + public + constructor Create; overload; + constructor Create(aFileName: TFilename); overload; + destructor Destroy; override; + procedure Execute; + end; + +implementation + +uses + System.Classes, System.Zip, System.IOUtils, System.RTLConsts; + +{ TDemoGenerator } + +constructor TDemoGenerator.Create; +begin + inherited Create; + + FJsonMapper := TPkgJsonMapper.Create;; + FDestinationClassName := ''; + FDestinationUnitName := ''; + FJson := ''; + FRootDirectory := ''; + FTDestinationFrameWork := TDestinationFrameWork.dfBoth; + FFileName := ''; +end; + +constructor TDemoGenerator.Create(aFileName: TFilename); +begin + inherited Create; + + FJsonMapper := TPkgJsonMapper.Create;; + FFileName := aFileName; + FDestinationClassName := ''; + FDestinationUnitName := ''; + FJson := ''; + FRootDirectory := ''; + FTDestinationFrameWork := TDestinationFrameWork.dfBoth; +end; + +destructor TDemoGenerator.Destroy; +begin + FreeAndNil(FJsonMapper); + inherited; +end; + +procedure TDemoGenerator.Execute; +begin + Validate; + + FJsonMapper.DestinationClassName := FDestinationClassName; + FJsonMapper.DestinationUnitName := FDestinationUnitName; + + if FDestinationDirectory = '' then + FDestinationDirectory := FRootDirectory + FJsonMapper.DestinationClassName + TPath.DirectorySeparatorChar; + TDirectory.CreateDirectory(FDestinationDirectory); + + if FFileName = '' then + FJsonMapper.Parse(FJson) + else + FJsonMapper.LoadFormFile(FFileName); + + ExtractZipFile; + UpdateDemoProject; +end; + +procedure TDemoGenerator.ExtractZipFile; +var + ResourceStream: TResourceStream; + ZipFile: TZipFile; +begin + ResourceStream := TResourceStream.Create(HInstance, 'DemoTemplate', 'ZipFile'); + ZipFile := TZipFile.Create; + ZipFile.Open(ResourceStream, TZipMode.zmRead); + ZipFile.ExtractAll(FDestinationDirectory); + ZipFile.Free; + ResourceStream.Free; +end; + +procedure TDemoGenerator.GenerateFrameWorkINC; +begin + with TStringList.Create do + try + case FTDestinationFrameWork of + dfBoth: + begin + Add('{.$DEFINE FMX}'); + Add('{.$DEFINE VCL}'); + end; + dfVCL: + begin + Add('{.$DEFINE FMX}'); + Add('{$DEFINE VCL}'); + end; + dfFMX: + begin + Add('{$DEFINE FMX}'); + Add('{.$DEFINE VCL}'); + end; + end; + Add(''); + Add('{$IF not Defined(VCL) and not Defined(FMX)}'); + Add(' Please define framework, above.'); + Add('{$ENDIF}'); + + SaveToFile(FDestinationDirectory + 'FrameWork.inc'); + finally + Free; + end; +end; + +procedure TDemoGenerator.ModifyDemoHelper; +var + FileName, s: String; + + procedure ReplaceAll(aToken, aText: string); + begin + s := StringReplace(s, aToken, aText, [rfReplaceAll]); + end; + + procedure SaveText; + begin + with TStringList.Create do + try + Text := s; + SaveToFile(FileName); + finally + Free + end; + end; + + procedure LoadText; + begin + with TStringList.Create do + try + LoadFromFile(FileName); + s := Text; + finally + Free; + end; + end; + +begin + FileName := FDestinationDirectory + TPath.DirectorySeparatorChar; + FileName := FileName + 'Demo Helper' + TPath.DirectorySeparatorChar; + FileName := FileName + 'Demo.DemoHelper.pas'; + LoadText; + ReplaceAll('@@UnitName@@', FJsonMapper.DestinationUnitName); + ReplaceAll('@@ClassName@@', FJsonMapper.DestinationClassName + TSettings.GetPostFix); + SaveText; +end; + +procedure TDemoGenerator.SetDestinationDirectory(const Value: string); +begin + FDestinationDirectory := IncludeTrailingPathDelimiter(Value); + FRootDirectory := FDestinationDirectory; +end; + +procedure TDemoGenerator.SetRootDirectory(const Value: string); +begin + FRootDirectory := IncludeTrailingPathDelimiter(Value); +end; + +procedure TDemoGenerator.UpdateDemoProject; +begin + GenerateFrameWorkINC; + with TStringList.Create do + try + Text := FJsonMapper.JsonString; + SaveToFile(FDestinationDirectory + 'DemoData.json'); + finally + Free; + end; + + FJsonMapper.SaveToFile(FDestinationDirectory + FJsonMapper.DestinationUnitName + '.pas'); + ModifyDemoHelper; +end; + +procedure TDemoGenerator.Validate; +begin + if FRootDirectory.Trim = string.empty then + raise EPathNotFoundException.Create('RootDirectory can not be empty'); + + if not TDirectory.Exists(FRootDirectory) then + raise EPathNotFoundException.CreateRes(@SDirectoryInvalid); + + if FDestinationClassName = '' then + raise EArgumentException.Create('DestinationClassName must be provided'); + + if FDestinationUnitName = '' then + raise EArgumentException.Create('DestinationUnitName must be provided'); + + if FFileName + FJson = '' then + raise EArgumentException.Create('Json must be provided'); + +end; + +end. diff --git a/Dummy JSON demos/Authentication/AuthenticationDemo.delphilsp.json b/Dummy JSON demos/Authentication/AuthenticationDemo.delphilsp.json new file mode 100644 index 0000000..36e241f --- /dev/null +++ b/Dummy JSON demos/Authentication/AuthenticationDemo.delphilsp.json @@ -0,0 +1 @@ +{ "settings": { "project": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Authentication/AuthenticationDemo.dpr", "dllname": "dcc32290.dll", "dccOptions": "-$D0 -$L- -$Y- --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DRELEASE;;FRAMEWORK_VCL -E.\\Win32\\Release -I..\\Lib;..\\DTO;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Bpl -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NU.\\Win32\\Release -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell; -O..\\Lib;..\\DTO;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -R..\\Lib;..\\DTO;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -U..\\Lib;..\\DTO;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\hpp\\Win32 -NO.\\Win32\\Release -LU" , "projectFiles":[ { "name": "DummyJson.Authentication.MainForm", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Authentication/DummyJson.Authentication.MainForm.pas" }, { "name": "DummyJson.UsersDTO", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/DTO/DummyJson.UsersDTO.pas" }, { "name": "Pkg.Json.DTO", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Lib/Pkg.Json.DTO.pas" }, { "name": "DummyJson.Lib.AuthWebService", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Lib/DummyJson.Lib.AuthWebService.pas" }, { "name": "DummyJson.AuthenticaticedUsers", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Authentication/DummyJson.AuthenticaticedUsers.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/FlatBox2D" ] , "CommonAppData": "file:///C%3A/Users/Jens%20Borrisholt/AppData/Roaming/Embarcadero/BDS/23.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/ObjRepos/" } } \ No newline at end of file diff --git a/Dummy JSON demos/Authentication/AuthenticationDemo.dpr b/Dummy JSON demos/Authentication/AuthenticationDemo.dpr new file mode 100644 index 0000000..0af2a24 --- /dev/null +++ b/Dummy JSON demos/Authentication/AuthenticationDemo.dpr @@ -0,0 +1,19 @@ +program AuthenticationDemo; + +uses + Vcl.Forms, + DummyJson.Authentication.MainForm in 'DummyJson.Authentication.MainForm.pas' {MainForm}, + DummyJson.UsersDTO in '..\DTO\DummyJson.UsersDTO.pas', + Pkg.Json.DTO in '..\Lib\Pkg.Json.DTO.pas', + DummyJson.Lib.AuthWebService in '..\Lib\DummyJson.Lib.AuthWebService.pas', + DummyJson.AuthenticaticedUsers in 'DummyJson.AuthenticaticedUsers.pas'; + +{$R *.res} + +begin + ReportMemoryLeaksOnShutdown := True; + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/Dummy JSON demos/Authentication/AuthenticationDemo.dproj b/Dummy JSON demos/Authentication/AuthenticationDemo.dproj new file mode 100644 index 0000000..cfe50c9 --- /dev/null +++ b/Dummy JSON demos/Authentication/AuthenticationDemo.dproj @@ -0,0 +1,1127 @@ + + + {69502EA4-F730-4BBC-A903-02926D4CCE26} + 20.1 + VCL + True + Release + Win32 + 3 + Application + AuthenticationDemo.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + AuthenticationDemo + ..\Lib\;..\DTO\;$(DCC_UnitSearchPath) + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;Skia.Package.FMX;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;RFindUnit;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + PerMonitorV2 + true + 1033 + + + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + PerMonitorV2 + + + PerMonitorV2 + + + + MainSource + + +
MainForm
+ dfm +
+ + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Application + + + + AuthenticationDemo.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + AuthenticationDemo.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + True + True + + + 12 + + + + +
diff --git a/Dummy JSON demos/Authentication/Demo.PNG b/Dummy JSON demos/Authentication/Demo.PNG new file mode 100644 index 0000000..15c68e9 Binary files /dev/null and b/Dummy JSON demos/Authentication/Demo.PNG differ diff --git a/Dummy JSON demos/Authentication/DummyJson.AuthenticaticedUsers.pas b/Dummy JSON demos/Authentication/DummyJson.AuthenticaticedUsers.pas new file mode 100644 index 0000000..0b5d14d --- /dev/null +++ b/Dummy JSON demos/Authentication/DummyJson.AuthenticaticedUsers.pas @@ -0,0 +1,68 @@ +unit DummyJson.AuthenticaticedUsers; + +interface + +uses + DummyJson.UsersDTO, System.Generics.Collections; + +Type + TAuthenticaticedUsers = class + private + FAutenticatedUsers: TObjectDictionary; + public + constructor Create; + Destructor Destroy; override; + function AuthenticateUser(aUser: TUser): TUserAuthenticationDTO; + procedure Clear; + end; + +var + AuthenticaticedUsers: TAuthenticaticedUsers; + +implementation + +uses + DummyJson.Lib.AuthWebService; + +{ TAuthenticaticedUsers } + +function TAuthenticaticedUsers.AuthenticateUser(aUser: TUser): TUserAuthenticationDTO; +begin + if FAutenticatedUsers.TryGetValue(aUser, Result) then + exit; + + with TUserAuthWebService.Create('https://dummyjson.com/auth/login', aUser.Username, aUser.Password) do + try + Result := Post; + FAutenticatedUsers.Add(aUser, Result); + finally + Free; + end; +end; + +procedure TAuthenticaticedUsers.Clear; +begin + FAutenticatedUsers.Clear; +end; + +constructor TAuthenticaticedUsers.Create; +begin + inherited; + FAutenticatedUsers := TObjectDictionary.Create([doOwnsValues]); +end; + +destructor TAuthenticaticedUsers.Destroy; +begin + FAutenticatedUsers.Free; + inherited; +end; + +initialization + +AuthenticaticedUsers := TAuthenticaticedUsers.Create; + +finalization + +AuthenticaticedUsers.Free; + +end. diff --git a/Dummy JSON demos/Authentication/DummyJson.Authentication.MainForm.dfm b/Dummy JSON demos/Authentication/DummyJson.Authentication.MainForm.dfm new file mode 100644 index 0000000..9e0652d --- /dev/null +++ b/Dummy JSON demos/Authentication/DummyJson.Authentication.MainForm.dfm @@ -0,0 +1,577 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + Caption = 'MainForm' + ClientHeight = 705 + ClientWidth = 1032 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Segoe UI' + Font.Style = [] + OnCreate = FormCreate + TextHeight = 15 + object lblAge: TLabel + Left = 20 + Top = 20 + Width = 24 + Height = 15 + Caption = 'Age:' + end + object lblBirthDate: TLabel + Left = 20 + Top = 50 + Width = 55 + Height = 15 + Caption = 'Birth Date:' + end + object lblBloodGroup: TLabel + Left = 20 + Top = 79 + Width = 70 + Height = 15 + Caption = 'Blood Group:' + end + object lblDomain: TLabel + Left = 20 + Top = 108 + Width = 45 + Height = 15 + Caption = 'Domain:' + end + object lblEin: TLabel + Left = 20 + Top = 169 + Width = 19 + Height = 15 + Caption = 'Ein:' + end + object lblEmail: TLabel + Left = 20 + Top = 168 + Width = 32 + Height = 15 + Caption = 'Email:' + end + object lblEyeColor: TLabel + Left = 20 + Top = 198 + Width = 53 + Height = 15 + Caption = 'Eye Color:' + end + object lblFirstName: TLabel + Left = 20 + Top = 228 + Width = 60 + Height = 15 + Caption = 'First Name:' + end + object lblGender: TLabel + Left = 20 + Top = 258 + Width = 41 + Height = 15 + Caption = 'Gender:' + end + object lblHair: TLabel + Left = 20 + Top = 319 + Width = 25 + Height = 15 + Caption = 'Hair:' + end + object lblHeight: TLabel + Left = 20 + Top = 318 + Width = 39 + Height = 15 + Caption = 'Height:' + end + object lblId: TLabel + Left = 20 + Top = 379 + Width = 13 + Height = 15 + Caption = 'Id:' + end + object lblImage: TLabel + Left = 20 + Top = 378 + Width = 36 + Height = 15 + Caption = 'Image:' + end + object lblIp: TLabel + Left = 20 + Top = 439 + Width = 13 + Height = 15 + Caption = 'Ip:' + end + object lblLastName: TLabel + Left = 20 + Top = 438 + Width = 59 + Height = 15 + Caption = 'Last Name:' + end + object lblMacAddress: TLabel + Left = 20 + Top = 468 + Width = 71 + Height = 15 + Caption = 'Mac Address:' + end + object lblMaidenName: TLabel + Left = 20 + Top = 498 + Width = 78 + Height = 15 + Caption = 'Maiden Name:' + end + object lblPhone: TLabel + Left = 20 + Top = 527 + Width = 37 + Height = 15 + Caption = 'Phone:' + end + object lblSsn: TLabel + Left = 20 + Top = 588 + Width = 21 + Height = 15 + Caption = 'Ssn:' + end + object lblUniversity: TLabel + Left = 20 + Top = 587 + Width = 55 + Height = 15 + Caption = 'University:' + end + object lblUserAgent: TLabel + Left = 20 + Top = 617 + Width = 61 + Height = 15 + Caption = 'User Agent:' + end + object lblWeight: TLabel + Left = 20 + Top = 646 + Width = 41 + Height = 15 + Caption = 'Weight:' + end + object LabelEin: TLabel + Left = 20 + Top = 141 + Width = 16 + Height = 15 + Caption = 'Ein' + end + object LabelHair: TLabel + Left = 20 + Top = 291 + Width = 22 + Height = 15 + Caption = 'Hair' + end + object LabelId: TLabel + Left = 20 + Top = 351 + Width = 10 + Height = 15 + Caption = 'Id' + end + object LabelIp: TLabel + Left = 20 + Top = 411 + Width = 13 + Height = 15 + Caption = 'Ip:' + end + object LabelSsn: TLabel + Left = 20 + Top = 561 + Width = 21 + Height = 15 + Caption = 'Ssn:' + end + object edtAge: TEdit + Left = 120 + Top = 20 + Width = 300 + Height = 23 + TabOrder = 0 + Text = '0' + end + object edtBirthDate: TEdit + Left = 120 + Top = 50 + Width = 300 + Height = 23 + TabOrder = 1 + Text = '01/01/2000' + end + object edtBloodGroup: TEdit + Left = 120 + Top = 79 + Width = 300 + Height = 23 + TabOrder = 2 + end + object edtDomain: TEdit + Left = 120 + Top = 108 + Width = 300 + Height = 23 + TabOrder = 3 + end + object edtEin: TEdit + Left = 120 + Top = 138 + Width = 300 + Height = 23 + TabOrder = 4 + end + object edtEmail: TEdit + Left = 120 + Top = 168 + Width = 300 + Height = 23 + TabOrder = 5 + end + object edtEyeColor: TEdit + Left = 120 + Top = 198 + Width = 300 + Height = 23 + TabOrder = 6 + end + object edtFirstName: TEdit + Left = 120 + Top = 228 + Width = 300 + Height = 23 + TabOrder = 7 + end + object edtGender: TEdit + Left = 120 + Top = 258 + Width = 300 + Height = 23 + TabOrder = 8 + end + object edtHair: TEdit + Left = 120 + Top = 288 + Width = 300 + Height = 23 + TabOrder = 9 + end + object edtHeight: TEdit + Left = 120 + Top = 318 + Width = 300 + Height = 23 + TabOrder = 10 + Text = '0' + end + object edtId: TEdit + Left = 120 + Top = 348 + Width = 300 + Height = 23 + TabOrder = 11 + Text = '0' + end + object edtImage: TEdit + Left = 120 + Top = 378 + Width = 300 + Height = 23 + TabOrder = 12 + end + object edtIp: TEdit + Left = 120 + Top = 408 + Width = 300 + Height = 23 + TabOrder = 13 + end + object edtLastName: TEdit + Left = 120 + Top = 438 + Width = 300 + Height = 23 + TabOrder = 14 + end + object edtMacAddress: TEdit + Left = 120 + Top = 468 + Width = 300 + Height = 23 + TabOrder = 15 + end + object edtMaidenName: TEdit + Left = 120 + Top = 498 + Width = 300 + Height = 23 + TabOrder = 16 + end + object edtPhone: TEdit + Left = 120 + Top = 527 + Width = 300 + Height = 23 + TabOrder = 17 + end + object edtSsn: TEdit + Left = 120 + Top = 557 + Width = 300 + Height = 23 + TabOrder = 18 + end + object edtUniversity: TEdit + Left = 120 + Top = 587 + Width = 300 + Height = 23 + TabOrder = 19 + end + object edtUserAgent: TEdit + Left = 120 + Top = 617 + Width = 300 + Height = 23 + TabOrder = 20 + end + object edtWeight: TEdit + Left = 120 + Top = 646 + Width = 300 + Height = 23 + TabOrder = 21 + Text = '0' + end + object Button1: TButton + Left = 949 + Top = 675 + Width = 75 + Height = 25 + Action = acUsertNext + TabOrder = 22 + end + object Button2: TButton + Left = 866 + Top = 675 + Width = 75 + Height = 25 + Action = actUserPrevious + TabOrder = 23 + end + object PageControl1: TPageControl + Left = 426 + Top = 20 + Width = 598 + Height = 649 + ActivePage = TabSheet1 + TabOrder = 24 + object TabSheet1: TTabSheet + Caption = 'Products' + object LabelTitle: TLabel + Left = 8 + Top = 63 + Width = 25 + Height = 15 + Caption = 'Title:' + end + object LabelThumbnail: TLabel + Left = 15 + Top = 345 + Width = 60 + Height = 15 + Caption = 'Thumbnail:' + end + object LabelStock: TLabel + Left = 12 + Top = 242 + Width = 32 + Height = 15 + Caption = 'Stock:' + end + object LabelRating: TLabel + Left = 12 + Top = 215 + Width = 37 + Height = 15 + Caption = 'Rating:' + end + object LabelPrice: TLabel + Left = 12 + Top = 184 + Width = 29 + Height = 15 + Caption = 'Price:' + end + object Label1: TLabel + Left = 10 + Top = 34 + Width = 13 + Height = 15 + Caption = 'Id:' + end + object LabelDiscountPercentage: TLabel + Left = 12 + Top = 155 + Width = 112 + Height = 15 + Caption = 'Discount Percentage:' + end + object LabelDescription: TLabel + Left = 12 + Top = 290 + Width = 63 + Height = 15 + Caption = 'Description:' + end + object LabelCategory: TLabel + Left = 8 + Top = 121 + Width = 51 + Height = 15 + Caption = 'Category:' + end + object LabelBrand: TLabel + Left = 8 + Top = 92 + Width = 34 + Height = 15 + Caption = 'Brand:' + end + object EditStock: TEdit + Left = 146 + Top = 233 + Width = 420 + Height = 23 + TabOrder = 0 + Text = 'EditStock' + end + object Button3: TButton + Left = 410 + Top = 371 + Width = 75 + Height = 25 + Action = actProductPrevious + TabOrder = 1 + end + object Button4: TButton + Left = 491 + Top = 371 + Width = 75 + Height = 25 + Action = actProductNext + TabOrder = 2 + end + object EditTitle: TEdit + Left = 146 + Top = 59 + Width = 420 + Height = 23 + TabOrder = 3 + Text = 'EditTitle' + end + object EditThumbnail: TEdit + Left = 146 + Top = 342 + Width = 420 + Height = 23 + TabOrder = 4 + Text = 'EditThumbnail' + end + object EditRating: TEdit + Left = 146 + Top = 204 + Width = 420 + Height = 23 + TabOrder = 5 + Text = 'EditRating' + end + object EditPrice: TEdit + Left = 146 + Top = 175 + Width = 420 + Height = 23 + TabOrder = 6 + Text = 'EditPrice' + end + object EditId: TEdit + Left = 146 + Top = 30 + Width = 50 + Height = 23 + TabOrder = 7 + Text = 'EditId' + end + object EditDiscountPercentage: TEdit + Left = 146 + Top = 146 + Width = 420 + Height = 23 + TabOrder = 8 + Text = 'EditDiscountPercentage' + end + object EditDescription: TMemo + Left = 146 + Top = 262 + Width = 420 + Height = 74 + Lines.Strings = ( + 'EditDescription') + TabOrder = 9 + end + object EditCategory: TEdit + Left = 146 + Top = 117 + Width = 420 + Height = 23 + TabOrder = 10 + Text = 'EditCategory' + end + object EditBrand: TEdit + Left = 146 + Top = 88 + Width = 420 + Height = 23 + TabOrder = 11 + Text = 'EditBrand' + end + end + end + object ActionList1: TActionList + Left = 80 + Top = 104 + object acUsertNext: TAction + Caption = 'Next >>' + OnExecute = acUsertNextExecute + end + object actUserPrevious: TAction + Caption = 'Previous' + OnExecute = actUserPreviousExecute + end + object actProductNext: TAction + Caption = 'Next >>' + OnExecute = actProductNextExecute + end + object actProductPrevious: TAction + Caption = '<< Previous' + OnExecute = actProductPreviousExecute + end + end +end diff --git a/Dummy JSON demos/Authentication/DummyJson.Authentication.MainForm.pas b/Dummy JSON demos/Authentication/DummyJson.Authentication.MainForm.pas new file mode 100644 index 0000000..8f703ba --- /dev/null +++ b/Dummy JSON demos/Authentication/DummyJson.Authentication.MainForm.pas @@ -0,0 +1,214 @@ +unit DummyJson.Authentication.MainForm; + +interface + +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Actions, Vcl.ActnList, Vcl.ComCtrls, + + DummyJson.UsersDTO, DummyJson.ProductsDTO, DummyJson.Lib.Enumerator; + +type + TMainForm = class(TForm) + lblAge: TLabel; + edtAge: TEdit; + lblBirthDate: TLabel; + edtBirthDate: TEdit; + lblBloodGroup: TLabel; + edtBloodGroup: TEdit; + lblDomain: TLabel; + edtDomain: TEdit; + lblEin: TLabel; + edtEin: TEdit; + lblEmail: TLabel; + edtEmail: TEdit; + lblEyeColor: TLabel; + edtEyeColor: TEdit; + lblFirstName: TLabel; + edtFirstName: TEdit; + lblGender: TLabel; + edtGender: TEdit; + lblHair: TLabel; + edtHair: TEdit; + lblHeight: TLabel; + edtHeight: TEdit; + lblId: TLabel; + edtId: TEdit; + lblImage: TLabel; + edtImage: TEdit; + lblIp: TLabel; + edtIp: TEdit; + lblLastName: TLabel; + edtLastName: TEdit; + lblMacAddress: TLabel; + edtMacAddress: TEdit; + lblMaidenName: TLabel; + edtMaidenName: TEdit; + lblPhone: TLabel; + edtPhone: TEdit; + lblSsn: TLabel; + edtSsn: TEdit; + lblUniversity: TLabel; + edtUniversity: TEdit; + lblUserAgent: TLabel; + edtUserAgent: TEdit; + lblWeight: TLabel; + edtWeight: TEdit; + Button1: TButton; + Button2: TButton; + ActionList1: TActionList; + acUsertNext: TAction; + actUserPrevious: TAction; + LabelEin: TLabel; + LabelHair: TLabel; + LabelId: TLabel; + LabelIp: TLabel; + LabelSsn: TLabel; + PageControl1: TPageControl; + TabSheet1: TTabSheet; + EditStock: TEdit; + Button3: TButton; + Button4: TButton; + EditTitle: TEdit; + EditThumbnail: TEdit; + EditRating: TEdit; + EditPrice: TEdit; + EditId: TEdit; + EditDiscountPercentage: TEdit; + EditDescription: TMemo; + EditCategory: TEdit; + EditBrand: TEdit; + LabelTitle: TLabel; + LabelThumbnail: TLabel; + LabelStock: TLabel; + LabelRating: TLabel; + LabelPrice: TLabel; + Label1: TLabel; + LabelDiscountPercentage: TLabel; + LabelDescription: TLabel; + LabelCategory: TLabel; + LabelBrand: TLabel; + actProductNext: TAction; + actProductPrevious: TAction; + procedure FormCreate(Sender: TObject); + procedure acUsertNextExecute(Sender: TObject); + procedure actUserPreviousExecute(Sender: TObject); + procedure actProductNextExecute(Sender: TObject); + procedure actProductPreviousExecute(Sender: TObject); + private + { Private declarations } + FUserEumerator: TListeEumerator; + FProductsEumerator: TListeEumerator; + + procedure UserEumeratorChanged(Sender: TObject); + procedure ProductsEumeratorChanged(Sender: TObject); + public + { Public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +uses + DummyJson.AuthenticaticedUsers, DummyJson.Lib.AuthWebService; + +{$R *.dfm} + +procedure TMainForm.acUsertNextExecute(Sender: TObject); +begin + FUserEumerator.Next; +end; + +procedure TMainForm.actProductNextExecute(Sender: TObject); +begin + FProductsEumerator.Next; +end; + +procedure TMainForm.actProductPreviousExecute(Sender: TObject); +begin + FProductsEumerator.Previous; +end; + +procedure TMainForm.actUserPreviousExecute(Sender: TObject); +begin + FUserEumerator.Previous; +end; + +procedure TMainForm.FormCreate(Sender: TObject); +const + Url = 'https://dummyjson.com/users'; +var + UsersDTO: TUsersDTO; +begin + UsersDTO := TWebService.GetDTO(Url); + FUserEumerator := TListeEumerator.Create(Self, UsersDTO, UsersDTO.Users); + FUserEumerator.OnChange := UserEumeratorChanged; +end; + +procedure TMainForm.ProductsEumeratorChanged(Sender: TObject); +var + Product: TProduct; +begin + Product := FProductsEumerator.Current; + if Product = nil then + Exit; + + EditBrand.Text := Product.Brand; + EditCategory.Text := Product.Category; + EditDescription.Text := Product.Description; + EditDiscountPercentage.Text := Product.DiscountPercentage.ToString; + EditId.Text := Product.Id.ToString; + EditPrice.Text := Product.Price.ToString; + EditRating.Text := Product.Rating.ToString; + EditStock.Text := Product.Stock.ToString; + EditThumbnail.Text := Product.Thumbnail; + EditTitle.Text := Product.Title; +end; + +procedure TMainForm.UserEumeratorChanged(Sender: TObject); +const + Url = 'https://dummyjson.com/auth/products'; +var + User: TUser; + ProductsDTO: TProductsDTO; + Token: string; +begin + User := FUserEumerator.Current; + if User = nil then + Exit; + + edtAge.Text := User.Age.ToString; + edtBirthDate.Text := DateToStr(User.BirthDate); + edtBloodGroup.Text := User.BloodGroup; + edtDomain.Text := User.Domain; + edtEin.Text := User.Ein; + edtEmail.Text := User.Email; + edtEyeColor.Text := User.EyeColor; + edtFirstName.Text := User.FirstName; + edtGender.Text := User.Gender; + edtHair.Text := User.Hair.Color; + edtHeight.Text := User.Height.ToString; + edtId.Text := User.Id.ToString;; + edtImage.Text := User.Image; + edtIp.Text := User.Ip; + edtLastName.Text := User.LastName; + edtMacAddress.Text := User.MacAddress; + edtMaidenName.Text := User.MaidenName; + edtPhone.Text := User.Phone; + edtSsn.Text := User.Ssn; + edtUniversity.Text := User.University; + edtUserAgent.Text := User.UserAgent; + edtWeight.Text := User.Weight.ToString;; + + FreeAndNil(FProductsEumerator); + + Token := AuthenticaticedUsers.AuthenticateUser(User).Token; + ProductsDTO := TWebService.GetDTO(Url, Token); + + FProductsEumerator := TListeEumerator.Create(Self, ProductsDTO, ProductsDTO.Products); + FProductsEumerator.OnChange := ProductsEumeratorChanged; +end; + +end. diff --git a/Dummy JSON demos/DTO/DummyJson.ProductsDTO.pas b/Dummy JSON demos/DTO/DummyJson.ProductsDTO.pas new file mode 100644 index 0000000..73833f0 --- /dev/null +++ b/Dummy JSON demos/DTO/DummyJson.ProductsDTO.pas @@ -0,0 +1,107 @@ +unit DummyJson.ProductsDTO; + +interface + +uses + Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types; + +{$M+} + +type + TProduct = class(TJsonDTO) + private + FBrand: string; + FCategory: string; + FDescription: string; + FDiscountPercentage: Double; + FId: Integer; + [JSONName('images')] + FImagesArray: TArray; + [JSONMarshalled(False)] + FImages: TList; + FPrice: Integer; + FRating: Double; + FStock: Integer; + FThumbnail: string; + FTitle: string; + function GetImages: TList; + protected + function GetAsJson: string; override; + published + property Brand: string read FBrand write FBrand; + property Category: string read FCategory write FCategory; + property Description: string read FDescription write FDescription; + property DiscountPercentage: Double read FDiscountPercentage write FDiscountPercentage; + property Id: Integer read FId write FId; + property Images: TList read GetImages; + property Price: Integer read FPrice write FPrice; + property Rating: Double read FRating write FRating; + property Stock: Integer read FStock write FStock; + property Thumbnail: string read FThumbnail write FThumbnail; + property Title: string read FTitle write FTitle; + public + destructor Destroy; override; + end; + + TProductsDTO = class(TJsonDTO) + private + FLimit: Integer; + [JSONName('products'), JSONMarshalled(False)] + FProductsArray: TArray; + [GenericListReflect] + FProducts: TObjectList; + FSkip: Integer; + FTotal: Integer; + function GetProducts: TObjectList; + protected + function GetAsJson: string; override; + published + property Limit: Integer read FLimit write FLimit; + property Products: TObjectList read GetProducts; + property Skip: Integer read FSkip write FSkip; + property Total: Integer read FTotal write FTotal; + public + destructor Destroy; override; + end; + +implementation + +{ TProducts } + +destructor TProduct.Destroy; +begin + GetImages.Free; + inherited; +end; + +function TProduct.GetImages: TList; +begin + Result := List(FImages, FImagesArray); +end; + +function TProduct.GetAsJson: string; +begin + RefreshArray(FImages, FImagesArray); + Result := inherited; +end; + +{ TRoot } + +destructor TProductsDTO.Destroy; +begin + GetProducts.Free; + inherited; +end; + +function TProductsDTO.GetProducts: TObjectList; +begin + Result := ObjectList(FProducts, FProductsArray); +end; + +function TProductsDTO.GetAsJson: string; +begin + RefreshArray(FProducts, FProductsArray); + Result := inherited; +end; + +end. diff --git a/Dummy JSON demos/DTO/DummyJson.UsersDTO.pas b/Dummy JSON demos/DTO/DummyJson.UsersDTO.pas new file mode 100644 index 0000000..7527661 --- /dev/null +++ b/Dummy JSON demos/DTO/DummyJson.UsersDTO.pas @@ -0,0 +1,275 @@ +unit DummyJson.UsersDTO; + +interface + +uses + Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types; + +{$M+} + +type + TAddress = class; + TBank = class; + TCompany = class; + TCoordinates = class; + TCrypto = class; + THair = class; + + TCrypto = class + private + FCoin: string; + FNetwork: string; + FWallet: string; + published + property Coin: string read FCoin write FCoin; + property Network: string read FNetwork write FNetwork; + property Wallet: string read FWallet write FWallet; + end; + + TCoordinates = class + private + FLat: Double; + FLng: Double; + published + property Lat: Double read FLat write FLat; + property Lng: Double read FLng write FLng; + end; + + TAddress = class + private + FAddress: string; + FCity: string; + FCoordinates: TCoordinates; + FPostalCode: string; + FState: string; + published + property Address: string read FAddress write FAddress; + property City: string read FCity write FCity; + property Coordinates: TCoordinates read FCoordinates; + property PostalCode: string read FPostalCode write FPostalCode; + property State: string read FState write FState; + public + constructor Create; + destructor Destroy; override; + end; + + TCompany = class + private + FAddress: TAddress; + FDepartment: string; + FName: string; + FTitle: string; + published + property Address: TAddress read FAddress; + property Department: string read FDepartment write FDepartment; + property Name: string read FName write FName; + property Title: string read FTitle write FTitle; + public + constructor Create; + destructor Destroy; override; + end; + + TBank = class + private + FCardExpire: string; + FCardNumber: string; + FCardType: string; + FCurrency: string; + FIban: string; + published + property CardExpire: string read FCardExpire write FCardExpire; + property CardNumber: string read FCardNumber write FCardNumber; + property CardType: string read FCardType write FCardType; + property Currency: string read FCurrency write FCurrency; + property Iban: string read FIban write FIban; + end; + + THair = class + private + FColor: string; + FType: string; + published + property Color: string read FColor write FColor; + property &Type: string read FType write FType; + end; + + TUser = class + private + FAddress: TAddress; + FAge: Integer; + FBank: TBank; + [SuppressZero] + FBirthDate: TDateTime; + FBloodGroup: string; + FCompany: TCompany; + FCrypto: TCrypto; + FDomain: string; + FEin: string; + FEmail: string; + FEyeColor: string; + FFirstName: string; + FGender: string; + FHair: THair; + FHeight: Integer; + FId: Integer; + FImage: string; + FIp: string; + FLastName: string; + FMacAddress: string; + FMaidenName: string; + FPassword: string; + FPhone: string; + FSsn: string; + FUniversity: string; + FUserAgent: string; + FUsername: string; + FWeight: Double; + published + property Address: TAddress read FAddress; + property Age: Integer read FAge write FAge; + property Bank: TBank read FBank; + property BirthDate: TDateTime read FBirthDate write FBirthDate; + property BloodGroup: string read FBloodGroup write FBloodGroup; + property Company: TCompany read FCompany; + property Crypto: TCrypto read FCrypto; + property Domain: string read FDomain write FDomain; + property Ein: string read FEin write FEin; + property Email: string read FEmail write FEmail; + property EyeColor: string read FEyeColor write FEyeColor; + property FirstName: string read FFirstName write FFirstName; + property Gender: string read FGender write FGender; + property Hair: THair read FHair; + property Height: Integer read FHeight write FHeight; + property Id: Integer read FId write FId; + property Image: string read FImage write FImage; + property Ip: string read FIp write FIp; + property LastName: string read FLastName write FLastName; + property MacAddress: string read FMacAddress write FMacAddress; + property MaidenName: string read FMaidenName write FMaidenName; + property Password: string read FPassword write FPassword; + property Phone: string read FPhone write FPhone; + property Ssn: string read FSsn write FSsn; + property University: string read FUniversity write FUniversity; + property UserAgent: string read FUserAgent write FUserAgent; + property Username: string read FUsername write FUsername; + property Weight: Double read FWeight write FWeight; + public + constructor Create; + destructor Destroy; override; + end; + + TUsersDTO = class(TJsonDTO) + private + FLimit: Integer; + FSkip: Integer; + FTotal: Integer; + [JSONName('users'), JSONMarshalled(False)] + FUsersArray: TArray; + [GenericListReflect] + FUsers: TObjectList; + function GetUsers: TObjectList; + protected + function GetAsJson: string; override; + published + property Limit: Integer read FLimit write FLimit; + property Skip: Integer read FSkip write FSkip; + property Total: Integer read FTotal write FTotal; + property Users: TObjectList read GetUsers; + public + destructor Destroy; override; + end; + + TUserAuthenticationDTO = class(TJsonDTO) + private + FEmail: string; + FFirstName: string; + FGender: string; + FId: Integer; + FImage: string; + FLastName: string; + FToken: string; + FUsername: string; + published + property Email: string read FEmail write FEmail; + property FirstName: string read FFirstName write FFirstName; + property Gender: string read FGender write FGender; + property Id: Integer read FId write FId; + property Image: string read FImage write FImage; + property LastName: string read FLastName write FLastName; + property Token: string read FToken write FToken; + property Username: string read FUsername write FUsername; + end; + + +implementation + +{ TAddress } + +constructor TAddress.Create; +begin + inherited; + FCoordinates := TCoordinates.Create; +end; + +destructor TAddress.Destroy; +begin + FCoordinates.Free; + inherited; +end; + +{ TCompany } + +constructor TCompany.Create; +begin + inherited; + FAddress := TAddress.Create; +end; + +destructor TCompany.Destroy; +begin + FAddress.Free; + inherited; +end; + +{ TUsers } + +constructor TUser.Create; +begin + inherited; + FAddress := TAddress.Create; + FHair := THair.Create; + FBank := TBank.Create; + FCompany := TCompany.Create; + FCrypto := TCrypto.Create; +end; + +destructor TUser.Destroy; +begin + FAddress.Free; + FHair.Free; + FBank.Free; + FCompany.Free; + FCrypto.Free; + inherited; +end; + +{ TRoot } + +destructor TUsersDTO.Destroy; +begin + GetUsers.Free; + inherited; +end; + +function TUsersDTO.GetUsers: TObjectList; +begin + Result := ObjectList(FUsers, FUsersArray); +end; + +function TUsersDTO.GetAsJson: string; +begin + RefreshArray(FUsers, FUsersArray); + Result := inherited; +end; + +end. diff --git a/Dummy JSON demos/Lib/DummyJson.Lib.AuthWebService.pas b/Dummy JSON demos/Lib/DummyJson.Lib.AuthWebService.pas new file mode 100644 index 0000000..80266d0 --- /dev/null +++ b/Dummy JSON demos/Lib/DummyJson.Lib.AuthWebService.pas @@ -0,0 +1,192 @@ +unit DummyJson.Lib.AuthWebService; + +interface + +uses + Pkg.Json.DTO, Rest.Types, Rest.Client; + +{$M+} + +const + HTTP_OK = 200; + CONTENT_TYPE = 'Content-Type'; + CONTENT_LENGTH = 'Content-Length'; + HEADER_PARAM_ACCEPT = 'Accept'; + HEADER_PARAM_AUTHORIZATION = 'Authorization'; + HEADER_PARAM_BEARER = 'Bearer '; + +type + TWebService = class abstract + private + FClient: TRESTClient; + FRequest: TRESTRequest; + FStatusText: string; + FStatusCode: Integer; + procedure SetBaseURL(const Value: string); + function GetBaseURL: string; + protected + procedure AddHeaderParam(const aKey, aValue: string); + procedure AddBody(aBody: string; aAddCoontentLength: Boolean = True); + function Execute: T; virtual; + published + property StatusCode: Integer read FStatusCode; + property StatusText: string read FStatusText; + property BaseURL: string read GetBaseURL write SetBaseURL; + public + constructor Create(aBaseUrl: string = ''; aAuthenticationToken: string = ''); reintroduce; + destructor Destroy; override; + function Post: T; virtual; + function Get: T; virtual; + class function GetDTO(aBaseUrl: string; aAuthenticationToken: string = ''): T; + end; + + TUserAuthWebService = class sealed(TWebService) + strict private + Type + TInternalUser = class(TJsonDTO) + private + FPassword: string; + FUsername: string; + public + property Username: string read FUsername write FUsername; + property Password: string read FPassword write FPassword; + constructor Create(aUserName: string; aPassword: string); reintroduce; + end; + + public + constructor Create(aUrl: string; aUserName: string; aPassword: string); reintroduce; + end; + +implementation + +uses + System.Sysutils; + +{ TWebService } + +procedure TWebService.AddBody(aBody: string; aAddCoontentLength: Boolean); +begin + if aAddCoontentLength then + FRequest.Params.AddItem(CONTENT_LENGTH, (aBody.Length).ToString, TRESTRequestParameterKind.pkHTTPHEADER); + + FRequest.AddBody(aBody, TRESTContentType.ctAPPLICATION_JSON); +end; + +procedure TWebService.AddHeaderParam(const aKey, aValue: string); +begin + FRequest.AddParameter(aKey, aValue, TRESTRequestParameterKind.pkHTTPHEADER, [poDoNotEncode]); +end; + +(* + Documentation from dummyjson: + fetch('https://dummyjson.com/auth/products', + { + method: 'GET', + headers: + { + 'Authorization': 'Bearer /* YOUR_TOKEN_HERE */', + }, + }) + .then(res => res.json()) + .then(console.log); +*) + +constructor TWebService.Create(aBaseUrl: string; aAuthenticationToken: string); +begin + inherited Create; + FClient := TRESTClient.Create(aBaseUrl); + FRequest := TRESTRequest.Create(FClient); + FRequest.Timeout := 10 * MSecsPerSec * SecsPerMin; + AddHeaderParam(CONTENT_TYPE, CONTENTTYPE_APPLICATION_JSON); + AddHeaderParam(HEADER_PARAM_ACCEPT, CONTENTTYPE_APPLICATION_JSON); + if aAuthenticationToken <> '' then + AddHeaderParam(HEADER_PARAM_AUTHORIZATION, HEADER_PARAM_BEARER + aAuthenticationToken); +end; + +destructor TWebService.Destroy; +begin + FClient.Free; + inherited; +end; + +function TWebService.Execute: T; +begin + Result := nil; + FStatusCode := -1; + FStatusText := ''; + + try + FRequest.Execute; + FStatusCode := FRequest.Response.StatusCode; + FStatusText := FRequest.Response.StatusText; + + if FStatusCode = HTTP_OK then + begin + Result := T.Create; + Result.AsJson := FRequest.Response.JSONText; + end; + + except + on e: Exception do + begin + FStatusCode := FRequest.Response.StatusCode; + FStatusText := e.Message; + end; + end; +end; + +function TWebService.Get: T; +begin + FRequest.Method := TRESTRequestMethod.rmGET; + Result := Execute; +end; + +function TWebService.GetBaseURL: string; +begin + Result := FClient.BaseURL; +end; + +class function TWebService.GetDTO(aBaseUrl: string; aAuthenticationToken: string = ''): T; +begin + with TWebService.Create(aBaseUrl, aAuthenticationToken) do + try + Result := Get; + finally + Free; + end; +end; + +function TWebService.Post: T; +begin + FRequest.Method := TRESTRequestMethod.rmPOST; + Result := Execute; +end; + +procedure TWebService.SetBaseURL(const Value: string); +begin + FClient.BaseURL := Value; +end; + +{ TUserAuthWebService } + +constructor TUserAuthWebService.Create(aUrl, aUserName, aPassword: string); +begin + inherited Create(aUrl); + with TInternalUser.Create(aUserName, aPassword) do + try + AddBody(AsJson); + finally + Free; + end; +end; + +{ TUserAuthWebService.TInternalUser } + +constructor TUserAuthWebService.TInternalUser.Create(aUserName, aPassword: string); +begin + inherited Create; + FPassword := aPassword; + FUsername := aUserName; +end; + +end. diff --git a/Dummy JSON demos/Lib/DummyJson.Lib.DTODownloader.pas b/Dummy JSON demos/Lib/DummyJson.Lib.DTODownloader.pas new file mode 100644 index 0000000..ff73980 --- /dev/null +++ b/Dummy JSON demos/Lib/DummyJson.Lib.DTODownloader.pas @@ -0,0 +1,63 @@ +unit DummyJson.Lib.DTODownloader; + +interface + +uses + System.SysUtils, + Pkg.Json.DTO; + +type + DTODownloader = class abstract + public + class function GetDTO(const aUrl: string; var aErrorText: string): T; overload; + class function GetDTO(const aUrl: string): T; overload; + end; + +const + HTTP_OK = 200; + +implementation + +uses + System.Net.HttpClient, System.Net.HttpClientComponent; + +{ DTODownloader } + +class function DTODownloader.GetDTO(const aUrl: string; var aErrorText: string): T; +var + DTO: T; + Respons: IHTTPResponse; +begin + DTO := nil; + with TNetHTTPClient.Create(nil) do + try + try + Respons := Get(aUrl); + + if Respons.StatusCode = HTTP_OK then + begin + DTO := T.Create; + DTO.AsJson := Respons.ContentAsString; + end + else + Exit; + + aErrorText := ''; + except + on e: Exception do + aErrorText := e.message; + end; + finally + Result := DTO; + Free; + end; +end; + +class function DTODownloader.GetDTO(const aUrl: string): T; +var + ErrorText: string; +begin + Result := GetDTO(aUrl, ErrorText); +end; + +end. diff --git a/Dummy JSON demos/Lib/DummyJson.Lib.Enumerator.pas b/Dummy JSON demos/Lib/DummyJson.Lib.Enumerator.pas new file mode 100644 index 0000000..e80f196 --- /dev/null +++ b/Dummy JSON demos/Lib/DummyJson.Lib.Enumerator.pas @@ -0,0 +1,98 @@ +unit DummyJson.Lib.Enumerator; + +interface + +uses + System.Classes, System.Generics.Collections, + + Pkg.Json.DTO; + +{$M+} + +Type + TListeEumerator = class(TComponent) + strict private + FCurrentIndex: Integer; + FDto: TJsonDTO; + FElements: TList; + FOnChange: TNotifyEvent; + + procedure DoChange; + function IndexInrange: Boolean; + function GetCurrent: TElement; + procedure SetOnChange(const Value: TNotifyEvent); + published + property Current: TElement read GetCurrent; + property OnChange: TNotifyEvent read FOnChange write SetOnChange; + public + constructor Create(aOwner: TComponent; aDTO: TJsonDTO; aElements: TList); reintroduce; + destructor Destroy; override; + Function Next: TElement; + Function Previous: TElement; + end; + +implementation + +{ TListeEumerator } + +constructor TListeEumerator.Create(aOwner: TComponent; aDTO: TJsonDTO; aElements: TList); +begin + inherited Create(aOwner); + FDto := aDTO; + FElements := aElements; + FCurrentIndex := 0; + DoChange; +end; + +destructor TListeEumerator.Destroy; +begin + FDto.Free; + inherited; +end; + +procedure TListeEumerator.DoChange; +begin + if Assigned(FOnChange) then + FOnChange(Self); +end; + +function TListeEumerator.GetCurrent: TElement; +begin + if not IndexInrange then + Exit(nil); + + Result := FElements[FCurrentIndex]; +end; + +function TListeEumerator.IndexInrange: Boolean; +begin + if FElements.Count = 0 then + Exit(False); + + Result := (FCurrentIndex >= 0) and (FCurrentIndex < FElements.Count); +end; + +function TListeEumerator.Next: TElement; +begin + FCurrentIndex := (FCurrentIndex + 1) mod FElements.Count; + Result := Current; + DoChange; +end; + +function TListeEumerator.Previous: TElement; +begin + FCurrentIndex := FCurrentIndex - 1; + if FCurrentIndex < 0 then + FCurrentIndex := FElements.Count - 1; + + Result := Current; + DoChange; +end; + +procedure TListeEumerator.SetOnChange(const Value: TNotifyEvent); +begin + FOnChange := Value; + DoChange; +end; + +end. diff --git a/Dummy JSON demos/Lib/Json.Interceptors.pas b/Dummy JSON demos/Lib/Json.Interceptors.pas new file mode 100644 index 0000000..35faec2 --- /dev/null +++ b/Dummy JSON demos/Lib/Json.Interceptors.pas @@ -0,0 +1,333 @@ +unit Json.Interceptors; + +interface + +uses + REST.JsonReflect, System.Rtti, System.Types, System.UITypes; + +{$M+} + + +type + TArrayHelper = record helper for TStringDynArray + public + function IndexOf(aString: string): Integer; + end; + + EnumMemberAttribute = class(TCustomAttribute) + strict private + FNames: TStringDynArray; + public + constructor Create(const aNames: string; aSeparator: Char = ','); overload; + published + property Names: TStringDynArray read FNames; + end; + + SetMembersAttribute = class(TCustomAttribute) + strict private + FName: string; + FSeparator: Char; + public + constructor Create(const aName: string; const aSeparator: Char = ','); overload; + function ToString: string; override; + property &Name: string read FName; + property Separator: Char read FSeparator; + end; + + TBaseInterceptor = class abstract(TJSONInterceptor) + strict private + FRttiContext: TRttiContext; + strict protected + function GetDataField(Data: TObject; Field: string): TRttiField; {$IFNDEF DEBUG} inline; {$ENDIF} + function GetValue(Data: TObject; Field: string): TValue; {$IFNDEF DEBUG} inline; {$ENDIF} + procedure SetValue(Data: TObject; Field: string; const AValue: TValue); {$IFNDEF DEBUG} inline; {$ENDIF} + function SplitString(const S, Delimiters: string): TStringDynArray; + function GetAttributes: TArray; {$IFNDEF DEBUG} inline; {$ENDIF} + procedure ExpectTypeKind(ATypeKind: TTypeKind); {$IFNDEF DEBUG} inline; {$ENDIF} + end; + + TColorInterceptor = class abstract(TBaseInterceptor) + public + function StringConverter(Data: TObject; Field: string): string; override; + procedure StringReverter(Data: TObject; Field: string; Arg: string); override; + class function TryStrToColor(const AValue: string; out aColor: TColor): Boolean; + class function StrToColor(const AValue: string): TColor; + end; + + TEnumInterceptor = class abstract(TBaseInterceptor) + strict private + function GetNames: TStringDynArray; {$IFNDEF DEBUG} inline; {$ENDIF} + public + function StringConverter(Data: TObject; Field: string): string; override; + procedure StringReverter(Data: TObject; Field: string; Arg: string); override; + end; + + TSetInterceptor = class abstract(TBaseInterceptor) + strict private + function GetSetStrings: TStringDynArray; + public + function StringsConverter(Data: TObject; Field: string): TListOfStrings; override; + procedure StringsReverter(Data: TObject; Field: string; Args: TListOfStrings); override; + end; + + TJSONInterceptorClass = class of TJSONInterceptor; + + StringHandlerAttribute = class(JsonReflectAttribute) + public + constructor Create(aClass: TJSONInterceptorClass); + end; + + StringsHandler = class(JsonReflectAttribute) + public + constructor Create(aClass: TJSONInterceptorClass); + end; + +implementation + +uses + System.TypInfo, System.SysUtils, System.StrUtils, + + System.Generics.Collections, System.UIConsts; + +function TArrayHelper.IndexOf(aString: string): Integer; +begin + for Result := low(Self) to high(Self) do + if Self[Result] = aString then + Exit; + Result := -1; +end; + +{ TBaseEnumInterceptor } + +procedure TBaseInterceptor.ExpectTypeKind(ATypeKind: TTypeKind); +begin + Assert(TypeInfo(T) <> nil, 'Type has no typeinfo!'); + Assert(PTypeInfo(TypeInfo(T)).Kind = ATypeKind, 'Type is not expected type!'); +end; + +function TBaseInterceptor.GetAttributes: TArray; +var + Attribute: TCustomAttribute; + Attributes: TArray; + ResultArray: TArray; +begin + ResultArray := nil; + for Attribute in FRttiContext.GetType(ClassType).GetAttributes do + if Attribute is U then + begin + SetLength(ResultArray, Length(ResultArray) + 1); + ResultArray[Length(ResultArray) - 1] := Attribute as U; + end; + Result := ResultArray; +end; + +function TBaseInterceptor.GetDataField(Data: TObject; Field: string): TRttiField; +begin + Result := FRttiContext.GetType(Data.ClassType).GetField(Field); +end; + +function TBaseInterceptor.GetValue(Data: TObject; Field: string): TValue; +begin + Result := GetDataField(Data, Field).GetValue(Data); +end; + +procedure TBaseInterceptor.SetValue(Data: TObject; Field: string; const AValue: TValue); +begin + GetDataField(Data, Field).SetValue(Data, AValue); +end; + +function TBaseInterceptor.SplitString(const S, Delimiters: string): TStringDynArray; +var + Buffer: TStringDynArray; + I: Integer; +begin + Buffer := System.StrUtils.SplitString(S, Delimiters); + SetLength(Result, Length(Buffer)); + for I := low(Result) to high(Result) do + Result[I] := Buffer[I].Trim; +end; + +{ EnumMemberAttribute } + +constructor EnumMemberAttribute.Create(const aNames: string; aSeparator: Char); +begin + inherited Create; + FNames := SplitString(aNames, aSeparator); +end; + +{ TSmartInterceptor } + +function TEnumInterceptor.GetNames: TStringDynArray; +var + Attribute: EnumMemberAttribute; + Name: string; + ResultArray: TStringDynArray; +begin + for Attribute in GetAttributes do + for name in Attribute.Names do + begin + SetLength(ResultArray, Length(ResultArray) + 1); + ResultArray[Length(ResultArray) - 1] := name.Trim; + end; + + Result := ResultArray; +end; + +function TEnumInterceptor.StringConverter(Data: TObject; Field: string): string; +begin + ExpectTypeKind(tkEnumeration); + Result := GetNames[GetValue(Data, Field).AsOrdinal]; +end; + +procedure TEnumInterceptor.StringReverter(Data: TObject; Field, Arg: string); +var + Enum: T; + AbsValue: Byte absolute Enum; +begin + ExpectTypeKind(tkEnumeration); + AbsValue := GetNames.IndexOf(Arg); + SetValue(Data, Field, TValue.From(Enum)); +end; + +{ EnumHandlerAttribute } + +constructor StringHandlerAttribute.Create(aClass: TJSONInterceptorClass); +begin + inherited Create(ctString, rtString, aClass, nil, True); +end; + +{ TSmartSetInterceptor } + +function TSetInterceptor.GetSetStrings: TStringDynArray; +var + AttributeArray: TArray; + Attr: TCustomAttribute; + SetAttr: SetMembersAttribute absolute Attr; +begin + Result := nil; + + AttributeArray := GetAttributes; + if AttributeArray = nil then + Exit(nil); + + Attr := AttributeArray[0]; + Result := SplitString(SetAttr.Name, SetAttr.Separator); +end; + +function TSetInterceptor.StringsConverter(Data: TObject; Field: string): TListOfStrings; +var + SetStrings: TStringDynArray; + RttiField: TRttiField; + EnumType: TRttiEnumerationType; + SetValues: TIntegerSet; + EnumSet: T absolute SetValues; + SetType: TRttiSetType; + I: Integer; +begin + Result := nil; + ExpectTypeKind(tkSet); + + SetStrings := GetSetStrings; + Assert(Length(SetStrings) > 0, Format('EnumSet attribute needs string parameters on %s!', [ClassName])); + + RttiField := GetDataField(Data, Field); + if not(RttiField.FieldType is TRttiSetType) then + Exit; + + SetType := TRttiSetType(RttiField.FieldType); + + if not(SetType.ElementType is TRttiEnumerationType) then + Exit; + + EnumSet := RttiField.GetValue(Data).AsType; + EnumType := TRttiEnumerationType(SetType.ElementType); + + (* + Common error scenarios + * Your Enum contains 3 elements, but you only provided 2 names + * You separated the strings with a pipe (|), but the separator is comma (,) + *) + Assert(EnumType.MaxValue <= high(SetStrings), 'Number of elements in set does not match, or separator mismatch!'); + + for I := EnumType.MinValue to EnumType.MaxValue do + if I in SetValues then + Result := Result + [SetStrings[I]]; +end; + +procedure TSetInterceptor.StringsReverter(Data: TObject; Field: string; Args: TListOfStrings); +var + I: Integer; + RttiField: TRttiField; + SetValues: TIntegerSet; + EnumSet: T absolute SetValues; + Names: TStringDynArray; + Argument: string; +begin + ExpectTypeKind(tkSet); + + Names := GetSetStrings; + SetValues := []; + + for I := low(Names) to high(Names) do + for Argument in TArray(Args) do + if Names[I] = Argument then + Include(SetValues, I); + + SetValue(Data, Field, TValue.From(EnumSet)); +end; + +{ SetMemberAttribute } + +constructor SetMembersAttribute.Create(const aName: string; const aSeparator: Char); +begin + FName := aName; + FSeparator := aSeparator; +end; + +function SetMembersAttribute.ToString: string; +begin + Result := FName; +end; + +{ StringsHandler } + +constructor StringsHandler.Create(aClass: TJSONInterceptorClass); +begin + inherited Create(ctStrings, rtStrings, aClass, nil, True) +end; + +{ TColorInterceptor } + +function TColorInterceptor.StringConverter(Data: TObject; Field: string): string; +var + Color: TColor; +begin + Color := GetValue(Data, Field).AsInteger; + Result := '0x' + IntToHex(Color); +end; + +procedure TColorInterceptor.StringReverter(Data: TObject; Field, Arg: string); +begin + SetValue(Data, Field, StrToColor(Arg)); +end; + +class function TColorInterceptor.StrToColor(const AValue: string): TColor; +begin + if not TryStrToColor(AValue, Result) then + Result := 0; +end; + +class function TColorInterceptor.TryStrToColor(const AValue: string; out aColor: TColor): Boolean; +var + Int: Integer; +begin + Result := False; + + if TryStrToInt(AValue, Int) or IdentToColor(AValue, Int) or IdentToColor('cl' + AValue, Int) then + begin + aColor := Int; + Result := True; + end; +end; + +end. diff --git a/Dummy JSON demos/Lib/Pkg.Json.DTO.pas b/Dummy JSON demos/Lib/Pkg.Json.DTO.pas new file mode 100644 index 0000000..d0f2585 --- /dev/null +++ b/Dummy JSON demos/Lib/Pkg.Json.DTO.pas @@ -0,0 +1,296 @@ +unit Pkg.Json.DTO; + +interface + +uses System.Classes, System.Json, Rest.Json, System.Generics.Collections, Rest.JsonReflect; + +type + TArrayMapper = class + protected + procedure RefreshArray(aSource: TList; var aDestination: TArray); + function List(var aList: TList; aSource: TArray): TList; + function ObjectList(var aList: TObjectList; aSource: TArray): TObjectList; + public + constructor Create; virtual; + end; + + TJsonDTO = class(TArrayMapper) + private + FOptions: TJsonOptions; + class procedure PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); + class procedure PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer = 0); overload; + class procedure PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); + protected + function GetAsJson: string; virtual; + procedure SetAsJson(aValue: string); virtual; + public + constructor Create; override; + class function PrettyPrintJSON(aJson: string): string; overload; + function ToString: string; override; + function Clone: T; + property AsJson: string read GetAsJson write SetAsJson; + end; + + GenericListReflectAttribute = class(JsonReflectAttribute) + public + constructor Create; + end; + + SuppressZeroAttribute = class(JsonReflectAttribute) + public + constructor Create; + end; + +implementation + +uses System.Sysutils, System.JSONConsts, System.Rtti, System.DateUtils; + +{ TJsonDTO } + +function TJsonDTO.Clone: T; +begin + Result := T.Create; + Result.AsJson := AsJson; +end; + +constructor TJsonDTO.Create; +begin + inherited; + FOptions := [joDateIsUTC, joDateFormatISO8601]; +end; + +function TJsonDTO.GetAsJson: string; +begin + Result := TJson.ObjectToJsonString(Self, FOptions); +end; + +const + INDENT_SIZE = 2; + +class procedure TJsonDTO.PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer); +var + i: Integer; + Ident: Integer; +begin + Ident := Indent + INDENT_SIZE; + i := 0; + + if aJSONValue is TJSONObject then + begin + aOutputStrings.Add(StringOfChar(' ', Ident) + '{'); + for i := 0 to TJSONObject(aJSONValue).Count - 1 do + PrettyPrintPair(TJSONObject(aJSONValue).Pairs[i], aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident); + + aOutputStrings.Add(StringOfChar(' ', Ident) + '}'); + end + else if aJSONValue is TJSONArray then + PrettyPrintArray(TJSONArray(aJSONValue), aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident) + else + aOutputStrings.Add(StringOfChar(' ', Ident) + aJSONValue.ToString); +end; + +class procedure TJsonDTO.PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +var + i: Integer; +begin + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE) + '['); + + for i := 0 to aJSONValue.Count - 1 do + begin + PrettyPrintJSON(aJSONValue.Items[i], aOutputStrings, Indent); + if i < aJSONValue.Count - 1 then + aOutputStrings[aOutputStrings.Count - 1] := aOutputStrings[aOutputStrings.Count - 1] + ','; + end; + + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE - 2) + ']'); +end; + +class function TJsonDTO.PrettyPrintJSON(aJson: string): string; +var + StringList: TStringlist; + JSONValue: TJsonValue; +begin + StringList := TStringlist.Create; + try + JSONValue := TJSONObject.ParseJSONValue(aJson); + try + if JSONValue <> nil then + PrettyPrintJSON(JSONValue, StringList); + finally + JSONValue.Free; + end; + + Result := StringList.Text; + finally + StringList.Free; + end; +end; + +class procedure TJsonDTO.PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +const + TEMPLATE = '%s:%s'; +var + Line: string; + NewList: TStringlist; +begin + NewList := TStringlist.Create; + try + PrettyPrintJSON(aJSONValue.JSONValue, NewList, Indent); + Line := Format(TEMPLATE, [aJSONValue.JsonString.ToString, Trim(NewList.Text)]); + finally + NewList.Free; + end; + + Line := StringOfChar(' ', Indent + INDENT_SIZE) + Line; + if not Last then + Line := Line + ','; + aOutputStrings.Add(Line); +end; + +procedure TJsonDTO.SetAsJson(aValue: string); +var + JSONValue: TJsonValue; + JSONObject: TJSONObject; +begin + JSONValue := TJSONObject.ParseJSONValue(aValue); + try + if not Assigned(JSONValue) then + Exit; + + if (JSONValue is TJSONArray) then + begin + with TJSONUnMarshal.Create do + try + SetFieldArray(Self, 'Items', (JSONValue as TJSONArray)); + finally + Free; + end; + + Exit; + end; + + if (JSONValue is TJSONObject) then + JSONObject := JSONValue as TJSONObject + else + begin + aValue := aValue.Trim; + if (aValue = '') and not Assigned(JSONValue) or (aValue <> '') and Assigned(JSONValue) and JSONValue.Null then + Exit + else + raise EConversionError.Create(SCannotCreateObject); + end; + + TJson.JsonToObject(Self, JSONObject, FOptions); + finally + JSONValue.Free; + end; +end; + +function TJsonDTO.ToString: string; +begin + Result := AsJson; +end; + +{ TArrayMapper } + +constructor TArrayMapper.Create; +begin + inherited; +end; + +function TArrayMapper.List(var aList: TList; aSource: TArray): TList; +begin + if aList = nil then + begin + aList := TList.Create; + aList.AddRange(aSource); + end; + + Exit(aList); +end; + +function TArrayMapper.ObjectList(var aList: TObjectList; aSource: TArray): TObjectList; +var + Element: T; +begin + if aList = nil then + begin + aList := TObjectList.Create; + for Element in aSource do + aList.Add(Element); + end; + + Exit(aList); +end; + +procedure TArrayMapper.RefreshArray(aSource: TList; var aDestination: TArray); +begin + if aSource <> nil then + aDestination := aSource.ToArray; +end; + +type + TGenericListFieldInterceptor = class(TJSONInterceptor) + public + function ObjectsConverter(Data: TObject; Field: string): TListOfObjects; override; + end; + + { TListFieldInterceptor } + +function TGenericListFieldInterceptor.ObjectsConverter(Data: TObject; Field: string): TListOfObjects; +var + ctx: TRttiContext; + List: TList; + RttiProperty: TRttiProperty; +begin + RttiProperty := ctx.GetType(Data.ClassInfo).GetProperty(Copy(Field, 2, MAXINT)); + List := TList(RttiProperty.GetValue(Data).AsObject); + Result := TListOfObjects(List.List); + SetLength(Result, List.Count); +end; + +constructor GenericListReflectAttribute.Create; +begin + inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); +end; + +type + TSuppressZeroDateInterceptor = class(TJSONInterceptor) + public + function StringConverter(Data: TObject; Field: string): string; override; + procedure StringReverter(Data: TObject; Field: string; Arg: string); override; + end; + +function TSuppressZeroDateInterceptor.StringConverter(Data: TObject; Field: string): string; +var + RttiContext: TRttiContext; + Date: TDateTime; +begin + Date := RttiContext.GetType(Data.ClassType).GetField(Field).GetValue(Data).AsType; + if Date = 0 then + Result := string.Empty + else + Result := DateToISO8601(Date, True); +end; + +procedure TSuppressZeroDateInterceptor.StringReverter(Data: TObject; Field, Arg: string); +var + RttiContext: TRttiContext; + Date: TDateTime; +begin + if Arg.IsEmpty then + Date := 0 + else + Date := ISO8601ToDate(Arg, True); + + RttiContext.GetType(Data.ClassType).GetField(Field).SetValue(Data, Date); +end; + +{ SuppressZeroAttribute } + +constructor SuppressZeroAttribute.Create; +begin + inherited Create(ctString, rtString, TSuppressZeroDateInterceptor); +end; + +end. diff --git a/Dummy JSON demos/Products/Demo.png b/Dummy JSON demos/Products/Demo.png new file mode 100644 index 0000000..beba775 Binary files /dev/null and b/Dummy JSON demos/Products/Demo.png differ diff --git a/Dummy JSON demos/Products/DummyJson.Products.MainForm.dfm b/Dummy JSON demos/Products/DummyJson.Products.MainForm.dfm new file mode 100644 index 0000000..6c56b43 --- /dev/null +++ b/Dummy JSON demos/Products/DummyJson.Products.MainForm.dfm @@ -0,0 +1,195 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + Caption = 'MainForm' + ClientHeight = 289 + ClientWidth = 659 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Segoe UI' + Font.Style = [] + Position = poScreenCenter + OnCreate = FormCreate + TextHeight = 15 + object LabelBrand: TLabel + Left = 8 + Top = 92 + Width = 34 + Height = 15 + Caption = 'Brand:' + end + object LabelCategory: TLabel + Left = 8 + Top = 121 + Width = 51 + Height = 15 + Caption = 'Category:' + end + object LabelDescription: TLabel + Left = 8 + Top = 167 + Width = 63 + Height = 15 + Caption = 'Description:' + end + object LabelDiscountPercentage: TLabel + Left = 420 + Top = 34 + Width = 112 + Height = 15 + Caption = 'Discount Percentage:' + end + object LabelId: TLabel + Left = 10 + Top = 34 + Width = 13 + Height = 15 + Caption = 'Id:' + end + object LabelPrice: TLabel + Left = 420 + Top = 63 + Width = 29 + Height = 15 + Caption = 'Price:' + end + object LabelRating: TLabel + Left = 420 + Top = 94 + Width = 37 + Height = 15 + Caption = 'Rating:' + end + object LabelStock: TLabel + Left = 420 + Top = 121 + Width = 32 + Height = 15 + Caption = 'Stock:' + end + object LabelThumbnail: TLabel + Left = 8 + Top = 230 + Width = 60 + Height = 15 + Caption = 'Thumbnail:' + end + object LabelTitle: TLabel + Left = 8 + Top = 63 + Width = 25 + Height = 15 + Caption = 'Title:' + end + object EditBrand: TEdit + Left = 98 + Top = 89 + Width = 295 + Height = 23 + TabOrder = 0 + Text = 'EditBrand' + end + object EditCategory: TEdit + Left = 98 + Top = 118 + Width = 295 + Height = 23 + TabOrder = 1 + Text = 'EditCategory' + end + object EditDescription: TMemo + Left = 98 + Top = 147 + Width = 295 + Height = 74 + Lines.Strings = ( + 'EditDescription') + TabOrder = 2 + end + object EditDiscountPercentage: TEdit + Left = 550 + Top = 31 + Width = 100 + Height = 23 + TabOrder = 3 + Text = 'EditDiscountPercentage' + end + object EditId: TEdit + Left = 98 + Top = 31 + Width = 50 + Height = 23 + TabOrder = 4 + Text = 'EditId' + end + object EditPrice: TEdit + Left = 550 + Top = 60 + Width = 100 + Height = 23 + TabOrder = 5 + Text = 'EditPrice' + end + object EditRating: TEdit + Left = 550 + Top = 89 + Width = 100 + Height = 23 + TabOrder = 6 + Text = 'EditRating' + end + object EditStock: TEdit + Left = 550 + Top = 118 + Width = 100 + Height = 23 + TabOrder = 7 + Text = 'EditStock' + end + object EditThumbnail: TEdit + Left = 98 + Top = 227 + Width = 552 + Height = 23 + TabOrder = 8 + Text = 'EditThumbnail' + end + object EditTitle: TEdit + Left = 98 + Top = 60 + Width = 295 + Height = 23 + TabOrder = 9 + Text = 'EditTitle' + end + object Button1: TButton + Left = 575 + Top = 260 + Width = 75 + Height = 25 + Action = actNext + TabOrder = 10 + end + object Button2: TButton + Left = 492 + Top = 260 + Width = 75 + Height = 25 + Action = actPrevious + TabOrder = 11 + end + object ActionList1: TActionList + Left = 464 + Top = 136 + object actNext: TAction + Caption = 'Next >>' + OnExecute = actNextExecute + end + object actPrevious: TAction + Caption = 'Previous' + OnExecute = actPreviousExecute + end + end +end diff --git a/Dummy JSON demos/Products/DummyJson.Products.MainForm.pas b/Dummy JSON demos/Products/DummyJson.Products.MainForm.pas new file mode 100644 index 0000000..3ddbd6c --- /dev/null +++ b/Dummy JSON demos/Products/DummyJson.Products.MainForm.pas @@ -0,0 +1,100 @@ +unit DummyJson.Products.MainForm; + +interface + +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, System.UITypes, System.Actions, + Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ActnList, + + DummyJson.Lib.Enumerator, DummyJson.ProductsDTO; + +type + TMainForm = class(TForm) + LabelBrand: TLabel; + LabelCategory: TLabel; + LabelDescription: TLabel; + LabelDiscountPercentage: TLabel; + LabelId: TLabel; + LabelPrice: TLabel; + LabelRating: TLabel; + LabelStock: TLabel; + LabelThumbnail: TLabel; + LabelTitle: TLabel; + EditBrand: TEdit; + EditCategory: TEdit; + EditDescription: TMemo; + EditDiscountPercentage: TEdit; + EditId: TEdit; + EditPrice: TEdit; + EditRating: TEdit; + EditStock: TEdit; + EditThumbnail: TEdit; + EditTitle: TEdit; + Button1: TButton; + Button2: TButton; + ActionList1: TActionList; + actNext: TAction; + actPrevious: TAction; + procedure actNextExecute(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure actPreviousExecute(Sender: TObject); + private + { Private declarations } + FListeEumerator: TListeEumerator; + procedure ListeEumeratorChanged(Sender: TObject); + public + { Public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +uses + DummyJson.Lib.DTODownloader; + +{$R *.dfm} + +procedure TMainForm.actNextExecute(Sender: TObject); +begin + FListeEumerator.Next; +end; + +procedure TMainForm.actPreviousExecute(Sender: TObject); +begin + FListeEumerator.Previous; +end; + +procedure TMainForm.FormCreate(Sender: TObject); +const + Url = 'https://dummyjson.com/products'; +var + ProductsDTO: TProductsDTO; +begin + ProductsDTO := DTODownloader.GetDTO(Url); + FListeEumerator := TListeEumerator.Create(Self, ProductsDTO, ProductsDTO.Products); + FListeEumerator.OnChange := ListeEumeratorChanged; +end; + +procedure TMainForm.ListeEumeratorChanged(Sender: TObject); +var + Product: TProduct; +begin + Product := FListeEumerator.Current; + if Product = nil then + Exit; + + EditBrand.Text := Product.Brand; + EditCategory.Text := Product.Category; + EditDescription.Text := Product.Description; + EditDiscountPercentage.Text := Product.DiscountPercentage.ToString; + EditId.Text := Product.Id.ToString; + EditPrice.Text := Product.Price.ToString; + EditRating.Text := Product.Rating.ToString; + EditStock.Text := Product.Stock.ToString; + EditThumbnail.Text := Product.Thumbnail; + EditTitle.Text := Product.Title; +end; + +end. diff --git a/Dummy JSON demos/Products/ProductsDemo.delphilsp.json b/Dummy JSON demos/Products/ProductsDemo.delphilsp.json new file mode 100644 index 0000000..27ddbcf --- /dev/null +++ b/Dummy JSON demos/Products/ProductsDemo.delphilsp.json @@ -0,0 +1 @@ +{ "settings": { "project": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Products/ProductsDemo.dpr", "dllname": "dcc32290.dll", "dccOptions": "-$D0 -$L- -$Y- --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DRELEASE;;FRAMEWORK_VCL -E.\\Win32\\Release -I\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Bpl -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NU.\\Win32\\Release -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell; -O\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -R\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -U\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\hpp\\Win32 -NO.\\Win32\\Release -LU" , "projectFiles":[ { "name": "DummyJson.Products.MainForm", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Products/DummyJson.Products.MainForm.pas" }, { "name": "DummyJson.ProductsDTO", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/DTO/DummyJson.ProductsDTO.pas" }, { "name": "Pkg.Json.DTO", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Lib/Pkg.Json.DTO.pas" }, { "name": "DummyJson.Lib.Enumerator", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Lib/DummyJson.Lib.Enumerator.pas" }, { "name": "DummyJson.Lib.DTODownloader", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Dummy%20JSON%20demos/Lib/DummyJson.Lib.DTODownloader.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/FlatBox2D" ] , "CommonAppData": "file:///C%3A/Users/Jens%20Borrisholt/AppData/Roaming/Embarcadero/BDS/23.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/ObjRepos/" } } \ No newline at end of file diff --git a/Dummy JSON demos/Products/ProductsDemo.dpr b/Dummy JSON demos/Products/ProductsDemo.dpr new file mode 100644 index 0000000..f4ad511 --- /dev/null +++ b/Dummy JSON demos/Products/ProductsDemo.dpr @@ -0,0 +1,20 @@ +program ProductsDemo; + +uses + Vcl.Forms, + DummyJson.Products.MainForm in 'DummyJson.Products.MainForm.pas' {MainForm}, + DummyJson.ProductsDTO in '..\DTO\DummyJson.ProductsDTO.pas', + Pkg.Json.DTO in '..\Lib\Pkg.Json.DTO.pas', + DummyJson.Lib.Enumerator in '..\Lib\DummyJson.Lib.Enumerator.pas', + DummyJson.Lib.DTODownloader in '..\Lib\DummyJson.Lib.DTODownloader.pas'; + +{$R *.res} + +begin + ReportMemoryLeaksOnShutdown := True; + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TMainForm, MainForm); + Application.Run; + +end. diff --git a/Dummy JSON demos/Products/ProductsDemo.dproj b/Dummy JSON demos/Products/ProductsDemo.dproj new file mode 100644 index 0000000..731bc8d --- /dev/null +++ b/Dummy JSON demos/Products/ProductsDemo.dproj @@ -0,0 +1,1124 @@ + + + {56C785AE-6F9E-40DC-9748-7A136234AD23} + 20.1 + VCL + True + Release + Win32 + 3 + Application + ProductsDemo.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + ProductsDemo + + + vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;Skia.Package.FMX;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;RFindUnit;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + PerMonitorV2 + + + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + PerMonitorV2 + + + PerMonitorV2 + + + + MainSource + + +
MainForm
+ dfm +
+ + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Application + + + + ProductsDemo.dpr + + + + + + ProductsDemo.exe + true + + + + + ProductsDemo.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + True + True + + + 12 + + + + +
diff --git a/End To End Test/DelphiBuilderU.pas b/End To End Test/DelphiBuilderU.pas new file mode 100644 index 0000000..ee10c14 --- /dev/null +++ b/End To End Test/DelphiBuilderU.pas @@ -0,0 +1,140 @@ +unit DelphiBuilderU; + +interface + +uses + Classes; + +Type + DelphiBuilder = class + protected + class function GetDelphiInstallPath: string; + class procedure CaptureConsoleOutput(const lpCommandLine: string; OutPutList: TStrings); + public + class procedure CompileProject(Console: TStrings; const ProjectFile: string); + end; + +implementation + +uses + System.SysUtils, WinApi.ShellAPI, WinApi.Windows, System.Win.Registry, RegistryHelperU; +{ TDelphiBuilder } + +class procedure DelphiBuilder.CaptureConsoleOutput(const lpCommandLine: string; OutPutList: TStrings); +const + ReadBuffer = 1024 * 1024; +var + lpPipeAttributes: TSecurityAttributes; + ReadPipe: THandle; + WritePipe: THandle; + lpStartupInfo: TStartUpInfo; + lpProcessInformation: TProcessInformation; + Buffer: PAnsiChar; + TotalBytesRead: DWORD; + BytesRead: DWORD; + Apprunning: integer; + n: integer; + BytesLeftThisMessage: integer; + TotalBytesAvail: integer; +begin + with lpPipeAttributes do + begin + nlength := SizeOf(TSecurityAttributes); + binherithandle := True; + lpsecuritydescriptor := nil; + end; + + if not CreatePipe(ReadPipe, WritePipe, @lpPipeAttributes, 0) then + exit; + + try + Buffer := AllocMem(ReadBuffer + 1); + try + ZeroMemory(@lpStartupInfo, SizeOf(lpStartupInfo)); + lpStartupInfo.cb := SizeOf(lpStartupInfo); + lpStartupInfo.hStdOutput := WritePipe; + lpStartupInfo.hStdInput := ReadPipe; + lpStartupInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; + lpStartupInfo.wShowWindow := SW_HIDE; + + OutPutList.Add(lpCommandLine); + if CreateProcess(nil, PChar(lpCommandLine), @lpPipeAttributes, @lpPipeAttributes, True, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS, nil, nil, lpStartupInfo, lpProcessInformation) then + begin + try + n := 0; + TotalBytesRead := 0; + repeat + Inc(n); + Apprunning := WaitForSingleObject(lpProcessInformation.hProcess, 100); + + if not PeekNamedPipe(ReadPipe, @Buffer[TotalBytesRead], ReadBuffer, @BytesRead, @TotalBytesAvail, @BytesLeftThisMessage) then + break + else if BytesRead > 0 then + ReadFile(ReadPipe, Buffer[TotalBytesRead], BytesRead, BytesRead, nil); + + // Inc(TotalBytesRead, BytesRead); + + Buffer[BytesRead] := #0; + OemToAnsi(Buffer, Buffer); + OutPutList.Text := OutPutList.Text + string(Buffer); + + until (Apprunning <> WAIT_TIMEOUT) or (n > 150); + + { + Buffer[TotalBytesRead] := #0; + OemToAnsi(Buffer, Buffer); + OutPutList.Text := OutPutList.Text + String(Buffer); + } + finally + CloseHandle(lpProcessInformation.hProcess); + CloseHandle(lpProcessInformation.hThread); + end; + end; + finally + FreeMem(Buffer); + end; + finally + CloseHandle(ReadPipe); + CloseHandle(WritePipe); + end; +end; + +class procedure DelphiBuilder.CompileProject(Console: TStrings; const ProjectFile: string); +var + Path: string; +begin + Console.Add(''); + with TStringList.Create do + try + LoadFromFile(GetDelphiInstallPath + 'rsvars.bat'); + Path := ExtractFilePath(ProjectFile); + Add(Format('msbuild.exe "%s"', [ProjectFile])); + SaveToFile(Path + 'Build.bat'); + finally + Free; + end; + + CaptureConsoleOutput(Path + 'Build.bat', Console); + Console.Add(''); + DeleteFile(PChar(Path + 'Build.bat')); +end; + +class function DelphiBuilder.GetDelphiInstallPath: string; +var + RegKey: String; + Filename: string; + Found: boolean; +begin + RegKey := '\Software\Embarcadero\BDS\' + FloatToStr(CompilerVersion - 13) + '.0'; + Found := RegKeyExists(RegKey, HKEY_CURRENT_USER); + if Found then + Found := RegReadStr(RegKey, 'App', Filename, HKEY_CURRENT_USER) and FileExists(Filename); + + if not Found then + if RegKeyExists(RegKey, HKEY_LOCAL_MACHINE) then + RegReadStr(RegKey, 'App', Filename, HKEY_LOCAL_MACHINE); + + Result := ExtractFilePath(Filename); +end; + +end. diff --git a/End To End Test/EndToEndTest.delphilsp.json b/End To End Test/EndToEndTest.delphilsp.json new file mode 100644 index 0000000..a7330f1 --- /dev/null +++ b/End To End Test/EndToEndTest.delphilsp.json @@ -0,0 +1 @@ +{ "settings": { "project": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/End%20To%20End%20Test/EndToEndTest.dpr", "dllname": "dcc32290.dll", "dccOptions": "-$O- -$W+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win32\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\debug\";\"../Demo Generator/\";../Lib/;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Bpl -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NU.\\Win32\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap; -O\"../Demo Generator/\";../Lib/;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -R\"../Demo Generator/\";../Lib/;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -U\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\debug\";\"../Demo Generator/\";../Lib/;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\" -CC -V -VN -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\hpp\\Win32 -NO.\\Win32\\Debug -W-DUPLICATE_CTOR_DTOR -LU" , "projectFiles":[ { "name": "DemoProject", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Demo%20Generator/DemoProject.rc" }, { "name": "JSON_PAS", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/JSON_PAS.rc" }, { "name": "System.Console", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/End%20To%20End%20Test/System.Console.pas" }, { "name": "DelphiBuilderU", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/End%20To%20End%20Test/DelphiBuilderU.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/FlatBox2D","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Generator%20GUI/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Demo%20Generator/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Components/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/DTO/GitHUB/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Unit%20Test/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Generator%20LIB/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/" ] , "CommonAppData": "file:///C%3A/Users/Jens%20Borrisholt/AppData/Roaming/Embarcadero/BDS/23.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/ObjRepos/" } } \ No newline at end of file diff --git a/End To End Test/EndToEndTest.dpr b/End To End Test/EndToEndTest.dpr new file mode 100644 index 0000000..aa32897 --- /dev/null +++ b/End To End Test/EndToEndTest.dpr @@ -0,0 +1,108 @@ +program EndToEndTest; + +{$APPTYPE CONSOLE} +{$R *.res} +{$R 'DemoProject.res' '..\Demo Generator\DemoProject.rc'} +{$R 'JSON_PAS.res' '..\Lib\JSON_PAS.rc'} + +uses + Winapi.Windows, + Winapi.ShellAPI, + System.SysUtils, + System.IOUtils, + System.Classes, + System.Console in 'System.Console.pas', + Pkg.Json.Mapper, + Pkg.Json.DemoGenerator, + DelphiBuilderU in 'DelphiBuilderU.pas'; + +const + DemoDataRoot = '../../../Demo Data/'; + +var + FullFileName, FileName: TFileName; + s, OutputDirectory: String; + JsonMapper: TPkgJsonMapper; + OutputBuffer: TStringlist; + Sucess: boolean; + +begin + Console.ForegroundColor := TConsoleColor.White; + + try + s := FormatDateTime('yyyymmdd-hhnnns', now); + JsonMapper := TPkgJsonMapper.Create; + OutputBuffer := TStringlist.Create; + + for FullFileName in TDirectory.GetFiles(DemoDataRoot, '*.json') do + begin + OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; + TDirectory.CreateDirectory(OutputDirectory); + + FileName := TPath.GetFileName(FullFileName).Replace('.json', ''); + Console.Write('* Building E2E Test for %s ... ', [FileName]); + + with TDemoGenerator.Create(FullFileName) do + try + DestinationClassName := string(FileName).Replace(#32, ''); + DestinationUnitName := JsonMapper.DestinationClassName; + + RootDirectory := OutputDirectory; + DestinationFrameWork := TDestinationFrameWork.dfVCL; + Execute; + OutputDirectory := DestinationDirectory; + finally + Free; + end; + + OutputBuffer.Clear; + DelphiBuilder.CompileProject(OutputBuffer, OutputDirectory + 'VCL\Demo.dproj'); + + FileName := OutputDirectory + 'Win32\Release\Demo.exe'; + Sucess := TFile.Exists(FileName); + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Green; + Console.WriteLine('Sucess!'); + end + else + begin + Console.ForegroundColor := TConsoleColor.Red; + Console.WriteLine('Failed!'); + end; + + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Blue; + Console.Write(' Launching [%s] demo ... ', [TPath.GetFileName(FullFileName).Replace('.json', '')]); + + Sucess := ShellExecute(0, 'OPEN', Pchar(FileName), '', Pchar(TPath.GetDirectoryName(FileName)), SW_SHOWNORMAL) > 32; + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Green; + Console.WriteLine('Sucess!'); + end + else + begin + Console.ForegroundColor := TConsoleColor.Red; + Console.WriteLine('Failed!'); + end; + end; + + Console.ForegroundColor := TConsoleColor.White; + Console.WriteLine(''); + end; + + Console.ForegroundColor := TConsoleColor.White; + Console.WriteLine('Press any key to continue ...'); + Console.ReadLine; + OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; + + ShellExecute(0, 'OPEN', Pchar(OutputDirectory), '', '', SW_SHOWNORMAL); + OutputBuffer.Free; + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; + +end. diff --git a/End To End Test/EndToEndTest.dproj b/End To End Test/EndToEndTest.dproj new file mode 100644 index 0000000..628c6d6 --- /dev/null +++ b/End To End Test/EndToEndTest.dproj @@ -0,0 +1,1103 @@ + + + {B28DDA19-BBFB-4F36-B6BE-A7A994625A1E} + 20.1 + FMX + True + Debug + Win32 + 1 + Console + EndToEndTest.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + EndToEndTest + ../Demo Generator/;../Lib/;$(DCC_UnitSearchPath) + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + false + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + (None) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + +
DemoProject.res
+
+ +
JSON_PAS.res
+
+ + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Application + + + + EndToEndTest.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + True + False + + + + + true + + + + + true + + + + + true + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + 12 + + + + +
diff --git a/End To End Test/RegistryHelperU.pas b/End To End Test/RegistryHelperU.pas new file mode 100644 index 0000000..328646a --- /dev/null +++ b/End To End Test/RegistryHelperU.pas @@ -0,0 +1,113 @@ +unit RegistryHelperU; + +interface + +uses + Winapi.Windows; + +function RegReadStr(const RegPath, RegValue: string; var StrValue: string; const RootKey: HKEY): boolean; +function RegReadInt(const RegPath, RegValue: string; var IntValue: integer; const RootKey: HKEY): boolean; +function RegWriteStr(const RegPath, RegValue: string; const StrValue: string; const RootKey: HKEY): boolean; +function RegWriteInt(const RegPath, RegValue: string; IntValue: integer; const RootKey: HKEY): boolean; +function RegKeyExists(const RegPath: string; const RootKey: HKEY): boolean; + +implementation + +uses + System.Win.Registry; + +function RegWriteStr(const RegPath, RegValue: string; const StrValue: string; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + Reg.WriteString(RegValue, StrValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegReadStr(const RegPath, RegValue: string; var StrValue: string; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + StrValue := Reg.ReadString(RegValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegWriteInt(const RegPath, RegValue: string; IntValue: integer; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + Reg.WriteInteger(RegValue, IntValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegReadInt(const RegPath, RegValue: string; var IntValue: integer; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + IntValue := Reg.ReadInteger(RegValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegKeyExists(const RegPath: string; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.KeyExists(RegPath); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +end. + diff --git a/End To End Test/System.Console.pas b/End To End Test/System.Console.pas new file mode 100644 index 0000000..345d862 --- /dev/null +++ b/End To End Test/System.Console.pas @@ -0,0 +1,1415 @@ +unit System.Console; + +interface + +uses + SysUtils, Classes, + {$IF CompilerVersion >= 22} + UITypes, Winapi.Windows, + {$ELSE} + Windows, + {$IFEND} + Types; + +{$M+} +{$IFDEF CONDITIONALEXPRESSIONS} +{$IF RTLVersion >= 14.0} +{$DEFINE HASERROUTPUT} +{$IFEND} +{$ENDIF} +{$WARN SYMBOL_PLATFORM OFF} +{$SCOPEDENUMS ON} + +const + Int16_MaxValue = 32767; +{$IF CompilerVersion <= 2500} //Delphi XE4 +const + { Virtual Keys, Standard Set } + vkLButton = $01; { 1 } + vkRButton = $02; { 2 } + vkCancel = $03; { 3 } + vkMButton = $04; { 4 } + vkXButton1 = $05; { 5 } + vkXButton2 = $06; { 6 } + vkBack = $08; { 8 } + vkTab = $09; { 9 } + vkLineFeed = $0A; { 10 } + vkClear = $0C; { 12 } + vkReturn = $0D; { 13 } + vkShift = $10; { 16 } + vkControl = $11; { 17 } + vkMenu = $12; { 18 } + vkPause = $13; { 19 } + vkCapital = $14; { 20 } + vkKana = $15; { 21 } + vkHangul = $15; { 21 } + vkJunja = $17; { 23 } + vkFinal = $18; { 24 } + vkHanja = $19; { 25 } + vkKanji = $19; { 25 } + vkConvert = $1C; { 28 } + vkNonConvert = $1D; { 29 } + vkAccept = $1E; { 30 } + vkModeChange = $1F; { 31 } + vkEscape = $1B; { 27 } + vkSpace = $20; { 32 } + vkPrior = $21; { 33 } + vkNext = $22; { 34 } + vkEnd = $23; { 35 } + vkHome = $24; { 36 } + vkLeft = $25; { 37 } + vkUp = $26; { 38 } + vkRight = $27; { 39 } + vkDown = $28; { 40 } + vkSelect = $29; { 41 } + vkPrint = $2A; { 42 } + vkExecute = $2B; { 43 } + vkSnapshot = $2C; { 44 } + vkInsert = $2D; { 45 } + vkDelete = $2E; { 46 } + vkHelp = $2F; { 47 } + { vk0 thru vk9 are the same as ASCII '0' thru '9' ($30 - $39) } + vk0 = $30; { 48 } + vk1 = $31; { 49 } + vk2 = $32; { 50 } + vk3 = $33; { 51 } + vk4 = $34; { 52 } + vk5 = $35; { 53 } + vk6 = $36; { 54 } + vk7 = $37; { 55 } + vk8 = $38; { 56 } + vk9 = $39; { 57 } + { vkA thru vkZ are the same as ASCII 'A' thru 'Z' ($41 - $5A) } + vkA = $41; { 65 } + vkB = $42; { 66 } + vkC = $43; { 67 } + vkD = $44; { 68 } + vkE = $45; { 69 } + vkF = $46; { 70 } + vkG = $47; { 71 } + vkH = $48; { 72 } + vkI = $49; { 73 } + vkJ = $4A; { 74 } + vkK = $4B; { 75 } + vkL = $4C; { 76 } + vkM = $4D; { 77 } + vkN = $4E; { 78 } + vkO = $4F; { 79 } + vkP = $50; { 80 } + vkQ = $51; { 81 } + vkR = $52; { 82 } + vkS = $53; { 83 } + vkT = $54; { 84 } + vkU = $55; { 85 } + vkV = $56; { 86 } + vkW = $57; { 87 } + vkX = $58; { 88 } + vkY = $59; { 89 } + vkZ = $5A; { 90 } + vkLWin = $5B; { 91 } + vkRWin = $5C; { 92 } + vkApps = $5D; { 93 } + vkSleep = $5F; { 95 } + vkNumpad0 = $60; { 96 } + vkNumpad1 = $61; { 97 } + vkNumpad2 = $62; { 98 } + vkNumpad3 = $63; { 99 } + vkNumpad4 = $64; { 100 } + vkNumpad5 = $65; { 101 } + vkNumpad6 = $66; { 102 } + vkNumpad7 = $67; { 103 } + vkNumpad8 = $68; { 104 } + vkNumpad9 = $69; { 105 } + vkMultiply = $6A; { 106 } + vkAdd = $6B; { 107 } + vkSeparator = $6C; { 108 } + vkSubtract = $6D; { 109 } + vkDecimal = $6E; { 110 } + vkDivide = $6F; { 111 } + vkF1 = $70; { 112 } + vkF2 = $71; { 113 } + vkF3 = $72; { 114 } + vkF4 = $73; { 115 } + vkF5 = $74; { 116 } + vkF6 = $75; { 117 } + vkF7 = $76; { 118 } + vkF8 = $77; { 119 } + vkF9 = $78; { 120 } + vkF10 = $79; { 121 } + vkF11 = $7A; { 122 } + vkF12 = $7B; { 123 } + vkF13 = $7C; { 124 } + vkF14 = $7D; { 125 } + vkF15 = $7E; { 126 } + vkF16 = $7F; { 127 } + vkF17 = $80; { 128 } + vkF18 = $81; { 129 } + vkF19 = $82; { 130 } + vkF20 = $83; { 131 } + vkF21 = $84; { 132 } + vkF22 = $85; { 133 } + vkF23 = $86; { 134 } + vkF24 = $87; { 135 } + + vkCamera = $88; { 136 } + vkHardwareBack = $89; { 137 } + + vkNumLock = $90; { 144 } + vkScroll = $91; { 145 } + vkLShift = $A0; { 160 } + vkRShift = $A1; { 161 } + vkLControl = $A2; { 162 } + vkRControl = $A3; { 163 } + vkLMenu = $A4; { 164 } + vkRMenu = $A5; { 165 } + + vkBrowserBack = $A6; { 166 } + vkBrowserForward = $A7; { 167 } + vkBrowserRefresh = $A8; { 168 } + vkBrowserStop = $A9; { 169 } + vkBrowserSearch = $AA; { 170 } + vkBrowserFavorites = $AB; { 171 } + vkBrowserHome = $AC; { 172 } + vkVolumeMute = $AD; { 173 } + vkVolumeDown = $AE; { 174 } + vkVolumeUp = $AF; { 175 } + vkMediaNextTrack = $B0; { 176 } + vkMediaPrevTrack = $B1; { 177 } + vkMediaStop = $B2; { 178 } + vkMediaPlayPause = $B3; { 179 } + vkLaunchMail = $B4; { 180 } + vkLaunchMediaSelect= $B5; { 181 } + vkLaunchApp1 = $B6; { 182 } + vkLaunchApp2 = $B7; { 183 } + + vkSemicolon = $BA; { 186 } + vkEqual = $BB; { 187 } + vkComma = $BC; { 188 } + vkMinus = $BD; { 189 } + vkPeriod = $BE; { 190 } + vkSlash = $BF; { 191 } + vkTilde = $C0; { 192 } + vkLeftBracket = $DB; { 219 } + vkBackslash = $DC; { 220 } + vkRightBracket = $DD; { 221 } + vkQuote = $DE; { 222 } + vkPara = $DF; { 223 } + + vkOem102 = $E2; { 226 } + vkIcoHelp = $E3; { 227 } + vkIco00 = $E4; { 228 } + vkProcessKey = $E5; { 229 } + vkIcoClear = $E6; { 230 } + vkPacket = $E7; { 231 } + vkAttn = $F6; { 246 } + vkCrsel = $F7; { 247 } + vkExsel = $F8; { 248 } + vkErEof = $F9; { 249 } + vkPlay = $FA; { 250 } + vkZoom = $FB; { 251 } + vkNoname = $FC; { 252 } + vkPA1 = $FD; { 253 } + vkOemClear = $FE; { 254 } + vkNone = $FF; { 255 } + {$IFEND} + + +type + ECOnsoleError = class(Exception); + TConsoleColor = ( + Black, + DarkBlue, + DarkGreen, + DarkCyan, + DarkRed, + DarkMagenta, + DarkYellow, + Gray, + DarkGray, + Blue, + Green, + Cyan, + Red, + Magenta, + Yellow, + White + ); + + TConsoleKey = ( + Backspace = vkBack, Tab = vkTab, Clear = vkClear, Enter = vkReturn, Pause = vkPause, Escape = vkEscape, Spacebar = vkSpace, + PageUp = vkPrior, PageDown = vkNext, &End = vkEnd, Home = vkHome, LeftArrow = vkLeft, UpArrow = vkUp, RightArrow = vkRight, + DownArrow = vkDown, Select = vkSelect, Print = vkPrint, Execute = vkExecute, PrintScreen = vkSnapshot, Insert = vkInsert, Delete = vkDelete, + Help = vkHelp, + + D0 = vk0, D1 = vk1, D2 = vk2, D3 = vk3, D4 = vk4, D5 = vk5, D6 = vk6, D7 = vk7, D8 = vk8, D9 = vk9, + A = vkA, B = vkB, C = vkC, D = vkD, E = vkE, F = vkF, G = vkG, H = vkH, I = vkI, J = vkJ, + K = vkK, L = vkL, M = vkM, N = vkN, O = vkO, P = vkP, Q = vkQ, R = vkR, S = vkS, T = vkT, + U = vkU, V = vkV, W = vkW, X = vkX, Y = vkY, Z = vkZ, + + LeftWindows = vkLWin, RightWindows = vkRWin, Applications = vkApps, Sleep = vkSleep, + Multiply = vkMultiply, Add = vkAdd, Separator = vkSeparator, Subtract = vkSubtract, Decimal = vkDecimal, Divide = vkDivide, + + NumPad0 = vkNumpad0, NumPad1 = vkNumpad1, NumPad2 = vkNumpad2, NumPad3 = vkNumpad3, NumPad4 = vkNumpad4, + NumPad5 = vkNumpad5, NumPad6 = vkNumpad6, NumPad7 = vkNumpad7, NumPad8 = vkNumpad8, NumPad9 = vkNumpad9, + + + F1 = vkF1, F2 = vkF2, F3 = vkF3, F4 = vkF4, F5 = vkF5, F6 = vkF6, F7 = vkF7, F8 = vkF8, F9 = vkF9, + F10 = vkF10, F11 = vkF11, F12 = vkF12, F13 = vkF13, F14 = vkF14, F15 = vkF15, F16 = vkF16, F17 = vkF17, F18 = vkF18, + F19 = vkF19, F20 = vkF20, F21 = vkF21, F22 = vkF22, F23 = vkF23, F24 = vkF24, + + BrowserBack = vkBrowserBack, BrowserForward = vkBrowserForward, BrowserRefresh = vkBrowserRefresh, BrowserStop = vkBrowserStop, + BrowserSearch = vkBrowserSearch, BrowserFavorites = vkBrowserFavorites, BrowserHome = vkBrowserHome, VolumeMute = vkVolumeMute, + VolumeDown = vkVolumeDown, VolumeUp = vkVolumeUp, MediaNext = vkMediaNextTrack, MediaPrevious = vkMediaPrevTrack, + MediaStop = vkMediaStop, MediaPlay = vkMediaPlayPause, LaunchMail = vkLaunchMail, LaunchMediaSelect = vkLaunchMediaSelect, + LaunchApp1 = vkLaunchApp1, LaunchApp2 = vkLaunchApp2, Oem1 = vkSemicolon, OemPlus = vkEqual, + OemComma = vkComma, OemMinus = vkMinus, OemPeriod = vkPeriod, Oem2 = vkSlash, + Oem3 = vkTilde, Oem4 = vkLeftBracket, Oem5 = vkBackslash, Oem6 = vkRightBracket, + Oem7 = vkQuote, Oem8 = vkPara, Oem102 = vkOem102, + + Process = vkProcessKey, Packet = vkPacket, Attention = vkAttn, CrSel = vkCrsel, + ExSel = vkExsel, EraseEndOfFile = vkErEof, Play = vkPlay, Zoom = vkZoom, + NoName = vkNoname, Pa1 = vkPA1, OemClear = vkOemClear + ); + + TConsoleModifiers = (Alt, Shift, Control); + + TConsoleModifiersSet = set of TConsoleModifiers; + + TConsoleKeyInfo = record + strict private + FKey: TConsoleKey; + FKeyChar: Char; + FMods: TConsoleModifiersSet; + public + property Key: TConsoleKey read FKey write FKey; + property KeyChar: Char read FKeyChar write FKeyChar; + property Modifiers: TConsoleModifiersSet read FMods; + end; + + TCONSOLE_FONT_INFOEX = record + cbSize: Cardinal; + nFont: LongWord; + dwFontSize: COORD; + FontFamily: Cardinal; + FontWeight: Cardinal; + FaceName: array [0 .. LF_FACESIZE - 1] of WideChar; + end; + + pCONSOLE_FONT_INFOEX = ^TCONSOLE_FONT_INFOEX; + + TFontFamily = + ( + ffDontCare = FF_DONTCARE, + Roman = FF_ROMAN, + Swiss = FF_SWISS, + Modern = FF_MODERN, + Script = FF_SCRIPT, + Decorative = FF_DECORATIVE + ); + + TFontWeight = + ( + fwDontCare = FW_DONTCARE, + Thin = FW_THIN, + ExtraLight = FW_EXTRALIGHT, + Normal = FW_NORMAL, + Medium = FW_MEDIUM, + SemiBold = FW_SEMIBOLD, + Bold = FW_BOLD, + ExtraBold = FW_EXTRABOLD, + Heavy = FW_HEAVY, + UltraLight = FW_ULTRALIGHT, + Regular = FW_NORMAL, + DemiBold = FW_SEMIBOLD, + UltraBold = FW_EXTRABOLD, + Black = FW_HEAVY + ); + + TWinColor = + ( + colBackgroundBlue = $10, + colBackgroundGreen = $20, + colBackgroundRed = $40, + colBackgroundYellow = $60, + colBackgroundIntensity = $80, + colBackgroundMask = $F0, + colBlack = $00, + + colColorMask = $FF, + colForegroundBlue = 1, + colForegroundGreen = 2, + colForegroundRed = 4, + colForegroundYellow = 6, + colForegroundIntensity = 8, + colForegroundMask = 15 + ); + Console = class + private + class var DefaultTextAttributes: Word; + class var FScreenSize: TCoord; + class var FTextWindow: TRect; + class var StdErr: THandle; + class var StdIn: THandle; + class var StdOut: THandle; + class var TextAttr: Word; + class var FAutoAllocateConsole : Boolean; + + class procedure RaiseConsoleError(aCaller : String); + class function ConsoleColorToColorAttribute(ConsoleColor: TConsoleColor; IsBackground: Boolean): TWinColor; static; + class function ConsoleCursorInfo: TConsoleCursorInfo; + class function ConsoleRect: TRect; + class function GetBufferInfo: TConsoleScreenBufferInfo; static; + class function CanGetBufferInfo: Boolean; static; + class function GetConsoleOutputHandle: THandle; static; + class procedure GotoXY(X, Y: SmallInt); + class procedure ScrollScreenBuffer(Left, Top, Right, Bottom: Integer; Distance: Integer = 0); + class procedure SetConsoleOutputHandle(const Value: THandle); static; + class procedure SetConsoleRect(Rect: TRect); + class function WriteString(aValue: string): Cardinal; inline; + class function GenericToString(aValue: T): string; + class function GetConsoleRedirected(const Index: Integer): Boolean; static; + class function GetBackgroundColor: TConsoleColor; static; + class procedure SetBackgroundColor(const Value: TConsoleColor); static; + class function GetForegroundColor: TConsoleColor; static; + class procedure SetForegroundColor(const Value: TConsoleColor); static; + class function GetBufferHeight: Integer; static; + class procedure SetBufferHeight(const Value: Integer); static; + class function GetBufferWidth: Integer; static; + class procedure SetBufferWidth(const Value: Integer); static; + class function GetLargestWindowWidth: Integer; static; + class function GetLargestWindowHeight: Integer; static; + class function GetWindowLeft: Integer; static; + class procedure SetWindowLeft(const Value: Integer); static; + class function GetWindowTop: Integer; static; + class procedure SetWindowTop(const Value: Integer); static; + class function GetCursorLeft: Integer; static; + class procedure SetCursorLeft(const Value: Integer); static; + class function GetCursorTop: Integer; static; + class procedure SetCursorTop(const Value: Integer); static; + class function GetCursorSize: Integer; static; + class procedure SetCursorSize(const Value: Integer); static; + class function GetCursorVisible: Boolean; static; + class procedure SetCursorVisible(const Value: Boolean); static; + class function GetTitle: string; static; + class procedure SetTitle(const Value: string); static; + class function GetKeyAvailable: Boolean; static; + class function GetKey(const Index: Integer): Boolean; static; + class function GetTreatControlCAsInput: Boolean; static; + class procedure SetTreatControlCAsInput(const Value: Boolean); static; + class function GetConsoleInputHandle: Integer; static; + class procedure SetConsoleInputHandle(const Value: Integer); static; + class function GetBufferSize: TCoord; static; + class procedure SetBufferSize(const Value: TCoord); overload; static; + class function GetWindowWidth: Integer; static; + class procedure SetWindowWidth(const Value: Integer); static; + class function GetWindowHeight: Integer; static; + class procedure SetWindowHeight(const Value: Integer); static; + class function GetOutputEncoding: DWORD; static; + class procedure SetOutputEncoding(const Value: DWORD); static; + class function GetConsoleFont: TCONSOLE_FONT_INFOEX; static; + class procedure SetConsoleFont(const Value: TCONSOLE_FONT_INFOEX); static; + public + // Not implemented + // class function OpenStandardError(BufferSize: Integer): TStream; overload; static; + // class function OpenStandardError: TStream; overload; static; + // class function OpenStandardInput(BufferSize: Integer): TStream; overload; static; + // class function OpenStandardInput: TStream; overload; static; + // class function OpenStandardOutput(BufferSize: Integer): TStream; overload; static; + // class function OpenStandardOutput: TStream; overload; static; + // class procedure SetError(NewError: TTextWriter); static; + // class procedure SetIn(NewIn: TTextReader); static; + // Class procedure SetOut(NewOut: TTextWriter); static; + + // Initialize + class constructor Create; + class destructor Destroy; + class function AttatchConsole : Boolean; + class procedure AllocateConsole; + class procedure FreeConsole; + // Methods + class procedure Beep(Frequency, Duration: Cardinal); overload; static; + class procedure Beep; overload; static; + class procedure Clear; static; + class procedure ClearEOL; static; + class procedure DeleteLine; + class procedure InsertLine; + class procedure MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer); overload; + class procedure MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer; SourceChar: Char; SourceForeColor, SourceBackColor: TConsoleColor); overload; + class function Read: Integer; static; + class function ReadKey(Intercept: Boolean): TConsoleKeyInfo; overload; static; + class function ReadKey: TConsoleKeyInfo; overload; static; + class function ReadLine: string; static; + class procedure ResetColor; + class procedure SetCursorPosition(Left, Top: SmallInt); + class procedure SetBufferSize(Width, Height: Integer); overload; static; + class procedure SetWindowPosition(Left, Top: Integer); + class procedure SetWindowSize(Width, Height: Integer); static; + class procedure UpdateConsoleFont(aFontName: string = ''; aFontSize: Cardinal = 0; aFontFamily: TFontFamily = TFontFamily.ffDontCare; aFontWeight: TFontWeight = TFontWeight.fwDontCare); + class procedure Write(aValue: T); overload; static; + class procedure Write(Value: Variant; Args: array of const); overload; static; + class procedure WriteLine(aValue: T); overload; static; + class procedure WriteLine(FormatString: String; Args: array of Variant); overload; static; + class procedure WriteLine; overload; static; + + // properties + class property AutoAllocateConsole : Boolean read FAutoAllocateConsole write FAutoAllocateConsole; + class property BackgroundColor: TConsoleColor read GetBackgroundColor write SetBackgroundColor; + class property BufferHeight: Integer read GetBufferHeight write SetBufferHeight; + class property BufferSize: TCoord read GetBufferSize write SetBufferSize; + class property BufferWidth: Integer read GetBufferWidth write SetBufferWidth; + class property CapsLock: Boolean index VK_CAPITAL read GetKey; + class property ConsoleInputHandle: Integer read GetConsoleInputHandle write SetConsoleInputHandle; + class property ConsoleOutputHandle: THandle read GetConsoleOutputHandle write SetConsoleOutputHandle; + class property ConsoleFont: TCONSOLE_FONT_INFOEX read GetConsoleFont write SetConsoleFont; + class property CursorLeft: Integer read GetCursorLeft write SetCursorLeft; + class property CursorSize: Integer read GetCursorSize write SetCursorSize; + class property CursorTop: Integer read GetCursorTop write SetCursorTop; + class property CursorVisible: Boolean read GetCursorVisible write SetCursorVisible; + class property ForegroundColor: TConsoleColor read GetForegroundColor write SetForegroundColor; + class property IsErrorRedirected: Boolean index STD_ERROR_HANDLE read GetConsoleRedirected; + class property IsInputRedirected: Boolean index STD_INPUT_HANDLE read GetConsoleRedirected; + class property IsOutputRedirected: Boolean index STD_OUTPUT_HANDLE read GetConsoleRedirected; + class property KeyAvailable: Boolean read GetKeyAvailable; + class property LargestWindowWidth: Integer read GetLargestWindowWidth; + class property LargestWindowHeight: Integer read GetLargestWindowHeight; + class property OutputEncoding: DWORD read GetOutputEncoding write SetOutputEncoding; + + class property WindowHeight: Integer read GetWindowHeight write SetWindowHeight; + class property WindowWidth: Integer read GetWindowWidth write SetWindowWidth; + class property NumberLock: Boolean index VK_NUMLOCK read GetKey; + class property Title: string read GetTitle write SetTitle; + class property TreatControlCAsInput: Boolean read GetTreatControlCAsInput write SetTreatControlCAsInput; + class property WindowLeft: Integer read GetWindowLeft write SetWindowLeft; + class property WindowTop: Integer read GetWindowTop write SetWindowTop; + end; + +function AttachConsole(dwProcessId: DWORD): Bool; stdcall; external KERNEL32 name 'AttachConsole'; +function GetConsoleWindow: HWND; stdcall; external kernel32 name 'GetConsoleWindow'; +function GetCurrentConsoleFontEx(ConsoleOutput: THandle; MaximumWindow: BOOL; ConsoleInfo: pCONSOLE_FONT_INFOEX): BOOL; stdcall; external kernel32 name 'GetCurrentConsoleFontEx'; +function SetCurrentConsoleFontEx(ConsoleOutput: THandle; MaximumWindow: BOOL; ConsoleInfo: pCONSOLE_FONT_INFOEX): BOOL; stdcall; external kernel32 name 'SetCurrentConsoleFontEx'; + +implementation + +uses + StrUtils, RTTI, TypInfo; + +var + LockObject: TObject; + +function Lock(ALockObject: TObject; ATimeout: Cardinal = INFINITE): Boolean; +begin + Result := System.TMonitor.Enter(LockObject, ATimeout) +end; + +procedure Release(ALockObject: TObject; ATimeout: Cardinal = INFINITE); +begin + System.TMonitor.Exit(LockObject); +end; +{ Console } + +class function Console.AttatchConsole: Boolean; +const + ATTACH_PARENT_PROCESS : UINT = $0ffffffff; +begin + {$IFNDEF Win32} + if IsDebuggerPresent then + Exit(false); + (* + In the case of a 64-bit debug, it appears that the IDE is creating a console for the debugger, + which hosts the debugged application as a child, and so electing to attach to the parent console succeeds. + + This console is not created for a 32-bit debug session. + *) + {$ENDIF} + + Result := AttachConsole(ATTACH_PARENT_PROCESS); + if Result then + AllocateConsole; +end; + +class procedure Console.Beep; +begin + Beep; +end; + +class procedure Console.Beep(Frequency, Duration: Cardinal); +begin + {$IF CompilerVersion >= 23} + Winapi. + {$IFEND} + Windows.Beep(Frequency, Duration); +end; + +class procedure Console.Clear; +var + StartPos: TCoord; + Buffer : TConsoleScreenBufferInfo; + ConSize : Integer; + NumWritten: DWORD; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + Buffer := GetBufferInfo; + ConSize := Buffer.dwSize.X * Buffer.dwSize.Y; + StartPos.X := 0; + StartPos.y := 0; + + if not FillConsoleOutputCharacter(StdOut, ' ', ConSize, StartPos, NumWritten) then + RaiseConsoleError('FillConsoleOutputCharacter in Console.Clear'); + + NumWritten := 0; + + if not FillConsoleOutputAttribute(StdOut, Buffer.wAttributes, ConSize, StartPos, NumWritten) then + RaiseConsoleError('FillConsoleOutputAttribute in Console.Clear'); + + GotoXY(1, 1); +end; + +class procedure Console.ClearEOL; +var + Len: Integer; + Pos: TCoord; + NumWritten: DWORD; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + Pos := GetBufferInfo.dwCursorPosition; + if Pos.X > FTextWindow.Right then + Exit; + + Len := FTextWindow.Right - Pos.X + 1; + FillConsoleOutputCharacter(StdOut, ' ', Len, Pos, NumWritten); + FillConsoleOutputAttribute(StdOut, TextAttr, Len, Pos, NumWritten); +end; + +class function Console.ConsoleColorToColorAttribute(ConsoleColor: TConsoleColor; IsBackground: Boolean): TWinColor; +begin + if ((Integer(ConsoleColor) and not Integer(TConsoleColor.White)) <> Integer(TConsoleColor.Black)) then + raise EArgumentException.Create('InvalidConsoleColor'); + + Result := TWinColor(ConsoleColor); + + if (IsBackground) then + Result := TWinColor(SmallInt(Integer(Result) shl 4)); +end; + +class function Console.ConsoleCursorInfo: TConsoleCursorInfo; +begin + GetConsoleCursorInfo(ConsoleOutputHandle, Result); +end; + +class function Console.ConsoleRect: TRect; +begin + ZeroMemory(@Result, SizeOf(TRect)); + GetWindowRect(GetConsoleWindow, Result); +end; + +class function Console.GetConsoleRedirected(const Index: Integer): Boolean; +var + FileType: DWORD; +begin + FileType := GetFileType(GetStdHandle(index)); + Result := (FileType = FILE_TYPE_PIPE) or (FileType = FILE_TYPE_DISK); +end; + +class procedure Console.AllocateConsole; +var + BufferInfo: TConsoleScreenBufferInfo; +begin + if not System.Console.AttachConsole(DWORD(-1)) then + begin + if FAutoAllocateConsole then + AllocConsole + else + Exit; + end; + + StdIn := GetStdHandle(STD_INPUT_HANDLE); + StdOut := GetStdHandle(STD_OUTPUT_HANDLE); + StdErr := GetStdHandle(STD_ERROR_HANDLE); + + Reset(Input); + Rewrite(Output); + Rewrite(ErrOutput); + + TextAttr := GetBufferInfo.wAttributes and $FF; + DefaultTextAttributes := TextAttr; + + if not GetConsoleScreenBufferInfo(StdOut, BufferInfo) then + begin + SetInOutRes(GetLastError); + Exit; + end; + + FTextWindow.Left := 0; + FTextWindow.Top := 0; + FTextWindow.Right := BufferInfo.dwSize.X - 1; + FTextWindow.Bottom := BufferInfo.dwSize.Y - 1; + FScreenSize.X := BufferInfo.srWindow.Right - BufferInfo.srWindow.Left + 1; + FScreenSize.Y := BufferInfo.srWindow.Bottom - BufferInfo.srWindow.Top + 1; +end; + +class constructor Console.Create; +begin + StdIn := GetStdHandle(STD_INPUT_HANDLE); + StdOut := GetStdHandle(STD_OUTPUT_HANDLE); + StdErr := GetStdHandle(STD_ERROR_HANDLE); + FAutoAllocateConsole := True; + + if Console.CanGetBufferInfo then + Console.AllocateConsole; +end; + +class procedure Console.DeleteLine; +begin + ScrollScreenBuffer(FTextWindow.Left, GetBufferInfo.dwCursorPosition.Y, FTextWindow.Right, FTextWindow.Bottom, -1); +end; + +class destructor Console.Destroy; +begin + FreeConsole; +end; + +class procedure Console.FreeConsole; +begin + {$IF CompilerVersion >= 23} + Winapi. + {$IFEND} + Windows.FreeConsole; +end; + +class function Console.GenericToString(aValue: T): string; +var + ElementValue, Value: TValue; + Data: PTypeData; + I: Integer; + AContext: TRttiContext; + ARecord: TRttiRecordType; +begin + TValue.Make(@aValue, System.TypeInfo(T), Value); + + if Value.IsArray then + begin + if Value.GetArrayLength = 0 then + Exit('[ø]'); + + Result := '['; + + for I := 0 to Value.GetArrayLength - 1 do + begin + ElementValue := Value.GetArrayElement(I); + Result := Result + ElementValue.ToString + ','; + end; + + Result[Length(Result)] := ']'; + Exit; + end; + + Data := GetTypeData(Value.TypeInfo); + + if (Value.IsObject) and (Value.TypeInfo^.Kind <> tkInterface) then + Exit(Format('0x%p %s', [pointer(Value.AsObject), Data.ClassType.ClassName])); + + if Value.TypeInfo^.Kind = tkRecord then + begin + AContext := TRttiContext.Create; + ARecord := AContext.GetType(Value.TypeInfo).AsRecord; + Exit(Format('0x%p (Record ''%s'' @ %p)', [Value.GetReferenceToRawData, ARecord.Name, Data])); + end; + + Result := Value.ToString; +end; + +class function Console.GetBackgroundColor: TConsoleColor; +begin + Result := TConsoleColor((TextAttr and $0F) shr 4); +end; + +class function Console.GetBufferHeight: Integer; +begin + Result := GetBufferSize.Y; +end; + +class function Console.CanGetBufferInfo: Boolean; +var + Dummy: TConsoleScreenBufferInfo; +begin + Result := GetConsoleScreenBufferInfo(ConsoleOutputHandle, Dummy); +end; + +class function Console.GetBufferInfo: TConsoleScreenBufferInfo; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + if not GetConsoleScreenBufferInfo(ConsoleOutputHandle, Result) then + RaiseConsoleError('GetBufferInfo'); +end; + +class function Console.GetBufferSize: TCoord; +begin + Result := GetBufferInfo.dwSize; +end; + +class function Console.GetBufferWidth: Integer; +begin + Result := GetBufferSize.X; +end; + +class function Console.GetConsoleFont: TCONSOLE_FONT_INFOEX; +begin + FillChar(Result, SizeOf(TCONSOLE_FONT_INFOEX), 0); + Result.cbSize := SizeOf(TCONSOLE_FONT_INFOEX); + GetCurrentConsoleFontEx(ConsoleOutputHandle, FALSE, @Result); +end; + +class function Console.GetConsoleInputHandle: Integer; +begin + Result := StdIn; +end; + +class function Console.GetConsoleOutputHandle: THandle; +begin + Result := StdOut; +end; + +class function Console.GetCursorLeft: Integer; +begin + Result := GetBufferInfo.dwCursorPosition.X +end; + +class function Console.GetCursorSize: Integer; +begin + Result := ConsoleCursorInfo.dwSize; +end; + +class function Console.GetCursorTop: Integer; +begin + Result := GetBufferInfo.dwCursorPosition.Y +end; + +class function Console.GetCursorVisible: Boolean; +begin + Result := ConsoleCursorInfo.bVisible; +end; + +class function Console.GetForegroundColor: TConsoleColor; +begin + Result := TConsoleColor(TextAttr and $0F); +end; + +class function Console.GetKey(const Index: Integer): Boolean; +begin + Result := (GetKeyState(index) and 1) = 1; +end; + +class function Console.GetKeyAvailable: Boolean; +var + NumberOfEvents: DWORD; + Buffer: TInputRecord; + NumberOfEventsRead: DWORD; +begin + Result := FALSE; + + if StdIn = INVALID_HANDLE_VALUE then + exit; + + NumberOfEvents := 0; + GetNumberOfConsoleInputEvents(StdIn, NumberOfEvents); + + if NumberOfEvents = 0 then + Exit; + + PeekConsoleInput(StdIn, Buffer, 1, NumberOfEventsRead); + if NumberOfEventsRead = 0 then + Exit; + + if Buffer.EventType = KEY_EVENT then // is a Keyboard event? + begin + if Buffer.Event.KeyEvent.bKeyDown then // the key was pressed? + Result := True + else + FlushConsoleInputBuffer(StdIn); // flush the buffer + end + else + FlushConsoleInputBuffer(StdIn); // flush the buffer +end; + +class function Console.GetLargestWindowHeight: Integer; +begin + Result := GetLargestConsoleWindowSize(ConsoleOutputHandle).Y; +end; + +class function Console.GetLargestWindowWidth: Integer; +begin + Result := GetLargestConsoleWindowSize(ConsoleOutputHandle).X +end; + +class function Console.GetOutputEncoding: DWORD; +begin + Result := GetConsoleOutputCP; +end; + +class function Console.GetTitle: string; +var + TitleLength: Integer; +begin + if GetConsoleWindow = 0 then + exit(''); + + TitleLength := GetWindowTextLength(GetConsoleWindow); + SetLength(Result, TitleLength); + GetWindowText(GetConsoleWindow, PChar(Result), TitleLength + 1); +end; + +class function Console.GetTreatControlCAsInput: Boolean; +var + Mode: Cardinal; +begin + Result := FALSE; + Mode := 0; + if not GetConsoleMode(ConsoleInputHandle, Mode) then + RaiseLastOSError + else + Result := (Mode and 1) = 0; +end; + +class function Console.GetWindowHeight: Integer; +var + BufferInfo: TConsoleScreenBufferInfo; +begin + BufferInfo := GetBufferInfo; + Result := BufferInfo.srWindow.Bottom - BufferInfo.srWindow.Top + 1; +end; + +class function Console.GetWindowLeft: Integer; +begin + Result := ConsoleRect.Left; +end; + +class function Console.GetWindowTop: Integer; +begin + Result := ConsoleRect.Top; +end; + +class function Console.GetWindowWidth: Integer; +var + BufferInfo: TConsoleScreenBufferInfo; +begin + BufferInfo := GetBufferInfo; + Result := BufferInfo.srWindow.Right - BufferInfo.srWindow.Left + 1; +end; + +class procedure Console.GotoXY(X, Y: SmallInt); +begin + Inc(X, FTextWindow.Left - 1); + Inc(Y, FTextWindow.Top - 1); + if PtInRect(FTextWindow, POINT(X, Y)) then + SetCursorPosition(X, Y); +end; + +class procedure Console.InsertLine; +begin + ScrollScreenBuffer(FTextWindow.Left, GetBufferInfo.dwCursorPosition.Y, FTextWindow.Right, FTextWindow.Bottom, 1); +end; + +class procedure Console.MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer); +begin + MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop, ' ', TConsoleColor.Black, BackgroundColor) +end; + +class procedure Console.MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer; SourceChar: Char; SourceForeColor, SourceBackColor: TConsoleColor); +var + I: Integer; + CharInfoArray: array of CHAR_INFO; + NumberOfCharsWritten: DWORD; + dwSize: TCoord; + ReadRegion, WriteRegion: SMALL_RECT; + dwWriteCoord, bufferCoord: TCoord; + wColorAttribute, color: TWinColor; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + if ((SourceForeColor < TConsoleColor.Black) or (SourceForeColor > TConsoleColor.White)) then + raise EArgumentException.Create('ParamName: SourceForeColor'); + if ((SourceBackColor < TConsoleColor.Black) or (SourceBackColor > TConsoleColor.White)) then + raise EArgumentException.Create('ParamName: SourceBackColor'); + + dwSize := GetBufferInfo.dwSize; + + if ((SourceLeft < 0) or (SourceLeft > dwSize.X)) then + raise EArgumentOutOfRangeException.Create('SourceLeft ' + IntToStr(SourceLeft) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((SourceTop < 0) or (SourceTop > dwSize.Y)) then + raise EArgumentOutOfRangeException.Create('SourceTop' + IntToStr(SourceTop) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((SourceWidth < 0) or (SourceWidth > (dwSize.X - SourceLeft))) then + raise EArgumentOutOfRangeException.Create('SourceWidth' + IntToStr(SourceWidth) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((SourceHeight < 0) or (SourceTop > (dwSize.Y - SourceHeight))) then + raise EArgumentOutOfRangeException.Create('SourceHeight' + IntToStr(SourceHeight) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((TargetLeft < 0) or (TargetLeft > dwSize.X)) then + raise EArgumentOutOfRangeException.Create('TargetLeft' + IntToStr(TargetLeft) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((TargetTop < 0) or (TargetTop > dwSize.Y)) then + raise EArgumentOutOfRangeException.Create('TargetTop' + IntToStr(TargetTop) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + + if ((SourceWidth <> 0) and (SourceHeight <> 0)) then + begin + SetLength(CharInfoArray, (SourceWidth * SourceHeight)); + dwSize.X := SourceWidth; + dwSize.Y := SourceHeight; + ReadRegion.Left := (SourceLeft); + ReadRegion.Right := (((SourceLeft + SourceWidth) - 1)); + ReadRegion.Top := (SourceTop); + ReadRegion.Bottom := (((SourceTop + SourceHeight) - 1)); + + bufferCoord.X := 0; + bufferCoord.Y := 0; + + if (not ReadConsoleOutput(ConsoleOutputHandle, CharInfoArray, dwSize, bufferCoord, ReadRegion)) then + RaiseLastOSError; + + dwWriteCoord.X := SourceLeft; + color := TWinColor(Integer(ConsoleColorToColorAttribute(SourceBackColor, True)) or Integer(ConsoleColorToColorAttribute(SourceForeColor, FALSE))); + wColorAttribute := color; + I := SourceTop; + + while ((I < (SourceTop + SourceHeight))) do + begin + dwWriteCoord.Y := (I); + if (not FillConsoleOutputCharacter(ConsoleOutputHandle, SourceChar, SourceWidth, dwWriteCoord, NumberOfCharsWritten)) then + RaiseLastOSError; + if (not FillConsoleOutputAttribute(ConsoleOutputHandle, Word(wColorAttribute), SourceWidth, dwWriteCoord, NumberOfCharsWritten)) then + RaiseLastOSError; + Inc(I) + end; + + WriteRegion.Left := TargetLeft; + WriteRegion.Right := TargetLeft + SourceWidth; + WriteRegion.Top := TargetTop; + WriteRegion.Bottom := TargetTop + SourceHeight; + + Win32Check(WriteConsoleOutput(ConsoleOutputHandle, CharInfoArray, dwSize, bufferCoord, WriteRegion)); + end +end; + +class function Console.ReadKey: TConsoleKeyInfo; +var + InputRec: TInputRecord; + NumRead: Cardinal; + KeyMode: DWORD; + StdIn: THandle; +begin + StdIn := TTextRec(Input).Handle; + GetConsoleMode(StdIn, KeyMode); + SetConsoleMode(StdIn, 0); + + repeat + ReadConsoleInput(StdIn, InputRec, 1, NumRead); + if (InputRec.EventType and KEY_EVENT <> 0) and InputRec.Event.KeyEvent.bKeyDown then + begin + if InputRec.Event.KeyEvent.AsciiChar <> #0 then + begin + Result.Key := TConsoleKey(InputRec.Event.KeyEvent.wVirtualKeyCode); + Result.KeyChar := InputRec.Event.KeyEvent.UnicodeChar; + Break; + end; + end; + until FALSE; + + SetConsoleMode(StdIn, KeyMode); +end; + +class procedure Console.RaiseConsoleError(aCaller: String); +begin + raise ECOnsoleError.Create('Error calling ' + aCaller +':' + sLineBreak + SysErrorMessage(GetLastError)); +end; + +class function Console.Read: Integer; +begin + System.Read(Result); +end; + +function IsKeyDownEvent(ir: TInputRecord): Boolean; +begin + Result := (ir.EventType = KEY_EVENT) and (ir.Event.KeyEvent.bKeyDown); +end; + +function IsModKey(ir: TInputRecord): Boolean; +begin + // We should also skip over Shift, Control, and Alt, as well as caps lock. + // Apparently we don't need to check for 0xA0 through 0xA5, which are keys like + // Left Control & Right Control. See the ConsoleKey enum for these values. + Result := ir.Event.KeyEvent.wVirtualScanCode in [$10 .. $12, $14, $90, $91]; +end; + +class function Console.ReadKey(Intercept: Boolean): TConsoleKeyInfo; +var + InputRec: TInputRecord; + NumRead: Cardinal; + OldKeyMode: DWORD; +begin + if StdIn = INVALID_HANDLE_VALUE then + exit; + + GetConsoleMode(StdIn, OldKeyMode); + SetConsoleMode(StdIn, 0); + + repeat + ReadConsoleInput(StdIn, InputRec, 1, NumRead); + until (InputRec.EventType and KEY_EVENT <> 0) and InputRec.Event.KeyEvent.bKeyDown; + + Result.Key := TConsoleKey(InputRec.Event.KeyEvent.wVirtualKeyCode); + Result.KeyChar := InputRec.Event.KeyEvent.UnicodeChar; + + SetConsoleMode(StdIn, OldKeyMode); +end; + +class function Console.ReadLine: string; +var + Buffer : Array[0..1024] of Char; + NumberOfCharsRead : DWORD; +begin + if StdIn = INVALID_HANDLE_VALUE then + exit(''); + + ZeroMemory(@Buffer, Length(Buffer)); + ReadConsole(StdIn, @Buffer, Length(Buffer), NumberOfCharsRead , nil); + Result := PChar(@Buffer); +end; + +class procedure Console.ResetColor; +begin + SetConsoleTextAttribute(StdOut, DefaultTextAttributes); +end; + +class procedure Console.ScrollScreenBuffer(Left, Top, Right, Bottom, Distance: Integer); +var + Rect: TSmallRect; + Fill: TCharInfo; + NewPos: TCoord; +begin + Fill.UnicodeChar := ' '; + Fill.Attributes := TextAttr; + if Distance = 0 then + Distance := Bottom - Top + 1; + Rect.Left := Left; + Rect.Right := Right; + Rect.Top := Top; + Rect.Bottom := Bottom; + NewPos.X := Left; + NewPos.Y := Top + Distance; + ScrollConsoleScreenBuffer(StdOut, Rect, @Rect, NewPos, Fill); +end; + +class procedure Console.SetBackgroundColor(const Value: TConsoleColor); +begin + TextAttr := (TextAttr and $0F) or ((Word(Value) shl 4) and $F0); + SetConsoleTextAttribute(StdOut, TextAttr); +end; + +class procedure Console.SetBufferHeight(const Value: Integer); +var + Size: TCoord; +begin + Size.X := GetBufferWidth; + Size.Y := Value; + SetConsoleScreenBufferSize(ConsoleOutputHandle, Size); +end; + +class procedure Console.SetBufferSize(Width, Height: Integer); +var + Size: TCoord; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + Size.X := Width; + Size.Y := Height; + SetConsoleScreenBufferSize(ConsoleOutputHandle, Size) +end; + +class procedure Console.SetBufferSize(const Value: TCoord); +begin + SetBufferSize(Value.X, Value.Y); +end; + +class procedure Console.SetBufferWidth(const Value: Integer); +var + Size: TCoord; +begin + Size.X := Value; + Size.Y := GetBufferHeight; + SetConsoleScreenBufferSize(ConsoleOutputHandle, Size); +end; + +class procedure Console.SetConsoleRect(Rect: TRect); +begin + SetWindowPos(GetConsoleWindow, 0, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, SWP_SHOWWINDOW); +end; + +class procedure Console.SetCursorLeft(const Value: Integer); +begin + SetCursorPosition(Value, CursorTop) +end; + +class procedure Console.SetCursorPosition(Left, Top: SmallInt); +var + COORD: TCoord; +begin + COORD.X := Left; + COORD.Y := Top; + if not SetConsoleCursorPosition(ConsoleOutputHandle, COORD) then + RaiseLastOSError; +end; + +class procedure Console.SetCursorSize(const Value: Integer); +var + ConsoleCursorInfo: TConsoleCursorInfo; +begin + if ((Value < 1) or (Value > 100)) then + raise ERangeError.Create('value' + IntToStr(Value) + ' out of range for CursorSize'); + + if (not GetConsoleCursorInfo(ConsoleOutputHandle, ConsoleCursorInfo)) then + RaiseLastOSError; + + ConsoleCursorInfo.dwSize := Value; + + if (not SetConsoleCursorInfo(ConsoleOutputHandle, ConsoleCursorInfo)) then + RaiseLastOSError; +end; + +class procedure Console.SetCursorTop(const Value: Integer); +begin + SetCursorPosition(CursorLeft, Value); +end; + +class procedure Console.SetCursorVisible(const Value: Boolean); +var + CursorInfo: TConsoleCursorInfo; +begin + if not GetConsoleCursorInfo(ConsoleOutputHandle, CursorInfo) then + RaiseLastOSError; + + CursorInfo.bVisible := Value; + + if not SetConsoleCursorInfo(ConsoleOutputHandle, CursorInfo) then + RaiseLastOSError; +end; + +class procedure Console.SetConsoleFont(const Value: TCONSOLE_FONT_INFOEX); +begin + SetCurrentConsoleFontEx(StdOut, FALSE, @Value); +end; + +class procedure Console.SetConsoleInputHandle(const Value: Integer); +begin + TTextRec(Input).Handle := Value; +end; + +class procedure Console.SetConsoleOutputHandle(const Value: THandle); +begin + TTextRec(Output).Handle := Value; +end; + +class procedure Console.SetForegroundColor(const Value: TConsoleColor); +begin + TextAttr := (TextAttr and $F0) or (Word(Value) and $0F); + SetConsoleTextAttribute(StdOut, TextAttr); +end; + +class procedure Console.SetOutputEncoding(const Value: DWORD); +begin + SetConsoleOutputCP(Value); +end; + +class procedure Console.SetTitle(const Value: string); +begin + SetConsoleTitle(PChar(Value)); +end; + +class procedure Console.SetTreatControlCAsInput(const Value: Boolean); +begin + if not SetConsoleMode(StdOut, Cardinal(Value)) then + RaiseLastOSError; +end; + +class procedure Console.SetWindowHeight(const Value: Integer); +begin + SetWindowSize(WindowWidth, Value); +end; + +class procedure Console.SetWindowLeft(const Value: Integer); +begin + SetWindowPosition(Value, ConsoleRect.Top); +end; + +class procedure Console.SetWindowPosition(Left, Top: Integer); +var + Rect: TRect; +begin + Rect := ConsoleRect; + Rect.Top := Top; + Rect.Left := Left; + SetConsoleRect(Rect); +end; + +class procedure Console.SetWindowSize(Width, Height: Integer); +var + srWindow: TSmallRect; + Size: TCoord; + BufferInfo: TConsoleScreenBufferInfo; + ResizeBuffer: Boolean; +begin + if Width <= 0 then + raise EArgumentOutOfRangeException.Create('Width must be a positive number required'); + if Height <= 0 then + raise EArgumentOutOfRangeException.Create('Height must be a positive number required'); + + BufferInfo := GetBufferInfo; + ResizeBuffer := FALSE; + + Size.X := BufferInfo.dwSize.X; + Size.Y := BufferInfo.dwSize.Y; + + if BufferInfo.dwSize.X < BufferInfo.srWindow.Left + Width then + begin + if BufferInfo.srWindow.Left >= Int16_MaxValue - Width then + raise EArgumentOutOfRangeException.Create('Width must be a positive number required and les than ' + IntToStr(Int16_MaxValue)); + + Size.X := Short(BufferInfo.srWindow.Left + Width); + ResizeBuffer := True; + end; + + if BufferInfo.dwSize.Y < BufferInfo.srWindow.Top + Height then + begin + if BufferInfo.srWindow.Top >= Int16_MaxValue - Height then + raise EArgumentOutOfRangeException.Create('Height must be a positive number required and lesthan ' + IntToStr(Int16_MaxValue)); + Size.Y := Short(BufferInfo.srWindow.Top + Height); + ResizeBuffer := True; + end; + + if ResizeBuffer then + if not SetConsoleScreenBufferSize(ConsoleOutputHandle, Size) then + RaiseLastOSError; + + srWindow := BufferInfo.srWindow; + // Preserve the position, but change the size. + srWindow.Bottom := Short(srWindow.Top + Height - 1); + srWindow.Right := Short(srWindow.Left + Width - 1); + + if not SetConsoleWindowInfo(ConsoleOutputHandle, True, srWindow) then + begin + // Try to give a better error message here + Size := GetLargestConsoleWindowSize(ConsoleOutputHandle); + if Width > Size.X then + raise EArgumentOutOfRangeException.Create(IntToStr(Width) + 'Is out of range for Console width'); + if Height > Size.Y then + raise EArgumentOutOfRangeException.Create(IntToStr(Height) + 'Is out of range for Console height'); + + RaiseLastOSError; + end; +end; + +class procedure Console.SetWindowTop(const Value: Integer); +begin + SetWindowPosition(ConsoleRect.Left, Value); +end; + +class procedure Console.SetWindowWidth(const Value: Integer); +begin + SetWindowSize(Value, WindowHeight); +end; + +class procedure Console.UpdateConsoleFont(aFontName: string; aFontSize: Cardinal; aFontFamily: TFontFamily; aFontWeight: TFontWeight); +var + CONSOLE_FONT_INFOEX: TCONSOLE_FONT_INFOEX; + Destination: PChar; +begin + CONSOLE_FONT_INFOEX := ConsoleFont; + CONSOLE_FONT_INFOEX.FontFamily := Cardinal(aFontFamily); + if aFontName <> '' then + begin + Destination := @CONSOLE_FONT_INFOEX.FaceName[0]; + StrLCopy(Destination, PChar(aFontName), LF_FACESIZE - 1); + end; + CONSOLE_FONT_INFOEX.dwFontSize.X := 0; + + if aFontSize <> 0 then + CONSOLE_FONT_INFOEX.dwFontSize.Y := aFontSize; + + CONSOLE_FONT_INFOEX.FontWeight := Cardinal(aFontWeight); + + if not SetCurrentConsoleFontEx(StdOut, FALSE, @CONSOLE_FONT_INFOEX) then + RaiseLastOSError; +end; + +class procedure Console.WriteLine(aValue: T); +begin + WriteString(GenericToString(aValue) + sLineBreak); +end; + +class function Console.WriteString(aValue: string): Cardinal; +begin + if StdOut = INVALID_HANDLE_VALUE then + AllocateConsole; + + if StdOut <> INVALID_HANDLE_VALUE then + WriteConsole(StdOut, PWideChar(aValue), Length(aValue), Result, nil); +end; + +class procedure Console.Write(aValue: T); +begin + WriteString(GenericToString(aValue)); +end; + +class procedure Console.Write(Value: Variant; Args: array of const); +var + S: string; + I: Integer; +begin + S := Value; + for I := 0 to high(Args) do + S := ReplaceStr(S, '{' + IntToStr(I) + '}', '%' + IntToStr(I) + ':s'); + + WriteString(Format(S, Args)); +end; + +class procedure Console.WriteLine(FormatString: String; Args: array of Variant); +var + I: Integer; + VarRecArray: array of TVarRec; +begin + for I := 0 to high(Args) do + FormatString := ReplaceStr(FormatString, '{' + IntToStr(I) + '}', '%' + IntToStr(I) + ':s'); + + SetLength(VarRecArray, Length(Args)); + + for I := 0 to high(Args) do + begin + VarRecArray[I].VType := vtUnicodeString; + // nil out first, so no attempt to decrement reference count. + VarRecArray[I].VUnicodeString := nil; + UnicodeString(VarRecArray[I].VUnicodeString) := UnicodeString(Args[I]); + end; + + WriteString(Format(FormatString, VarRecArray) + sLineBreak); +end; + +class procedure Console.WriteLine; +begin + WriteString(sLineBreak); +end; + +initialization + +LockObject := TObject.Create; + +finalization + +LockObject.Free; + +end. + + + diff --git a/FMX.ConstrainedForm.pas b/FMX.ConstrainedForm.pas deleted file mode 100644 index 52e1227..0000000 --- a/FMX.ConstrainedForm.pas +++ /dev/null @@ -1,162 +0,0 @@ -unit FMX.ConstrainedForm; - -// http://stackoverflow.com/a/8044518 - -interface - -uses - System.Classes, System.Types, System.UITypes, FMX.Forms, FMX.Platform, FMX.Types; - -type - TFormConstraints = class(TPersistent) - private - FMaxHeight: Integer; - FMaxLeft: Integer; - FMaxWidth: Integer; - FMaxTop: Integer; - FMinHeight: Integer; - FMinLeft: Integer; - FMinWidth: Integer; - FMinTop: Integer; - public - constructor Create; - published - property MaxHeight: Integer read FMaxHeight write FMaxHeight default 0; - property MaxLeft: Integer read FMaxLeft write FMaxLeft default 0; - property MaxWidth: Integer read FMaxWidth write FMaxWidth default 0; - property MaxTop: Integer read FMaxTop write FMaxTop default 0; - property MinHeight: Integer read FMinHeight write FMinHeight default 0; - property MinLeft: Integer read FMinLeft write FMinLeft default 0; - property MinWidth: Integer read FMinWidth write FMinWidth default 0; - property MinTop: Integer read FMinTop write FMinTop default 0; - end; - - TConstrainedForm = class(TCustomForm) - private - FConstraints: TFormConstraints; - protected - public - constructor Create(AOwner: TComponent); override; - destructor Destroy; override; - procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; - procedure StartWindowResize; override; - procedure StartWindowDrag; override; - published - property Constraints: TFormConstraints read FConstraints write FConstraints; - property BiDiMode; - property Caption; - property Cursor default crDefault; - property BorderStyle default TFmxFormBorderStyle.Sizeable; - property BorderIcons default [TBorderIcon.biSystemMenu, TBorderIcon.biMinimize, TBorderIcon.biMaximize]; - property ClientHeight; - property ClientWidth; - property Left; - property Top; -// property Margins; - property Position default TFormPosition.DefaultPosOnly; - property Width; - property Height; -// property ShowActivated default True; -// property StaysOpen default True; - property Transparency; -// property TopMost default False; - property Visible; - property WindowState default TWindowState.wsNormal; - property OnCreate; - property OnDestroy; - property OnClose; - property OnCloseQuery; - property OnActivate; - property OnDeactivate; - property OnResize; - property Fill; - property StyleBook; - property ActiveControl; - property StyleLookup; - property OnPaint; - // XE7 - property Padding; - property FormFactor; - property OnKeyDown; - end; - -procedure Register; - -implementation - -{ TFormConstraints } - -constructor TFormConstraints.Create; -begin - inherited; - FMaxHeight := 0; - FMaxLeft := 0; - FMaxWidth := 0; - FMaxTop := 0; - FMinHeight := 0; - FMinLeft := 0; - FMinWidth := 0; - FMinTop := 0; -end; - -{ TConstrainedForm } - -constructor TConstrainedForm.Create(AOwner: TComponent); -begin - FConstraints := TFormConstraints.Create; - inherited; -end; - -destructor TConstrainedForm.Destroy; -begin - FConstraints.Free; - inherited; -end; - -procedure TConstrainedForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); -begin - if (FConstraints.FMinWidth > 0) and (AWidth < FConstraints.FMinWidth) then - AWidth := FConstraints.FMinWidth; - - if (FConstraints.FMaxWidth > 0) and (AWidth > FConstraints.FMaxWidth) then - AWidth := FConstraints.FMaxWidth; - - if (FConstraints.FMinHeight > 0) and (AHeight < FConstraints.FMinHeight) then - AHeight := FConstraints.FMinHeight; - - if (FConstraints.FMaxHeight > 0) and (AHeight > FConstraints.FMaxHeight) then - AHeight := FConstraints.FMaxHeight; - - if (FConstraints.FMinLeft > 0) and (ALeft < FConstraints.FMinLeft) then - ALeft := FConstraints.FMinLeft; - - if (FConstraints.FMaxLeft > 0) and (ALeft > FConstraints.FMaxLeft) then - ALeft := FConstraints.FMaxLeft; - - if (FConstraints.FMinTop > 0) and (ATop < FConstraints.FMinTop) then - ATop := FConstraints.FMinTop; - - if (FConstraints.FMaxTop > 0) and (ATop > FConstraints.FMaxTop) then - ATop := FConstraints.FMaxTop; - - FWinService.SetWindowRect(Self, RectF(ALeft, ATop, ALeft + AWidth, ATop + AHeight)); - inherited SetBounds(ALeft, ATop, AWidth, AHeight); -end; - -procedure TConstrainedForm.StartWindowDrag; -begin - inherited; - -end; - -procedure TConstrainedForm.StartWindowResize; -begin - inherited; -end; - -procedure Register; -begin - RegisterClass(TConstrainedForm); -end; - -end. diff --git a/Generator GUI/JsonToDelphiClass.delphilsp.json b/Generator GUI/JsonToDelphiClass.delphilsp.json new file mode 100644 index 0000000..2933ec5 --- /dev/null +++ b/Generator GUI/JsonToDelphiClass.delphilsp.json @@ -0,0 +1 @@ +{ "settings": { "project": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Generator%20GUI/JsonToDelphiClass.dpr", "dllname": "dcc32290.dll", "dccOptions": "-$O- -$W+ -$D1 --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DmadExcept;DEBUG;;FRAMEWORK_FMX -E.\\Win32\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\";\"C:\\Program Files (x86)\\DevExpress\\VCL\\Library\\RS29\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Bpl -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NU.\\Win32\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Data;Datasnap;Web;Soap; -O\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\";\"C:\\Program Files (x86)\\DevExpress\\VCL\\Library\\RS29\" -R\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\";\"C:\\Program Files (x86)\\DevExpress\\VCL\\Library\\RS29\" -U\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\lib\\Win32\\release\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\";\"C:\\Users\\Jens Borrisholt\\Documents\\Embarcadero\\Studio\\23.0\\Imports\\Win32\";\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp;\"c:\\program files (x86)\\embarcadero\\studio\\23.0\\include\";\"C:\\Program Files (x86)\\DevExpress\\VCL\\Library\\RS29\" -V -VN -GD -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\Dcp -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\23.0\\hpp\\Win32 -NO.\\Win32\\Debug -W-DUPLICATE_CTOR_DTOR -LU" , "projectFiles":[ { "name": "DemoProject", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Demo%20Generator/DemoProject.rc" }, { "name": "JSON_PAS", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/JSON_PAS.rc" }, { "name": "Pkg.Json.Components.Update", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Components/Pkg.Json.Components.Update.pas" }, { "name": "Pkg.Json.Visualizer", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Components/Pkg.Json.Visualizer.pas" }, { "name": "Pkg.Json.DemoGenerator", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Demo%20Generator/Pkg.Json.DemoGenerator.pas" }, { "name": "Pkg.Json.DTO", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.DTO.pas" }, { "name": "Pkg.Json.JSONName", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.JSONName.pas" }, { "name": "Pkg.Json.Lists", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.Lists.pas" }, { "name": "Pkg.Json.Mapper", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.Mapper.pas" }, { "name": "Pkg.Json.ReservedWords", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.ReservedWords.pas" }, { "name": "Pkg.Json.StubField", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.StubField.pas" }, { "name": "Pkg.Json.JsonValueHelper", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.JsonValueHelper.pas" }, { "name": "DTO.GitHUB.ReleaseDTO", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/DTO/GitHUB/DTO.GitHUB.ReleaseDTO.pas" }, { "name": "Pkg.Json.Utils", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.Utils.pas" }, { "name": "Pkg.JSON.SubTypes", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.JSON.SubTypes.pas" }, { "name": "Pkg.Json.Settings", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.Settings.pas" }, { "name": "Pkg.Json.ThreadingEx", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.ThreadingEx.pas" }, { "name": "MainFormU", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Generator%20GUI/MainFormU.pas" }, { "name": "Pkg.Json.Lib.JSONConverter", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.Lib.JSONConverter.pas" }, { "name": "Pkg.Json.OutputFormat", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/Pkg.Json.OutputFormat.pas" }, { "name": "Pkg.Json.GeneratorGUI.SettingsForm", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Generator%20GUI/Pkg.Json.GeneratorGUI.SettingsForm.pas" }, { "name": "Pkg.Json.GeneratorGUI.UpdateForm", "file": "file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Generator%20GUI/Pkg.Json.GeneratorGUI.UpdateForm.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/source/FlatBox2D","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressSpreadSheet%20Core/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressTile%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressWizard%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressSpreadSheet/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressExport%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressCharts/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressScheduler/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressQuantumTreeList/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressVerticalGrid/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressSpellChecker/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressSkins%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressPrinting%20System/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressPivotGrid/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressDBTree%20Suite/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressOrgChart/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressFlowChart/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressMap%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressQuantumGrid/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressGantt%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressRichEdit%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressGauge%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressPDFViewer/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress/VCL/ExpressEntityMapping%20Framework/Sources","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Demo%20Generator/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/End%20To%20End%20Test/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Unit%20Test/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Generator%20LIB/","file:///C%3A/Users/Jens%20Borrisholt/Documents/Source/Delphi-JsonToDelphiClass/Lib/" ] , "CommonAppData": "file:///C%3A/Users/Jens%20Borrisholt/AppData/Roaming/Embarcadero/BDS/23.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/23.0/ObjRepos/" } } \ No newline at end of file diff --git a/Generator GUI/JsonToDelphiClass.dpr b/Generator GUI/JsonToDelphiClass.dpr new file mode 100644 index 0000000..08812ed --- /dev/null +++ b/Generator GUI/JsonToDelphiClass.dpr @@ -0,0 +1,38 @@ +program JsonToDelphiClass; + +{$R 'DemoProject.res' '..\Demo Generator\DemoProject.rc'} +{$R 'JSON_PAS.res' '..\Lib\JSON_PAS.rc'} + +uses + System.StartUpCopy, + FMX.Forms, + Pkg.Json.Components.Update in '..\Components\Pkg.Json.Components.Update.pas', + Pkg.Json.Visualizer in '..\Components\Pkg.Json.Visualizer.pas', + Pkg.Json.DemoGenerator in '..\Demo Generator\Pkg.Json.DemoGenerator.pas', + Pkg.Json.DTO in '..\Lib\Pkg.Json.DTO.pas', + Pkg.Json.JSONName in '..\Lib\Pkg.Json.JSONName.pas', + Pkg.Json.Lists in '..\Lib\Pkg.Json.Lists.pas', + Pkg.Json.Mapper in '..\Lib\Pkg.Json.Mapper.pas', + Pkg.Json.ReservedWords in '..\Lib\Pkg.Json.ReservedWords.pas', + Pkg.Json.StubField in '..\Lib\Pkg.Json.StubField.pas', + Pkg.Json.JsonValueHelper in '..\Lib\Pkg.Json.JsonValueHelper.pas', + DTO.GitHUB.ReleaseDTO in '..\DTO\GitHUB\DTO.GitHUB.ReleaseDTO.pas', + Pkg.Json.Utils in '..\Lib\Pkg.Json.Utils.pas', + Pkg.JSON.SubTypes in '..\Lib\Pkg.JSON.SubTypes.pas', + Pkg.Json.Settings in '..\Lib\Pkg.Json.Settings.pas', + Pkg.Json.ThreadingEx in '..\Lib\Pkg.Json.ThreadingEx.pas', + MainFormU in 'MainFormU.pas' {MainForm}, + Pkg.Json.Lib.JSONConverter in '..\Lib\Pkg.Json.Lib.JSONConverter.pas', + Pkg.Json.OutputFormat in '..\Lib\Pkg.Json.OutputFormat.pas', + Pkg.Json.GeneratorGUI.SettingsForm in 'Pkg.Json.GeneratorGUI.SettingsForm.pas' {SettingsForm}, + Pkg.Json.GeneratorGUI.UpdateForm in 'Pkg.Json.GeneratorGUI.UpdateForm.pas' {UpdateForm}; + +{$R *.res} + +{$WEAKLINKRTTI OFF} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. diff --git a/Generator GUI/JsonToDelphiClass.dproj b/Generator GUI/JsonToDelphiClass.dproj new file mode 100644 index 0000000..00160ee --- /dev/null +++ b/Generator GUI/JsonToDelphiClass.dproj @@ -0,0 +1,1172 @@ + + + {FC0815BD-2831-42AD-BC2C-0CC105026B1F} + 20.1 + FMX + JsonToDelphiClass.dpr + True + Debug + Win32 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + $(BDS)\bin\default_app.manifest + JsonToDelphiClass + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + false + + + 1033 + TAutomagicFormInterceptorPkg;madBasic_;FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;tethering;TeeDB;tsc;DBXInterBaseDriver;Tee;log4delphi_D7_PROF;vclFireDAC;madDisAsm_;xmlrtl;svnui;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;MetropolisUILiveTile;TMSFMXPackPkgDXE7;bindcompdbx;bindengine;vclactnband;vcldb;soaprtl;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;vcltouch;madExcept_;emsclient;CustomIPTransport;vclribbon;VCLRESTComponents;FireDAC;VclSmp;dsnap;Intraweb;fmxase;vcl;IndyCore;IndyIPServer;TMSFMXPackPkgDEDXE7;IndyIPCommon;CloudService;CodeSiteExpressPkg;dsnapcon;FireDACIBDriver;FmxTeeUI;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;soapserver;inetdbxpress;svn;ChromiumFMX;dsnapxml;fmxdae;RESTComponents;FireDACMSAccDriver;dbexpress;adortl;IndyIPClient;$(DCC_UsePackage) + true + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + 1033 + FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;tethering;TeeDB;DBXInterBaseDriver;Tee;vclFireDAC;xmlrtl;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;MetropolisUILiveTile;bindcompdbx;bindengine;vclactnband;vcldb;soaprtl;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;vcltouch;emsclient;CustomIPTransport;vclribbon;VCLRESTComponents;FireDAC;VclSmp;dsnap;Intraweb;fmxase;vcl;IndyCore;IndyIPServer;IndyIPCommon;CloudService;dsnapcon;FireDACIBDriver;FmxTeeUI;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;soapserver;inetdbxpress;dsnapxml;fmxdae;RESTComponents;FireDACMSAccDriver;dbexpress;adortl;IndyIPClient;$(DCC_UsePackage) + true + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + JsonToDelphiClass_Icon1.ico + $(BDS)\bin\delphi_PROJECTICNS.icns + madExcept;$(DCC_Define) + true + 3 + 1 + false + Debug + 2 + 3 + 1 + CompanyName=;FileVersion=2.3.1.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + + + Debug + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + 3 + 1 + JsonToDelphiClass_Icon.ico + true + madExcept;$(DCC_Define) + $(BDS)\bin\delphi_PROJECTICNS.icns + 1033 + true + + + + MainSource + + +
DemoProject.res
+
+ +
JSON_PAS.res
+
+ + + + + + + + + + + + + + + + +
MainForm
+ fmx +
+ + + +
SettingsForm
+ fmx +
+ +
UpdateForm
+ fmx +
+ + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Application + + + + JsonToDelphiClass.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + + true + + + + + true + + + + + true + + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + True + True + + + C:\Users\Jens Borrisholt\Documents\GitHUB\Delphi-JsonToDelphiClass\Generator GUI\Test\JsonToDelphiClassTests.dproj + + + 12 + + + + +
diff --git a/JsonToDelphiClass_Icon.ico b/Generator GUI/JsonToDelphiClass_Icon.ico similarity index 100% rename from JsonToDelphiClass_Icon.ico rename to Generator GUI/JsonToDelphiClass_Icon.ico diff --git a/JsonToDelphiClass_Icon1.ico b/Generator GUI/JsonToDelphiClass_Icon1.ico similarity index 100% rename from JsonToDelphiClass_Icon1.ico rename to Generator GUI/JsonToDelphiClass_Icon1.ico diff --git a/Generator GUI/MainFormU.fmx b/Generator GUI/MainFormU.fmx new file mode 100644 index 0000000..246bd3d --- /dev/null +++ b/Generator GUI/MainFormU.fmx @@ -0,0 +1,1805 @@ +object MainForm: TMainForm + Left = 0 + Top = 0 + Caption = 'Form1' + ClientHeight = 480 + ClientWidth = 612 + StyleBook = StyleBook1 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + OnCreate = FormCreate + OnDestroy = FormDestroy + DesignerMasterStyle = 0 + object MenuBar1: TMenuBar + Size.Width = 612.000000000000000000 + Size.Height = 24.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + object MenuItem1: TMenuItem + Text = '&File' + object MenuItem2: TMenuItem + Action = actOpen + Locked = True + ImageIndex = -1 + end + object MenuItem3: TMenuItem + Action = actSaveAs + Locked = True + ImageIndex = -1 + end + object MenuItem4: TMenuItem + Action = actExit + Locked = True + ImageIndex = -1 + end + end + object MenuItemView: TMenuItem + Text = '&View' + object MenuItem5: TMenuItem + Action = actOnlineValidation + Locked = True + ImageIndex = -1 + end + object MenuItem6: TMenuItem + Action = actSettings + Locked = True + ImageIndex = -1 + end + object MenuItem7: TMenuItem + Action = actDemoData + Locked = True + ImageIndex = -1 + end + object MenuItem8: TMenuItem + Action = actClassVisualizer + Locked = True + ImageIndex = -1 + end + end + object Formats: TMenuItem + Text = 'Formats' + object MenuItem9: TMenuItem + Action = actBSON + Locked = True + ImageIndex = -1 + end + object MenuItem10: TMenuItem + Action = actDelphiUnit + Locked = True + ImageIndex = -1 + end + object MenuItem11: TMenuItem + Action = actMinifyJson + Locked = True + ImageIndex = -1 + end + object MenuItem12: TMenuItem + Action = actDemoProject + Locked = True + ImageIndex = -1 + end + end + end + object TabControl1: TTabControl + Align = Client + Size.Width = 612.000000000000000000 + Size.Height = 434.000000000000000000 + Size.PlatformDefault = False + TabIndex = 0 + TabOrder = 1 + TabPosition = PlatformDefault + Sizes = ( + 612s + 408s) + object TabItemJSON: TTabItem + CustomIcon = < + item + end> + TextSettings.Trimming = None + IsSelected = True + Size.Width = 44.000000000000000000 + Size.Height = 26.000000000000000000 + Size.PlatformDefault = False + StyleLookup = '' + TabOrder = 0 + Text = 'Json' + ExplicitSize.cx = 91.000000000000000000 + ExplicitSize.cy = 26.000000000000000000 + object MemoJSON: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + Lines.Strings = ( + + 'Enter your JSON here or load it from a file. Then click "Convert' + + '"' + '' + 'See also the possibilities in the MenuBar') + OnChange = MemoJSONExit + OnChangeTracking = MemoJSONExit + Align = Client + Size.Width = 612.000000000000000000 + Size.Height = 355.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + OnExit = MemoJSONExit + Viewport.Width = 612.000000000000000000 + Viewport.Height = 355.000000000000000000 + end + object ListView1: TListView + ItemAppearanceClassName = 'TListItemAppearance' + ItemEditAppearanceClassName = 'TListItemShowCheckAppearance' + HeaderAppearanceClassName = 'TListHeaderObjects' + FooterAppearanceClassName = 'TListHeaderObjects' + Align = Left + Size.Width = 158.000000000000000000 + Size.Height = 430.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Visible = False + OnChange = ListView1Change + end + object Splitter1: TSplitter + Align = Left + Cursor = crHSplit + MinSize = 20.000000000000000000 + Size.Width = 4.000000000000000000 + Size.Height = 430.000000000000000000 + Size.PlatformDefault = False + Visible = False + end + object TreeView: TTreeView + Align = Left + Size.Width = 209.000000000000000000 + Size.Height = 377.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Visible = False + Viewport.Width = 205.000000000000000000 + Viewport.Height = 373.000000000000000000 + end + object Panel3: TPanel + Align = Bottom + Padding.Left = 6.000000000000000000 + Padding.Top = 6.000000000000000000 + Padding.Right = 6.000000000000000000 + Padding.Bottom = 6.000000000000000000 + Position.Y = 355.000000000000000000 + Size.Width = 612.000000000000000000 + Size.Height = 53.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + object Panel4: TPanel + Align = Left + Margins.Right = 6.000000000000000000 + Position.X = 6.000000000000000000 + Position.Y = 6.000000000000000000 + Size.Width = 395.000000000000000000 + Size.Height = 41.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Panel4Style1' + TabOrder = 2 + object Label5: TLabel + Position.X = 203.000000000000000000 + Position.Y = -1.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Destination Unit Name:' + end + object EditUnitName: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 2 + Text = 'RootU' + Position.X = 203.000000000000000000 + Position.Y = 17.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + end + object Label2: TLabel + Position.X = 3.000000000000000000 + Position.Y = -1.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Destination Class Name:' + TabOrder = 3 + end + object EditClassName: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 1 + Text = 'Root' + Position.X = 3.000000000000000000 + Position.Y = 17.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = EditClassNameChange + end + end + object Button1: TButton + Action = actConvert + Anchors = [akTop, akRight] + ImageIndex = -1 + Position.X = 527.000000000000000000 + Position.Y = 21.000000000000000000 + TextSettings.Trimming = None + end + end + object Splitter2: TSplitter + Align = Left + Cursor = crHSplit + MinSize = 20.000000000000000000 + Size.Width = 4.000000000000000000 + Size.Height = 430.000000000000000000 + Size.PlatformDefault = False + Visible = False + end + object sd: TSaveDialog + Filter = + 'Delphi Source File|*.pas|JSON File|*.json|BSON File|*.bson|All F' + + 'iles|*.*' + Left = 88 + Top = 40 + end + object StyleBook1: TStyleBook + Styles = < + item + ResourcesBin = { + 464D585F5354594C4520322E3501061C5374796C65426F6F6B3157696E646F77 + 7320377374796C652E706E67043A910000061354726565566965774974656D31 + 5374796C65310329040628726565566965774974656D31747265657669657765 + 7870616E646572627574746F6E7374796C6531038703061A7265655669657749 + 74656D31436865636B426F785374796C653103750506104C6162656C4E6F726D + 616C5374796C65032901060C50616E656C325374796C653103D800060B4D656D + 6F315374796C653103E80806144D656D6F315363726F6C6C4261725374796C65 + 3103630406194D656D6F31536D616C6C5363726F6C6C4261725374796C653103 + A601060E4C6162656C4C696E6B5374796C65039501060F4C6162656C4572726F + 725374796C6503B000060F4C6162656C477265656E5374796C6503E700060C50 + 616E656C345374796C653103D30000545046300654496D61676500095374796C + 654E616D65061C5374796C65426F6F6B3157696E646F777320377374796C652E + 706E670E4D756C74695265734269746D61700E01055769647468039001064865 + 6967687403580203504E470ACC90000089504E470D0A1A0A0000000D49484452 + 000001900000025808060000004CECB088000000017352474200AECE1CE90000 + 000467414D410000B18F0BFC61050000907649444154785EED9D078014D5FDC7 + 7FBB7BB757813B8E8E059122448D050D120DD841516CD8A548A251A3422CD1FC + A38831D1D8301AB1244AB1077B033B58D0287605B152A4C315B87E5BFEBFEFEC + 7BCBECDC6CBD6D77FBFBC0F7E6BD3775DFCCBCEFBCF7A6902008822008822008 + 8220088220088220084207C4A18682207410EEB9E71EBF0A0A162EB8E082B065 + DEF537DE21F916866BAF9E6A9B6FB689B5B5B5929149A6B4B434A259FFE3D6BB + 732ECFFF74F9457201931C908FC1E3070672C61967A898A079ECB1C7A21AC835 + 575DAA6282E6AF37FD530C24D3C46220575E76A18A757C6EBE6D961848F2D0F9 + 689CB76220F688812446240371AAA12008ED1731622123888108822008092106 + 2208ED1F398F858C20079E20741CA4294B482B62208220084242888108822008 + 09210622088220248418889095783C5E3FF0F9446601E48DCA2641C828622042 + 56C265254B0F453B14C81341C806C44084ACC4E3F15153B38F9A5B4466214F90 + 3761106711D28A18889095B478FDD4E2F1B27CA210719EB46EC10AEB2882904A + C44084AC0457D9B8E26E1185087912A106220869450C44C84ABC3ED440B8D0F4 + 8A42C47982BC11846C400C44C84AFC7EBF28826C105711D28E18889095A08C14 + 85970569D3123282188890956CAB6DA2CAEA46AAAA1199853C41DE0842362006 + 2264250E8743144182900D8881085989D3E12487536427E48D20640372240A59 + 0B9795C6012A32097F04214B90C351C84AD04A631498188A7648E58D20640362 + 204256E23435D9884285BC11846C408E44212BC1D5B68BFF885A8BFF0B425620 + 06226425B8D3C8A9EE3812ED90CE1341C806C44084ACC45A708A422508D98018 + 88909538BCD52D0E078B4421429E70DEA86C12848C627B29535B5BDBFA650942 + 9B282D2D8D78D9F88F5BEFF65F79D9852AD6F1B9F9B659F4A7CB2F0A9B27EFBC + FF95BFAAA68EF2F25C2A45001E8F97CABB94D02107ED1936EFEEB9E71EFF1967 + 9CA16282E6B1C71EA30B2EB8206CBE5D7FE31DFE6BAEBA54C504CD5F6FFA275D + 7BF554DB7CB34D1403493E6220A144331039062313E9781203B1470C24312219 + 8834610959090A485178A96C12848C22062208822024841888904DC8F1181B92 + 4F42562007A2904DC8F1181B6E3514848C62DB962A1D98C9275ABBB574A21BE4 + B13C085455554DFDA93A7FE6FAED2E6AF2222537297011F5EEE4A5DDCA5AA695 + 9797FF4B2517B26A03C1D64827BA3DD2899E18721756162006124A3403F9F8A7 + 5ABFD3994FBB55040AD15C05E6F9D356229FAF85F6DFADB44025A30622061227 + 62208921776109ED85E0F1B88E6B1E300F97C3472D5E6FCE0ABF1FF980FC604A + 8DCC0918AD20641C3110212B69E12BEF7C2E337D3EBFED37C17345F8FDC807E4 + 07D3C8C2392BE7AD9015C8812864355C86E6BC04215B110311B21BBB1235D7B4 + 03395F85AC420E48216BB12B4B735582908D888108D90B979CD682341715F863 + E0534341C80AC440846C22A480340A50FE93F30A648719E3566741C834622042 + F6A20ACF5C57E04F1098ACD44484AC400C44C85A8285678E0B03851887905588 + 8108D984149091D1B50F69C212B202311021ABB15C8CE7A44C688315A315B202 + 3110216B310A50FE93F30A648746CC43C81AC440846C22A470D48567CE0B7F02 + E8FC91262C212B100311B29A902BF11C950D520B11B202311041685F88790859 + 83188890B51857E018E6BAF0278098879055888108598DB92927572508D98A18 + 889095E01B18CD5E3E409D113FE4D8E1C1EF473E203F0421DB100311B292DEA5 + 5E5A5D4DE47038A9D0EDCA59E1F7231F901F82906DD85EDE85FB26BA23B72F06 + DB4449897C13DD4C986FA207A9AAAA9AFA7D65FECC8D752EE30A3C57610FA19E + 255E1AD0B5655A7979F91D2A3922F24D747BE49BE88911E99BE8B6896220C947 + 0C2494680622248E18883D62208911C940A4094B100441480831104110042121 + C440044110848410031104411012420C441004414808DB9E75B90B2BF9C85D58 + A144BA0B6BD1A2457FE4C16D81986087DFEFA7430F3DD436FFE42E2C7BE42EAC + C490DB78B300319050221988CFE7FBA3C3E110038902E7916DFE8981D8230692 + 18721BAFD0AE703A9DB7A370B4E014854A659720640C3908856C05573C660982 + 9065888108D986D530CC2692ABCA67E1758A66215D10328A1888906DE8C2514B + 634ED3C2F19B2BCA5332A709424689EB20B47EA74014BB8498C0F1A83F9AA40B + 495D70E22A1C2A30C9DDC1A57F3BF204C2B7D0F550BE8B2E641C5CC5B522DC5D + 5842E29496CA5D5866C2DC8565361021417017960A0A16A2DD85A5828285A4DC + C62B248E1848286220822008490206924BE0F7AA9F6E06062208423B414E5821 + 9B90DA8720B423C4400441108484100311044110122262C7AE903EA4135D1032 + 4B53738BFFCDCF37D0B2D535545DD7AC527393B212370DDDA50B1DF6CB5E54E0 + CE0F7B9ECA099C25888108426679FABD957E87D345FBECDE9D4A8BF1C851EE52 + 5BDF429FFDB099FC3E2F9DF4EB7E6220D94E98BB923A34622001962D5FE1FF7A + D9B72A26A48A5F0C1D4443870C0E7BCCFDF5B1CFFD5346FF829A7D449E1CBF9D + 23CF49E4663DB0F06BBAE68C5F8A816429D9D807257742A599D56B36F977DEA9 + BB8A09C9C6A75E05B176ED16DA65E71E61CBBC6BE67DE2BFF8C45F524D833C06 + 07BA1439E8AE673EA7BF4ED84F0C44685F5455558DAAACAC3CC3E3F11C9D9797 + B7AB4ACE4A781B57F136BED2B56BD7C7CACBCB17A9E4981103492D5EC8EBA58D + EB2B633290AA7A3110505E2C0622B4439479DCDABF7FFFFD5552BBE0C71F7FFC + 984DE4F2784D440C24B58881248618483BE2F5D75FCFA9A3F688238E087BECFD + F0C30FF7B1799C575D5DFD81DFEFBF970BE5B96A5456C26637D1E170FCBEACAC + 6C389BC8FDBBEFBEFBF96A544C8881A496B80CE40431108D6120CF8A8108ED8C + 152B56AC1C3468D0AE5C139994EDE6A1818970CD63CEB7DF7EBB6AF0E0C1FD54 + 724C8881A416B3813CF09FEEAE19331CB6FD7C6220A1C46220F220A19075E83E + 8FF6621E406F6BB6F7D7E43ACB7EF1355E8F1F11D8872836C4400441C819B6AF + 77476C7589B5E0CC0562C90B311041100413E6ABF05C562CD8BAF1C1D39F8B75 + FE8CF2EE8C7111AF26DACBC379D11EA8EB28BF23567EF8E1077FFFFEFDC9C1A8 + A476015E53FFE38F3FD2EEBBEF1ED7764B1F486A31F7819CF77475E1C24B0735 + 05C684823E903F8CFB256D95E7400C2A8A1CF4AFE712E8448781BC79ED712A96 + 9D1C76FD0B311948B6BF1E2496577AE0775C3635AE1B7BD2CE6D77DC27062206 + 9295C4632017B181548A8118746503B93B8A81446CC2AA6EF267A57295A6A6A6 + AC94207414707B161E5C17C5F64A8AB006C2F367B572118FC7939512840E0317 + 2E7685692E2A968236620D040E948DCA55D0A2938D12848E845D619A8B8A85F0 + 0662B3C06C512E5641FCFCC3B35982D051D0454CAE2B16223661E12D96D9A858 + 7F5C47C3AEE0CE0609424741179EA280A211C540B253FC5F100441C83011FB40 + BC5C5267A372159FCF979512848E8251BCE08FC81844433AD1DB09764D47D924 + 41682714A8615870388B546644217C1396CD02B349B9885DC19D0D12848E040E + 6991CA8C2844AC8108D9855DE19D0D12848E020E671CD12216FE4421AC81B4F0 + CC3FD53AB252D8B65C037D0DDBB66DCB4A493F88D05E709744EF45350A4F514C + 843510AF5126D82D36F30A6C5B6E61EEB4CE4609427BC05D5312F1D509460D44 + 145434223661D93557648304411012A136AF51AE769248F84E7496DD437CD9A0 + 5CB5103B33CD060942470247B42836221A88F5F98B6C11FFCF39EC0AEE6C9220 + 74047024E37016B102591291884D582D5C5A67A3721114D2F8A641364A0C44E8 + 28E04816ED5034C2D7405060F9B253B95A60D915DED92041C8668CE3D4135BD7 + 87B500CD7545C3F65DDCF822E1D37F1A4B6FAF6B5629D9C56FFAB8E9A47FBC98 + 535F24BCE8F713095FBBCB46F0F5C0BBEF9D2B5F246412F922E19A8D557E7F73 + 8B8A09A9C2E1CEA7DF3DBE39E21709CF3DF697B4715B2C4567C7A76767073DF8 + 52829FB47D8A0D64F1DAECFCDADCC8BE0574728E19C885E74FC86A039975DF3C + 3190040D44C80EB481AC170331E81D838184EF03F1DBDF01950DC2B6E52268BA + CB460942870187B36887A260EB2C460DE4CA63E9CD9FB3B30672D84E5C03B9F9 + A59CAB817CFFFDF72A25BB18306080D4401836D3846A20CB96AFF09FFFF0572A + 26A48AFBCEDE93860E191C76DF183590637E49EBA40662D0073590971368C212 + 844C926B06F2D2A7EBFDC7ECD34BC5846463B45A300B3FDF48C7EEDB5B0C2446 + 62319088B7F10A8220B477FC7C1DE289F1753B46CB0DFF11B102591211311021 + D948AD5668B7A0E0F4890C212FA221062208822024841888200839C3F4E9FEB0 + 655E71818B1A9BBD94C7538434E5E4A09007C80BE44924A4B9A18D34FB7CC317 + BEFCF2EFDF78EDF5891B376E54A9A9A567CF9E74F89147CC1D7DCC31F7BA9DCE + 0F54329D7BEEB9C73A1C8E0354346DF8FDFE8F1E7CF0C1975414C7141F828923 + 9DE84232C1BB12F034FAEB5F6EA639DF6D2D987FEA9EB64F483FFFFE2A7F93DF + 457BF6EFC505686E178D1E9F9FBEFA7103E573EE9D3062D7B09991DBB994049E + 7AEA99390B172E9CB8E75E7B51E7CE9D556A6AC1479C3EFCF07F74D28927CD3D + F9E41327214D9BC79FFF722DF5E9D5C7982E1DACDBB08EFE7EC3F56613C1155E + 9B5E992D06222413B381DCF5F6F6B04FA2D73736FB172C5D47CBD6D450734B6E + BFA2C79DEFA2A13B77A131C3FA5071A15B0C2455FCFEC23FF8870C19423D7AF4 + A42E5DBAA8D4D4E272B968D9D75FD38A6F57D0BDB3FE65ECC32953A65C77159B + 47AF1E3DA8B6BED1982E1D941617D2864D9BE8263691071E78E03A4E12031103 + C92A623510217EC2B6070AB1B179D3662A2BEB4A65E515D4B56BF7F4A8A2071D + 34E21063DD66BA75EB415B2A6BA9B1D19336617D58AF2008B98718481BF1F9FC + 5C23C827B7BB889C2E775AE470E4912BAFC058B709175FF7BB7C3E5FDA85F51A + EB170421A780814079464C881B14E10EA7D390D3E94A8B1C8EC0FACCF6E1F7FB + 4B9A3DAC664FFAC5EBC5FAD5A608829023C03CDCAC7C23D6BE80E9657CBB9B9B + BD81025D15EAE910AFCC581FD62D08829029D0D957CCF2B0B2F3E31FE181F165 + 7C9B8F197BB2FFB4332752AFDE3B5369A7F4DC85A5F9DB7557D2CB2F3E15EC44 + 3FE5F473A9B2BADE18974EBA9615D3938F3FA83BD1DB8C74A20BC9443AD15307 + 0EF45216BE6613CCD45BEFBE7BE77C8FE7649FC371343BCBFE48E3CBFD8F9D7E + FF2B2D79794F5D7ED1456B8C092D9C76EB633B3B783EBE3E3E9A1C7E633EF23B + 3EF693FF153FCFF7C4E567D8CE97E0FA0A787D3D12595F3239F6B893FD679C3D + 997AF7D9850D243D776169AEBFE68FF4D20B4103B9E5D4D3A7D0969A3A635C3A + E9D6A584FEFBF80330902B54529B58B162C5CA418306ED5A555535A96BD7AE73 + 55725653595939B1BCBC7CCEB7DF7EBB6AF0E0C1FD54724C8881A4961C321094 + 056D7A062B5ED084859506AF9866DE75D7412EAFF7AEAE1515337F356CD8E889 + A79FDE1D421869188769D4E441CEB8F991831C5EDF5DBDBB97CF3CFA905F8EFE + D36F8FEF0E218C348CC3346AF22089AEEF846BEE1E8E650ED8A5D7CC338FFBF5 + E8197F38A53B8430D2C2AD2FF93870E5493E9F8F7C7C90A6437E5E1764DA6DD8 + 867AA7D351EF7238D32EAC17EB579BB263A312846B1FAFE04A9E2B20BF47C1AC + 92B3166C23B615DB8C6D57C9427652A0864212C0C95EC6822337A0268002BBFF + AEBB8E3BF8E04368C5F73F5155CD364C4715E55D68E0EEFDE8DD77DEA11F57AD + 7ACEEB725DAC6B0646CD830BEC3D07F41D37EEE811F4C11A3F6DAC3566A35E9D + 8886EFE4A0675F59425F7DBFF639BFCB79B1AE1958D7F7C5B26F69E9D7DF19F3 + 1DB8D720DA73C8C0F0EB6B6999357CDF41630F3F783F7AEB9BEDF4F997DF1AF3 + EDB3F7203A7470277AFDDD4FE883CF7F08595F2A187BFC29FED3CF9CC835909D + A953BA6B20D3AFA0179F7FD228B0CF3DF7DCDBCF9E703E55D63418E3D249D72E + 45F4F0BCFBE8C1071FFC2347B13D6DBA0AE29AC7A84E9D3ADDBA6AD5AA40ADB2 + 9DB0EBAEBB7EBC7DFBF6CBB926B24825C584D440528BA506D2856B208142ADE3 + D1E6732F5E426A206846EAD6B5EBB8E1078DA0251F7D4A0D4DCD54515141DDBA + 75E31DE0E3427A398DF8F5AF09D3605ACC03D08CD4BB5B9771C71E31829E5AE6 + A7168F930675CDA3C12C9FD749CF7FEBA7638F1C419806D3AAD942D6F7F073AF + D0EF6FB897DEF8E86B9AFFCA3B34F1FF66D2FC17DF08BBBE01BBF61E3BF2A0FD + E8AE67BEA07FFDE50AFAF9BD17E88B17E6D22D975D4C773EF3298D1CB11F0DD8 + B947C8FA52051EEC839C6912BA06ACDD031CDFE670E56D73385DE917D6CBEB57 + 9BD2665000A320EED7AFDFFD3BEFBCF32AF48764B3B08DD8D644CC4310DA334E + BED27376EFDE1D4642E88318B0FBEEF4FD8FABA8A4A4943A77EA4CEEFC7C2A2D + 2EA29E3DBA51F78AAE84F73D611A4C6B2C81411FC43E43FAD147EBFCD4ABC449 + 7D4B9D54E8222A7513F52F7352BFCE4EFA62939F308DD15FA1D0EBFBFA9BEFE9 + AE475FA60B2F3A8FA6DFF437DA7FDA25544B79F4F7079EA4D53FFF6CBBBEE1FB + 0CA4B7BFDB4EAFCFBD93FE74D94534EFAE1BE8987FFD9D1ADCC5B4E03F33E9C3 + 55758469CCEB4B0528C89DCEC02DBC79797969913610C88CDBED66156740B89F + 21B9A02066533E9F97DD8F7F6756836DC4B68A7908B986D3EFF7074B217460EF + CE8575554D0D75E9DC890A0BF2A953492175292DE2611175EFD6953C1E2FEE32 + 31A655B37129EADFFF978377A675DB897A1639299FCDA3289FA89885E16E5D9C + D4E87110A6097676337A7D4B3EFB9A4A0B9CE4DF7D579AB56625BDB5D24BAE63 + 2EA2E6DA1AFAF08BEF6CD73768D79EF4D1D22FA813CFD7EDD77BD12D850E7AE1 + E7722AFCED4C9EAF9ABEFCE473C234E6F5A50A171B489E8B85611AE474C2B442 + CD0314BA0B59EE0CA8506D81415AABD082D001687D32B71374135608055CEB28 + 2E2A304CA3736931D7468AA9A0A0C010C2684FB4238F8DA3202F601AA87D74E3 + 42BD3BABDCEDA05E450EA3A3D98EFCBC7CDAB06103DDF9EA2A7AE7D35AC29DA8 + 0DCD8172A8B0B020ECFA508662BEAB5F6DA417DF23DA524B54DB1498AF0B6F83 + 37C6AF90B5055402F82234AD0AD4789C1C561BA1C8E3823C53120421F7709496 + 96762F2A2A6AD8BC7973EDCC3BEF5C70D081078E2E282A319AAEBA55941BCD13 + F91C46C1D5D4D444CDCDCDB472E54A7AFFC30F174EBBE4923158C819373DBC60 + CCC87D467BBB0DA4422ED876EBECA4CE6C1AA56C262E2EE4B6B3196CF3FAE89B + 6F57D082C59F2D7CECAAB38DF9F4FA7CCE7C3AFD8A9BA9068F761C712179D803 + 1CAFCDA20A670B2D9A77336D5CBFAED5FACE1E77C8E89F1A8AE91FD32EA65A77 + 17729E732B35C32F1EBA9CCA3D353467EE3DD4D0B08D1E7EEE9DE0FA52C1E429 + 17FA0F3DFC281A34782875EE8CFB11520FEEFA02B7FE6306CD7E609661239327 + 4F9E7AF6D91796F5E8B3136DDB96BEC7633A7776537DED36BAFFDE9B93F61C48 + AE219DE8A9259E4EF47FFEF39F52830EC3A5975E6AB9640DD43E2A58787D6B1D + 67DE54DC3A3B66F4185AB57A3575EB56415D3A7736DADDB103601EA8853CF7FC + F354B975EB345EE01D58C8E9373D34B54F8FAE33CF39E5487A678D9FF6287351 + BF4E4E2AE61A490B17EADB5BFC5454E4A57B1E7B8DD66DAA9CF6F855E718F399 + D7B760D17BF4E73B1FA19686EDE4E05D985FDC89FE73C3341ABECF50DBF50DDC + B5F7CC938EFD0DCD79F9537A6AD64CF2F07C20BFA8134DFFCBE534F290BD69DE + B36FD377ABD607D7970A1E98FDD49CF73F5834F1A493CFA05DFBEDAE52534B75 + 55253DF1D85CFAE52F0F983B65F2C9C6EBDCD9400EE65AC911BFFFC35554D6B9 + AB315D3AA8DE5649F7FEEB26989AF99B20421C8881A416B381DCF77175E7E77F + 3B245058D8C0C7B1184818B81211D940CCB7D58E1C398AB66DDF464E8793F2DD + F94633537E7E1EBDF9E69B116FE33D79CC085AB7CD415C67A1CEF90E2AC8F773 + 2DC6478FBD14F9365EAC6FC3E6CDB4ECBBD5E4E2F5EC3774201784A5E1D7A76E + E33DFA37FBD1373F6FA79F567C4FC5790EFAE59E03A847F7527A61517A6EE37D + F9D5A5C3977CB0E8F75F7CF2D1C46DDBAA556A6A414D67EFFD0E983B62F8A87B + 8F396A58B67D504A88133190D4623690D96FB6143F79D92E61EF75AFD9BA550C + 240C5D2A2A6C0D040F2FA0CDC3C854E3A13DBFFF4FB87576F7FEFD69D0A04148 + A6EFBEFB8EBEFFE107DA5259F91C5BD13FA65D7CF1FBC608051EDA63EFFE539F + EE65E3F61EBC0BEDFF8BC0C3B89F2C5B459F7FB38AD66DAE7E8EFDEB1F8F5D79 + 56C87C89AE6FDCFFDD35AAA873D7A90377E939EEC0BD77A7A1BB073EA2B4FCC7 + F5F4BFCFBFA7EF566FB45D9F20641B6220A9C5D28415F149743190F0843310BC + C0090612FC0A5182AF1649F7AB4C0A797DDD13599F2064136220A9C56C20C7EE + DBBB552168460C243CE10C048FF6B7C777C3B4D7ED168410C440528B184872B0 + 3310DCC69BCF6A8FEF8711F31004212A300FAF27F5B7F4E7227014DCC49FC752 + 6FAF12B2917FDC7A77BBB832FAD3E51745BCC2135A831A880A0A29466A208913 + AE090BEFA1404D04353DE395260CD2F5C4189A33558761E918871A0C8688BB58 + 78353CB0CEA72F01F410E320BD1C9D2ED80003B9F2B20B552C3BB9F9B6596220 + 42BB460C243CE10C441B80D540343AAC0B7C3388A3F602301DE43162ADE733CF + 8BB0F9297884B581845B1FD6A3E37A8869B1DD66CCF368908669F510CBC276EA + 6DCD7AB4813CB7323BBFFB35AE9F5B0C4468F7888184279C81A030C5D05A0330 + 4F6CCD548CD369A87568906E2ED0ED76864ED36605CCCB0376EBD386A3C76188 + B879BBEDE6B34E0F609AEDD640505867137A9BC44084F68E184878C21988567B + 6C4232D75CC2A17F74BB3E30C4403A2E5EAFD7EF72B91C074F7F2EE163745099 + 6BF1F85143EF1EB36FFFF988EF79EE2D092FAB7B5EEDE293460EBFFBE2B3C618 + CBCA25C440C213C94024D3B21C31908E0F0CE4CD6B8F53B1F8983AE73DEA554C + 8BAF3DE3905188C340FE78FC2F8D71F13277FE4B34608F3D163F70CD05C6B272 + 093190F0443590DB67CE8C3BF3FE386D9A63FCDF1F8A7BBEF97F3EC7D1D1D7A7 + 8249410CA4E3A30DA45ABD513A1ECA0A1C74D8F52FD0BB33C619F90F03B960CC + 5E34E6B0DF18E3E361D13BEFD2EDCF7F4E5F3D7845CEED4B3190F08433902028 + 60CFFBDDEF542C3AF7FFFBDFC102F61F979DA652A3F3A7DB9E0816E891D6A73F + 9E84FBB8F12AF858D7D7D9E5A4029E6FBBD7478D78BF4A8CEBB3D2D6DFA7A249 + 410CA4E3A30DA4320103E96A6320D79E79300DDB776F637C3C2CFDF40BBAFED1 + 77C5408410EC0CC4DC911DE4D5B7DEB3D56B8B96D0A2F7FE47EF7FF8B19A3294 + 7F7FECB7D7277E7AF0333FCDFBC27EDFD8AD0B5F297CE4990FE8DADB9EA7751B + 2B0D23B162B7AE6F3738E98947DEA70B2F7B94F2B63786F4F06B0EB8E43E3AF0 + 92FB95EEA3032EBE9786FD61160DBBF02EDAFFFC3B68BFDFDDAAA60CE5D80BEE + A2B117FC4BE92E3AF6F777D2313CFD31BFBB8DC69C7B338D9EF47735A520248E + 8F4F93786587BBA0809C79F9710BF309422CD81A08D879A79D42D4BFDFAE3468 + 407F1ACC72E7EB3B775B33BC775E887EDD378F7EB3531E8D64B9EC4A7385795D + BBECBC330DE8BF1BBDFACE0FF4F157EBE987955B6C0D0498D735A24F1E1DDA9B + E8B67FBF458F3DFF097DF4F96A2AB0F9721F187FDEA974E2E493E9D8B34FA023 + 4F3D8E468D1B43C3C71C49FB1D368A7CDEF037679D36630A9DF4974934F64FE7 + D0D1D3CEA4C32E3C8D464C3995F63FFBA488F30942ACF8B8D61CAFECC0DD255E + 1E15AFDAE3DD344266086B201A7C3AB5C09D4F85856EE313B708E7E3D3835140 + B18DC9F0795BB71A8629CB43C0FABA752DA3B73FFC912AABEB68B79D2B68EF3D + 7A85FD9AA1068BDEBD8B836B2D4B69F5BA2ADA73706F1A76D010AAB7BB3CF3FB + C8D3ECA117D7D6D2AB1BEA69D1D6067AAFBA913EDAD6440D750DE4F78479D682 + E76B69F6D282263FBDEE71D262CAA325AE025AEA2EA2C6BAE6F0F309421CD815 + EAD16407DEDE81EFF1C42B79EB87102B610D049F4CC5F73F601845852C360F18 + 086A1F6E4E0B072A0A2E5EAA360E6D1E799C56127E362A2E2EA46E1565BC0E37 + 752DEF4CCFBCF285B10DA78DDD976AEBC2BF65A5A290686099830AB95234A893 + 9FFE71EF1B46FAD5171D495F57599F310CE067336A6A4281EF219FA7857C4D4D + E46B6C60D553436D3D799B832F260E01F33537F1F47C86F95BBC3C9F97BC8DBC + 8C86166AD8DE14763E4188073B8388263B0206E28F5B622042ACD81A481E571D + 6016C55CEB28E5821DDF462F292EE2B402E3F3B68585456ACA50B8BC37CC02DF + 45E7D98D6FA37776B330645514D857417AF6E8465C6ED3BB4BD750AF1E5DE983 + 4F56D1E6AD75B4739F723AF880FE5C68DB5FD9EFDB9D57F8F32A7A79FE221ADA + D541FF7DE933FA61D5161AD4BF079D3C7A6F5A57677F66F97D1E6A6A6C261F17 + F8BE867AF2D5D79197E5A9DDCE4650C7E9F6DF9B31E66B60C368F2909787DE7A + 565D0BCFD742F5DB795961E613DA3F175C70813F9C860F1F3E524D6606075F38 + F5678585CBF0B865878747B4B0BBC42BCC2708B1606B206E6D20456E5681F119 + 5BFD6DF48081E0FD8BAD41CD43D73A8AD944CADD0E2A63E1CB8425790E2A0F63 + 20BD7B76A3479EFD981E7E1ACD4FB5F4D402D43E1C74F2987D8CA6AB8230EBFB + 552F17FDDF2D2FD25537BD402B97ADA41BEF7ECD48BFFC778752B587D71D667D + 7E2F1B413DD738EAB9B6C1B51B4FED36F26CAB26EFB61AAADF56CB3589300662 + CCC7B51518079B86675B13796A9A594D3C1F6A2062201D957BEEB9C7F660FAF4 + D34F477DF0C1078B55D48CFDC14784EF1EFF1808DAC36578DCB2C33090042406 + 22C44AD81A089AAAF2F3D0F1ED3284E6243D44D3961DA881A0A9AA800DA48827 + 298499C05494F0C9593BAAAAAA69EAB9238D8EF23FB321FCBCA19A7A5474A243 + 470C340C24DCFA966EF6D203379F6184479D76172DFF7E23EDC2B596B34E1C46 + 8DDEF0EBF3B53453436D43C03CB6B379D454534B759561228D755C0369B17F53 + 7C603E360C685BC0383CD58DC6B0B1968D25CC7C42C7C06A2211CC43633D00A3 + 9A07585BEF885B7678FCF606114D984F1062818BF5D618FD1C2C3C87A14D0342 + 016F1808A7DBA16B208679700D229FE328C3612A106A2576343535516949011D + 7EF0203EE3F81FAF67DC517B71C81F717D2B6B7DD4B953214D3879C767C0A74E + 1949CD0E36BB08EB436777635D3D0DF4B650BFA666EACDB58A8A7A2F75AEC7B6 + D8F79B80C07C4D3470E356DA65DD46EAB97A3D755DBD8E3AAD591B713EA1E3F0 + F1C71F1BCD4F9F7FFEF93951CC43D3550D87B1A29A07B0BBCB2A9AECF8B1BA99 + BEDAD214B7309F20C40217B3AD4147F6E6CD5BA8B2B28AAA6B6A68DBF6ED54CB + 57E675F5F554C705AFCB655F32C338BEADF6D2CA6D3EFA990BF7F5753EDADCE0 + A72DACADAC70B7D4E671695F5DB9994E19B3371D3662773AE2E0813C1C48DB6B + 6B23AE0FA7CD47F585347DEA68FAEDE907D1F9678D30866B6A23AF0FB7DB7EB8 + E079FAFCCD1768D9BB2FD18F1FBF4EEB97BD4D5BBF5B42B5ABFEA7A66A0DE6FB + E081FBE8D347EEA1AFE7CFA21F5FBA8FD6BEF9206D79671E6DFFDF236A2AA123 + F3E1871FFE849AC892254B1E5649D1A862E140B47F78CA062FD702E2951D813E + 0D5F02921A88101BB6063274C81ED4AFDFAED4BB772FEA5651C157F99DA8B8A8 + 888A0A0BA9A8A8904A4A8AD594A19C34D84187EC42B4572F3FEDD6CD47DDBBF8 + A8B4D44BC5250175E9647F958EF5F5E9D39B7A5494D2C59346D2EFCFFA35D720 + FC46A77DB4F50DE9E12757F74E74F35F4FA6BF5F771255BA1C54581C797D5F3E + FA5736809B69F9B377D1B72FFF9BBE7B657640AF2A71D88E37E6FF83DE7AF60E + 5ACCC6F1EE6B73E9BD371F09E82D250E0B425B411352BCB20366D0E4895F984F + 106221E412BDA3BF9B2ADDEB53C1A420AF32E9F8E857992C5CA3BFC9163BA377 + CE6FF52A9343460EA39D070E31C6C7C39AEF96D33B8B97CAAB4C8410A2BE0B4B + C85EC4403A3EDA405E5A157F1FC4B1BBBA5B19C8F05FEF477D07EE618C8F87B5 + DF7D431FBCF78918881042CCEFC212042173D8F5714493C6CFA82035A349AAC5 + 1BB7309F20C4825C2DB613CC35906C446A206D47D7409EF931FE371A9CD8BFD0 + A881BC73DDF1B88BD1811AC8DEC3F6A25EBB0F5653C4CE861F56D0174BBF941A + 8810823461B563B481643362206D231906B2F8DAB1B8F5DE309021FB0C4DD840 + 967FB64C0C4408410C4410B2186D208970E5434BA84B01FBC7A9078D341B48E7 + 3EBBA82962A7F693C5D4AB57AFC5FFBCE414F922A110440C4410B21818880AC6 + CDF1FBF4587CDAF02177EFDABBACCDDF441F77C85E8B271D79C0DD0377AA906F + A20B41EC0C44100441481F1DEAC625B90B4B4826728522081964F6ECD9DFA960 + 5A100311928954FF052183F8FDFE4A154C0B6220422A418D446A258290261C0E + C736154C0B6220422AD1351231114148035C0389FF3D386D20E4C4AEAAAA9A3A + 77EEDC99EBD7AF375EB12E04C007B57AF7EE4D13274E9C565E5E7E874A1662C3 + 7C8C49139790EBE0A23D658FFA3FF8E0834F9F7BEEB927A968CA0931901B6FBA + C98FB7EE9E76DA69D4AD5B37952A6CD9B2859E78E209AA6F68A0ABAFBA4AAEA6 + E303278C360E3190E451A086E63CB5E63386F2A19AEC22A506327BF6ECC7274F + 9E7CBA8AA69C90C2F08A2BAEF0B3A8ACAC8C1A1BE37F1AB6A3824FF8565757D3 + 2DB7DC02C5622098460ACB002E16F2C25AB80942B6D1EECFDB3973E63C3C69D2 + A4B35534E584148653A74EF5DF7AEBAD545F5FAF52044D7171315D7EF9E574C7 + 1D778881C487184814FEFD9FFFF8BB77F01AFF6F468EA4AEE5E5B19C3B421B60 + 0399CD06325945534E2B03C155B618486B6020A89D8981C40D3E27A90D444B30 + F1ECB3CFFA7F3562848A754C7A545418EFE852512145CC9E3DFBDF93274FFE9D + 8AA61C5B03A9ABAB532982A6A4A4440C2431F25968F3359B47D8BC59BF7EBD31 + 0ECD8666F09D7CBCA91C433388436872EDD1A387E3E977BEF4BFB67C0B7DB936 + F6BB1977EB5642C7FCB20F9DF19BA1C6C21F5AF0BEFFC9F7BFA3FF7DB7C1181F + 0B7BF4ED4AA7FF6628FDFEF811B11C1F21888108C9820DE46E36908B5434E584 + EC506D20B5B5B52A45D09496968A81A481B61AC805F7BFE5BFF284FD69D7EE9D + 787A3591C267F3E957247DB76E2BDDF0D4C7F4D8B4D1C6C2C75D3BCF7FCDA4A3 + A97FDF6E844F63784DF36D6932F57F7232A235CD3E5AB9663DCD7EEC157AF78E + DFC7727C84200622248B3973E6FC6BD2A4497F50D194D3EA39109CA43E9F4F64 + 11F2250EE444C910A879ECD2AD136D6EF0D1DA5A2FFDB4CD13D4AB6B9A42F4D4 + 0F0DF4C8179BA8D8DF486BAA77DCB68E9A07CCA38A8D6163A38FD6D47B835ABA + B525A88F586F6E68A267576EA7E2E202FA7E635A9FE112043B527687971DF220 + A1D02169F6F995100EA8B6C51F224F4B33793D2DE4F178D45C3B40CDA39E93B7 + B7F8B88611B878A86EF2D3CF75DEA0D6B2A1ACADF35043F5566A6E6C30A61162 + 07370FA0F615AF2AABAAE2BA9ACB25F84237F30682AB6D51A884DC02CD560D5E + 5FD06CD6D6F9A8CEE3379AB0B4366E6FA0869AC0AB87BC3626244406779EA1E9 + 2E5E75EED4492D41B0410C241B2508822084D2CA40509DDFB66D9BC822BB660E + A1E3D3EAD20117135A82907DA4B55BC27665769DC8B92E2137415356686D1437 + 54042408D986C3E1C8BC81849E302248C84DBCF009988592DFC7C78392206421 + 99351014967657E0B92E3191DC446A20427B828FD1B43E429056B712846C23D2 + 850146B51A6B2406E4721790BBB8548D1084ACC0AD8669C1D640ECAEC0735D42 + FBA2C54BD4E4F593D7EB09AAA5B92944C673209C6E079E03C16DBB91F0F232F0 + 1C8920640B0E8703EF9E6B137C51E5FFF4D34F231FFC0A69C28A5191AE54852C + 8377557D8B873CCDCDAC96A01AEB6A836AA8DD4E8DF575C6347634B0F9543762 + 196C122D3BD45C5FBB4375DBA98587BE96B69908DE54DBBD6BD70E2D216DE0DD + 736D62C3860DB472E54A158B8CD4406294D03E18D8A384D6556EA37E453EDA15 + 2ADEA191159EA04675F3D2E13D1D74F4CE05B4726B3D95786AD41288F6DAB51B + ADD9B095FA157AA95F8197762DE0F9958677F2EC50672F8D2877D0C13DDCB475 + 4B3555E4DB9B5134F09AF3BCBCBC0E2D790F567AE00BDD36D7407AF7EEED38F1 + C41363DA5F2113E1658A7FFDEB5FE9C71F7F542982A67FFFFE74CD35D7C4FA32 + 4518B3B84E02B4F5658A8FBEF5B9FFE5CFD7D1CAAAD80B7398C7592387D284A3 + 86190BBFEFB977FC8F2D5E46DFACDF612AD18079FCE9ECD1C16508D1C16B49F0 + 6479BCA04603535251C144A29FB4E573CBFFD9679FD1BEFBEEEB3087D5E8B084 + 4C802F125E7CF1C5C6B72FD6AC59A352859D77DED9F846CA5D77DD15EB1709C5 + 4004210A6220C9870DE46536906354346670E1F6C1071F106A1EE6B01A1D9690 + 096EBAE9267F4141018D1F3F9EBA74E9A252859A9A1A9A3F7F3E353535D155B1 + 7D135D0C4488CAE2C58BA72E5DBA74A6F5620D172CC3860D9B3672E4C83B5452 + 084F2DF966EAC22FD7CF5CBE2EF4EDBF43FA74A6D17BF59E76F2883D6CE77BFC + F50FA73EBBE49B995FADDCA85202ECD9AF279D30628F69A71F716070BE70DB16 + 0FFC3B56F1EFB823DCEF1003493EB367CF7E6DF2E4C947AA68CA09D909555555 + 53EFB9E79E993CA49636760C7624F2F3F3A9BCBC9C2EB8E082693CB43D192C88 + 8124886EC24A04B4DD26F24129F49B1C39B43B9D79E82F8DF321910F4AA1DFE4 + 948306D2F9E30E89B960BBEDB6DBFC279C7002EDBAEBAE2A25C0AA55ABE88927 + 9EA03FFFF9CFE51CAD0EA4EEE077F7BDE5BF68F4DE3474278CDEC1B29FABE8F6 + E73EA279978CC6DB065B7DD4E7F4EBE7F92F3FFD30DA7BF73E2A25C0173FACA3 + BFCD5D40CFFCED77151C35DE0E69DE36341D9AD171FD7A1FF3781DC610E6C326 + 11F6778881241FAE81FC8F6B20BF52D188F03EB26DB63287D5A4429AB1BD3941 + 880E0C2451617E7C50EAA74DDBFC5E9F3F3679FDFE359B6BFC67DFB120580AE2 + 83524B7FDCE8AF6CF2FA373578FDEBEB3D61B5A6D6E3FFB6A6C5FFC68A0DFE51 + 7FBC6F47491A03E873E442D8BF6DDBB610210DE37892018129433978FA73FE26 + DEF88DF5DE10210DE378929D025386B2E7B9B7F81B3D3EFF5ADE66B39086713C + C990C094A1DBC635707F7575B59F2F2CFD959595FE2D5BB6F8376FDEECFFEEBB + EF0CAD58B1C2BF7CF972FFB265CBFC5F7DF595FF8B2FBE4001E4DFBE7D7BC4DF + 010359BF6953DCC276A94508161E78E081152A18159C33CF3CF38C9197AB57AF + F6FFF7BFFF35C2E6F4684841276415E83C4F5400350F7C8D704BA38FD6D57B23 + 6AD5762F2DAF6AA2F2E2FC904EF7481F94326B759D97BEDBEEA1AF2A79199D8B + E2EA74D7F0C59EADA2C293E06D2A66B57EEAB135980EB7289B65CC2B74085C2E + 5768B53402E6BBAD76D96517C7A9A79E6A84E3B90B4B0C44E870A0FC6DE28BD4 + 686AF0F8C88BE7455856CC1F94C287A4A02A168C69633D9B139B074C089FB3C5 + C384DE3634F9C66D1E0CA6329B0784B46860BAFA167F889026740C264D9AD443 + 05D3821888D021B17E8DD04E3E9F37F09C8FCD7BADF407A5F034BA563DAB91D5 + E2F59297E553F2ABE5244A220602B08D66C502A6AB63D3302BD67905C14A4835 + 059DE8CF7DBA7626EEA35F572D9FE8D4F4292BA2637ED987C6EDDBD7B613BDBA + BABAEBC68D1B2F59B76EDDF8A6A6A6A1D66715ACA09088360D70BBDDCBFAF4E9 + 337FE0C081B7389DCE3A95DCA1413BBB0AC60DEF1B07FA00164F3FDEF8063A4C + 2212788D099E50C74386C7DFB198DE9D31CED829BDCEB8D9FFE9037F349AA900 + BE46A8310A78E3658A3B36134FA8E321C37157CFA10D8F5D1953D51FA07FE096 + 5B6EA1EDDBB7AB94009D3A75C22DF578E6682047BF0FA4EE00BFF1B56B8EA3F5 + 5C1332D3BBD84947FEF505FC8E9D39FA73207507E8E7787BD61FE9E34DA1CFC8 + ECDFC34DBFB9F076FAEAC12B86727439D292D5897EDF7DF7D13FFFF94FDBDF21 + 9DE8ED9F909DF0E0EB5FFAEF5E564D2D07EE43859D4A54AAD0B8BD8EF23FFC8C + 2E1A5A46E71EB157AB0377C58A15D7B1894C1F326488F10C4D22E084339B0AE2 + 78386ED9B2655456563663F0E0C1D7A9511D1A74D6AA60DC703E25DD40D07465 + 7E2796514026D1406EBEF966E38365663A77EE4C575E7965440379F52FC7D15A + 8B81F4650339EA86C806F2D6DD7FA4F7D637A99400BFEE5D40875E146A20B88D + F7BDF7DE9BB969D3264413820D662D17F473F877CCE1A81848072464279C7CFB + 2BFEEF7FFD6B3AB847211D5A12E5ECCB21DEAA73D2BB9B1A69C07BEFD1537F3C + BAD581CB279B7FFFFDF7273C4383A60DA00DC15CD08423DC74B87DB8A1A1813E + F9E4131A3972644E9C30C9A881BC75ED71F4EA9A26E35BE691C00B15F15E2CBC + DA64F2BC2F420CE4B5595369E9D616FAB9CE6B7CFFDC80F791F12A775F608838 + C07BB1F06A933FDFF95C420682E78CCCE019AC6806F20A1BC89ADAD07374E752 + 271D1DC540DEB86B1ABDF173A34A0970F84E8574F8C533430C4451C6EA160826 + 0CAA29B885576EE3ED8084F4816CAC69A482D2623A94AFC80EE50A884889F303 + F982FCB1033505DC05D4DC8CB7BBAAF6719F2F388CA670D3E1C1452C17CBCF15 + 60A689AA3D826620AE758548370D45029EB6B6C11122ED7391F0B2E735708DCA + 2CA48501853E0CAC2DC25BF95A9987D031B0ED44C7F1842B629152205B22A2A7 + B59A80355DC7A3A5E9744110846CC5FE2E2C2EB70C1311190AFC890CAE80CD05 + BF0E9B6B24E678B4349DDE5EAFACDB0B614D9A93F528E3BB1FC66BDD9BC9C7B5 + 03DC758591F8A094411B8CDE7AD100C574E1C093787D5C7B302996E3B4B6D943 + 9FAEDB1622A4094222B43210BE0E56FF02C7A308D239121E9CF4DA00CC468074 + 2D9D669679BC9EC69A26C4CFF6665FAB0F485915E98352680E42DFC796466FE8 + 37404CD21F94F2855946AC588F8958C051E161D3302B9623C5C7D33534368508 + 69829008F64D587C3CE1A01205146B196E2DF82173C1106DBC9EC61CCF35CC7D + 1AF14AC35918F86094E903525645FBA0141E105CB3AD91EAB66EE45A079B848D + 1AB75525E58352D6632216309D878F0FB3629917CFBEE0C60CB39026088960DF + 8425C48D2EFC812E08ACB21BA7B1A699E33A2D17B03386580576EB5642DFADDB + 4AA32A5A423E206555A40F4AEDD1B72BAD5CB39E46746AA143BAE71B1F8D8AA4 + B67C500AFBD67CC1603E8E22812912A98178BD3EAA67D3300B6956F0C65FBCB4 + 11777C25AA73EF79CB8FE5A845669CDADA5ABF2836A92C8B4A48033B767AE3A9 + 63E9F2AE7CF295A8448116D711DD5A994F85FF7D3178ABA799850B17FA0F3DF4 + 501CA02A25000A355D1898C366ACE93AAE8778A8ECADB7DEA2A38F6E7DFB7047 + 64D3A64D311FBC56F041A9C7DE5EE67FFEE3D5B4A63AF4598748583F2875EFF3 + 4BFC0FBFF9057DBF31F637FA26F24129DCC67BC30D37B4FA801B3E5EF697BFFC + 25E26DBC4FFF692C2D5E17FA1B47F629A093FE611CA3616FE37DE4AFBFA32B9E + FF42A504B8E5F8BDE9AC6BFE1D721BAF7EE3EF10BCF197F788DE2918E270C530 + 78D7978AE378DD31DECF465E4DF7BCF8113D32758CEDDB81D37D1B6F3C0563AE + 535A5A1A53FE864C6418C8F8B17499612092D79AC5750EBA0D0632DFDE405E79 + E515FFA851A3420C040600ACA6A1D3811E176E5AC03B92162D5A943306924BC0 + 40F005D01F7EF841A504D87DF7DDF5D72FC31AC8537F3A96DEFA39D4400EDDA9 + 804EFEC74B110DE4A119E7D2A5F397AA9400FF1C3F8CCE99FE608881601D6F5E + 7B9CF1FE2FAEDC18C22B4FF04C256EFB45A505B70E0374E0076A41684A4387BE + CF481BD5B7804EB939FCF68881642FB11A48AB262C1C04358D2DB4B14EA485FC + 40BE440346A0653603B36900E34ACD345EC7ADD3091D1B7C7009AFFB80619885 + 343CC5AD266BC5A05E9D8DAB7B14D06621ADC41BFA5A1433F870D4B7AB37D2CC + 93F70F11D23A3B63AFB1098226A4C4C255C7F6938EA1DF9734D0818562D69A0F + 1B1D746F5D11757AFAE5B03590BDF7DEBBD547B8AC46128970D3F295167DF9E5 + 975203E980847B5D88BA98F81BD740FEC3513C881702FA159EFEF0A799AB2CDF + 7D8779ECE25F3FE3DF7FBB02F3B5BAE2C717099F78EBF399DFAD0F7DAE0FE6D1 + AFA0F6A647EFBE691E47A5062224DE84050339AF580CC40C0CE4FEFAC806B2CF + 3EFB040DC45A9BD0C610AD8661371D5E6782AF838981745822BD2E640B2BDC53 + DCA52CCC6B07E669D5E7A0E8CAEA1908B602DFBA35BE48280692DB24DC84851C + C6811238084486383FA21D7928F49D4EA72197CB150CEBB835CD2A3D0D6A1CE6 + 34213B183F7E7CAB43802F1A925120457A5D48A45780C0205028DB299C790018 + 046A197632CC03E0FBEAF8446E598183BAB22A0A1DD4A3C869BCF1172F6DC47B + B7F6AD70181AD6CD49BFEAE1A2113DF3E890DEF946673EFA63BEE79A4EA42635 + A1FD13E232B8EAD8C63590DF16D5D38105D1DBFC73850F9B9CF49F8662EA1CA6 + 0682BBB00E38E000DBD75B035DA3B0A66B228D470D64E9D2A55203C920BBEDB6 + 9BFFD4534FF5FEE31FFFC853490603070E346A9EF3E7CFEF70FB06CD64CF2D5D + 39F3C7AD89F78D446B52931A48F692701356CD8930905A1A562079AD59DAE460 + 0329A52ECF846FC21A3E7CB8F1047A3281A1A046F2C1071F888164885D76D9C5 + CF06D23C61C204F794295342F6010C640417803D7AF4A05B6EB9A523EE9F48CD + 64F160DBA4260692BD24DC84C5A516F9B8F281364C5140C80FE44B2474B3136A + 135A3A6E1E679E46A7874BD3CD5A427CECB5D75E510B8AF2E163A34E83E5F4EC + D993D824DC4CAB4B71EC9B3E7DFAD0B061C3E8C9279FEC888553A466B27814A9 + 494D68C7D8F681F8F8AFDD2B3D72569C1FD14A071426E6C21F8221E8746D0ED6 + 342DF33CD67421765063C02BF0C78D1B17F6939AA58386F95DC55DA8FFB47F47 + DCAD5F7EF9A5830DA2B1A2A282BA75EB16FAB41FC369B4E79E7B1AB7DE9E72CA + 29524314720E73E9A44E8040A16974A48B0C213F02D61A1E14F67A6896C69A66 + 370C272136D05781E6A6238E38820E39E490C2BFFFFDEFAD765AA72107F9CB0E + 184D7DC65F4E430FF8351D36F7AB883BF6B9E79E2BC2775E0A0A0A70251DC2D0 + A1436B540D4476929093980F7CC7C9B7BFE2FBEAC0E1B457E77C3AD059AF9285 + 0F7DC5F4E5B616DAF3C30F6CBF48F8D65B6F7DBDEFBEFB0ED55F24B4EB0C371B + 01C623AE8766F4BC48474D051F95FAF4D34F971D7AE8A1BF304608B6E02EA9FE + FDFB7B070D1AE44273136A0C28F41B1B1B773FE6986376C734FD2EFCA7BFD3D0 + 113462D772EADDC94D5D0A5C54EA76D1B6262F5D36A26F441378F9E5977FD0CB + D1DC7AEBADFECB2FBF3CE27C4278A40F247B49A413DDF1E0EB5FFAFEF57515D5 + 0DFB25E51515AA64C1D3D048254B3FA73FFCA23CEC37D1ABAAAAA6F315A9F159 + 5BB331584DC2CE34ECC074B8F2C537D1CBCBCB73E69BE842EE200692BDC46B20 + C6900BC14B9F5CBA66E6CB9FAFA3CDDBE5D5069AEE9D0AE8985FF6A15386ED3C + 8D0BF33B547290EAEAEAAE1B376EBC64DDBA75E3B9D0C7FB8462328A68D3F095 + F4B23E7DFACC1F3870E02D4EA7B34E250B42CAC153EBCF2EF966E6572BF16C61 + 62E0D529278CD863DAE9471CD8EA9C016220D94B4206C248060B820D68FE5A39 + EBD29093AAEBC127F92BDF7D3AEE82AC3D70FAF5F3FC979F7E18EDD9BF4FC893 + E8C653E8881BFDA48169F145C3C00D27F8AAA67E2DBDD778C7D6E32FBF47CFFC + ED77153C59F021458D1848F692C86DBC1DF2441084B6828E77F49D58F16CDB6A + 188B8A762850F3D87BF73EB4B5D147EBEABDF4E3360F2DABF4D0C79B9AE9BDF5 + 4DF4C6CF8DB4605583A13B3FDE4AB7BCBF9E6E58B48AAE79F55BE375F178E3EF + 809D7A907AEF56B857A708ED1CB94754E810E0B52278B00FDA638F3DFC071F7C + B0FFBCF3CEAB4647B79AC4A83174DE7BA4A12EFB1DE9EF79ECF9FEC1D39FF18F + 7D74595813C02DBF5DF63BDCE878B723AFB49CF6BCF303B9B21572123110A143 + F0D9679F39F05A113C197EE28927D205175C40679C714617F35D52686E6213A1 + 1EA3A7D0AEBFBB99CEBAE42ABAFCF883E8C53387DAD6BEF1B061E14E83D9784E + 36EEDAB2E2C87353F16E7BD171BFE845D7BEB54A4C44C839F48983A1E3830F3E + B864DA3F9F985957D09D7CCEFCC018819CBE162A69DA4C332F3D6DDAF0E1C36D + 3BD13FFAE8A34B162F5E3CBEB2B2D2E84407E820377794230CCC1DE73ACD8EAE + 5DBB2E1B3972E4FCC30F3F5C3AD163E48A2BAEF0E3C9703CDC17EEF90CD41850 + E81FD8A7139D38A4C2761A0D1E36C4F32287EFD685A61D147AAB2F6A3030A143 + 76E91C7539ED0D7C7CEA937F5F469B1B7CD4E0F5537D8B9FEA58B52D3EAAF320 + CEE978352FF3E9BA6DD4D0D8647C5FDDF84C6E7D3D35F210DF1A99386376C887 + AACC481F48F6924827BA63FF53A7790BBAF6A6B107EC46E59D8AC89D9F1F52D8 + E51A28DC9B5B5AC8E7C8A347DEF8829A2AD7D3C7FF9DD92A43162C5870DDDB6F + BF3D7DC89021C62768AD46613611601E6F1EA7D301D2B66FDF4E9F7CF2098D19 + 3366C6D1471FDD6E6EE3FDF0C30FA7AE5EBD7AE6E6CD9B554AF2292F2FC753E7 + D3B8C6D1CAD0F15A91684F86A3C670FDA1BB469C4683870DCFD8B31BFD6EFF5E + 21D3A3F90B35186B7A4720599DE8FF9CFD342DF9CF5FC440DA190919C89E13FF + EE3DF3370369D8DE436940FFDDC8ED1603C1837C3FFCB48ABE5BB986EE79F113 + FA6AEE9F5B65C8B5D75EEB1F346810E195179CF12AB535DA3022613613BCC604 + 9F3BFDF6DB6F97DD70C30DEDE6414214E078B924D7A0A2FEDE44C032B9D647EF + BEFB2E9D7EFAE96939406F5BB2D66F7DD8107D27E19ABFDA3BE13E3E150F761F + AA32230692BD246620E7DEE2BDF6CC8369D8BE7B630705DFCD94ABA0A0F27870 + 55E5A18F3FFB92AE7FF45D54C75B65C845175DE41F3D7AB461205DBA74092934 + ADA6A1E3E621308735C87F5CCDDD7DF7DDCB66CD9AD56E0CE4BEFBEEF39F73CE + 394618BFCBFCFB9301F609B2EAE1471EA68B2EBC28770FD0D413E9E353F110FC + 5095193190EC2591DB780DDC0505E4CCCB271F7B0AAAA8812F8DE5A68C2A3A17 + E2AE7CB7912FE14001E976BBA9A8A8C818E269742D731C611D370FF1CD0FF378 + AB9860BF4A7B02F9020344B3463285EFAE6028A49C481F9F8A47ADCC43E818B4 + 32109C96BA9DD3AE50CD35E9BC88565CA1C60623D0D271733ACC00712D73BA0E + 9BC7E35D5848B3D64CDA0B3B0A7DD4E2922BB4B10B8290595A1988874BCA1651 + 2B215F2281C2DE2C6D007A684E371B845576E3DB2346EDC3AF3B54932D348BA9 + 1509829031C218885F64512403410D01FD15662380C2998455D6E9ACF1F68A9F + F30D05FE8E9A4872846526BB5F451084F891070993000A336D206623D1C66295 + 1E6F978E21E6338F6F6F8525B6BFB1B1916A6BEBA8A6663B55D7D42455959595 + C62DCE822064169B1A085F717B4556215FC2A18D02680308671E9075BC0E6368 + 3611F3F8F644A0F31C7D205EA3C3DBD392644927BA206405F606226AA5480612 + 6B0DC16C04E14CC16E59EDB106E2F7FBC88BE62B9F3291648A8D29FA47860541 + 4835AD0D840B2BBB0234D7857C8946B49A82D908106E6F358B78C0EFF3E2191A + 169EDB48AAB816E247154768D7FC66E448EA515111B73AF279D3DED07B0243E3 + 41C2B1A34750BFC1EDF2B18394B272C5327A71E192B00F129E76DA69D4AB572F + 2A292951A901CC07BBB526A1C785AB61E8F137DC7003CD9A35ABD57AB395FBEF + BFDF3F76EC71B479CB566A6868343AD393498BA785BA5574A5B716BD210F120A + 31230F12C64EC20F1206DAFC7DA2560A7FEC690340816F278D390D7D1B1A6BBA + 39AEC7B737F039DE6DDBB653536393F13A9864AA05EF27931A8820641C1B03F1 + 5193476415F2251CE682DF3C349B815DBA0E9BE37A7A481B53B81A4AB6525656 + 46D5D53554D6A53375E9D229E9EA5A5E46757575BCFC32B54641103281BEB4C5 + D068C23AECB05FD12E838604528520ABBF5D4E6FBEF93FDB26AC0B2FBCD07FD6 + 5967194D58D697299A8D0058E31AA403736D061DC6A0BD35612D5DBA74EAAA55 + AB666ED8B841A5241F9847F7EEDDA71D75D451B6DFDB16042BD284153B09BF4C + F19091C368E781622056D67CB79CDE59BC346C1F883610BCCEDD0C0C419B03B0 + C6ADE8F118E236580003B9FBEEBBC3CF24084254C4406227F13E10A3C9C62BB2 + 08F9128948A660469B4338F47230D48A34BD200842A6686520CD3090162E3445 + 2142BE44229E425E9B04C07C76F3220DD3E97E114110846CA39581E021AD66BE + E216850AF9120E2EECEBC315F2D6743BB3B09B066910C276F3088220641A5D72 + 61E8D86BF24DDE3DF6DD8B7AED3E58A5DA178A39852ABC37FCB082BEF9F44BFA + 72F655AD32E5DA6BAF5D386AD4A8A377DB6DB7B07D20E6A1C66C1C3A5DA799A7 + FBD7BFFEF5CA8C193346AB68D6F3E85B9F4F7D6DD9E699DF6D4ADD67DC07F628 + A12387769F76E6A1BF944E742126A40F247612EA443FF2925B7FDC54EFDB75D8 + E831E472E591D3E54289169822174121EEF719CF1D2C5DB8807A143B57BD76E7 + E5FDD4D820AFBCF2CAA4254B96DC7BC2092714F4E9D3A79509D89982D94CCCE3 + 753A86353535F4F0C30F378D1831E2F7471F7DF41C63A276C0B9B3DEF0FFF5B4 + E1D4BB6B31FF1695984C7899EB2AB7D1D58F2CA187A78EC9E1035488073190D8 + 49C840AAAAAA2E39FBEF0FCF5C53D5647C734108E0743A68E7F2027AF8CF674F + 2B2F2FB7BDE25DB060C1A4F7DF7FFFF4AD5BB71EC2D1E2406A78D30066B3D043 + A0A7E9D6ADDB2B071D74D0E363C68C6937E6010E9EFE9CFFEDEB8EA7EA261F35 + FB029F078817CC816C082A906C50DFE2A17E453E3AF4CF8FD047FFFC9D188810 + 136220B1939081B0E4F15EA1CDC040164F3F9E3637E28EBEC0BBC4E205736036 + 98A9310C241B789A9B6957369023A73F210622C48C1848EC24721BAF64AE9054 + F48B28510B8957C60B2C7D3E4378AB2F3E61BB431CF7F3448220649456776109 + 822008422C680391DA872008821017E6762E74A25FFAA78797CCFCBEDA47D11E + 9CCB25DC794E1A50E6A47F9C3D226C27BAB003F481BC75ED71F4D1A616AA6AF2 + 516D4BFCD727E8FBC047A9F02A7863889E7445635D2D8DACF0D09977BE6EDB07 + B264C992A9AB57AF9EB9B572AB4A894EB8776BE196E4973F5F3773C54F3FAB94 + E8742D2DA0BDBA7AA7DD7AD9E456C7CAA8CBEEF37FB3AE46C5A25391DF4C870C + E8B4DFBDD75EFAA94A121244FA406227DE4E74E038FDE6677CE515DDE8CAE3F7 + A1BE5D43BF6B91CBACADACA39B9FFF8CAAB66EA1C7AF3C31A68CCD65326D208F + 3FFEB8FFE0830F369EC9C1A76FD16F82D9B10C7C4B1D69BC54E3A354B8DB107D + 2A78BBEFF7DF7F4B679D7556C8F226DFFDBAFFFA530FA0F2E27CE34356E6BE97 + AD95552A14CACAADF574EB731FD32B7F9B10B2AC23AF7AD0FF7F538EA52EC579 + C63ACD7CFE73A50A85B2754B35CD99FF1A7D3DEF2F72DCB5113190D849A8137D + 5DBD8BAE3A615FEA555642D54D7E9112F203F982FC11B21FAE491BAF948769A0 + A08661E04B862D6C00F5F50D8659E05B25555535B4656B256DDCB499DC6E3755 + D754AB25EC000F43F6E9DA99563638691554BF438BB7E605B5688B8BDED8E8A7 + 57D63451BF8A62AAAC6D524BD8C197ABB6D0CEBDBAD29A2617CB19A20FB6E705 + B4CD45EF573B6849959FDEDDD44C15DDCA686B8B5B2D4110B20BB381387C7CC6 + F52A2BA61ABE62C4F5912820E407F205F923C44EAA72CB5C1B09079EA9C9CB73 + 517E7EBE521EC7F3C85D50C066C1CA771BC3FCBC7C7239A35C18F0B55831E667 + 93C973E7075558521A545169272A2C2E31A68944A1D349AEFC02CAB3C85D5C1A + 504927CAE7E5E573D8C9DB2D08D94CEBDB7871D5266AA59495861D18345D6D6F + F6514B7353826AE65A4313795A9A43E4F506BE932208426669751B2FCA495C69 + 8B4225FE111F9C65B4B5AE891A6AB71B7D16B108D36A35D669717A5D1D35D6EF + 101E244C2168FBD56A757E0882B0035B03C1E7BF45A1E2FF428CECD1BB337DBD + 7A331D5AD142A358E8F08E45A3BA794DF2D1A1DDFD74580FA2C37B428EA08EDE + B9C0E8A8C6DD4E2900BB5A0B2D9806DA51CCFE826632ABF45482900B841CEDB8 + 7BE6B56B8EA3F5F5C1F34650F42E76D2917F7D81DE9D314E4A88283CF3C1B753 + 9FF9F0A799CB7F58AD52924FA45B65EFB9E71EFF8409138CBE1274A0E3CB8EBA + 33BDBAA6C6B89B0A9F0B46C77A33D7669A9A9A8C6FAD2F79FF5DBAE8C28B5A9D + 13782DCB9A5A2F357A024FC66BBED81C5A1342731B6A4C303DE30EB13B7E8B8F + B904AF3D7A9D71B3FFE3FF5C469F553693DF17FA7980856B76BCB9D8B86B8CD7 + D3525F4B23CA1DF4E73B9FA30D8F5D29C75D1B91BBB062077761F1F9E3B8EEBA + EB1C3366CCB0E65B302E061223622019820F6273211C0BA930909FEB602081D7 + AB68BED86231105E169ADD5073B2BBC51806F2090CA4AA997C96EFCB2CFCB95E + 854C06C26634A29CC44092841848EC24721BAF01DAAEED3A91735DC8172103C4 + 691EA902AD534E566893152A1866E966AC086039F883E94C0A59AEF12F304A48 + 1E281445B149655954A40F2446F17F2187310AF49090A9C037494F150E630ADB + 49F4BC2C4C10C3B20421D3B43210BC09756DBD436411F24510DA0A6A3105FCC7 + 816FDD9BE4CCCBDB21978B9C4E97912E08D94CC8250EDA7B9FBFFA38FA64AB94 + 9656F6AB70D2F1374A1F48ACE0B51D78F23A55ECB56B377AEDA6736DF7452AFA + 40D6D57B8D6F9B982F24BEDCDAA24201F0EC0A6E41C65D64E1FA403E7FF0325A + 5EEDA13ADE1633AFAEDBF1E4BACFEB213F6F7373DD761ADED92B7D2042D6D2EA + 64798E0D64E9E6D00E3E81685877178D13038989A3AE9EEDBFFDA271D4B77B17 + E232D7E8438A07A3CF09013DB4D0C866B06643255D77EFB3B4E8B6F35BED8F4C + 1A08EEC2C22DC9110DA4C643F51EBC8F6B07B606525F4BC33B79C44084ACC5B6 + 0FC4C3279E285476059960CF172B3753CF6E5D687D838F7EDAEE310ACC98C457 + E6D017552DF445658B71B7126E79B5EAEBCD75C60B09E379ABAD2008C9471A59 + 8594805A44A3D74F7CE16E5C6DC72234EB402D7CF5EDC197077988E725ACD25F + 25140421B3B43610BEDAF6F2D92F0A95DCC79B20C8BAC020AA0441685FD83661 + D915A0B92E29E004411042696D205C52DA15A0B92EA98008822084625F034133 + 962844E21FF1B1A9D14B9F57B5D03B9B9A8C3B8CE2D12B3F37B0EA8DD77BE01D + 5156BDFC6375D82FF80982903E420CC4E974D0A6EA3ADABF7B3E053EF5298290 + 1FC817E48F2008821020A4443CF39667FDC565153475EC3ED4AD73914A15B66C + 6BA03B5EFC8CEAABB7D2A3579C202E12053CEFF0DADD53E9A3AD2DB4B6DE4B5B + 9AE2BB63CAE7C107A3D06CC8F53EC842B407ECE4391041480F2107655555D5D4 + DFFF7BD1CCF5F52EC2479484004E87837A177BE9DEDF8D9A565E5EDEEAF5E142 + 28282817FC6BAAF14DEFB5751EAAE3023B1E8C37D51ACD86F60682B7D41E54E6 + 170311840C2307A590745050BE78D7547A7343936120DE96F8BE2088E73C0206 + C2D8194894EF64680301DA3830846A6AB61BE6E1E57578D940EAEAEBA9A93160 + 20EF2D7927AC816C6EF41906D2E2DBB13D2BAA438D119FEF355E6552D142A7DE + BED0D640BE9C7D99F170259E8F313B08FA8A34752DBC1CAF9F9AB8A67550A716 + FAD3ED4F8981085949EBE740042109547361BA665BA35108E24A3A26615A166A + 183089E0D0225F4BE895BF1DFAEDB84EBCA8107239C9E57291DB9D4F05056E56 + 81A1A2A2C2E0B870E0C5B86E3E530AF21C212A2F7006558661A18B0A8A8AA890 + 150E9E8D4AF39DD439DF419DDD3BB45389CB50DF6256499EA1FCC22272B30421 + 5B11031192CEBEFD7BD28F3FFD4C23F8EA1957D0688689499DBD86D03C755019 + 191F53424DC3AA837BB869EB966AAAC8B7AFD974EFDE9D2A2B037769C144F2F2 + 5C949F9767984771712195949450A7D212A3D6D1BD5B05EDBC531FA399AB57CF + 5EC63C6606F628A1F595F58641742F74521F2EE0B50EE8911FD481ACC3FABAE9 + 94819D6843AD9786ECBE8B5AC20EF002C8B59B6B8CE5184661D2B08A7C4307B0 + F0FB0EEB5540E3FA75A2EDDBEA69E84E9C1182908548B558483A735F5D3A75EE + 6B9FCE5CF673954A493E308F430674DAEFDE6B2FFD542505F9F0C30FA7AE5EBD + 7AE6D6AD5B55CA0E6028E81B097CBB6307656565D4BF7FFF69C3860D0BE9E37A + F4ADCFA7BEBE7CCBCC6F37D6AA94E8E09BF0C7EED377DA89C307B5EA2FC38B26 + F1AEB05881199F3EF217D3261E15BA5D82200882200882200882200882200882 + 2008822008822008822008822008822008822008822008822008822008822008 + 8220088220088220088220088220C489BC8D57C82A366DDA34F5FBEFBF9FB965 + CB169522248B6EDDBAD1800103A6F5E8D123F8665FE4F7175F7C3173DBB66DC6 + 2BEDB58C8F6EF1301ECCF3419D3B77A6A38E3A6A5ADFBE7D33B63E21B5888108 + 59C5EBAFBFEEDF65975D8C6F7A583FF2647D05BB101EE37BF22650C06EDEBC99 + 56AF5E4D471C71443023972C59E287B1F4EEDDDBF8BC6F636323B5B4B418D3D7 + D6C6FE0A7B8D7E5D3E3EE2555D5D4DDF7EFB2D4D993225647DABF75A43EB4BD7 + 13B538A9BEB1C9589FCF47F4DF552FAAA9628497EACC7318A27C2FEDB979373A + F29BC343D627A416C96821AB78FAE9A7FD471E79A4F1B54014424272C0E77CF1 + EDF7D75E7B8D4E3AE9A4E079FFFCF3CFFB0F39E410E3235BA815D4D5D5514343 + 83312DD716D454B1A1BFFE081381F9EFB4D34EF4D4534FD1E5975F1EB2BE9AE3 + B619614F938FAA797D8DCD4DC627866F5DFE1F233D567078B8F29CE4CA7792BB + D04545C579F4BB174E0F599F905A24A385AC62FEFCF9FEC30E3B2CE40A5AD73C + AC43A1353ADFAC43807C7BF3CD3769FCF8F1C10C44813E6AD4282A2E2E366A0C + 3010D442501BD9B871A39A2A36601ADA44201808EFCF5606E2382E7061D0D2E8 + A5AD75DBA8810DA4C5E3A56BBEBCCD488F1587938D8A6B1FF96E17E5173AD904 + DD74C1C233C440D2885CE20900275C1EAB9855C6EAC1C2F75D31441CE9181FED + C46CF372D07482020C0519545F5F1F94352EB2975DBE41C857E46F246032E65A + 443C329B875E861D9DA8D45089BF940AFD4554E02DE461219B882F2E79D8743C + 46187D201C6FF1A93508E9C2760FBFFAEAAB7DF8CAE53C0E8E670D351213E71E + 3E906E38EAA8A3D6A9B82D9958670AC967B50482ED83CD9B370FE3C158CEB751 + 5CC8EC85342E14BEE47DB288832F76EFDE7D29D2A2B17CF9F2615C788CE5F946 + F1B28CE570F84B0E2FF2F97C2F0E193224E2721E79E411FFAF7FFD6BA3B0E379 + 8C8288E737C25A4264905F5AC82F345F215C585848EFBDF71E9D75D659C14C34 + D7406A6A6A0CC3411316FA25E2BD9101EBD2468221FA559E78E289563590CEC7 + 7536C24D0D5EDA545745F5BCAF3D3E2F4DFDECAF467AACF06A8C26AC3CB7930A + 8A5C545CE4A68BDF384B6A2069A45546A320E703602DDA448B8A8A282F0F178C + 89B37DFB76E3EA870FE2BEE10A74ACB3C991B776B3BB822AF3BB5083AB508D49 + 8CBE8D1BA97BF3562AF07BC2AE53D8C1D6AD5BCFE7C125AC70C6BD8C75674545 + C57D81A83D2B56AC389F8F9D88CBE1E3E0CEC18307875DCEDCB973FD071F7CB0 + D1818B82C86C1C904E13EC815168C3300B69A5A5A5F4EEBBEFD2C48913231A88 + EE48B7FBA67C24B05FCCB51118C8638F3DD6CA407A1CD7D3083736B4D0C6DA2A + AA6B62C3F27AE8824FFE62A4C70A9AB0F2F2596E171514BAA8A4D84D97BE75B6 + 18481A69D584C507DB5F3A75EA44E5E5E5C6150B0CA42DC272B03C2C57ADA215 + 18B7B9A082D615F7A246773139F3F8004C500E97D3580E9617699D1922F4D698 + 083CF3CC33314F0B6EBDF5D6B8A6D7C03CF8C4BF9935140580D6DB6FBF1D0CB3 + 30EE666534B6FCF8E38FE7E7E7E7DFCC85C7505D88405F7DF55530CC1A8A6930 + AD9AAD15FAEE1F74E0A20D1E770EE14A1885596565A5A1AAAA2A5118E93C427E + 21DF907FC847E427F2D5AE090BFBD83A846002F10AFBD93CB4239FF20C05FEF1 + 71E160F13F1FAF3E1EF931E4E51943C4038B17D288DAC3D805412EC06D7D7CA2 + 274D581E966B2CDD9E0BD615F7E6EA281F56EE82360BCBC1F2B05C63E9D9813E + BEA31EE7DA3C6235116D1EF19A487575359A9B2E6175C6C9AEB578F162633C86 + A6744C7309E631469A58B56AD5302E302E617546C1A1F5F9E79F1BE33134A563 + 9A4B308F3152C82ADA621E90795E8423618C0FFC0F9444B86B3B0EF97518F36A + 0969C536CBCD0744B2140D972B8F6B10F9E4C4B00D82796039585E16612DD8C3 + 16F456D388662256D388C744F8041ECBFB26A4E6F1D65B6FA9B10110D7E3D4B4 + 63D5A8209C3E964D21A4E6F1C9279FA8B10110378D1F8A79D428214BD0FB5987 + 71DEC623EC5B3D44EB03C251C1FA8CC978E84A504E2D6389421A0964F9F4EB38 + F7338B03071F4B1FC06DC1580E2B4B0857A0B74A0F6716E1D2CD66616EF78DD5 + 44F8041FA54F7E08B7786A8E38E208152223DD34DD28951C840B8B512673A08F + 3EFA488D211A3E7CB80A9191AEA7C13C2A59C86570D46AE91A45224249D6F6A2 + 438893ACF1EC64188799642FAF0DE8D3C34E219C78E2898E705293D8A2CD23DE + CE433683BD4CC6A05209AF8330E2186A4CD319775699419AEEF38234E80C471C + 438D9EC66E39420E8323D7AE76114DBAE661848D2509692490E5CB7EC1B92FB4 + 376018DA3474ADC39C160D9329181A3D7AB421845F7DF5D556695A7668638070 + 570F8430EEFAB1A641821004879461026D905E86905602595E5E25599F3A50B0 + 87530868AA0A2735892DDA3CE2E9FF005C4BFBD26C0C5A0B172E34C663681D87 + 798C91260A0A0ABE343761692D5A844748C8185AC7611E63A490BBE032C710FF + 81ACB58B6842ED430F0D03E1A1905602397EDE7DF974FFF9C6836FAFBCF28A7F + D0A041467232C14BD58E3EFA68DB3D8C757ED6E720A3133C59F8BC1EDA67DDFB + 61D79966EC0A76DBEDB2338B484D5876A6116B0DA4A9A9E93A3684E92A6AF0D2 + 4B2FA9D00E8E3DF65815E21FE2F7CFE0C2FF3A1535A8ABAB433C6439A8C15831 + 378931334A4A4A4296031E7CF041FFFEFBEF6FDC768A6648988DD5C420C11E3C + EF61156EDDE5FD463D7AF4A08F3FFE98CE3DF7DCE0F181E7320E3DF450E3992F + 3CB3A59F03C13CB82D381EF4BED1B54CBC1073DEBC7921C723D6D7F7B8BE46B8 + B1C9431B1A2AA9AEA5819A7D5EFAED77FF67A4C70A8E8F3CBCCA24CF49EE0217 + 95BAF369EA0B67463CFE977FFDB55F9E57B70767D5905FC4D71A159878FC7FDD + 34FFD46604C5405286B9A08FB84D661389D53C70D258E32A1896E6E6E6617C12 + CE65190FFEBDF0C20B463A38EEB8E35AC5B9105AC69AE876BB439E26C7725A5A + 5AE672616F2C67C18205463A1833664CAB38174ECBF2F3F35B2D078881B48D76 + 67208D2603F9210103E11A483E5EA6E86603C96703793EB2817CCD063264C810 + 1513CC2C5FBE9C7E11A781C899983EF48E89BA83B46944EB3CD7E8132616D330 + 83029C4FC23BB926B20D27A3E6F8E38F374E4E0C356A9A3BED0A7DA4B121DCC9 + 85CE3614F89AB163C71A0680A106D3605ABBE50839060E39B38C66A804645E46 + 0CE0D816B5562220FB85F411F35E8AC53C601856D3B04B8B045F29DEC7579F57 + F295EAB271E3C611643EA810670358866930AD9AAD156C08F71514145CC9C165 + 301EC85C63401CCBC1349836309720E050656160F465B445C602853422592EA0 + 80BF8F6B0A13D93066B016736DA312421869188769D4E46181C1A86967B01637 + 3737574208230DE3229990908370B91F94AE512422BD0C21AD20EB5B812BCF64 + 4BC86EB8804773163AD547716DA30242186918A7268B4A5B9783B677C0D306FB + 3F78DE10214D642FBBBCD2F90874FE6625DA04129590766C0D44103205BE716D + 35091480103A66756128B297399FAC79857C45FE660DBAD0D706A06B13F1CA3C + BF905624CB85AC0257C8B863C8CE44F41005A4C85EE67C32E71FF213F99A7535 + 105DF8031D4E5442DA1103493DB8B5369C42303F3868959AA4C38302CE5A009A + 0B45C8AEE01405A4F3285C1E666F13163B009B5CE2C222F0474827811CB73C07 + 3278F060233999AC58B1421E240CC576BBECCC22D6DB793B02B367CFF60F1830 + C0F89E360A3C5C399B6B233A2CD883E73E50D3D0CF8020ACE33FFFFC337DFFFD + F73479F2E4E0F194D1E7405A3CB4A1A98AEA3CEA3990B5717E508A8F05E33910 + 9793DCF94E2A75E5D3D4F991BF898EE74050BE7176908FF325D7410EB89C7C4E + 715EAE58F14DDCCF8104260E3590AF77DB6DB7A16EB7DB18950CF081FE9F7EFA + 691917E6BF504921609DDFF4D8676873412795D276DC4DDB698F4D9F855D6706 + 301FAD117792D94472C93CC0DAB56BA72E5CB87066BC8597101D7CDC6DF4E8D1 + D3FAF6ED7B874ACA490319340806C2A62A0612341017EFB76419C875DDBA759B + AE3E029514F06534D60C2ECC5BBDBA02609D1B3AED3C7D53593F95D2767A54AF + A45EDBD7845D6786C0FE8A6907C14472CD3C84F4937103696603C193E8FE040D + 840B3FE35526ACD23C3690FF8A81C4435B0DA4555B00EF94FB71E0E03398F804 + 665353539B84E5607958AE5A452B30AEA27E23F5A85945852DF52A3571B01C2C + 2FD23A3344CC3B27DDE6B179F3E661ACEBD8E817F13EDB0A218C348C53934565 + F9F2E5C356AC5871DD37DF7CB388875B2115BE0EE3D4648290315068FAF14F35 + EFE5B4D8488D0C4990402165AA8180575F7DB50F2FFC3C0E8E6719EF376A03F7 + 70417EC351471DB54EC56DC9C43A8500EA5BE797B0C2E5FB32D69D151515111F + 026493389FAF40232EC7E7F3DD3978F0607998304BC8C51AC840A306823E22A9 + 81B087509E0B375924A9094BC82D601E7C22DECCC1CE8194B06C6383BF329C89 + FCF8E38F30A19896C3BAB27FFFFEB6CBD9B469D3D4EFBFFF7E269A3D85C44113 + F4800103A6F5E8D123D8DF61472E1B88970D24AED2B203825A485E9ECB30916F + BE1103C929F4DB77CD278C5D5A38AAABAB87F101147C1BAFFE1E3A0A148D398D + A75DC6D34E2C2B2B0B79A27CD5AA55689A9ACB3296A3BF87BEDF7EFB19436049 + 438D66E2AEBBEEDAEAC9F4D75F7FDDBFE5575BA9A5B485CAF85F272A35D20BA9 + 88F2493E4465470B79A8911A8CF076AAA56AFE975F9B4FDDFE57814F13473C0E + 72D240060E62F3100301410361AD48C040E47EC80E80360DF3EBDC63814FC0B1 + 7CC20FC5890869601A886BF30088AB6977BC5A57C1E9635D2ED750FD0C8206A6 + 81B8360FA0A6198A79545208DBB66DA3F5A5EB554C4814E421F252680D4E1234 + DDA0F014212354A62440A0D430D540F8AAB4EBC68D1B2FD9B061C3F486868690 + 82C50E6C40B46980DBED5ED6A74F9FF903070EBC850B8F3A952CB4113BD388A5 + F601F88A139F0C1C198805E01A800AED80AF6255C86071A74E9D46A9B0C1FAF5 + EB5B2DE7830F3E50A11D0C1F3E5C850C16F7EEDD3B643960FEFCF9FE9FC7ADA7 + 325F1975F177A1127FA00652C0FFF8BAD6FE5833275947C794135984756F9AE3 + 362739CE3F0FFF6BE27FA0CE514B358E1AAA7656D34ECFF5A6F1E3C747CC815C + AC81EC3E6020FF3E7C27C5C7CB502372141C3FF9F9799C8779C9E903C1DD326C + 22D3F1D195E2E2626374BC584D05711C94CB962DA3B2B2B21983070FCEA65B6B + DB3D661389D53C405D5DDD561E740DC47660FE9AA0E52B82A0B2A4A4A442850D + 70C716171CAD9683EFA16B0E3EF860150AE0F3F92A7BF6EC19B21CF0F8E38FFB + 7F38660D15B79452299B47A1BFC84877FB61205CBBC1AFC3B165FE95469A49F8 + 630C15E630B0C6334554B3E03F189AA531E2FC87FF7BC84BCD8E8081343A1AA8 + 964DA43EBF96767F79673AFDF4D323FE5A311035224769AB81B46AC25AB76EDD + 785E887140E1C56B504B4B4B70184DE679CC6958DED0A1438DE5AB550949429F + 30F19807D027BC55A3478F36C6636837DE0E5D6898356A54A08281A1755C3850 + 70E198696C6EA206563D1766505D13178CCD0DC6B0AEB97E873C10A77121642B + 8CB3CA6EBA4C289E6D33C69B7E3764CA139D4FC833E41DF2107929D8A0CCD7EF + DFF1A47EAE2B9029F1D3AA34686E6E1E5A5858683C3D8E031032EE5850C3680A + 371D9E0951CB6DEB2DBA8202350F5DFBD0E6614E8B065FC17D693686850B171A + 42F898638E699506611E357B908282822F75FF07B468D12243081F7EF8E1ADD2 + 20CCA3660F01171B7CB890D7C746E2F1928787508B972F4A785CB38FC5E986F8 + 580B8AA709CACFD398857942C66789CCDB846D6CB5DDA6F1E6DFAA7F3FCF833C + 41DE04F389D39177C843E4A5D01A2E3203FF6C0AD2DC54A2F6A12BF3A6262CBC + 97EAB0C30E330A7C2CDC8C6E96D2E9D6662A60970690CE8506BDF9E69BD9F49D + F2768DB5E9CA1A57C1B0F03EC6773BA6AB28BDF4D24B2A4474ECB1C7B68A03DE + A733783F863441D6D5D5211E5C8EB5092C4C93D88C929292564D99F826FACD7B + FF873654575173130A442E09193437F8F08BD047EFE28075E854615C12218C21 + 0F82431C9718023DCC347A6F61A8CF62FC5C3DC4730A18A22281B017423C74E8 + E401EEE30746734E818B7A9595D3955FFC36E4FBE776E4621356BFDDFA1BBFCF + CB666B1C17B90C1F7779F9F9E476E7D1F7DF7DD7F63E101808AE1A7120C100B0 + 93CC46D016B8C0A037DE78430C2489D8D53662310FC0B5C161BC7F83B7F18217 + 5E7841857670DC71C719433E0E96B1265ABF678EE5B4B4B4CCE59A4570390B16 + 2C50A11D8C1933C618F2C9BB2C3F3FBFD5728018888A8B8144251103F9EAABAF + FC984FB0272906821A085E6362C59CF176A662DD31DA80343010A981249F786B + 1E663C1ECFF95C13B9B9B0B030F800209FE42A44C6B7CC01172ADBF03D732E18 + 6C1F006413399F4DE4663685E0725E7CF14515227C0FDD18F274DBD83CC27E17 + 5D0C44C5C540A292888108C92570D4D980C2DF2A739F46B4F17A1A735C889DBE + 7DFBFE4A05A3A24F98444E1C1802171E57F2FEC14382C649396EDC38631C8688 + 631CA609671E00860083E1E0325D9068F3C110718CC334E1CC431084F685AD81 + A0B047E10FCC066196DD388D35CD1CD7694264D6AE5DFB3F158C89B65C7571E1 + 7E9FCBE59AC8663183B5986B2495A3478FAE441869188769D4E46181C1A86967 + B016736DC3580EC248C3B84826240842FB226020E555C152DD5CC09BC3B812D5 + 201CCE08ACF3206E9D57C83EB8805FCAFB069DEAA3B8B65101218C348C539345 + 2559CB110421FB695503E1135D8576604DD32681742DA0CDC21CB71B0A822008 + ED9F80815495877450545656E2D6CCA0D0A16E8E9BD3B5CC69E669CCDABA150F + 3E0B8220081D81405561FA7427CD98619808EEC2DA679F7D8C275981AE556874 + 2DC29C6687DD74F9F9F9F4D9679FC95D584258E42E2C15C750EEC28A08CA9644 + EEC2FADBC22F36AFCF2B4FDE2757DB31BB79AAB65C367AEFEE2A1A37818CB618 + C8FEFBEF1F7C8AD5DAEC646D9EB2621E8FB0D9485CAEC09B59C54084708881A8 + B81848541235903FBCBEC67FF988C036E43AB72E594BFF3A62E784CF88C05137 + E33A3E047780825E1F046D9179393A2C08829049E0BB2E5CD08A8CBC680B0103 + B180C25E4B1B80D908ECD2B5A28D170441103A06CA401CAD6A20A88AA28AA8A5 + ABA75AE634EBF870F340821009349DA08909878AC38963C81CE6E3CA4EEA78EB + F0B2F9ED3A4F42F3893392F3D0C84B41482138D45A6177F09AD375580F755863 + 9706ECD204C10CFADE9C795CBDCE73B2F4D04979F9083BB8166B924BC91A8F26 + 2E64B34276DB66A770BF9765E4899137817CD279863C94B7F10AA926AC81E8A1 + 591A6B9ADD309C042112B86A360C24DF49F96E17E5B9D93C0CB928BF808561BE + 164F03718169C81CD672D9C83A4DA614CBB6597F9F21F5FB559E206F743E210D + 79873C941A88906A5A19085EB98E57B9E3965B3439D99980B949CA1AD7CD5F7A + 9C1E8FE561B958BE2084C328F4F2BDE42EE4C2B1D0490545AE80388EB4A0B8E0 + 7417E6F11052712E3C83E2023654CE1DE2C2382B64DE26EBF69A7F8BFE7DF8AD + C66FE6B0292F90373A9F906748431E8A8108A9A69581F4EEDD7BC637DF7C633C + 0782421F72BBDD867458A7A353DC2E5D4BCF87E9B03C2C17CB57AB12845674EE + DC99F6DCBC1B1515E75149899B8A8B022A297653290F03CAA7D2421617A80171 + D8CDE2632E204E83F8B80B0EF338DDA584703628647B2CDB6C88D321FC36FC46 + FD7BF1DB91072A3F9037C17CE23C43DE210F9197823D28F8446DA7559B527575 + 75D78D1B375E824FCF36371B6F781FAA9FE98844946996C148FAF4E9337FE0C0 + 81B7708DA44EA50B42086BD7AE9DBA70E1C299F13E832084525E5E8E4F124FEB + DBB7EF1D2AC9965C7C0EE482D7D6F8CFD87F2715CB6D1EFBF867BAE7C8C49F03 + 4978464110DA3FB96A2027EF2706029EFAA46D06928C5A8C200842BB0225A6A8 + ED8881088220080921062208822024841888200839076EFA11B5F145588C1888 + 200882901062208220640E7D118C612202D6610CE0E25BA432A30D8881088220 + 0809210622084276802BE2B6281EECEE69CD45B51131104110B2007600BB3696 + 988545E04F6CF89D7E11ABAD8881088290398C823F100C8613551C789B7C2256 + 5B110311042133E8425F1B80F11DF804649E3F065C3E0F797C7E110B79D11692 + D00A2608427B25A3EFC26AF6D08626FD2E2C0FFD766502EFC272A97761E5BB8C + 37184F7DFACCA8EFC2BAF6E9F7366D2DE9D35D45739ACE752B37DD78D2A13D55 + 346EC440042187C9B881349A0CE4A73618885B19C833D10D44481ED284250842 + 0651ED4F461314FF69938C050A69440C441084CCC0657E88CCFD1AF1C8BC0C21 + AD888108829039CC853FBEC01BAF60207A28069276C4400441C81CBAD0C7D0B6 + 592A0EC5F11C88901CA4B3491072988C76A2377A68437D25D579EAA999D7F7DB + 6FFE6CA4C78AC3A93AD1F39DE456DF8B9FFAF2D9513BD12FFFCF335B7FA8F377 + 55D19C668F4A97F7C619E3F254346EC440042187C90A03695606B2BC0D0652A8 + 0C6461740339F19F4FFB8F18D28F3A959650717131F97C68FFCA1DFC0E07EFE7 + 06AAAFABA3D797AFA4672E3D29611F100311841C266B0CC4C306F2F5D5467AAC + 180692070371710DC445A585F934F5D5E80632EE8EA7FD27FF7A3FEAD3BBB74A + C94DD6AD5F4F4FBDF7093D37357103913E1041103207BA2DB4AC1DE4F1483AD1 + 33821888200899031DDF460B120FBD092AD8916E2C514823622082206404E393 + AA81FF81C2DFAE6611410E1DC6BC5A425A110311B285AB58AB58C71BB1087CFC + C537FE97DE783F28C4D528A11DD0421E43817F5EAE44B0F81FDE2E1E8F1C18F2 + F28C21E281C50B69440C4488C618D60BAC6223961AF661DDC0DA85752C1222B1 + 6173151D73D8F0A09E7A65891A23B4071AA9C15013FF6B7634B1993493C7D142 + 2E97332EE10E2C9793C34E1E72D8C9C35841C1276A3B892E0327FC2825213360 + 1F4C67BD6511D292B55FCA588FB2C6B29E61A5C2445CACBBD4100D12F7B062E2 + 94BF4D52A100A7FCEE6ABF59E1D204015E235299D106E25D040A2D1424FD8C58 + 806AD664D6B3464C48353087584C62256B1AABADFBE52896368F575927B2EA59 + C9E202D6AC40D0308F0B03C1F0A0D90A350FCDFFDD3A9BFE7EC5B949381D720F + F36DBCDBB66D336EE36D6A6A228FC7439595956AAAD8C0DB715D2E57503D7BF6 + A4871F7EB8D56DBC8EE302D7AD2D8D5EDA5AB78D1A9AB916E2F1D2355FDE66A4 + C70A6EE375E1365EB78BF20B9D5452E2A60B169E11D36DBCBB0CDD97FAF6EDA5 + 527293B56B37D0EA659FA6ED365E98C7A72C98070AA5EB5877B070958A0226F4 + 72B06383DF3C3510B405E3304DB2C17251CBD0E6318705F33E5409853BD260EA + D84FD82F33596DC16C1A66334906781A184D57602D2BA607017A752F374C436B + 9F21BBA931425B41C7368487EB1291795EA393DC866AF5AFC65143B58E5AAA63 + 35B86A8D6739E251418193C5E6E10EBCCE3D2F3FF672309F4B3E4C9ED34A421B + 563C8B98AD86B8AA4581324385517081B61654ED0518030A71FC5E9D27669086 + 71982699260283D679BC88855213E601C3401C82B1230DE374CD03A693AD2602 + F3D0AF94B89255130846067D207FBB7C72509F2DFF498D11124117F4E6A1D908 + E2111E40340FAD74EBD68DF26BF3690BFFAB7656537D7E2D35B9EBA9D9DD44BD + CACAE3528F2EE5D4BD4B1975EBDC853A9714D1BE5B06517979B95A93900ED887 + 620205211E4B45B388DDE59EBE2A8699A020EBC89CC04201AAD1B50000F3D035 + 31D402F66521CFDA8AAEFD01F3FAA261DE9E64EC9B449AB306B330ED32D63856 + 330BE0372D65A1EFE35DD621AC98D04D582BBA3968F0167FB009CBDAC7F1E4BF + 6FB44D5341814193D2A851A38C577AD4D4D4184D580D0D0DD4D2D2425BB66C51 + 53C5866EC2C2D3E818F6EEDD9B9E78E2899026A54D9B364DFDE28B2F66A2B90C + 26A38526330CE3C13C1FD4B973673AEAA8A3A6F5EDDB172D2361411356FF5FEC + 437DFBE47813D6BA0DF4E3D79FB5A9092BD619610E30091440BAC66126970C04 + A05036D73E50A803B379202F3E33626D0785368C0BCB832999415315C675613D + C7B2AE53EF1BBB79E305C681E51DC88271E0377EC88AC469ACC70341BA9E85FE + 1BF00EEB60164A8D61AC98F34AFA409287D940AAABB946A0FA40A0CD9B37ABA9 + 6243BFCA448B0B72FAEF7FFF1BB54F22DDC040766303D9A9776E1BC8CFEB37D0 + 4F6D3490589BB0B429A020B26B96D19DEAC9B8DAD6A0A0C2D5A32E7000D683F6 + 0AD486B02D1A14DC48C3557A2AFA1EAC586B01587FAACC03BF070601D06C6806 + EB447EA0890A7D52F8FDE6FC027A1E5CF1438902F3809169F340ED239A7900CC + F36520683CEBB13FEB3C16CC03DCCF8A2BAFA40F2475E8A62B0CF5957DACD2CD + 585ABA492C2B41EB1A362F979584072FE3E903D127390A765D4863882B7114EC + 3099641908CC411B84D92826B2B02EAC7724121448475A5B0BC97808D794944C + F300E6DF63BEA30ABFD7AE6F0346A20D1D98F74BA279A3CD034D58DA3CD02C15 + 0B68B23A4B0DDD2C1C2F37B240CC1DE766A40F24B9E8C25F63369178A48DC36C + 2642C7265603C149AF0B1F0C71B50F23C1998BAB601450B1B6CBC7020A3D1496 + B89A9F8B0405C2289CB13E34D768FEC9421AE64B66E11D0DB389692E55C36481 + 3CC0EFD2CD641AEC076DE456CC06029097584622B4C53C34A881E89AD15EACB8 + 3BCEEDD8EF0F8B552880F9790FDDF7619726EC009DDA68AA429315FA30F016DD + C2C2422A2D2DA51E3D7AC4252CABA2A2C2E8C82E2B2BA39F7FFE396B3BB5FD2E + 11D4566269FB3277C4021464A815A090D28536EEC64241974B98F305BFDD5C98 + 87AB9D24131888EE58B792ACBEA864988706872BFA3D0E326271769C9B913E90 + E4910D9DDAE9067D20FDF6903E10F481ACFC26B59DE856F340A168BD12CE45AC + E681021B053AD235E93011DD416E0635B0B676966BD0E40403C13ADA621E9A01 + 2C2CA33B6B044BF78DC405DE7D657E7D09FA404E1D7BA81888101386810CD99B + 0D24B7BF07F2F3FAF5B472F917293310EB15AE9847001887360A6D1EBAD9CC3C + 0EA0204F65939AEE07D19DEC68AA4A766D1026826321960EF358404DA4949570 + D39520B405C340068B811806B2A26D0612A90F04059F2EFCC43C76807C80ACE6 + 01CCB50E0C53691E00DB80F5A0A119423899E601D0F99D2CF300681711F31032 + 8A9F8B4C91CA8C36908445088220B41F4E9CF9A47FA73DF6A6BEBD72FC41C20D + 1BE8E76FBEA067A69D92B00F2434E3C48913837700CD9D3B37199DB5429C601F + 381C0E3CD96DED0359E4F7FB17CB7E11047B7E7BEBFD5BB6BABA56A8684ED3B3 + FA4BEFBD3366E4A968DCC46520AAD042A7AAF936D16A2EB0267381657E464148 + 11BC0F46F13E88E96DBCBC5FA6C97E11042155C46C20CA3C74A73A0A25B4EFA3 + 1662BC955699484EF493705EE0774FE2DF6B7B7B228F479ECCE1F149ED8FC072 + 791F981F1E9C83DA060FF5838265AA56824E757D5BF11D73E6CC41C7BA200842 + 5289D940264D9A04F3D8475DD5060B4E75458CDB49ABB9A0CACEA7869208CC43 + FD5E34E3F14F9EA33BCD0D389FF42DBE9F715E1D9A2C13E1F54EE2F5EA3BBCD0 + 4C05C3D6C61182DA464CABEFCE1213110421E9C46420AA4032DEC6CB0551AB17 + 0F71A1693C8FA00ACC0EDDF6CE797102E7059AF134411331990740D3DEBEE10A + F978E0759A6B7FC1F545C3BC3DB9B06F0441482FB1BECA0457DBA0CD85617B87 + 0BE16771F5AFA280CBE949B36DCC03057652F28BCD43BF06E433AB79B0B9F463 + 4DE5F54F87D1A8640335AD611ABC8CB67E134410042184789AB08CF70871C158 + CE056348B30C8FC33BB1FAF1B8DD925568F232F553D6D7714168BC5116852517 + 84482FE3759DA8AFA8391DCD3B2820D1719CB466A348A875EA262533DA3C92F2 + 0C08AF47D7FE90F7F8CDC14EF130DB10CC2FC0D3E82646CC8F1A51AA9F4D1104 + 214788FB6DBC288C50A8218CA1BAF2C65D598BB8704A8A79A0D0E381BECB2878 + B711AF3BF8365E0E075F64A8D2B14DB8020FB90A4F15FC5BD181DDAA292999E6 + A108FE1E8B79200F6CDFC6CBE38277C9F13C3059BD5FD292378220E406311988 + 32095DF8A03DBE0A35041E06DFC66B5798268A2AF45058E26A3EF8365E1546E1 + 8CF505DFC6CBE18CBC8DD76C621A4EEB686FE3150441B0256A1396320FDDB60F + 5090A1568042CA28B4B900C79D59296F36CA262CF982DF6E2ECCE758FB2A920D + D732CC1DEB21F0FE900E734110524E4403B19A07174C39F3AC4724ACE681029B + 8728D091AE49B989A016C88360139F021DEDC97A1BAF20084258C23661E10A97 + 07621E16385F902721E6C1F9F219F20679A4D2C12495872983D78757AC639FA0 + 0604611B606682200829275A0D443F3C28E66142D5404ED0E611480D0083414D + 44F24C1004411004411004411004411004411004411004411004411004411004 + 411004411004411004411004411004411004411004411004212A317F9150683B + 2FBEF862B90A06193B76ACF1B541411004411004411004411004411004411004 + 4110044110044110044110044110044110044110044110044110044110DA014E + 351404C186905799D4D4D40C7CF0C107FFBD61C386914D4D4D2A554805050505 + D4BB776F9A3C79F2A02E5DBA7C87B48F3EFAA8F725B73F7A635D41F7893E67BE + 319D907C7C2DB5355D3CDB9EBDF38F675E7DC00107AC57C9545D5DDD75E3C68D + 97AC5BB76E3C1FFF431D0EFB37FDF8FD7E150A25DCF499C0ED762FEBD3A7CFFC + 810307DEE2743AEB9086DFC7C7D8258B172F1E5F595939D49890C176E337E9ED + D7BFCFFC7BCCBF79D6AC598E0B2FBC309860375DAA9685B079FEAE5DBB2E1B39 + 72E47CDE8F7796959555AA64214DECD85BCC8D37DEB8A8B8B878E469A79D46DD + BA7553A9A9A7B9B9990A0B0BC9E7F3A994F490A9F5822D5BB6D0134F3C41F5F5 + F58BAFBEFAEA5148DBFFD469730ABAF69E78ECB07ED4B57331B9F3F3434EA854 + B2FCABAF68C89E7BAA587A49D7BA51F034B7B490CF91478FBCF1053555AE9FFB + F17F674E52A369C58A15D771213B7DC89021C4E7814A8D1D2EA8A9B6B6964A4B + 4BDB7C4CF171616C83B9B03413E9B8C03C8D8D8DB46CD932E24275C6E0C183AF + 43FA82050BAE7BFBEDB78DDFD7A953A7E0B2AD05B4C63C5E8F7BE38D37E85FFF + FA97E30F7FF883FFF0C30F0FA65B9705CCCB4BD5B2B66FDF4ECB972FA7DFFCE6 + 3733C68C1963FC4E217DECD843CC15575CE167E1A0330EC074515555655C8DA7 + 739D2053EB05302E2EACE8965B6E818CFDB0E7C4BFFBCFFCCD40DA7FAF213470 + F7FE7C15993E03F97E433D0DE8157FA1990CD2B56E143CA859FFF0D32AFA6EE5 + 1ABAE7C54FE8ABB97F0E66305F99FBF7DF7F7FA376E8F57A8D346BA11609BEEA + 27AEBD105FF91B1727F160DDCF5C43A09E3D7B520B1B5E2CEBB692CF171F0D0D + 0DF4C9279F105FA11B0BBFF6DA6BFD83060DA28A8A0AC3E4C211E9F7BEFAEAAB + F4D7BFFED571CD35D7F88F3AEA28951A8A79FE642ECB0E18F6D6AD5BE9DB6FBF + A5EBAFBF3E3D278B1024A48D17072B57093352A0E61AC863E435F23C882B9F06 + ECBA130DE8DF8FF2F25C2A5148262E571EEDBEDBAED4BDBC8B91DF66B04F60EC + 28FC6120106A127A184D28E83C1E8F31B41B1F497A7D5A303A2C27D6755B85F9 + F15BCCE7320ADA2E5DBA18C2B1575E5E1E94398E0B481D370F751858D3CC43CC + 8F3094CC65E974735CFF1EFC3621FDB4EA248CE4F64272B1CBEBBCBC3C72BA5C + C4D7BD2C221F0AA334C8EBE382CA263D1D4AD7BA8DDCE62B5A279B08F2D90EEC + 133B0330A7EBB05500053ED069D6E544927959D6E5C422EBB2AC200DB5A4A2A2 + 2263889A9696398EB08E9B87A8D5C094008688DB4DA7C3D6B87998E8B27458C7 + F56FB1FBBD89327DFAF4BCF1E3C7BB55548880ED5D26FA804C9770C0E7D27AB5 + EC70A26073B8085BE6E53F9E34A9D9639F9E0EA56BDDC84F3F1B88C3E90AE473 + 18CCFBC7BCBFA20924EB984AC672EC8071A2B0D6D271733A0A64C4B5CCE928B8 + 812EC0F538F3F4E6F4642E4BCF6F5E8E8E270B18C7AA55AB5A4A4A4A9AC444A2 + 93150602E5DA7A213BBC9CEE6179797460981E79B81660979E0EA56BDDD67CB5 + 43B7B95B85021D3287ADC2386B13969E3F169997954853987559F82D565C5CBB + 350B85AF79684ED7B2A68358A78F340EF17896A5E3D6742819A0E601E350519A + 3F7F7E7C1D5961983469921F52D10E45D6D440ECD253AD4CAD57CB0EDE24F270 + 2987ABE5748ACB2BDBF4742813EB463E8723D27101ECD221807981DD78AD7098 + A789653976D298C31A180AEE14B316BE7605B29D301DAEF881BEF2B79B2E1625 + BA2CBBE9F09BECCC321ED83C9CA879A828FA26BBA8A0100169C2CAC07AB5ECF0 + 70720B8F4BB79AB91660979E0E6562DDC8673BCCFBC76C241AF3783B99E78957 + 6DC5BA2CEB3211D7066236126D2C56990B68731AB04BB7A69965371EF1789785 + 6D358FD743EB6F8D17368F40A713C3CBECF5C8238F6C53512102B60622640E9C + 07A2F4281CBA108E57205917256D31222D2BDA28802E8CC39907641D8F300A6C + 80A1759C396E95753CC2C95816D0698962695EDAE581071ED8A8C242145A1988 + DD81284A9D84F64132F7997959E194881159A717A263360F36B28173E6CC59A3 + A2420C480D24CBF0FAFC461F48BAD5D2ECB54D4F8732B16EE4B31DFACA1F980B + E358154BCD211EECE68F24BB7934E67024CC57F3B15ED9879B2799CB8A44ACBF + CD8CD53CB8E6F1BD8A0A31626B20E6832F1D4A56B53F5E656ABD5A76E8BB85D2 + 2F2EC46DD3D3A1F4AFDBEE2E2CF33E31871329D012C17C6C988D2C56B06D9827 + DAF6C6FB1BEC96176D1DE148E6B240BCD303DC9E6B360FCEEB3DC53C12436A20 + 59062E8C21941DE914BCD42E3D1DCAC4BAED2A20768591354D17D0E1646EA387 + ECD0266195793EEB72ACB203CBB01B0A3B9832654A4FF3ADBA9C9787CC9B37EF + 6B154D88C99327FF0A86144E6AB2E0EDBC76529384C56E9E78A4169374B2A206 + 92ABB2A3D1EBA37A8F8FEAD2AD668F7D7A3A948175239FC3612EA8CDFB4917DC + D6FD6896B5092B1ECCF359976395791BB5920596AF3187818E874B07B184818E + 874B07D67149A0931A1AD4D6D67EA88209337BF6ECFFA960CE1172D44D9D3AD5 + 7FE38D37D2C68DE9BD0961FDFAF53474E850E3E586E92453EBD5E06579575F7D + 35DD71C71DC67ED8F3DC5BFC271CF36BEA37700F72A83B4CD2C5F2653FD390A1 + 3BA9587AC9C4BA7F5AB18C9E7DF93DFAEAC12B82E7C02BAFBCE2DF7BEFBD43DF + 4FC6A0708EA520C34B0A3FF8E0031A3E7C789BDFCDF4DD77DF19CBC14B15ED88 + 657BF0CCC4975F7E49471F7DB4F11B2FBAE822FF19679C41BD7AF522BE0A37A6 + 31A34DC8BA6C73FAA2458B8897E178ECB1C7FCA3468D8A691E33C95C16A8ABAB + A30D1B36102F83EEBEFBEEC0845198C0700D6FAE8AD29C3973629A2F51740D20 + D5EBC904AD4A29EC249C40E9145EFC8677FFD88D4BA532B55E2DBB13A2A1856B + 202DDEB4ABB1B9D9363D1DCAC4BA91CF76A0E9480B059775A8C376C238EB2DA9 + 894A2F275E59976105351B3BE158B44B87CC2F74D4EFE8B2A6E97034B5655991 + B6311EE6313CB828100BED4C17E243FA40B20CBCF40F770889522BE4B31DE642 + 1805B0B540B6A699857975C16F373E1EE9E5E875C622D438CCF35BD1172C58AE + 9D34E1C6450B9BA509372E5AD82C8DDD3808D85D8C45826B03B3782026D246B2 + A60F24D7D60BD981C2CD930179BD3EDBF4742813EB463E5BC13E3117C8E6025D + 17CA76E95A00E381DDF868D2CB876006281CEDA60B27F3F40863195674816B1E + EA30B0A6EB6599651EAF659E4E8FD7D84DA3651EAF15CBB274D83C8C179808D7 + 5E26AAA8984802D8366189D227217B4041844217EF6682F02658B3C2A56BA1E0 + C7570431B41B1F4D7AF9105E538E82D49C6696DDFC66611AAB81E8C2371ED9CD + 176B9A5576D3C49A168B1201CD59622289933535905C941D5EBF8FAF8ED32F9F + CF639B9E0E6564DD9CCF76D815463A9E4841A5E78957308F78B15B8E152C17D2 + B51C5DE3419A8E63A8A7B1CAFC0A76BBF1D6E5247359E6E5E874A4416D0126C2 + E7E3041515138983AC31905C5B2F6487C7E3A3E60CC8E3F1DAA6A743995837F2 + D90EBB423856015D98D98D8F47588E5D7AAC0A57B0625C472319BF69EEDCB90F + F13929261227AD8E30146CE6BB1BD2A178EEE248A632B55E2D3B13C16B365ABC + BEB4CBC37961979E0E6562DDC8673BC215DCE6745D385B659DAE2DC27280DDB8 + 7894289837DC454E3830BDDD3A93B9AC5462359173CF3D77980AB609DCBEDB11 + 6FE105B63510BBC22ED5C20163979E6A656ABD901D1E4E6FC1EBCD8D42357DF2 + 783DB6E9E95026D68D7CB603859655E67473D82A602DF8DB8A79F9D164C52E2D + 9E82DC3C3FE6B3CE6B4DB35B9F2699CBB2625D565B8089E802FFC1071F5CAA92 + 8530D81A88DE99A2D4CA0E0FAE903DE997D7C305AB4D7A3A948975239FEDD005 + 17866669CC613B6231103DCEAA70D84D1BAB042195B43210BB822E1DCAD4BA33 + B55E2D2B48C3330AE917D78A6CD3D3A1F4AFDB2EEF3B3AFC9BEBC3998A35DD2E + 7FACD3D82D2BDC316D259165D94D03908EDFA6A2421AB1AD810899C1D7E2AD69 + 31AEC6954C6DF6A9169EC5B04B4F87D2BA6E53FE22BF55D61BB8DDEE65783B01 + 6E810DD797112D1D7707E97838851BAFEF3082702B2EA633DF69144D985E2F1B + BF01BF05BF49FD3CEAD6ADDB3B0D0D0DC1E9CC02E6A10E0384F5F2CDD8A523AC + E33A6C1D9FE8B2F4D02AFC26FC36630221AD84ECC51B6FBC71516161E1C8F1E3 + C753972EE9FB24707575B5F17E9EC6C64695921E32B55E505353838FF663DD8B + AFBEFAEA51483BEA925B6EDB58EFFFE3FE471FCD05919B9C5C78F019624C9F6A + 7EFEEA1BDA69CF3D542CBDA46DDDB8A2E5DA0E5E23B374E102EA59ECB8FDD53B + AFB84C8DA5152B565C575555351DEF47C3ADA5B802460105CCE170C03CB66CD9 + 82C28C3CF8D07B1BC0B199E872B0ADCDCDCDB46CD9322A2F2F9F3178F0E0EB90 + FECA2BAF4C5AB264C9BD279C7042419F3E7D427E1BB0C601D2CCE3DF7EFB6D3A + E594531C4F3EF9A4FF37BFF94DC838EB7C2015CB32C7D7AD5B47CF3EFB6CD388 + 11237E7FF4D147CF3146086923B027145CA80DBCFBEEBBFFCD27D1489C6442EA + C015229FDC78C1DD2036EBEF90565B5BDB7BFC750FDEB8B6AA69A2CD83D24292 + 703A1DD4B7CC3D77FE75E75E5D5A5ABA5E25A3D0EEBA71E3C64BB8501ACF05F0 + 50A4A190D2055622980B42336D59662CA0E6C126317FE0C081B7F0957D9D4AA6 + 050B164C7AFFFDF74FDFBA75EB211C2D0EA4862FE8818EEBE1AC59B31C175E78 + A1DF9AAE31C7C38DD3C37896051037515F5151F1CE41071DF4F8983163C43C04 + 4110044110044110044110044110044110044110044110044110044110044110 + 0441100441100441100441100441100441100441100441100441100441100441 + 1004411004411004411004411004411004411004411004411004411004411004 + 411004411004411004418807871A0A8220643D13264C38DEE9749EC8C1BD945C + ACCF586B598F161717BF346BD6AC5A0EA795891327EEEF7038CEE3E081AC7D58 + 0DAC2F59AFF97CBE7BE6CD9B87EDEB70443490499326F955B04DCC9933A7CD46 + A5B72519CB1204A17D71F6D967EFE672B96673213D5225D9D2D2D2B2392F2FEF + CAB973E7CE51493479F2E40B66CF9E7D8F8A2695534E39A5A8A4A4E406DEAE4B + 390A336B85D7EBADE16DBF90CBAE47555287A15D1A481BB6EB7A9E7FBA0A0B82 + D00EE0F3FD8F7EBF7F0617D2A52A292A3CFD93F5F5F567718DE4489EEF393EEF + F3D4A8A4C1C6D49DCDE11DAE110D564911E19AC8A30D0D0D13E6CF9FEF5549ED + 1EA71AE6023789790842FB82CDE3061EDCA6CD838D01CD53D773C13DA2AEAE2E + 8F0DA21317CCBFE2F4BFA0F68169004F7F4A5151D1021EF708476D6B066D61FC + F8F12E5EE77366F3E0F8625EDF38D64E4AE390A646134F7B26D756AE55D10E41 + AED4406EE1F9AE54E1943171E2C4457C90FC85ABCBEFAAA48C61CEA348F98FAB + 283ED0EFE22AFFE92A292570DE3CCE797331E74DF024B712EB362713BB756662 + 3B34D81FE1F228D2B88E081F33A3D90816A8A85140B3714C7EF8E1877F524921 + 4C9932A52B8F9FCDC1E303293B48F67EE46D3B87B76D9E8A025CA05EADC221F0 + F174230FAE0AC4A8D9E572FDE281071EF85EC5DB351DBE06C207DDEDBC63536E + 1E800FA891BCBE7760247CB21FAC92B3960913269CD8DCDCFC356FF7692A2965 + 601D5817D6A992040BE79C73CE2E7CFCFC8F0B1C14822170DA7F78DC524CA392 + D20E8C554B25A50CBEC277F3E0AE40CCE019BEC81915CE3C0017CA955C2B3989 + 83CF0752520A3ACC0D606CBCDEBFA8682B308EA7D117956E36B9292ADCEE89CB + 40E0E26627D771ABD4E88CC33BED9F7CD05DA6A26923DB8D0457B2AA46F0747E + 7E7E77959C72B02EAC93D73D1FDBA0920506F9C157A68B38B81B8BCBE81D26C2 + E1FFF00085CE2E3CCD3BB99077A5A5A5C7F3793400618FC753595C5C3CC11891 + 059C77DE795D78DB0E5251344DFD2552BF06C6611A1505A3D5B0DDD3A16B20BC + 93C35EADA4836C349274D63AC2C1EB3E456A23A1D4D6D656F220D85ECE182662 + 320FCD9B6ADA0E0D5FA5078F0D36CDDB63BD35978DE60E1EB46AC24A264D4D4D + 30F960BF0A5F18E176DD88F034B8D5D8807F1BE6EF10C465207C3087545F75DC + 2A353A1BB8830BEF2B543863648391E0AA3513B58E70486D24145CA5D6D5D5FD + 9683C1DB4F99492CB379CCC1341DE92E9E08ECAF86E025358CCADCB9732F4E75 + AB081FB731DF0DA6C9CBCB0BEE3336C422156CF774F83E102EBC6FCE06130199 + 32926CA87584436A233B0863229AB49B47A40BC348E392019F27BD5490EAEBEB + 97A96056D0D2D212F25020C7F14063441A1A1ACC86D8611E2AECD07D201A6522 + FFA7A2D900AABF49BFB5301C7CC5840EC9ACA63D6C633A8864103952F3684579 + 7979565DB1AB8EFC60F3B8CFE7BB01B7F5AA682B300ED3A828CC71A10AB67B3A + 7C0D44C3267243A64D840F9C77793B467135FB90D9B3679BDBBB530A9BFA136E + B7FB171C7C269092553C836DC336AA784EC357F3E83C47D395151ED5FAEEAC8E + 0A9F271B5450F73964157C2E3FA08246CB029E4657D156A827D5832D0E6C260F + A960BB27626D215955D364D44AF4B664630D47132EBF601C7C858DE743D2661A + E66D31E7D9E4C993D16434CBDA0F92EA7CB5E60D1EFAE26D407B75D038C26D73 + 2AB15B6726B603F07AADE6A19BB242D298C92A9C56D2992F13264C7884CF9933 + 11E6F3E72F7CD1F53763449670E1851796D6D7D77FCDC1E06DD5BC9D8B59B7B3 + 597CA8E20772F88F3018638200CF73DE8D53E1764FCED44032018C830F9EB4D7 + 3822C1DBF16416D446A4D661816BC768F33F2C103330FA3C6CFA440E53D37668 + D83C821DE71E8FE75214D82A9A15F07EC12DC6AF0562016014BCDDCFF1703DA4 + C241F3E0F2E07B3EEEB3E676E46490137D20E9261B8DC30C6FD366DE4F27F136 + 8E37BFFE21D5A8759D8E75631B02A902E0636583D7EB3D8483AB59C10E734BC7 + FA6A2E4C715C059B773A2AFC9B9F44818B306ACB1C8FA9F90EFD0D5C537A8E4D + F63B354CFAAB4378B967F2B9B39483FA0EB9A87D5328137870C8FDF7DF5F1348 + E918480D248964BB715849736D446A1D5178E8A18756F3F1334C9B874A0EDE9D + C5C7D7AF223D89DD91E0DFDCCC83A9819871757FCA8409135EC55B7955522BF0 + 805F7171F1E31CD40F21E27990A49A2D1BD2393CC02B4C829DE6BC5FF0A439DE + B307F3B7F23E8F9B8C32A1231A7FC4DA82B9CDB32D24A356A2B7456A3882903B + F0796F7E8F140A6B3C50780B0F17CE9B37EF43BCF2A4A8A8681FA7D3792CD770 + 2FB0F4ED3D83DAAE0AB719368F496C4C78B0D37CC7158C7E5F5E8FF130E19429 + 5306702DB10BC2CCDA8E5E5B1403110421ABE173FF8F3CC05D4EF1DCCEFB4C6D + 6DED594F3EF9243EECD466781BF00C156A3766BCAA76D161EEAA8A1769C21204 + 21ABE18BC6DBB986B12F17D6B1340BA319101F6F3A2959E6A1B84D0D35396F1E + 400C441084ACE7C1071F5CC185F5289FCF872629DC50F0310BCD4730898F391D + 5FFB3BBDAEAEAEFFECD47C7D107D321A98C76F73DD3C8034610982204481CB9F + 237980FE0FBC31612A9743723388200882200882200882200882200882200882 + 2008822008822008822008822008822008822008822008822008822008822008 + 822008822008822008427B43DE6C2B08422B264C98D0D7E974DEE5F57A0F73B9 + 5CFA0B7B4138BD86D3DFF4F97C17CF9B376FAD4A16720C3110411042183F7EBC + ABA4A4E41D0E1E144889C8FB7575758798BFE19E6A264F9E3CD2EFF7DFCCC103 + 0329F4A1C3E1B872F6ECD9B17C704A4822F24129411042282E2EDE8B07B19807 + 38484D9F36D83CF069596D1EE0409526A419A9810859C3C489136F9B3B77EE65 + 2A9A3632B5DE6C85AFF00FE60219359098E0ABFF43F8EAFF5D15CD5972F1A377 + 49F9A15CE575F355C81D7C125EA892D20E1702B3EAEBEBA77255DAFCE949A11D + 80E3A7A4A4045F7B3B2713279F3AF11FAAABABFB6D361E3FE93EBFB2C540264C + 98F086D3E93C4C4513C2E7F3BD396FDEBCC35534A5E4A281B4B9098B0BEE5E7C + 70BFC107D1052A292360FDD80E6C8F4A12DA01175E7861695151D18B1C3C2790 + 9231CEC176607B543C2BC8C4F9C5E6B1B70AC644BCD3C70A9B479BCD3C19CB10 + C2D32603E12B8403F9C05ECA3A582565146C07EBD373CE3927D6F6DB94C25724 + 7F845454B080C2916B8DB8CAC4F7A6330EB603DB932D1721D9767EA51BBE921F + A38209938C6508E149D840F8249BC2271CAAB97D032959432F97CBB588B7EF3C + 15CF086C1C67F2E03648850513679F7DF66E3CC0F163EE0CCD06B03DEFA8EDCB + 18597C7E094290B8DBEA747B2C5F1559ABD4D7B3DB4F57E1B4C385F40C1E5C1B + 8805B9BFAEAEEEE274B76BF3B6A0DD7601CB6D241061FD63387FDE0C44530317 + 3AB7F17E69538DC7EFF7DF9EEA0E65DECEFD793BD16CD5EA4A3F13EDC7BCBF8C + B66B0B1B382FC6725E7CACE269211BCEAF6CEA440FB36F62269DC793DED64C1C + C39922AE1A089FF8E1DA63336A1E40ADFFFA402CC879252525A88DA4AD4982D7 + B58FD7EB7D9A83DA3C801B692838553C25A0E0F7F97C8FAA68DC60DE549B8732 + D745AC6CEFABC2F62D52DB9B16B2F9FCCA32D0296EEE18B7C6530A0C96F715CA + 15EB056B2B300DA6C53C2AA94311B353A23D96ABD4281863AE52A7D289E3BC32 + D9C005F8490F3DF4D0FB2A9E12A64C9932A0B1B171497E7E7E779514424B4BCB + E6C2C2C2110F3CF0C0F72A29E9E00AB6A8A86801EFABB80A3EDCADD2D0D03026 + 95B535DE6768CA9BCD329B6B0899B87A8B722C213F26F376256CCCB1904DE757 + B6D740F4EFD6E3AC7133A9C8235E4FB0B583F3693A5F741917AED6ED817970DE + 605AD0212F0262AA817046B4F7F6D894F78BF049D7DDE3F12C08671E00E3300D + A65549490706C026751207E3697AF90CF3A4D83C2EE5C123ACB0E691A5607B1F + 51DB9F123AC0F995532823304C030601A340D84C2E980788C940F8E06E6F27BD + 2DFC3B5C2A98544E39E59422BE1279910F98012A292C9806D3621E959474EEBF + FFFE1A5ECF185E4FD49A0EA6E1698FC23C2A2955A424EFD348CAB6BFA39C5FB9 + 442413C915F300311908574FEFE10C411BE386404ABB6303B61FBF43C59386EA + F44487703C77131D887930AF8A271DFEAD9BF3F2F2C6A0D94C25B502E3300DA6 + 554929834FA2DBD9AC267030AD37342481666C37B65FC5934E0738BF7212AB89 + 600872C53C40CC9DE87C90BFCB27D2BE1C6CD58FC0E9D339A31C56A9D129C16E + 7DD80E35DACC873E9F6F18B65FC5934A5151D16CBE828CBBA315F3605E154D09 + E86B71B95C6339D8104809A101E352D91F6365EEDCB90FF1602CEFA7DA404A76 + A3B613776261BB534AB69D5F426CF07E089A88859CB8F121AEBBB0F844DA5057 + 57378A83F7075202C071EDDA01D389A5DAA87980B7F79054BD6E7AD2A44937B2 + 1124FC8C07E6C532543425F06FFF90073011F3953FC263D5B8B4C227D56B5C20 + B687AB6DDCC67B38B657C5534E369F5F42786C4C2427CC03247C15C307F4797C + 60DFC5C160330C675AC6AE8AF41D108A66DEB6A9681A50F19C87F30746874E6C + 7016EFAB94DE55140DDCB1E6F57A5FE560C8037B9938862CC70EF8896B6747A5 + B376662593E757B6DF85C5DB663C5DCEEBC5B356ADE266D2793CF1B61A17B0BC + CE9C300F10570DC40C5F2DDDCF0500AE96B2ED4A3265FD1DED1918069F685743 + 08ABE48C81C299B7650407D3FAA05E0C7C8CEDCAA479802C3EBF320E8CC26C16 + D6782A81A1D9991A807184338F48F3B56712361080E72AF864B36DB7CD1029ED + EF68EF70A17413A4A219074D36C5C5C5A3F00C8A4ACA28D80E6C0FB64B256594 + 2C3ABF3EE602FA175C38F2C0F10BC403C9B9CB84091362BEE53A9E69DB1B6D32 + 108093CDAEDD3603A4B4BF43480DB366CDAAC5038C5C7867B45684F5633BB03D + 2A292BC882F3ABD9E5729DCE1765CB10C11071A4239EAB389DCEFF4C8CE10D17 + 9806D3AA688723637D168260854F367CF362AA8AA68D4CAD375BB1F481DCCF35 + 8FF35538C8A44993EEE381F1602ED74A52D907F2330F12BD825FCBDBBE930A27 + 856CDB9E4CD3E61A8820248B4C15E2621E1179520DAD844B4F2A6C64BFE54122 + 4D8AB88B0EF326956CDB9E4C233510411042D03510566D7D7D7DD9FCF9F3BD6A + 5490F1E3C7BB8A8B8BABB9F6519ACA1A8890DD480D4410045BD81896D9990740 + 3AC6ABA820088220088220088220088220088220088220088220088220088220 + 0882200882200882200882200882200882200882200882200882200882200882 + 20643FF23AF7243265CA94AE3E9FEF34BFDF3F9AA3F8E8CC3EC608A2CF586B1D + 0EC742A7D3F9C4030F3C50194816044168BFB42B0349D647E9F16D67154C0AA7 + 9C724A514949C9A56C1E57B95CAE2E2AD916AFD75BC32672535D5DDD3F9F7CF2 + C906959C14B2357F0441E898C8F740DA08BE795C5A5ABA886B173746330F8069 + 302DE689E59BCA822008D98A18481B983061425F3683FF71F0C0404A5C1C8879 + B10C151704416857D836554C9E3C79A4DFEFBF998389148CEFB3FE3267CE9C37 + 03D1E4914D4D34E3C78F77979494BCC3C144F2C8CC8775757587CC9F3FBF59C5 + 13469AB004414827B63510368FC7799068C17810EB3F81E00EB870BB51053B04 + C5C5C57FE441B43CC2E7404FF77ABDBBF2F04323A53507AA65098220B42B6CAF + 34DB7A258B8EE2871E7AA80C617C7C9FAFD46771F0BCB65ED95AB72BD6E5253A + 5F38CE3BEFBC2EF5F5F53FE6E5E5755549B6783C9ECA871F7EB80261DE861B78 + F07F085BC1746C22FDEFBFFFFE1A95941071ECB7CB583074B711B32035104110 + 6221A57D2068E6E182F1110E9E1748E9183437371F1BCD3C00A6E1427DF6C489 + 13AFE0E894406A6B305D4B4BCB992A9A72DC6EF7036CF2A338B8219022088210 + 3F29AB81343434F466F378CEE9741EA992DB7C65DBD6EDD224613B9EE3C1F181 + 58543EF6FBFDB8F36A808A87E379DEAE712A9C10B1E60F1B48196A3BE8C0E7FD + F334278534C5490D4410845848490DC4E572B94B4B4BDF309B4747C2E7F30D56 + C170AC65D3389F0DB41317C6C3EAEAEAF6E6B468CF7CECAF86490566CEDB723B + 078FE2616F9843555595B12DF3E6CD5B5B5B5B8B9AC81CC4054110E221253590 + 7024E1CA3F64BB625D5EA2F385E39C73CEA98EF4CC071BCC0A36CFC5BC9EF311 + 9F3C79F2C15C78E38EAD4834F3F4052A9C1036FB6DB5C7E319F5F0C30FFFA4E2 + AD401F151BDD6D5C43BA5425490D4410849890E74052009B076A284581986128 + 07AB6058D860DA7C1BAF155EEFC579797903D858E6B1962AF9711300C6B3B175 + 67F378C36C1E822008B1D2AE6B2089D2D6ED983061C237CA24C28226ACB973E7 + DE8FF0C48913DFE1423AA289A0D6326FDEBC3D5434216CF2E725D6B181E00ED0 + 07D2D4D43480B709FD1FBB04527720351041106221553510B4B1E381C20E099B + C70A150C0B1BC2420C71B5CF05359E8D89482CCB4C8056E6019A9B9BCFE16D42 + 935A2BF31004418895941888D7EB6D2E2E2E3E8A0BD1A43F8D6E0657CAB1484D + 9E34B876F1A40ADA82DAC4430F3DB41A61BED247CDC3C58A78CB2C17E886E1A4 + 89BB58C126364110844448591FC8AC59B36A1B1A1AC670F099404AC7A1A0A0E0 + 79DCDDA4A2ADE0DAC4F72A086380919CC57ADE48B001CBCACFCF7F5445054110 + DA0529E9034181687912FD3E0E4E696B6D205BFA40C0C48913AF6273B07D3D4B + 4B4BCBE6BCBCBC09F5F5F5AFF16F1FCA3592ABD854C23E28C8359AABE7CE9D7B + 938A264C36E58F20081D9F7006F2330F127E4B2C1788DF73813850450DB8C0BD + 8DD3F00A8D8449B4804C4581A85EA6B884836D7D7EE3E3DADADA4392F16D906C + CA1F41103A3EB64D586C00BFE541A2AFB94093CDC581E00EDA6A1E6D0585ABD2 + 0C95D426F0F65CAE59E0C9F1B5819484588B6524FBC3528990ECFC1104A1E3D3 + AEAE3C51C0A9605CE00A5BCD7B3D87A7075293C339E79CB38BCBE59ACFC178DF + 5EFCA1D7EB1DAF3BDB934136E68F20081D975C7A90302585230C00AF03E15ADB + 5F2275AC6B300DA6C53CC9348F2420E62108425C48DB77129932654A57360874 + 968F66A10F691FA4339FB1D0D4B5906B2B8F3EF0C0039546AA20088220088220 + 0882200882200882200882200882200882200882200882200882200882200882 + 2008822008822008822008822008822008822008822008822008822008822008 + 8220088220088220088220088220088220088220088220088220088220088220 + 0882200882200882200882200882200882200882200882200882200882200882 + 2008822008822008822008822008822008822008822008822008822008822008 + 822008424488FE1F3D0B185DA478C4790000000049454E44AE42608200000756 + 697369626C650800005450463007544C61796F757400095374796C654E616D65 + 061354726565566965774974656D315374796C65310A506F736974696F6E2E58 + 05000000000000008F07400A506F736974696F6E2E590500000000000000A707 + 400A53697A652E576964746805000000000000409308400B53697A652E486569 + 6768740500000000000000A003401453697A652E506C6174666F726D44656661 + 756C74080756697369626C6508085461624F726465720201000C545370656564 + 427574746F6E00095374796C654E616D650606627574746F6E05416C69676E07 + 044C6566740C4D617267696E732E4C6566740500000000000000C000400B4D61 + 7267696E732E546F700500000000000000C000400D4D617267696E732E526967 + 68740500000000000000C000400E4D617267696E732E426F74746F6D05000000 + 00000000C000400A506F736974696F6E2E580500000000000000C000400A506F + 736974696F6E2E590500000000000000C000400A53697A652E57696474680500 + 000000000000F002400B53697A652E4865696768740500000000000000E00240 + 1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B + 75700628726565566965774974656D317472656576696577657870616E646572 + 627574746F6E7374796C6531000007544C61796F75740005416C69676E070843 + 6F6E74656E74730C4D617267696E732E4C6566740500000000000000A003400A + 53697A652E576964746805000000000000408E08400B53697A652E4865696768 + 740500000000000000A003401453697A652E506C6174666F726D44656661756C + 7408000954436865636B426F7800095374796C654E616D650605636865636B05 + 416C69676E07044C6566740843616E466F637573081244697361626C65466F63 + 7573456666656374090A53697A652E57696474680500000000000000A003400B + 53697A652E4865696768740500000000000000A003401453697A652E506C6174 + 666F726D44656661756C74080B5374796C654C6F6F6B7570061A726565566965 + 774974656D31436865636B426F785374796C6531000016544163746976655374 + 796C65546578744F626A65637400095374796C654E616D650604746578740541 + 6C69676E0706436C69656E74064C6F636B6564090A53697A652E576964746805 + 000000000000408908400B53697A652E4865696768740500000000000000A003 + 401453697A652E506C6174666F726D44656661756C7408185465787453657474 + 696E67732E466F6E742E46616D696C790608436F6E736F6C6173155465787453 + 657474696E67732E576F72645772617008165465787453657474696E67732E48 + 6F727A416C69676E07074C656164696E670D536861646F7756697369626C6508 + 0D41637469766554726967676572070853656C65637465640B41637469766543 + 6F6C6F720708636C61426C61636B000000005450463007544C61796F75740009 + 5374796C654E616D650628726565566965774974656D31747265657669657765 + 7870616E646572627574746F6E7374796C65310B4D617267696E732E546F7005 + 0000000000000080FF3F0756697369626C6508085461624F7264657202020005 + 54506174680005416C69676E070643656E74657209446174612E506174680A40 + 0000000500000000000000D36D3F431BEF4843010000001749E043BA09E54301 + 000000C9B63943C73B344401000000D36D3F431BEF4843030000000000000000 + 0000000A46696C6C2E436F6C6F720708636C61426C61636B064C6F636B656409 + 0748697454657374080A53697A652E57696474680500000000000000E001400B + 53697A652E4865696768740500000000000000E001401453697A652E506C6174 + 666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F + 54466C6F6174416E696D6174696F6E00084475726174696F6E05000000000017 + B7D1F13F0C50726F70657274794E616D6506074F7061636974790A5374617274 + 56616C756505000000000000000000000953746F7056616C7565050000000000 + 000080FF3F075472696767657206104973457870616E6465643D66616C73650E + 54726967676572496E7665727365060F4973457870616E6465643D7472756500 + 00000554506174680005416C69676E070643656E74657209446174612E506174 + 680A400000000500000000000000CB11CF4379E93C4301000000DDB4CD439623 + 0A44010000007DBF1E424871094401000000CB11CF4379E93C43030000000000 + 0000000000000A46696C6C2E436F6C6F720708636C61426C61636B064C6F636B + 656409074869745465737408074F70616369747905000000000000000000000A + 53697A652E57696474680500000000000000E001400B53697A652E4865696768 + 740500000000000000E001401453697A652E506C6174666F726D44656661756C + 74080B5374726F6B652E4B696E6407044E6F6E65000F54466C6F6174416E696D + 6174696F6E00084475726174696F6E05000000000017B7D1F13F0C50726F7065 + 7274794E616D6506074F7061636974790A537461727456616C75650500000000 + 0000000000000953746F7056616C7565050000000000000080FF3F0754726967 + 676572060F4973457870616E6465643D747275650E54726967676572496E7665 + 72736506104973457870616E6465643D66616C7365000000005450463007544C + 61796F757400095374796C654E616D65061A726565566965774974656D314368 + 65636B426F785374796C65310756697369626C6508085461624F726465720203 + 0007544C61796F75740005416C69676E07044C6566740A53697A652E57696474 + 6805000000000000009003400B53697A652E4865696768740500000000000000 + C804401453697A652E506C6174666F726D44656661756C740800115443686563 + 6B5374796C654F626A65637400095374796C654E616D65060A6261636B67726F + 756E6405416C69676E070643656E746572074361704D6F6465070454696C6506 + 4C6F636B6564090C536F757263654C6F6F6B7570061257696E646F7773203773 + 74796C652E706E670A53697A652E57696474680500000000000000D002400B53 + 697A652E4865696768740500000000000000D002401453697A652E506C617466 + 6F726D44656661756C740808577261704D6F6465070643656E7465720D416374 + 697665547269676765720707436865636B65640A4163746976654C696E6B0E01 + 0F536F75726365526563742E4C6566740500000000000000F803400E536F7572 + 6365526563742E546F70050000000000000092064010536F7572636552656374 + 2E52696768740500000000000000B0044011536F75726365526563742E426F74 + 746F6D05000000000000009F064000000A536F757263654C696E6B0E010F536F + 75726365526563742E4C6566740500000000000000C000400E536F7572636552 + 6563742E546F70050000000000000092064010536F75726365526563742E5269 + 676874050000000000000080034011536F75726365526563742E426F74746F6D + 05000000000000009F0640000007486F744C696E6B0E010F536F757263655265 + 63742E4C65667405000000000000008803400E536F75726365526563742E546F + 70050000000000000092064010536F75726365526563742E5269676874050000 + 0000000000F0034011536F75726365526563742E426F74746F6D050000000000 + 00009F064000000D416374697665486F744C696E6B0E010F536F757263655265 + 63742E4C6566740500000000000000B404400E536F75726365526563742E546F + 70050000000000000092064010536F75726365526563742E5269676874050000 + 0000000000E8044011536F75726365526563742E426F74746F6D050000000000 + 00009F064000000B466F63757365644C696E6B0E010F536F7572636552656374 + 2E4C65667405000000000000008803400E536F75726365526563742E546F7005 + 0000000000000092064010536F75726365526563742E52696768740500000000 + 000000F0034011536F75726365526563742E426F74746F6D0500000000000000 + 9F0640000011416374697665466F63757365644C696E6B0E010F536F75726365 + 526563742E4C6566740500000000000000B404400E536F75726365526563742E + 546F70050000000000000092064010536F75726365526563742E526967687405 + 00000000000000E8044011536F75726365526563742E426F74746F6D05000000 + 000000009F064000000000001654427574746F6E5374796C65546578744F626A + 65637400095374796C654E616D6506047465787405416C69676E0706436C6965 + 6E74064C6F636B6564090C4D617267696E732E4C6566740500000000000000C0 + 00400A53697A652E57696474680500000000000000E803400B53697A652E4865 + 696768740500000000000000C804401453697A652E506C6174666F726D446566 + 61756C74080D536861646F7756697369626C650808486F74436F6C6F72070863 + 6C61426C61636B0C466F6375736564436F6C6F720708636C61426C61636B0B4E + 6F726D616C436F6C6F720708636C61426C61636B0C50726573736564436F6C6F + 720708636C61426C61636B0000005450463007544C61796F757400095374796C + 654E616D6506104C6162656C4E6F726D616C5374796C650A506F736974696F6E + 2E580500000000000000CC07400A506F736974696F6E2E590500000000000000 + A807400A53697A652E57696474680500000000000080AC07400B53697A652E48 + 656967687405000000000000008803401453697A652E506C6174666F726D4465 + 6661756C74080756697369626C6508085461624F726465720204000554546578 + 7400095374796C654E616D6506047465787405416C69676E0706436C69656E74 + 064C6F636B6564090748697454657374080A53697A652E576964746805000000 + 00000080AC07400B53697A652E48656967687405000000000000008803401453 + 697A652E506C6174666F726D44656661756C7408000000545046300A54526563 + 74616E676C6500095374796C654E616D65060C50616E656C325374796C65310A + 46696C6C2E436F6C6F720708636C6157686974650748697454657374080A506F + 736974696F6E2E5805000000000000809607400A506F736974696F6E2E590500 + 000000000000C803400A53697A652E57696474680500000000000000BC08400B + 53697A652E48656967687405000000000000C09F08401453697A652E506C6174 + 666F726D44656661756C74080C5374726F6B652E436F6C6F720709636C615369 + 6C7665720756697369626C650800005450463007544C61796F75740009537479 + 6C654E616D65060B4D656D6F315374796C65310A506F736974696F6E2E580500 + 0000000000009807400A506F736974696F6E2E5905000000000000009405400A + 53697A652E57696474680500000000000000BB08400B53697A652E4865696768 + 7405000000000000408708401453697A652E506C6174666F726D44656661756C + 74080756697369626C6508085461624F72646572020600125441637469766553 + 74796C654F626A65637400095374796C654E616D65060A6261636B67726F756E + 6405416C69676E0708436F6E74656E74730C50616464696E672E4C6566740500 + 0000000000008000400B50616464696E672E546F700500000000000000800040 + 0D50616464696E672E526967687405000000000000008000400E50616464696E + 672E426F74746F6D05000000000000008000400C536F757263654C6F6F6B7570 + 061C5374796C65426F6F6B3157696E646F777320377374796C652E706E670A53 + 697A652E57696474680500000000000000BB08400B53697A652E486569676874 + 05000000000000408708401453697A652E506C6174666F726D44656661756C74 + 080D416374697665547269676765720707466F63757365640A4163746976654C + 696E6B0E010E436170496E736574732E4C6566740500000000000000E001400D + 436170496E736574732E546F700500000000000000E001400F436170496E7365 + 74732E52696768740500000000000000E0014010436170496E736574732E426F + 74746F6D0500000000000000E001400F536F75726365526563742E4C65667405 + 00000000000000E106400E536F75726365526563742E546F7005000000000000 + 00E0054010536F75726365526563742E526967687405000000000000009E0740 + 11536F75726365526563742E426F74746F6D05000000000000008D064000000A + 536F757263654C696E6B0E010E436170496E736574732E4C6566740500000000 + 000000E001400D436170496E736574732E546F700500000000000000E001400F + 436170496E736574732E52696768740500000000000000E0014010436170496E + 736574732E426F74746F6D0500000000000000E001400F536F75726365526563 + 742E4C6566740500000000000000E106400E536F75726365526563742E546F70 + 0500000000000000A2054010536F75726365526563742E526967687405000000 + 000000009E074011536F75726365526563742E426F74746F6D05000000000000 + 00DC0540000013546F756368416E696D6174696F6E2E4C696E6B0E000007544C + 61796F757400095374796C654E616D650607636F6E74656E7405416C69676E07 + 06436C69656E740A53697A652E57696474680500000000000000B608400B5369 + 7A652E48656967687405000000000000408208401453697A652E506C6174666F + 726D44656661756C740800000A545363726F6C6C42617200095374796C654E61 + 6D65060A767363726F6C6C62617205416C69676E070552696768740643757273 + 6F72070763724172726F770B536D616C6C4368616E6765050000000000000000 + 00000B4F7269656E746174696F6E0708566572746963616C0A506F736974696F + 6E2E580500000000000080B608400A506F736974696F6E2E5905000000000000 + 008000400A53697A652E576964746805000000000000008003400B53697A652E + 48656967687405000000000000408208401453697A652E506C6174666F726D44 + 656661756C74080B5374796C654C6F6F6B757006144D656D6F315363726F6C6C + 4261725374796C653100000A545363726F6C6C42617200095374796C654E616D + 65060A687363726F6C6C62617205416C69676E0706426F74746F6D0643757273 + 6F72070763724172726F770B536D616C6C4368616E6765050000000000000000 + 00000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974 + 696F6E2E5805000000000000008000400A506F736974696F6E2E590500000000 + 0000C08208400A53697A652E57696474680500000000000000BA08400B53697A + 652E48656967687405000000000000008003401453697A652E506C6174666F72 + 6D44656661756C7408000007544C61796F75740005416C69676E0706436C6965 + 6E740A53697A652E57696474680500000000000000B608400B53697A652E4865 + 6967687405000000000000408208401453697A652E506C6174666F726D446566 + 61756C7408000F54536D616C6C5363726F6C6C42617200095374796C654E616D + 65060F76736D616C6C7363726F6C6C62617205416C69676E0705526967687406 + 437572736F72070763724172726F770B536D616C6C4368616E67650500000000 + 0000000000000B4F7269656E746174696F6E0708566572746963616C0C4D6172 + 67696E732E4C65667405000000000000008000400A53697A652E576964746805 + 000000000000008002400B53697A652E48656967687405000000000000008002 + 401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F + 6B757006194D656D6F31536D616C6C5363726F6C6C4261725374796C65310756 + 697369626C650800000F54536D616C6C5363726F6C6C42617200095374796C65 + 4E616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F74 + 746F6D06437572736F72070763724172726F770B536D616C6C4368616E676505 + 000000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74 + 616C0B4D617267696E732E546F7005000000000000008000400A53697A652E57 + 6964746805000000000000009606400B53697A652E4865696768740500000000 + 0000008002401453697A652E506C6174666F726D44656661756C740807566973 + 69626C6508000000000C5442727573684F626A65637400095374796C654E616D + 65060A666F726567726F756E640B42727573682E436F6C6F720708636C61426C + 61636B00000C5442727573684F626A65637400095374796C654E616D65060973 + 656C656374696F6E0B42727573682E436F6C6F72070978374633333939464600 + 000B54466F6E744F626A65637400095374796C654E616D650604666F6E740B46 + 6F6E742E46616D696C790608436F6E736F6C61730000005450463007544C6179 + 6F757400095374796C654E616D6506144D656D6F315363726F6C6C4261725374 + 796C65310756697369626C6508085461624F726465720207000754427574746F + 6E00095374796C654E616D65060A6C656674627574746F6E05416C69676E0704 + 4C656674064C6F636B6564090A506F736974696F6E2E59050000000000000080 + 03400A53697A652E576964746805000000000000008003400B53697A652E4865 + 6967687405000000000000009003401453697A652E506C6174666F726D446566 + 61756C74080B5374796C654C6F6F6B757006137363726F6C6C6261726C656674 + 627574746F6E00000754427574746F6E00095374796C654E616D65060B726967 + 6874627574746F6E05416C69676E07055269676874064C6F636B6564090A506F + 736974696F6E2E5805000000000000008804400A506F736974696F6E2E590500 + 0000000000008003400A53697A652E576964746805000000000000008003400B + 53697A652E48656967687405000000000000009003401453697A652E506C6174 + 666F726D44656661756C74080B5374796C654C6F6F6B757006147363726F6C6C + 6261727269676874627574746F6E00000754427574746F6E00095374796C654E + 616D650609746F70627574746F6E05416C69676E0703546F70064C6F636B6564 + 090A53697A652E57696474680500000000000000C804400B53697A652E486569 + 67687405000000000000008003401453697A652E506C6174666F726D44656661 + 756C74080B5374796C654C6F6F6B757006127363726F6C6C626172746F706275 + 74746F6E00000754427574746F6E00095374796C654E616D65060C626F74746F + 6D627574746F6E05416C69676E0706426F74746F6D064C6F636B6564090A506F + 736974696F6E2E5905000000000000008804400A53697A652E57696474680500 + 000000000000C804400B53697A652E4865696768740500000000000000800340 + 1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B + 757006157363726F6C6C626172626F74746F6D627574746F6E00000654547261 + 636B00095374796C654E616D65060668747261636B05416C69676E0706436C69 + 656E74064C6F636B6564090B4F7269656E746174696F6E070A486F72697A6F6E + 74616C0A53697A652E576964746805000000000000009003400B53697A652E48 + 656967687405000000000000009003401453697A652E506C6174666F726D4465 + 6661756C74080B5374796C654C6F6F6B757006147363726F6C6C626172687472 + 61636B7374796C6500000654547261636B00095374796C654E616D6506067674 + 7261636B05416C69676E0706436C69656E74064C6F636B6564090B4F7269656E + 746174696F6E070A486F72697A6F6E74616C0A53697A652E5769647468050000 + 00000000009003400B53697A652E486569676874050000000000000090034014 + 53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75 + 7006147363726F6C6C62617276747261636B7374796C65000000545046300754 + 4C61796F757400095374796C654E616D6506194D656D6F31536D616C6C536372 + 6F6C6C4261725374796C65310756697369626C6508085461624F726465720208 + 000654547261636B00095374796C654E616D65060668747261636B05416C6967 + 6E0706436C69656E74064C6F636B6564090B4F7269656E746174696F6E070A48 + 6F72697A6F6E74616C0A53697A652E57696474680500000000000000C804400B + 53697A652E4865696768740500000000000000C804401453697A652E506C6174 + 666F726D44656661756C74080B5374796C654C6F6F6B757006147363726F6C6C + 62617268747261636B7374796C6500000654547261636B00095374796C654E61 + 6D65060676747261636B05416C69676E0706436C69656E74064C6F636B656409 + 0B4F7269656E746174696F6E070A486F72697A6F6E74616C0A53697A652E5769 + 6474680500000000000000C804400B53697A652E486569676874050000000000 + 0000C804401453697A652E506C6174666F726D44656661756C74080B5374796C + 654C6F6F6B757006147363726F6C6C62617276747261636B7374796C65000000 + 5450463007544C61796F757400095374796C654E616D65060E4C6162656C4C69 + 6E6B5374796C6506437572736F72070B637248616E64506F696E740748697454 + 657374090A506F736974696F6E2E580500000000000000C806400A506F736974 + 696F6E2E590500000000000000A807400A53697A652E57696474680500000000 + 000000FD08400B53697A652E4865696768740500000000000000900340145369 + 7A652E506C6174666F726D44656661756C74080756697369626C650808546162 + 4F7264657202090005545465787400095374796C654E616D6506047465787405 + 416C69676E0706436C69656E7406437572736F72070B637248616E64506F696E + 74064C6F636B6564090A53697A652E57696474680500000000000000FD08400B + 53697A652E48656967687405000000000000009003401453697A652E506C6174 + 666F726D44656661756C7408175465787453657474696E67732E466F6E742E53 + 74796C650B0B6673556E6465726C696E6500165465787453657474696E67732E + 466F6E74436F6C6F720707636C61426C75650000005450463007544C61796F75 + 7400095374796C654E616D65060F4C6162656C4572726F725374796C650A506F + 736974696F6E2E5805000000000000C08A08400A506F736974696F6E2E590500 + 000000000000A007400756697369626C6508085461624F72646572020A000554 + 5465787400095374796C654E616D6506047465787405416C69676E0706436C69 + 656E74165465787453657474696E67732E466F6E74436F6C6F720706636C6152 + 65640000005450463007544C61796F757400095374796C654E616D65060F4C61 + 62656C477265656E5374796C650A506F736974696F6E2E580500000000000000 + 9C08400A506F736974696F6E2E590500000000000000A00740085461624F7264 + 6572020B0005545465787400095374796C654E616D6506047465787405416C69 + 676E0706436C69656E7406437572736F72070B637248616E64506F696E741754 + 65787453657474696E67732E466F6E742E5374796C650B0B6673556E6465726C + 696E6500165465787453657474696E67732E466F6E74436F6C6F72070C636C61 + 4461726B677265656E000000545046300A5452656374616E676C650009537479 + 6C654E616D65060C50616E656C345374796C65310A46696C6C2E436F6C6F7207 + 097846464634463446340748697454657374080A506F736974696F6E2E580500 + 0000000000008308400A506F736974696F6E2E590500000000000000A207400A + 53697A652E57696474680500000000000080B507400B53697A652E4865696768 + 740500000000000000A404401453697A652E506C6174666F726D44656661756C + 74080B5374726F6B652E4B696E6407044E6F6E650756697369626C65080000} + end> + Left = 280 + Top = 204 + end + end + end + object StatusBar1: TStatusBar + Padding.Left = 4.000000000000000000 + Padding.Top = 2.000000000000000000 + Padding.Right = 2.000000000000000000 + Padding.Bottom = 2.000000000000000000 + Position.Y = 458.000000000000000000 + ShowSizeGrip = True + Size.Width = 612.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + object Label1: TLabel + Align = Client + HitTest = True + Size.Width = 606.000000000000000000 + Size.Height = 18.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'LabelNormalStyle' + TextSettings.Trimming = None + Text = 'Idle' + OnClick = Label1Click + end + end + object OpenDialog1: TOpenDialog + Filter = 'JSON Files|*.json|All Files|*.*' + Left = 304 + Top = 224 + end + object ActionList1: TActionList + OnUpdate = ActionList1Update + Left = 440 + Top = 144 + object actBSON: TAction + Category = 'Convert' + AutoCheck = True + Text = 'Bson' + Checked = True + OnExecute = EmptyExecute + end + object actOpen: TAction + Category = 'File' + Text = '&Open' + ShortCut = 16463 + OnExecute = actOpenExecute + end + object actSaveAs: TAction + Category = 'File' + Text = '&Save As..' + OnExecute = actSaveAsExecute + end + object actExit: TAction + Category = 'File' + Text = '&Exit' + OnExecute = actExitExecute + end + object actDelphiUnit: TAction + Category = 'Convert' + AutoCheck = True + Text = 'Delphi Unit' + Checked = True + OnExecute = EmptyExecute + end + object actOnlineValidation: TAction + Category = 'View' + Text = 'Online validation' + OnExecute = actOnlineValidationExecute + end + object actSettings: TAction + Category = 'View' + Text = 'Settings' + OnExecute = actSettingsExecute + end + object actDemoData: TAction + Category = 'View' + AutoCheck = True + Text = 'Demo Data' + OnExecute = actDemoDataExecute + end + object actClassVisualizer: TAction + Category = 'View' + AutoCheck = True + Text = 'Class Visualizer' + OnExecute = actClassVisualizerExecute + end + object actMinifyJson: TAction + Category = 'Convert' + AutoCheck = True + Text = 'Minify Json' + Checked = True + OnExecute = EmptyExecute + end + object actConvert: TAction + Text = 'Convert >>' + OnExecute = actConvertExecute + end + object actDemoProject: TAction + Category = 'Convert' + AutoCheck = True + Text = 'Demo project' + OnExecute = EmptyExecute + end + end +end diff --git a/Generator GUI/MainFormU.pas b/Generator GUI/MainFormU.pas new file mode 100644 index 0000000..4b08771 --- /dev/null +++ b/Generator GUI/MainFormU.pas @@ -0,0 +1,414 @@ +unit MainFormU; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Threading, System.Actions, + + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TabControl, FMX.Menus, FMX.ActnList, FMX.Memo.Types, FMX.Objects, FMX.Controls.Presentation, + FMX.ScrollBox, FMX.Memo, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.StdCtrls, FMX.ListView, FMX.Layouts, FMX.TreeView, FMX.Edit, + + Pkg.Json.Mapper, DTO.GitHUB.ReleaseDTO, Pkg.Json.OutputFormat; + +type + TMainForm = class(TForm) + MenuBar1: TMenuBar; + ActionList1: TActionList; + actOpen: TAction; + actSaveAs: TAction; + actExit: TAction; + MenuItem1: TMenuItem; + MenuItem2: TMenuItem; + MenuItem3: TMenuItem; + MenuItem4: TMenuItem; + TabControl1: TTabControl; + TabItemJSON: TTabItem; + MenuItemView: TMenuItem; + actDelphiUnit: TAction; + actOnlineValidation: TAction; + MenuItem5: TMenuItem; + MemoJSON: TMemo; + actSettings: TAction; + MenuItem6: TMenuItem; + actDemoData: TAction; + ListView1: TListView; + Splitter1: TSplitter; + MenuItem7: TMenuItem; + MenuItem8: TMenuItem; + actClassVisualizer: TAction; + TreeView: TTreeView; + Panel3: TPanel; + Panel4: TPanel; + Label5: TLabel; + EditUnitName: TEdit; + Label2: TLabel; + EditClassName: TEdit; + Splitter2: TSplitter; + actBSON: TAction; + Formats: TMenuItem; + Button1: TButton; + MenuItem9: TMenuItem; + MenuItem10: TMenuItem; + MenuItem11: TMenuItem; + actMinifyJson: TAction; + actConvert: TAction; + OpenDialog1: TOpenDialog; + actDemoProject: TAction; + MenuItem12: TMenuItem; + StatusBar1: TStatusBar; + Label1: TLabel; + sd: TSaveDialog; + StyleBook1: TStyleBook; + procedure actOpenExecute(Sender: TObject); + procedure actSaveAsExecute(Sender: TObject); + procedure actExitExecute(Sender: TObject); + procedure actOnlineValidationExecute(Sender: TObject); + procedure actSettingsExecute(Sender: TObject); + procedure actDemoDataExecute(Sender: TObject); + procedure ListView1Change(Sender: TObject); + procedure actClassVisualizerExecute(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure actConvertExecute(Sender: TObject); + procedure EmptyExecute(Sender: TObject); + procedure Label1Click(Sender: TObject); + procedure ActionList1Update(Action: TBasicAction; var Handled: Boolean); + procedure EditClassNameChange(Sender: TObject); + procedure MemoJSONExit(Sender: TObject); + private type + TValidationTypes = (vtUnchecked, vtValid, vtInvalid); + private + { Private declarations } + FCheckVersionResponse: TRelease; + FJsonMapper: TPkgJsonMapper; + FIsValid: TValidationTypes; + FJson: string; + procedure SetJSON(const Value: string); + public + { Public declarations } + property Json: string read FJson write SetJSON; + end; + +var + MainForm: TMainForm; + +implementation + +uses + System.IOUtils, System.Json, System.NetEncoding, Pkg.Json.Utils, + + FMX.DialogService, + + Pkg.Json.GeneratorGUI.SettingsForm, Pkg.Json.Components.Update, Pkg.Json.GeneratorGUI.UpdateForm, + Pkg.Json.ThreadingEx, Pkg.Json.Lib.JSONConverter, Pkg.Json.Visualizer, Pkg.Json.DemoGenerator; + +{$R *.fmx} + +const + DemoDataRoot = '../../../Demo Data/'; + +procedure TMainForm.actClassVisualizerExecute(Sender: TObject); +begin + TreeView.Visible := actClassVisualizer.Checked; + Splitter2.Visible := actClassVisualizer.Checked; + if not actClassVisualizer.Checked then + exit; + + FJsonMapper.DestinationUnitName := EditUnitName.Text; + FJsonMapper.Parse(MemoJSON.Text); + + JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); +end; + +procedure TMainForm.actConvertExecute(Sender: TObject); +var + Destination: string; +begin + FJson := MemoJSON.Text; + + while TabControl1.TabCount > 1 do + TabControl1.Delete(TabControl1.TabCount - 1); + + OutputFormatDict.Clear; + + if actBSON.Checked then + with TOutputFormat.Create(TabControl1, 'BJSON', TJSONConverter.Json2BsonString(FJson), 'bson') do + Execute; + + if actMinifyJson.Checked then + with TOutputFormat.Create(TabControl1, 'Minify Json', TJSONConverter.MinifyJson(FJson), 'json') do + Execute; + + if actDelphiUnit.Checked then + begin + FJsonMapper.DestinationClassName := EditClassName.Text; + FJsonMapper.DestinationUnitName := EditUnitName.Text; + FJsonMapper.Parse(FJson); + + with TOutputFormat.Create(TabControl1, 'Delphi Unit', FJsonMapper.GenerateUnit, 'pas') do + Execute; + end; + + if actDemoProject.Checked then + begin + if not SelectDirectory('Select a directory', Destination, Destination) then + exit; + + with TDemoGenerator.Create do + try + DestinationClassName := EditClassName.Text; + DestinationUnitName := EditUnitName.Text; + DestinationDirectory := Destination; + DestinationFrameWork := TDestinationFrameWork.dfBoth; + Json := MemoJSON.Text; + Execute; + finally + Free; + end; + + TDialogService.MessageDialog('Demo project sucessfull genereted. Do you want to open the destination folder?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbYes, 0, + procedure(const AResult: TModalResult) + begin + if AResult <> mrYes then + exit; + + ShellExecute(Destination); + end) + end; + + TabControl1.Last; +end; + +procedure TMainForm.actDemoDataExecute(Sender: TObject); +var + FileName: string; +begin + ListView1.Visible := actDemoData.Checked; + Splitter1.Visible := actDemoData.Checked; + + if not TDirectory.Exists(DemoDataRoot) then + exit; + + ListView1.BeginUpdate; + try + for FileName in TDirectory.GetFiles(DemoDataRoot, '*.json') do + ListView1.Items.Add.Text := TPath.GetFileName(FileName); + finally + ListView1.EndUpdate; + end; + + TTaskEx.QueueMainThread(50, + procedure + begin + ListView1.ItemIndex := 0; + ListView1.OnChange(nil); + end); +end; + +procedure TMainForm.actExitExecute(Sender: TObject); +begin + Close; +end; + +procedure TMainForm.ActionList1Update(Action: TBasicAction; var Handled: Boolean); +var + OutputFormat: TOutputFormat; +begin + if not OutputFormatDict.TryGetValue(TabControl1.ActiveTab, OutputFormat) then + OutputFormat := nil; + + actConvert.Enabled := FIsValid = vtValid; + actSaveAs.Enabled := (OutputFormat <> nil) and (actConvert.Enabled); +end; + +procedure TMainForm.MemoJSONExit(Sender: TObject); +begin + Json := MemoJSON.Text; +end; + +procedure TMainForm.SetJSON(const Value: string); +begin + if FJson = Value then + exit; + + FJson := Value; + + if FJsonMapper.IsValid(FJson) then + FIsValid := vtValid + else + begin + FIsValid := vtInvalid; + FJson := string.empty; + end; +end; + +procedure TMainForm.actOnlineValidationExecute(Sender: TObject); +const + JsonValidatorUrl = 'https://jsonformatter.curiousconcept.com/?data=%s&process=true'; +begin + ShellExecute(TNetEncoding.URL.Encode(Format(JsonValidatorUrl, [MinifyJson(MemoJSON.Text)]))); +end; + +procedure TMainForm.actOpenExecute(Sender: TObject); +begin + if not OpenDialog1.Execute then + exit; + + while TabControl1.TabCount > 1 do + TabControl1.Delete(TabControl1.TabCount - 1); + + MemoJSON.BeginUpdate; + Json := TFile.ReadAllText(OpenDialog1.FileName); + + MemoJSON.Lines.Text := PrettyPrint(FJson); + MemoJSON.EndUpdate; +end; + +procedure TMainForm.actSaveAsExecute(Sender: TObject); +var + Buffer: TStringList; + ResourceStream: TResourceStream; + OutputFormat: TOutputFormat; + FileExtention, Output: string; +begin + if not OutputFormatDict.TryGetValue(TabControl1.ActiveTab, OutputFormat) then + OutputFormat := nil; + + if OutputFormat = nil then + begin + FileExtention := 'json'; + Output := MemoJSON.Text; + end + else + begin + FileExtention := OutputFormat.FileExtention; + Output := OutputFormat.Output; + end; + + sd.FileName := EditUnitName.Text + '.' + FileExtention; + + if not sd.Execute then + exit; + + Buffer := TStringList.Create; + Buffer.Text := Output; + Buffer.SaveToFile(sd.FileName); + + try + if not SameText(FileExtention, 'pas') then + exit; + + ResourceStream := TResourceStream.Create(HInstance, 'JsonDTO', 'PAS'); + try + ResourceStream.Position := 0; + Buffer.LoadFromStream(ResourceStream); + Buffer.SaveToFile(ExtractFilePath(sd.FileName) + 'Pkg.Json.DTO.pas'); + finally + ResourceStream.Free; + end; + + finally + Buffer.Free; + end; +end; + +procedure TMainForm.actSettingsExecute(Sender: TObject); +begin + with TSettingsForm.Create(nil) do + try + ShowModal; + finally + Free; + end; +end; + +procedure TMainForm.EditClassNameChange(Sender: TObject); +begin + EditUnitName.Text := EditClassName.Text + 'U'; +end; + +procedure TMainForm.EmptyExecute(Sender: TObject); +begin + // +end; + +procedure TMainForm.FormCreate(Sender: TObject); +begin + FJsonMapper := TPkgJsonMapper.Create; + FJson := ''; + Caption := 'JsonToDelphiClass - ' + FormatFloat('#.0', ProgramVersion, TFormatSettings.Invariant) + ' | By Jens Borrisholt'; + + CheckForUpdate( + procedure(aRelease: TRelease; aErrorMessage: string) + begin + if aRelease <> nil then + FCheckVersionResponse := aRelease.Clone + else + FCheckVersionResponse := nil; + + if (aRelease = nil) and (aErrorMessage = '') then + begin + Label1.StyleLookup := 'LabelGreenStyle'; + Label1.Text := 'Your version ' + FormatFloat('#.0', ProgramVersion, TFormatSettings.Invariant) + ' is up to date! For more information about JsonToDelphiClass click here!'; + (Label1.FindStyleResource('text') as TText).OnClick := Label1Click; + end + else if aErrorMessage = '' then + begin + Label1.StyleLookup := 'LabelLinkStyle'; + Label1.Text := 'Version ' + aRelease.TagName + ' is available! Click here to download!'; + (Label1.FindStyleResource('text') as TText).OnClick := Label1Click; + Label1.HitTest := True; + end + else + begin + Label1.StyleLookup := 'LabelErrorStyle'; + Label1.Text := 'Error checking for new version: ' + aErrorMessage; + end; + end); +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(FJsonMapper); + FreeAndNil(FCheckVersionResponse); +end; + +procedure TMainForm.Label1Click(Sender: TObject); +begin + if FCheckVersionResponse = nil then + ShellExecute(ProgramUrl) + else + with TUpdateForm.Create(nil) do + try + NewRelease := FCheckVersionResponse; + ShowModal; + finally + Free; + end; +end; + +procedure TMainForm.ListView1Change(Sender: TObject); +var + Item: TListViewItem; +begin + Item := ListView1.Selected as TListViewItem; + if Item = nil then + begin + MemoJSON.Lines.Clear; + exit; + end; + + with TStringList.Create do + try + LoadFromFile(DemoDataRoot + Item.Text); + MemoJSON.Lines.Text := TJSONConverter.PrettyPrintJSON(Text); + finally + Free; + end; + + TreeView.Clear; + actClassVisualizer.Checked := False; + actClassVisualizer.Execute; +end; + +end. diff --git a/Generator GUI/Pkg.Json.GeneratorGUI.SettingsForm.fmx b/Generator GUI/Pkg.Json.GeneratorGUI.SettingsForm.fmx new file mode 100644 index 0000000..fe820cf --- /dev/null +++ b/Generator GUI/Pkg.Json.GeneratorGUI.SettingsForm.fmx @@ -0,0 +1,156 @@ +object SettingsForm: TSettingsForm + Left = 0 + Top = 0 + BorderStyle = ToolWindow + Caption = 'Settings' + ClientHeight = 180 + ClientWidth = 248 + Position = MainFormCenter + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + DesignerMasterStyle = 0 + object chbAddJsonPropertyAttributes: TCheckBox + Position.X = 8.000000000000000000 + Position.Y = 49.000000000000000000 + Size.Width = 233.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'Add JsonProperty Attributes' + end + object Label1: TLabel + StyledSettings = [Family, FontColor] + Position.X = 16.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 129.000000000000000000 + Size.Height = 33.000000000000000000 + Size.PlatformDefault = False + TextSettings.Font.Size = 20.000000000000000000 + TextSettings.Font.StyleExt = {00070000000000000004000000} + TextSettings.Trimming = None + Text = 'Settings' + TabOrder = 1 + end + object chbUsePascalCase: TCheckBox + Position.X = 8.000000000000000000 + Position.Y = 73.000000000000000000 + TabOrder = 3 + Text = 'Use Pascal Case' + end + object btnOk: TButton + ModalResult = 1 + Position.X = 160.000000000000000000 + Position.Y = 152.000000000000000000 + TabOrder = 4 + Text = '&Ok' + TextSettings.Trimming = None + end + object chbPostfixClassNames: TCheckBox + Position.X = 8.000000000000000000 + Position.Y = 98.000000000000000000 + Size.Width = 129.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + TabOrder = 5 + Text = 'Postfix Class Names' + end + object edPostFix: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 6 + Text = '67,67' + Position.X = 152.000000000000000000 + Position.Y = 96.000000000000000000 + Enabled = False + Size.Width = 73.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + end + object CheckBoxSuppressZeroDate: TCheckBox + Position.X = 8.000000000000000000 + Position.Y = 123.000000000000000000 + TabOrder = 2 + Text = 'Suppress Zero Date' + end + object PrototypeBindSource1: TPrototypeBindSource + AutoActivate = True + AutoPost = False + FieldDefs = < + item + Name = 'AddJsonPropertyAttributes' + FieldType = ftBoolean + Generator = 'Booleans' + end + item + Name = 'PostFixClassNames' + FieldType = ftBoolean + Generator = 'Booleans' + end + item + Name = 'PostFix' + Generator = 'Currency' + end + item + Name = 'UsePascalCase' + FieldType = ftBoolean + Generator = 'Booleans' + end + item + Name = 'SuppressZeroDate' + FieldType = ftBoolean + Generator = 'Booleans' + end> + ScopeMappings = <> + OnCreateAdapter = PrototypeBindSource1CreateAdapter + Left = 160 + Top = 24 + end + object BindingsList1: TBindingsList + Methods = <> + OutputConverters = <> + Left = 32 + Top = 13 + object LinkControlToField1: TLinkControlToField + Category = 'Quick Bindings' + DataSource = PrototypeBindSource1 + FieldName = 'AddJsonPropertyAttributes' + Control = chbAddJsonPropertyAttributes + Track = True + end + object LinkControlToField2: TLinkControlToField + Category = 'Quick Bindings' + DataSource = PrototypeBindSource1 + FieldName = 'UsePascalCase' + Control = chbUsePascalCase + Track = True + end + object LinkControlToField3: TLinkControlToField + Category = 'Quick Bindings' + DataSource = PrototypeBindSource1 + FieldName = 'PostFixClassNames' + Control = chbPostfixClassNames + Track = True + end + object LinkControlToField4: TLinkControlToField + Category = 'Quick Bindings' + DataSource = PrototypeBindSource1 + FieldName = 'PostFix' + Control = edPostFix + Track = False + end + object LinkPropertyToFieldEnabled: TLinkPropertyToField + Category = 'Quick Bindings' + DataSource = PrototypeBindSource1 + FieldName = 'PostFixClassNames' + Component = edPostFix + ComponentProperty = 'Enabled' + end + object LinkControlToField5: TLinkControlToField + Category = 'Quick Bindings' + DataSource = PrototypeBindSource1 + FieldName = 'SuppressZeroDate' + Control = CheckBoxSuppressZeroDate + Track = True + end + end +end diff --git a/Generator GUI/Pkg.Json.GeneratorGUI.SettingsForm.pas b/Generator GUI/Pkg.Json.GeneratorGUI.SettingsForm.pas new file mode 100644 index 0000000..22c538a --- /dev/null +++ b/Generator GUI/Pkg.Json.GeneratorGUI.SettingsForm.pas @@ -0,0 +1,48 @@ +unit Pkg.Json.GeneratorGUI.SettingsForm; + +interface + +uses + System.SysUtils, System.Types, System.Rtti, System.UITypes, System.Classes, System.Variants, System.Bindings.Outputs, + + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Edit, FMX.Bind.Editors, + + Data.Bind.Components, Data.Bind.ObjectScope, Data.Bind.GenData, Data.Bind.EngExt, FMX.Bind.DBEngExt, + + Pkg.Json.Settings; + +type + TSettingsForm = class(TForm) + chbAddJsonPropertyAttributes: TCheckBox; + Label1: TLabel; + chbUsePascalCase: TCheckBox; + btnOk: TButton; + chbPostfixClassNames: TCheckBox; + edPostFix: TEdit; + PrototypeBindSource1: TPrototypeBindSource; + BindingsList1: TBindingsList; + LinkControlToField1: TLinkControlToField; + LinkControlToField2: TLinkControlToField; + LinkControlToField3: TLinkControlToField; + LinkControlToField4: TLinkControlToField; + LinkPropertyToFieldEnabled: TLinkPropertyToField; + CheckBoxSuppressZeroDate: TCheckBox; + LinkControlToField5: TLinkControlToField; + procedure PrototypeBindSource1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter); + private + { Private declarations } + public + { Public declarations } + end; + +implementation + +{$R *.fmx} + +procedure TSettingsForm.PrototypeBindSource1CreateAdapter(Sender: TObject; var ABindSourceAdapter: TBindSourceAdapter); +begin + ABindSourceAdapter := TObjectBindSourceAdapter.Create(Self, TSettings.Instance, false); + ABindSourceAdapter.AutoPost := True; +end; + +end. diff --git a/Generator GUI/Pkg.Json.GeneratorGUI.UpdateForm.fmx b/Generator GUI/Pkg.Json.GeneratorGUI.UpdateForm.fmx new file mode 100644 index 0000000..6059be8 --- /dev/null +++ b/Generator GUI/Pkg.Json.GeneratorGUI.UpdateForm.fmx @@ -0,0 +1,190 @@ +object UpdateForm: TUpdateForm + Left = 0 + Top = 0 + BorderIcons = [biSystemMenu] + BorderStyle = Single + Caption = 'New Version Information' + ClientHeight = 332 + ClientWidth = 676 + Padding.Left = 10.000000000000000000 + Padding.Top = 10.000000000000000000 + Padding.Right = 10.000000000000000000 + Padding.Bottom = 10.000000000000000000 + StyleBook = StyleBook1 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + OnKeyDown = FormKeyDown + OnShow = FormShow + DesignerMasterStyle = 0 + object Panel1: TPanel + Align = Bottom + Position.X = 10.000000000000000000 + Position.Y = 297.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Panel1Style1' + TabOrder = 0 + object Button1: TButton + Align = Right + ModalResult = 2 + Position.X = 576.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'Close' + TextSettings.Trimming = None + end + end + object Panel2: TPanel + Align = Top + Margins.Bottom = 4.000000000000000000 + Position.X = 10.000000000000000000 + Position.Y = 10.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 127.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Panel1Style1' + TabOrder = 1 + object Label1: TLabel + Align = Top + Size.Width = 656.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Label1Style1' + TextSettings.Trimming = None + Text = 'Version:' + end + object lblVersion: TLabel + Align = Top + Position.Y = 17.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'lblVersion' + end + object Label3: TLabel + Align = Top + Margins.Top = 6.000000000000000000 + Position.Y = 40.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Label1Style1' + TextSettings.Trimming = None + Text = 'Release Page Link:' + end + object lblReleasesLink: TLabel + Align = Top + HitTest = True + Position.Y = 57.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Label4Style1' + TextSettings.Trimming = None + Text = 'Release Link' + OnClick = lblReleasesLinkClick + end + object Label6: TLabel + Align = Top + Margins.Top = 6.000000000000000000 + Position.Y = 80.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Label1Style1' + TextSettings.Trimming = None + Text = 'Direct Download Link:' + end + object lblDownloadLink: TLabel + Align = Top + HitTest = True + Margins.Bottom = 6.000000000000000000 + Position.Y = 97.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Label4Style1' + TextSettings.Trimming = None + Text = 'Download Link' + OnClick = lblReleasesLinkClick + end + end + object Panel3: TPanel + Align = Client + Margins.Bottom = 4.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 152.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Panel1Style1' + TabOrder = 2 + object Label5: TLabel + Align = Top + Margins.Bottom = 4.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Label1Style1' + TextSettings.Trimming = None + Text = 'Description:' + end + object Memo1: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + ReadOnly = True + Align = Client + Margins.Bottom = 4.000000000000000000 + Size.Width = 656.000000000000000000 + Size.Height = 127.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Viewport.Width = 652.000000000000000000 + Viewport.Height = 123.000000000000000000 + end + end + object StyleBook1: TStyleBook + Styles = < + item + ResourcesBin = { + 464D585F5354594C4520322E3501060C50616E656C315374796C653103E10006 + 0C4C6162656C345374796C6531038601060C4C6162656C315374796C65310371 + 0100545046300A5452656374616E676C6500095374796C654E616D65060C5061 + 6E656C315374796C65310A46696C6C2E436F6C6F720709784646463446344634 + 0748697454657374080A506F736974696F6E2E5805000000000000009A07400A + 506F736974696F6E2E590500000000000000A507400553696465730B000A5369 + 7A652E576964746805000000000000008908400B53697A652E48656967687405 + 00000000000000F003401453697A652E506C6174666F726D44656661756C7408 + 0C5374726F6B652E436F6C6F7207097846463937393739370756697369626C65 + 0800005450463007544C61796F757400095374796C654E616D65060C4C616265 + 6C345374796C653106437572736F72070B637248616E64506F696E7407486974 + 54657374090A506F736974696F6E2E5805000000000000009A07400A506F7369 + 74696F6E2E590500000000000000A807400A53697A652E576964746805000000 + 000000008908400B53697A652E48656967687405000000000000008803401453 + 697A652E506C6174666F726D44656661756C74080756697369626C6508085461 + 624F7264657202010005545465787400095374796C654E616D65060474657874 + 05416C69676E0706436C69656E74064C6F636B6564090A53697A652E57696474 + 6805000000000000008908400B53697A652E4865696768740500000000000000 + 8803401453697A652E506C6174666F726D44656661756C74081A546578745365 + 7474696E67732E466F6E742E5374796C654578740A0D00000004040000000000 + 000004000000165465787453657474696E67732E466F6E74436F6C6F72070763 + 6C61426C75650000005450463007544C61796F757400095374796C654E616D65 + 060C4C6162656C315374796C653106437572736F72070B637248616E64506F69 + 6E740748697454657374090A506F736974696F6E2E5805000000000000009407 + 400A506F736974696F6E2E590500000000000000A807400A53697A652E576964 + 746805000000000000C08E08400B53697A652E48656967687405000000000000 + 008803401453697A652E506C6174666F726D44656661756C7408085461624F72 + 64657202020005545465787400095374796C654E616D6506047465787405416C + 69676E0706436C69656E7406437572736F72070B637248616E64506F696E7406 + 4C6F636B6564090A53697A652E576964746805000000000000C08E08400B5369 + 7A652E48656967687405000000000000008803401453697A652E506C6174666F + 726D44656661756C74081A5465787453657474696E67732E466F6E742E537479 + 6C654578740A0D00000000070000000000000004000000000000} + end> + Left = 512 + Top = 40 + end +end diff --git a/Generator GUI/Pkg.Json.GeneratorGUI.UpdateForm.pas b/Generator GUI/Pkg.Json.GeneratorGUI.UpdateForm.pas new file mode 100644 index 0000000..cca7f85 --- /dev/null +++ b/Generator GUI/Pkg.Json.GeneratorGUI.UpdateForm.pas @@ -0,0 +1,68 @@ +unit Pkg.Json.GeneratorGUI.UpdateForm; + +interface + +uses + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, + FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Layouts, FMX.Memo, FMX.Objects, FMX.Memo.Types, FMX.ScrollBox, FMX.Controls.Presentation, + + DTO.GitHUB.ReleaseDTO; + +type + TUpdateForm = class(TForm) + Memo1: TMemo; + Panel1: TPanel; + Button1: TButton; + Panel2: TPanel; + Label1: TLabel; + lblVersion: TLabel; + Label3: TLabel; + lblReleasesLink: TLabel; + Label5: TLabel; + Panel3: TPanel; + StyleBook1: TStyleBook; + Label6: TLabel; + lblDownloadLink: TLabel; + procedure FormShow(Sender: TObject); + procedure lblReleasesLinkClick(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); + private + FRelease: TRelease; + { Private declarations } + public + { Public declarations } + property NewRelease: TRelease read FRelease write FRelease; + end; + +implementation + +uses + System.UIConsts, Pkg.Json.Utils; + +{$R *.fmx} + +procedure TUpdateForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); +begin + if Key = 27 then + ModalResult := mrCancel; +end; + +procedure TUpdateForm.FormShow(Sender: TObject); +begin + lblVersion.Text := FRelease.TagName; + lblReleasesLink.Text := FRelease.HtmlUrl; + + lblDownloadLink.Text := FRelease.AssetsUrl; + + Memo1.Text := FRelease.Body; + (lblReleasesLink.FindStyleResource('text') as TText).OnClick := lblReleasesLinkClick; + (lblDownloadLink.FindStyleResource('text') as TText).OnClick := lblReleasesLinkClick; +end; + +procedure TUpdateForm.lblReleasesLinkClick(Sender: TObject); +begin + ShellExecute((Sender as TText).Text); + ModalResult := mrOk; +end; + +end. diff --git a/Generator GUI/Test/JsonToDelphiClassTests.dpr b/Generator GUI/Test/JsonToDelphiClassTests.dpr new file mode 100644 index 0000000..09fcd1b --- /dev/null +++ b/Generator GUI/Test/JsonToDelphiClassTests.dpr @@ -0,0 +1,25 @@ +program JsonToDelphiClassTests; +{ + + Delphi DUnit Test Project + ------------------------- + This project contains the DUnit test framework and the GUI/Console test runners. + Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options + to use the console test runner. Otherwise the GUI test runner will be used by + default. + +} + +{$IFDEF CONSOLE_TESTRUNNER} +{$APPTYPE CONSOLE} +{$ENDIF} + +uses + DUnitTestRunner; + +{$R *.RES} + +begin + DUnitTestRunner.RunRegisteredTests; +end. + diff --git a/Generator GUI/Test/JsonToDelphiClassTests.dproj b/Generator GUI/Test/JsonToDelphiClassTests.dproj new file mode 100644 index 0000000..74624aa --- /dev/null +++ b/Generator GUI/Test/JsonToDelphiClassTests.dproj @@ -0,0 +1,121 @@ + + + {A67BDFF2-134E-452C-9DE4-A58F042739D8} + 19.0 + None + True + Debug + Win32 + 1 + Console + JsonToDelphiClassTests.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + . + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\Source\DUnit\src;$(DCC_UnitSearchPath) + _CONSOLE_TESTRUNNER;$(DCC_Define) + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + JsonToDelphiClassTests.dpr + + + + True + False + + + + DUnit / Delphi Win32 + GUI + C:\Users\Jens Borrisholt\Documents\GitHUB\Delphi-JsonToDelphiClass\Generator GUI\JsonToDelphiClass.dproj + + + 12 + + + + diff --git a/Generator LIB/GeneratorLIB.dpr b/Generator LIB/GeneratorLIB.dpr new file mode 100644 index 0000000..615516b --- /dev/null +++ b/Generator LIB/GeneratorLIB.dpr @@ -0,0 +1,31 @@ +library GeneratorLIB; + +uses + System.SysUtils, System.Classes, System.IOUtils, + + Pkg.Json.Mapper, Pkg.Json.Settings; + +{$R *.res} + + +function GenerateUnit(Settings: WideString; Json: WideString; out SouceFile: WideString): WordBool; stdcall; +begin + TSettings.Instance.AsJson := string(Settings); + + with TPkgJsonMapper.Create do + try + DestinationClassName := 'Root'; + DestinationUnitName := 'Root.pas'; + Parse(string(Json)); + SouceFile := GenerateUnit; + finally + Free; + end; + + Result := True; +end; + +exports + GenerateUnit; + +end. diff --git a/Generator LIB/GeneratorLIB.dproj b/Generator LIB/GeneratorLIB.dproj new file mode 100644 index 0000000..c0b2bcc --- /dev/null +++ b/Generator LIB/GeneratorLIB.dproj @@ -0,0 +1,1110 @@ + + + {3EAD353C-07A3-4B1B-B44A-1D428E53F619} + 20.1 + None + True + Release + Win32 + 3 + Library + GeneratorLIB.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + GeneratorLIB + ..\Lib\;$(DCC_UnitSearchPath) + 1030 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + dxPSdxSpreadSheetLnkRS28;vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;dxHttpIndyRequestRS28;appanalytics;IndyProtocols;vclx;dxTileControlRS28;cxExportRS28;IndyIPClient;dbxcds;vcledge;cxLibraryRS28;dxCloudServiceLibraryRS28;bindcompvclwinx;cxPivotGridOLAPRS28;FmxTeeUI;dxGanttControlRS28;dxRichEditDocumentModelRS28;dxPScxPivotGridLnkRS28;dxGDIPlusRS28;dxPScxVGridLnkRS28;dxPSdxDBOCLnkRS28;emsedge;bindcompfmx;dxPSdxMapControlLnkRS28;DBXFirebirdDriver;dxCoreRS28;cxPivotGridRS28;dxPSPrVwRibbonRS28;dxPSdxPDFViewerLnkRS28;inetdb;cxGridEMFRS28;dxSpreadSheetCoreRS28;cxSchedulerTreeBrowserRS28;dxPSCoreRS28;FireDACSqliteDriver;DbxClientDriver;dxSpreadSheetRS28;FireDACASADriver;dxTabbedMDIRS28;dxSkinsCoreRS28;Tee;soapmidas;dxBarRS28;vclactnband;TeeUI;dxADOServerModeRS28;fmxFireDAC;dbexpress;dxFireDACServerModeRS28;dxWizardControlRS28;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;dxServerModeRS28;dxPSdxLCLnkRS28;vcltouch;fmxase;cxTreeListRS28;dxBarDBNavRS28;dxdbtrRS28;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;dxPSLnksRS28;fmxdae;TeeDB;dxPScxCommonRS28;FireDACMSAccDriver;dxNavBarRS28;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;dxSpreadSheetReportDesignerRS28;DataSnapConnectors;dxFireDACEMFRS28;vcldsnap;DBXInterBaseDriver;dxComnRS28;FireDACMongoDBDriver;dxFlowChartDesignerRS28;IndySystem;dxSpreadSheetConditionalFormattingDialogsRS28;cxVerticalGridRS28;FireDACTDataDriver;dxOrgChartAdvancedCustomizeFormRS28;vcldb;dxDBXServerModeRS28;cxSchedulerRS28;dxPSDBTeeChartRS28;dxRibbonRS28;dxmdsRS28;dxRichEditControlRS28;cxSchedulerGridRS28;dxPScxSchedulerLnkRS28;dxFlowChartLayoutsRS28;dxPScxExtCommonRS28;dxPSdxOCLnkRS28;dxPsPrVwAdvRS28;dxdborRS28;vclFireDAC;dxRichEditControlCoreRS28;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;dxADOEMFRS28;dxRibbonCustomizationFormRS28;IndyCore;RESTBackendComponents;dxPSdxDBTVLnkRS28;dxPScxGridLnkRS28;cxPivotGridChartRS28;dxBarExtDBItemsRS28;bindcompdbx;dxGaugeControlRS28;dxRichEditCoreRS28;cxTreeListdxBarPopupMenuRS28;rtl;FireDACMySQLDriver;dxDockingRS28;dxPDFViewerRS28;FireDACADSDriver;dxFlowChartAdvancedCustomizeFormRS28;RESTComponents;dxPSTeeChartRS28;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;dxBarExtItemsRS28;cxSchedulerWebServiceStorageRS28;DBXSybaseASEDriver;dxtrmdRS28;dxorgcRS28;dxSpreadSheetCoreConditionalFormattingDialogsRS28;DBXDb2Driver;dxPSdxFCLnkRS28;dxPSdxGaugeControlLnkRS28;dxPSRichEditControlLnkRS28;dxSpellCheckerRS28;cxGridRS28;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;dxMapControlRS28;bindcompvcl;dsnap;dxEMFRS28;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;cxSchedulerRibbonStyleEventEditorRS28;dxPScxTLLnkRS28;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;dxFlowChartRS28;dxPScxPCProdRS28;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + (None) + + + dxPSdxSpreadSheetLnkRS28;vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;dxHttpIndyRequestRS28;appanalytics;IndyProtocols;vclx;dxTileControlRS28;cxExportRS28;IndyIPClient;dbxcds;vcledge;cxLibraryRS28;dxCloudServiceLibraryRS28;bindcompvclwinx;cxPivotGridOLAPRS28;FmxTeeUI;dxGanttControlRS28;dxRichEditDocumentModelRS28;dxPScxPivotGridLnkRS28;dxGDIPlusRS28;dxPScxVGridLnkRS28;dxPSdxDBOCLnkRS28;emsedge;bindcompfmx;dxPSdxMapControlLnkRS28;DBXFirebirdDriver;dxCoreRS28;cxPivotGridRS28;dxPSPrVwRibbonRS28;dxPSdxPDFViewerLnkRS28;inetdb;cxGridEMFRS28;dxSpreadSheetCoreRS28;cxSchedulerTreeBrowserRS28;dxPSCoreRS28;FireDACSqliteDriver;DbxClientDriver;dxSpreadSheetRS28;FireDACASADriver;dxTabbedMDIRS28;dxSkinsCoreRS28;Tee;soapmidas;dxBarRS28;vclactnband;TeeUI;dxADOServerModeRS28;fmxFireDAC;dbexpress;dxFireDACServerModeRS28;dxWizardControlRS28;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;dxServerModeRS28;dxPSdxLCLnkRS28;vcltouch;fmxase;cxTreeListRS28;dxBarDBNavRS28;dxdbtrRS28;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;dxPSLnksRS28;fmxdae;TeeDB;dxPScxCommonRS28;FireDACMSAccDriver;dxNavBarRS28;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;dxSpreadSheetReportDesignerRS28;DataSnapConnectors;dxFireDACEMFRS28;vcldsnap;DBXInterBaseDriver;dxComnRS28;FireDACMongoDBDriver;dxFlowChartDesignerRS28;IndySystem;dxSpreadSheetConditionalFormattingDialogsRS28;cxVerticalGridRS28;FireDACTDataDriver;dxOrgChartAdvancedCustomizeFormRS28;vcldb;dxDBXServerModeRS28;cxSchedulerRS28;dxPSDBTeeChartRS28;dxRibbonRS28;dxmdsRS28;dxRichEditControlRS28;cxSchedulerGridRS28;dxPScxSchedulerLnkRS28;dxFlowChartLayoutsRS28;dxPScxExtCommonRS28;dxPSdxOCLnkRS28;dxPsPrVwAdvRS28;dxdborRS28;vclFireDAC;dxRichEditControlCoreRS28;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;dxADOEMFRS28;dxRibbonCustomizationFormRS28;IndyCore;RESTBackendComponents;dxPSdxDBTVLnkRS28;dxPScxGridLnkRS28;cxPivotGridChartRS28;dxBarExtDBItemsRS28;bindcompdbx;dxGaugeControlRS28;dxRichEditCoreRS28;cxTreeListdxBarPopupMenuRS28;rtl;FireDACMySQLDriver;dxDockingRS28;dxPDFViewerRS28;FireDACADSDriver;dxFlowChartAdvancedCustomizeFormRS28;RESTComponents;dxPSTeeChartRS28;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;dxBarExtItemsRS28;cxSchedulerWebServiceStorageRS28;DBXSybaseASEDriver;dxtrmdRS28;dxorgcRS28;dxSpreadSheetCoreConditionalFormattingDialogsRS28;DBXDb2Driver;dxPSdxFCLnkRS28;dxPSdxGaugeControlLnkRS28;dxPSRichEditControlLnkRS28;dxSpellCheckerRS28;cxGridRS28;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;dxMapControlRS28;bindcompvcl;dsnap;dxEMFRS28;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;cxSchedulerRibbonStyleEventEditorRS28;dxPScxTLLnkRS28;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;dxFlowChartRS28;dxPScxPCProdRS28;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + true + 1033 + (None) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + 1033 + + + + MainSource + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + + + + Delphi.Personality.12 + Application + + + + GeneratorLIB.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + + + true + + + + + true + + + + + true + + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 64 + + + classes + 64 + + + + + res\xml + 1 + + + res\xml + 1 + + + + + library\lib\armeabi + 1 + + + library\lib\armeabi + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\mips + 1 + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset + 1 + + + + + + + + + + + + + + + + + True + True + + + 12 + + + + + diff --git a/Json2Delphi/.vs/Json2Delphi/DesignTimeBuild/.dtbcache.v2 b/Json2Delphi/.vs/Json2Delphi/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000..db7b02a Binary files /dev/null and b/Json2Delphi/.vs/Json2Delphi/DesignTimeBuild/.dtbcache.v2 differ diff --git a/Json2Delphi/.vs/Json2Delphi/config/applicationhost.config b/Json2Delphi/.vs/Json2Delphi/config/applicationhost.config new file mode 100644 index 0000000..ab6634f --- /dev/null +++ b/Json2Delphi/.vs/Json2Delphi/config/applicationhost.config @@ -0,0 +1,995 @@ + + + + + + +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Json2Delphi/.vs/Json2Delphi/project-colors.json b/Json2Delphi/.vs/Json2Delphi/project-colors.json new file mode 100644 index 0000000..03dcc3a --- /dev/null +++ b/Json2Delphi/.vs/Json2Delphi/project-colors.json @@ -0,0 +1,16 @@ +{ + "Version": 1, + "ProjectMap": { + "6351c67d-b667-4a45-875c-7529f386365b": { + "ProjectGuid": "6351c67d-b667-4a45-875c-7529f386365b", + "DisplayName": "Json2Delphi.Web", + "ColorIndex": 0 + }, + "a2fe74e1-b743-11d0-ae1a-00a0c90fffc3": { + "ProjectGuid": "a2fe74e1-b743-11d0-ae1a-00a0c90fffc3", + "DisplayName": "Miscellaneous Files", + "ColorIndex": -1 + } + }, + "NextColorIndex": 1 +} \ No newline at end of file diff --git a/Json2Delphi/.vs/Json2Delphi/v17/.futdcache.v1 b/Json2Delphi/.vs/Json2Delphi/v17/.futdcache.v1 new file mode 100644 index 0000000..65b68d1 Binary files /dev/null and b/Json2Delphi/.vs/Json2Delphi/v17/.futdcache.v1 differ diff --git a/Json2Delphi/.vs/Json2Delphi/v17/TestStore/0/000.testlog b/Json2Delphi/.vs/Json2Delphi/v17/TestStore/0/000.testlog new file mode 100644 index 0000000..4d245a0 Binary files /dev/null and b/Json2Delphi/.vs/Json2Delphi/v17/TestStore/0/000.testlog differ diff --git a/Json2Delphi/.vs/Json2Delphi/v17/TestStore/0/testlog.manifest b/Json2Delphi/.vs/Json2Delphi/v17/TestStore/0/testlog.manifest new file mode 100644 index 0000000..e92ede2 Binary files /dev/null and b/Json2Delphi/.vs/Json2Delphi/v17/TestStore/0/testlog.manifest differ diff --git a/Json2Delphi/Json2Delphi.Web/.config/dotnet-tools.json b/Json2Delphi/Json2Delphi.Web/.config/dotnet-tools.json new file mode 100644 index 0000000..4cbf740 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "5.0.10", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Controllers/ConvertController.cs b/Json2Delphi/Json2Delphi.Web/Controllers/ConvertController.cs new file mode 100644 index 0000000..f3e475f --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Controllers/ConvertController.cs @@ -0,0 +1,97 @@ +using Json2Delphi.Web.Extensions; +using Json2Delphi.Web.Models; +using Microsoft.AspNetCore.Mvc; +using MimeKit; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace Json2Delphi.Web.Controllers +{ + public class ConvertController : Controller + { + private static bool TryIsValidJson(string strInput, out string errorMessage) + { + errorMessage = string.Empty; + if (string.IsNullOrWhiteSpace(strInput)) + { + errorMessage = "JSON input can not be empty"; + return false; + } + strInput = strInput.Trim(); + if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object + (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array + { + try + { + var obj = JToken.Parse(strInput); + return true; + } + catch (JsonReaderException jex) + { + //Exception in parsing json + errorMessage = jex.Message; + return false; + } + catch (Exception ex) //some other exception + { + errorMessage = ex.ToString(); + return false; + } + } + else + { + errorMessage = "JSON must start with \"{ or [\" and end with \"] or ]\" "; + return false; + } + } + + + [HttpGet] + [Route("~/")] + public IActionResult Index() => View(new MainViewModel()); + + [DllImport("GeneratorLIB.dll", CharSet = CharSet.Unicode)] + private static extern bool GenerateUnit( + [MarshalAs(UnmanagedType.BStr)] string Settings, + [MarshalAs(UnmanagedType.BStr)] string JSON, + [MarshalAs(UnmanagedType.BStr)] out string errstr + ); + + [HttpPost] + [Route("Convert/Delphi")] + public IActionResult ConvertDelphi([FromForm] MainViewModel model) + { + var settings = JsonConvert.SerializeObject(new Settings(model)); + var json = model.SourceText; + var delphiUnit = string.Empty; + + if (TryIsValidJson(json, out delphiUnit)) + try + { + GenerateUnit(settings, json, out delphiUnit); + } + catch (System.Exception e) + { + delphiUnit = $"Exception: { e.GetType().Name}.{Environment.NewLine} Message {e.Message} "; + } + + + model.ResultText = delphiUnit; + ViewData.SetResultText(model.ResultText); + return View("Index", model); + } + + [HttpGet] + [Route("Convert/DownloadDTO")] + public ActionResult DownloadDTO() + { + var attachment = "Pkg.Json.DTO.pas"; + var path = Path.Combine(Directory.GetCurrentDirectory(), attachment); + var fileBytes = System.IO.File.ReadAllBytes(path); + return File(fileBytes, "application/x-msdownload", attachment); + } + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Extensions/ViewDataDictionaryExtensions.cs b/Json2Delphi/Json2Delphi.Web/Extensions/ViewDataDictionaryExtensions.cs new file mode 100644 index 0000000..a584e2e --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Extensions/ViewDataDictionaryExtensions.cs @@ -0,0 +1,38 @@ +using Microsoft.AspNetCore.Mvc.ViewFeatures; + +namespace Json2Delphi.Web.Extensions +{ + public static class ViewDataDictionaryExtensions + { + private const string _titleIdent = "Title"; + private const string _resultTextIdent = "ResultText"; + + private static void SetIdent(ViewDataDictionary viewData, string ident, object value) + { + if (viewData is null) + return; + viewData[ident] = value; + } + + private static T GetIdent(ViewDataDictionary viewData, string ident) + { + if (viewData is null || viewData[ident] is null) + return default; + return (T)viewData[ident]; + } + + public static void SetTitle(this ViewDataDictionary viewData, string title) + { + SetIdent(viewData, _titleIdent, title); + } + + public static string GetTitle(this ViewDataDictionary viewData) => GetIdent(viewData, _titleIdent); + + public static void SetResultText(this ViewDataDictionary viewData, string resultText) + { + SetIdent(viewData, _resultTextIdent, resultText); + } + + public static string GetResultText(this ViewDataDictionary viewData) => GetIdent(viewData, _resultTextIdent); + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Interface/ISettings.cs b/Json2Delphi/Json2Delphi.Web/Interface/ISettings.cs new file mode 100644 index 0000000..05dcd6e --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Interface/ISettings.cs @@ -0,0 +1,11 @@ +namespace Json2Delphi.Web.Interface +{ + public interface ISettings + { + bool AddJsonPropertyAttributes { get; set; } + bool PostFixClassNames { get; set; } + string PostFix { get; set; } + bool UsePascalCase { get; set; } + public bool SuppressZeroDate { get; set; } + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Json2Delphi.Web.csproj b/Json2Delphi/Json2Delphi.Web/Json2Delphi.Web.csproj new file mode 100644 index 0000000..28d3ead --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Json2Delphi.Web.csproj @@ -0,0 +1,41 @@ + + + + net5.0-windows + AnyCPU;x86;x64 + x86 + + + + + Always + + + + + + + + + + + + + + + + + Always + + + + + + Always + + + Always + + + + diff --git a/Json2Delphi/Json2Delphi.Web/Models/MainViewModel.cs b/Json2Delphi/Json2Delphi.Web/Models/MainViewModel.cs new file mode 100644 index 0000000..94fdec1 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Models/MainViewModel.cs @@ -0,0 +1,15 @@ +using Json2Delphi.Web.Interface; + +namespace Json2Delphi.Web.Models +{ + public class MainViewModel : ISettings + { + public string SourceText { get; set; } = string.Empty; + public string ResultText { get; set; } = string.Empty; + public bool AddJsonPropertyAttributes { get; set; } = false; + public bool PostFixClassNames { get; set; } = false; + public string PostFix { get; set; } = string.Empty; + public bool UsePascalCase { get; set; } = true; + public bool SuppressZeroDate { get; set; } = true; + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Models/Settings.cs b/Json2Delphi/Json2Delphi.Web/Models/Settings.cs new file mode 100644 index 0000000..e2bb3bc --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Models/Settings.cs @@ -0,0 +1,24 @@ +using Json2Delphi.Web.Interface; + +namespace Json2Delphi.Web.Models +{ + public class Settings : ISettings + { + public Settings() { } + + public Settings(ISettings settings) + { + AddJsonPropertyAttributes = settings.AddJsonPropertyAttributes; + PostFixClassNames = settings.PostFixClassNames; + PostFix = settings.PostFix; + UsePascalCase = settings.UsePascalCase; + SuppressZeroDate = settings.SuppressZeroDate; + } + + public bool AddJsonPropertyAttributes { get; set; } + public bool PostFixClassNames { get; set; } + public string PostFix { get; set; } + public bool UsePascalCase { get; set; } + public bool SuppressZeroDate { get; set; } + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Pkg.Json.DTO.pas b/Json2Delphi/Json2Delphi.Web/Pkg.Json.DTO.pas new file mode 100644 index 0000000..f3c52da --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Pkg.Json.DTO.pas @@ -0,0 +1,289 @@ +unit Pkg.Json.DTO; + +interface + +uses System.Classes, System.Json, Rest.Json, System.Generics.Collections, Rest.JsonReflect; + +type + TArrayMapper = class + protected + procedure RefreshArray(aSource: TList; var aDestination: TArray); + function List(var aList: TList; aSource: TArray): TList; + function ObjectList(var aList: TObjectList; aSource: TArray): TObjectList; + public + constructor Create; virtual; + end; + + TJsonDTO = class(TArrayMapper) + private + FOptions: TJsonOptions; + class procedure PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); + class procedure PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer = 0); overload; + class procedure PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); + protected + function GetAsJson: string; virtual; + procedure SetAsJson(aValue: string); virtual; + public + constructor Create; override; + class function PrettyPrintJSON(aJson: string): string; overload; + function ToString: string; override; + property AsJson: string read GetAsJson write SetAsJson; + end; + + GenericListReflectAttribute = class(JsonReflectAttribute) + public + constructor Create; + end; + + SuppressZeroAttribute = class(JsonReflectAttribute) + public + constructor Create; + end; + +implementation + +uses System.Sysutils, System.JSONConsts, System.Rtti, System.DateUtils; + +{ TJsonDTO } + +constructor TJsonDTO.Create; +begin + inherited; + FOptions := [joDateIsUTC, joDateFormatISO8601]; +end; + +function TJsonDTO.GetAsJson: string; +begin + Result := TJson.ObjectToJsonString(Self, FOptions); +end; + +const + INDENT_SIZE = 2; + +class procedure TJsonDTO.PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer); +var + i: Integer; + Ident: Integer; +begin + Ident := Indent + INDENT_SIZE; + i := 0; + + if aJSONValue is TJSONObject then + begin + aOutputStrings.Add(StringOfChar(' ', Ident) + '{'); + for i := 0 to TJSONObject(aJSONValue).Count - 1 do + PrettyPrintPair(TJSONObject(aJSONValue).Pairs[i], aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident); + + aOutputStrings.Add(StringOfChar(' ', Ident) + '}'); + end + else if aJSONValue is TJSONArray then + PrettyPrintArray(TJSONArray(aJSONValue), aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident) + else + aOutputStrings.Add(StringOfChar(' ', Ident) + aJSONValue.ToString); +end; + +class procedure TJsonDTO.PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +var + i: Integer; +begin + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE) + '['); + + for i := 0 to aJSONValue.Count - 1 do + begin + PrettyPrintJSON(aJSONValue.Items[i], aOutputStrings, Indent); + if i < aJSONValue.Count - 1 then + aOutputStrings[aOutputStrings.Count - 1] := aOutputStrings[aOutputStrings.Count - 1] + ','; + end; + + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE - 2) + ']'); +end; + +class function TJsonDTO.PrettyPrintJSON(aJson: string): string; +var + StringList: TStringlist; + JSONValue: TJsonValue; +begin + StringList := TStringlist.Create; + try + JSONValue := TJSONObject.ParseJSONValue(aJson); + try + if JSONValue <> nil then + PrettyPrintJSON(JSONValue, StringList); + finally + JSONValue.Free; + end; + + Result := StringList.Text; + finally + StringList.Free; + end; +end; + +class procedure TJsonDTO.PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +const + TEMPLATE = '%s:%s'; +var + Line: string; + NewList: TStringlist; +begin + NewList := TStringlist.Create; + try + PrettyPrintJSON(aJSONValue.JSONValue, NewList, Indent); + Line := Format(TEMPLATE, [aJSONValue.JsonString.ToString, Trim(NewList.Text)]); + finally + NewList.Free; + end; + + Line := StringOfChar(' ', Indent + INDENT_SIZE) + Line; + if not Last then + Line := Line + ','; + aOutputStrings.Add(Line); +end; + +procedure TJsonDTO.SetAsJson(aValue: string); +var + JSONValue: TJsonValue; + JSONObject: TJSONObject; +begin + JSONValue := TJSONObject.ParseJSONValue(aValue); + try + if not Assigned(JSONValue) then + Exit; + + if (JSONValue is TJSONArray) then + begin + with TJSONUnMarshal.Create do + try + SetFieldArray(Self, 'Items', (JSONValue as TJSONArray)); + finally + Free; + end; + + Exit; + end; + + if (JSONValue is TJSONObject) then + JSONObject := JSONValue as TJSONObject + else + begin + aValue := aValue.Trim; + if (aValue = '') and not Assigned(JSONValue) or (aValue <> '') and Assigned(JSONValue) and JSONValue.Null then + Exit + else + raise EConversionError.Create(SCannotCreateObject); + end; + + TJson.JsonToObject(Self, JSONObject, FOptions); + finally + JSONValue.Free; + end; +end; + +function TJsonDTO.ToString: string; +begin + Result := AsJson; +end; + +{ TArrayMapper } + +constructor TArrayMapper.Create; +begin + inherited; +end; + +function TArrayMapper.List(var aList: TList; aSource: TArray): TList; +begin + if aList = nil then + begin + aList := TList.Create; + aList.AddRange(aSource); + end; + + Exit(aList); +end; + +function TArrayMapper.ObjectList(var aList: TObjectList; aSource: TArray): TObjectList; +var + Element: T; +begin + if aList = nil then + begin + aList := TObjectList.Create; + for Element in aSource do + aList.Add(Element); + end; + + Exit(aList); +end; + +procedure TArrayMapper.RefreshArray(aSource: TList; var aDestination: TArray); +begin + if aSource <> nil then + aDestination := aSource.ToArray; +end; + +type + TGenericListFieldInterceptor = class(TJSONInterceptor) + public + function ObjectsConverter(Data: TObject; Field: string): TListOfObjects; override; + end; + + { TListFieldInterceptor } + +function TGenericListFieldInterceptor.ObjectsConverter(Data: TObject; Field: string): TListOfObjects; +var + ctx: TRttiContext; + List: TList; + RttiProperty: TRttiProperty; +begin + RttiProperty := ctx.GetType(Data.ClassInfo).GetProperty(Copy(Field, 2, MAXINT)); + List := TList(RttiProperty.GetValue(Data).AsObject); + Result := TListOfObjects(List.List); + SetLength(Result, List.Count); +end; + +constructor GenericListReflectAttribute.Create; +begin + inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); +end; + +type + TSuppressZeroDateInterceptor = class(TJSONInterceptor) + public + function StringConverter(Data: TObject; Field: string): string; override; + procedure StringReverter(Data: TObject; Field: string; Arg: string); override; + end; + +function TSuppressZeroDateInterceptor.StringConverter(Data: TObject; Field: string): string; +var + RttiContext: TRttiContext; + Date: TDateTime; +begin + Date := RttiContext.GetType(Data.ClassType).GetField(Field).GetValue(Data).AsType; + if Date = 0 then + Result := string.Empty + else + Result := DateToISO8601(Date, True); +end; + +procedure TSuppressZeroDateInterceptor.StringReverter(Data: TObject; Field, Arg: string); +var + RttiContext: TRttiContext; + Date: TDateTime; +begin + if Arg.IsEmpty then + Date := 0 + else + Date := ISO8601ToDate(Arg, True); + + RttiContext.GetType(Data.ClassType).GetField(Field).SetValue(Data, Date); +end; + +{ SuppressZeroAttribute } + +constructor SuppressZeroAttribute.Create; +begin + inherited Create(ctString, rtString, TSuppressZeroDateInterceptor); +end; + +end. diff --git a/Json2Delphi/Json2Delphi.Web/Program.cs b/Json2Delphi/Json2Delphi.Web/Program.cs new file mode 100644 index 0000000..3452a8f --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Program.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace Json2Delphi.Web +{ + public class Program + { + public static void Main(string[] args) { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Properties/PublishProfiles/IISProfile.pubxml b/Json2Delphi/Json2Delphi.Web/Properties/PublishProfiles/IISProfile.pubxml new file mode 100644 index 0000000..bdaaf40 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Properties/PublishProfiles/IISProfile.pubxml @@ -0,0 +1,28 @@ + + + + + MSDeploy + True + Release + x86 + + False + 6351c67d-b667-4a45-875c-7529f386365b + true + nt5.unoeuro.com + json2delphi.com + + False + WMSVC + True + True + json2delphi.com + <_SavePWD>True + net5.0-windows + win-x86 + + \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Properties/launchSettings.json b/Json2Delphi/Json2Delphi.Web/Properties/launchSettings.json new file mode 100644 index 0000000..a681c26 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:1352", + "sslPort": 44300 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Json2Delphi.Web": { + "commandName": "Project", + "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Startup.cs b/Json2Delphi/Json2Delphi.Web/Startup.cs new file mode 100644 index 0000000..b6526ac --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Startup.cs @@ -0,0 +1,40 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace Json2Delphi.Web +{ + public class Startup + { + public Startup(IConfiguration configuration) => Configuration = configuration; + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) { + services.AddRazorPages(); + services.AddControllersWithViews(); + services.AddWebOptimizer(pipeline => { + pipeline.AddCssBundle("/lib/highlight/highlight-bundle.css", "lib/highlight/default.css"); + pipeline.AddCssBundle("/css/json2delphi-bundle.css", "css/_globals.css", "css/json2delphi.css"); + pipeline.AddJavaScriptBundle("/js/json2delphi-bundle.js", "js/json2delphi.js"); + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); + + app.UseWebOptimizer(); + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseRouting(); + app.UseEndpoints(endpoints => { + endpoints.MapRazorPages(); + endpoints.MapControllers(); + }); + } + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Views/Convert/Index.cshtml b/Json2Delphi/Json2Delphi.Web/Views/Convert/Index.cshtml new file mode 100644 index 0000000..194bf32 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Views/Convert/Index.cshtml @@ -0,0 +1,97 @@ +@model Json2Delphi.Web.Models.MainViewModel + +
+
+
+ +
+ +
+
+ +
+
+
JSON source code
+
+ +
+
+
+ +
+
+
Delphi source code
+
+
+
+
+
+ +
+
+ +
+ +
+
Settings
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+

Download base class

+

Pkg.Json.DTO is the base class for all generated files

+
+ + +
+
+ + +
+
+
+
+
+
+ +@section viewScripts { + + +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Views/Shared/_Layout.cshtml b/Json2Delphi/Json2Delphi.Web/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..13c295d --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Views/Shared/_Layout.cshtml @@ -0,0 +1,34 @@ +@{ + ViewData.SetTitle("Json to Delphi"); +} + + + + + + + + @ViewData.GetTitle() + + + + + + + + + + +
+ @RenderBody() +
+ + + + + @await RenderSectionAsync("viewScripts") + + + \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Views/Shared/_ValidationScriptsPartial.cshtml b/Json2Delphi/Json2Delphi.Web/Views/Shared/_ValidationScriptsPartial.cshtml new file mode 100644 index 0000000..25afb33 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Views/Shared/_ValidationScriptsPartial.cshtml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/Views/_ViewImports.cshtml b/Json2Delphi/Json2Delphi.Web/Views/_ViewImports.cshtml new file mode 100644 index 0000000..cda9087 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Views/_ViewImports.cshtml @@ -0,0 +1,4 @@ +@addTagHelper *, WebOptimizer.Core +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@using Json2Delphi.Web +@using Json2Delphi.Web.Extensions diff --git a/Json2Delphi/Json2Delphi.Web/Views/_ViewStart.cshtml b/Json2Delphi/Json2Delphi.Web/Views/_ViewStart.cshtml new file mode 100644 index 0000000..906f995 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/appsettings.Development.json b/Json2Delphi/Json2Delphi.Web/appsettings.Development.json new file mode 100644 index 0000000..8e7e18a --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "https_port": 443, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/appsettings.json b/Json2Delphi/Json2Delphi.Web/appsettings.json new file mode 100644 index 0000000..aee184f --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/libman.json b/Json2Delphi/Json2Delphi.Web/libman.json new file mode 100644 index 0000000..ec9a73f --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/libman.json @@ -0,0 +1,10 @@ +{ + "version": "1.0", + "defaultProvider": "cdnjs", + "libraries": [ + { + "library": "bootstrap@4.6.0", + "destination": "wwwroot/lib/bootstrap/" + } + ] +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/css/_globals.css b/Json2Delphi/Json2Delphi.Web/wwwroot/css/_globals.css new file mode 100644 index 0000000..1232c7d --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/css/_globals.css @@ -0,0 +1,8 @@ +:root { + --titleHeight: 54px; + --formHeight: calc(100vh - var(--titleHeight)); + --settingsHeight: 230px; + --settingsPostfixIdent: 20px; + --sourceCodeHeight: calc(var(--formHeight) - var(--settingsHeight)); + --global-group-spacing: 5px; +} \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/css/json2delphi.css b/Json2Delphi/Json2Delphi.Web/wwwroot/css/json2delphi.css new file mode 100644 index 0000000..e00c30b --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/css/json2delphi.css @@ -0,0 +1,35 @@ +.json2delphi-title { + height: var(--titleHeight); + vertical-align: center; +} + +.json2delphi-form { + height: var(--formHeight); + padding: var(--global-group-spacing); +} + +.json2delphi-group { padding: var(--global-group-spacing); } + +.json2delphi-sourcecode { height: var(--sourceCodeHeight); } + +.json2delphi-sourcecode textarea { + height: 100%; + resize: none; + width: 100%; +} + +.json2delphi-sourcecode .result-text { + border: 1px solid black; + display: inline-block; + height: 100%; + overflow: auto; + padding: 1px; + white-space: pre-wrap; + width: 100%; +} + +.json2delphi-settings { } + +.json2delphi-settings .postfix-classnames { padding-left: var(--settingsPostfixIdent); } + +.json2delphi-settings .postfix-classnames input { width: 100%; } \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/favicon.ico b/Json2Delphi/Json2Delphi.Web/wwwroot/favicon.ico new file mode 100644 index 0000000..a3a7999 Binary files /dev/null and b/Json2Delphi/Json2Delphi.Web/wwwroot/favicon.ico differ diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/js/json2delphi.js b/Json2Delphi/Json2Delphi.Web/wwwroot/js/json2delphi.js new file mode 100644 index 0000000..34d58f7 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/js/json2delphi.js @@ -0,0 +1,23 @@ +$(document).ready(function () { + $("#highlight").html(delphiHighlighter.getHtml($("#resultText").val(), false, false, 9)); +}); + +function CopyToClipboard() { + var valueToCopy = resultText.getValue(); + + function listener(e) { + e.clipboardData.setData("text/html", valueToCopy); + e.clipboardData.setData("text/plain", valueToCopy); + e.preventDefault(); + } + document.addEventListener("copy", listener); + document.execCommand("copy"); + document.removeEventListener("copy", listener); + + + var temp = $("#copy-to-clipboard-btn").html(); + $("#copy-to-clipboard-btn").text("Copied !"); + setTimeout(function () { + $("#copy-to-clipboard-btn").html(temp); + }, 1500); +}; \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-grid.css b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-grid.css new file mode 100644 index 0000000..468530f --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-grid.css @@ -0,0 +1,3872 @@ +/*! + * Bootstrap Grid v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +html { + box-sizing: border-box; + -ms-overflow-style: scrollbar; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +.container, +.container-fluid, +.container-sm, +.container-md, +.container-lg, +.container-xl { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container, .container-sm { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container, .container-sm, .container-md { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container, .container-sm, .container-md, .container-lg { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container, .container-sm, .container-md, .container-lg, .container-xl { + max-width: 1140px; + } +} + +.row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.row-cols-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.row-cols-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.row-cols-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.row-cols-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.row-cols-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; +} + +.row-cols-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-sm-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-sm-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-sm-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-sm-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-sm-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-sm-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + -ms-flex-order: -1; + order: -1; + } + .order-sm-last { + -ms-flex-order: 13; + order: 13; + } + .order-sm-0 { + -ms-flex-order: 0; + order: 0; + } + .order-sm-1 { + -ms-flex-order: 1; + order: 1; + } + .order-sm-2 { + -ms-flex-order: 2; + order: 2; + } + .order-sm-3 { + -ms-flex-order: 3; + order: 3; + } + .order-sm-4 { + -ms-flex-order: 4; + order: 4; + } + .order-sm-5 { + -ms-flex-order: 5; + order: 5; + } + .order-sm-6 { + -ms-flex-order: 6; + order: 6; + } + .order-sm-7 { + -ms-flex-order: 7; + order: 7; + } + .order-sm-8 { + -ms-flex-order: 8; + order: 8; + } + .order-sm-9 { + -ms-flex-order: 9; + order: 9; + } + .order-sm-10 { + -ms-flex-order: 10; + order: 10; + } + .order-sm-11 { + -ms-flex-order: 11; + order: 11; + } + .order-sm-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-md-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-md-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-md-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-md-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-md-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-md-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + -ms-flex-order: -1; + order: -1; + } + .order-md-last { + -ms-flex-order: 13; + order: 13; + } + .order-md-0 { + -ms-flex-order: 0; + order: 0; + } + .order-md-1 { + -ms-flex-order: 1; + order: 1; + } + .order-md-2 { + -ms-flex-order: 2; + order: 2; + } + .order-md-3 { + -ms-flex-order: 3; + order: 3; + } + .order-md-4 { + -ms-flex-order: 4; + order: 4; + } + .order-md-5 { + -ms-flex-order: 5; + order: 5; + } + .order-md-6 { + -ms-flex-order: 6; + order: 6; + } + .order-md-7 { + -ms-flex-order: 7; + order: 7; + } + .order-md-8 { + -ms-flex-order: 8; + order: 8; + } + .order-md-9 { + -ms-flex-order: 9; + order: 9; + } + .order-md-10 { + -ms-flex-order: 10; + order: 10; + } + .order-md-11 { + -ms-flex-order: 11; + order: 11; + } + .order-md-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-lg-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-lg-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-lg-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-lg-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-lg-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-lg-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + -ms-flex-order: -1; + order: -1; + } + .order-lg-last { + -ms-flex-order: 13; + order: 13; + } + .order-lg-0 { + -ms-flex-order: 0; + order: 0; + } + .order-lg-1 { + -ms-flex-order: 1; + order: 1; + } + .order-lg-2 { + -ms-flex-order: 2; + order: 2; + } + .order-lg-3 { + -ms-flex-order: 3; + order: 3; + } + .order-lg-4 { + -ms-flex-order: 4; + order: 4; + } + .order-lg-5 { + -ms-flex-order: 5; + order: 5; + } + .order-lg-6 { + -ms-flex-order: 6; + order: 6; + } + .order-lg-7 { + -ms-flex-order: 7; + order: 7; + } + .order-lg-8 { + -ms-flex-order: 8; + order: 8; + } + .order-lg-9 { + -ms-flex-order: 9; + order: 9; + } + .order-lg-10 { + -ms-flex-order: 10; + order: 10; + } + .order-lg-11 { + -ms-flex-order: 11; + order: 11; + } + .order-lg-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-xl-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-xl-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-xl-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-xl-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-xl-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-xl-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + -ms-flex-order: -1; + order: -1; + } + .order-xl-last { + -ms-flex-order: 13; + order: 13; + } + .order-xl-0 { + -ms-flex-order: 0; + order: 0; + } + .order-xl-1 { + -ms-flex-order: 1; + order: 1; + } + .order-xl-2 { + -ms-flex-order: 2; + order: 2; + } + .order-xl-3 { + -ms-flex-order: 3; + order: 3; + } + .order-xl-4 { + -ms-flex-order: 4; + order: 4; + } + .order-xl-5 { + -ms-flex-order: 5; + order: 5; + } + .order-xl-6 { + -ms-flex-order: 6; + order: 6; + } + .order-xl-7 { + -ms-flex-order: 7; + order: 7; + } + .order-xl-8 { + -ms-flex-order: 8; + order: 8; + } + .order-xl-9 { + -ms-flex-order: 9; + order: 9; + } + .order-xl-10 { + -ms-flex-order: 10; + order: 10; + } + .order-xl-11 { + -ms-flex-order: 11; + order: 11; + } + .order-xl-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-print-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} + +.flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} + +.flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} + +.justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + .m-sm-n1 { + margin: -0.25rem !important; + } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; + } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; + } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; + } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; + } + .m-sm-n2 { + margin: -0.5rem !important; + } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; + } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; + } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; + } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; + } + .m-sm-n3 { + margin: -1rem !important; + } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; + } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; + } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; + } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; + } + .m-sm-n4 { + margin: -1.5rem !important; + } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; + } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; + } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; + } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; + } + .m-sm-n5 { + margin: -3rem !important; + } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; + } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; + } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; + } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + .p-md-0 { + padding: 0 !important; + } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + .m-md-n1 { + margin: -0.25rem !important; + } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; + } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; + } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; + } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; + } + .m-md-n2 { + margin: -0.5rem !important; + } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; + } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; + } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; + } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; + } + .m-md-n3 { + margin: -1rem !important; + } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; + } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; + } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; + } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; + } + .m-md-n4 { + margin: -1.5rem !important; + } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; + } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; + } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; + } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; + } + .m-md-n5 { + margin: -3rem !important; + } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; + } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; + } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; + } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + .m-lg-n1 { + margin: -0.25rem !important; + } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; + } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; + } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; + } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; + } + .m-lg-n2 { + margin: -0.5rem !important; + } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; + } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; + } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; + } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; + } + .m-lg-n3 { + margin: -1rem !important; + } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; + } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; + } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; + } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; + } + .m-lg-n4 { + margin: -1.5rem !important; + } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; + } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; + } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; + } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; + } + .m-lg-n5 { + margin: -3rem !important; + } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; + } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; + } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; + } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + .m-xl-n1 { + margin: -0.25rem !important; + } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; + } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; + } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; + } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; + } + .m-xl-n2 { + margin: -0.5rem !important; + } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; + } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; + } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; + } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; + } + .m-xl-n3 { + margin: -1rem !important; + } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; + } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; + } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; + } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; + } + .m-xl-n4 { + margin: -1.5rem !important; + } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; + } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; + } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; + } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; + } + .m-xl-n5 { + margin: -3rem !important; + } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; + } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; + } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; + } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} +/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-grid.min.css b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-grid.min.css new file mode 100644 index 0000000..f0a3258 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-grid.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap Grid v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}} +/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-reboot.css b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-reboot.css new file mode 100644 index 0000000..6041496 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-reboot.css @@ -0,0 +1,325 @@ +/*! + * Bootstrap Reboot v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +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: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([class]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +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, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +[role="button"] { + cursor: pointer; +} + +select { + word-wrap: normal; +} + +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; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} +/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-reboot.min.css b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-reboot.min.css new file mode 100644 index 0000000..83c70bb --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap-reboot.min.css @@ -0,0 +1,8 @@ +/*! + * Bootstrap Reboot v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} +/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap.css b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap.css new file mode 100644 index 0000000..2282e0a --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap.css @@ -0,0 +1,10298 @@ +/*! + * Bootstrap v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #007bff; + --secondary: #6c757d; + --success: #28a745; + --info: #17a2b8; + --warning: #ffc107; + --danger: #dc3545; + --light: #f8f9fa; + --dark: #343a40; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +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: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([class]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + -ms-overflow-style: scrollbar; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +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, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +[role="button"] { + cursor: pointer; +} + +select { + word-wrap: normal; +} + +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; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} + +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; +} + +.blockquote-footer::before { + content: "\2014\00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #6c757d; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-wrap: break-word; +} + +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #212529; +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container, +.container-fluid, +.container-sm, +.container-md, +.container-lg, +.container-xl { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container, .container-sm { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container, .container-sm, .container-md { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container, .container-sm, .container-md, .container-lg { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container, .container-sm, .container-md, .container-lg, .container-xl { + max-width: 1140px; + } +} + +.row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.row-cols-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.row-cols-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.row-cols-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.row-cols-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.row-cols-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; +} + +.row-cols-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; +} + +.col-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; +} + +.col-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; +} + +.col-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; +} + +.col-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; +} + +.col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.333333%; +} + +.offset-2 { + margin-left: 16.666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.333333%; +} + +.offset-5 { + margin-left: 41.666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.333333%; +} + +.offset-8 { + margin-left: 66.666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.333333%; +} + +.offset-11 { + margin-left: 91.666667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-sm-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-sm-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-sm-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-sm-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-sm-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-sm-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + -ms-flex-order: -1; + order: -1; + } + .order-sm-last { + -ms-flex-order: 13; + order: 13; + } + .order-sm-0 { + -ms-flex-order: 0; + order: 0; + } + .order-sm-1 { + -ms-flex-order: 1; + order: 1; + } + .order-sm-2 { + -ms-flex-order: 2; + order: 2; + } + .order-sm-3 { + -ms-flex-order: 3; + order: 3; + } + .order-sm-4 { + -ms-flex-order: 4; + order: 4; + } + .order-sm-5 { + -ms-flex-order: 5; + order: 5; + } + .order-sm-6 { + -ms-flex-order: 6; + order: 6; + } + .order-sm-7 { + -ms-flex-order: 7; + order: 7; + } + .order-sm-8 { + -ms-flex-order: 8; + order: 8; + } + .order-sm-9 { + -ms-flex-order: 9; + order: 9; + } + .order-sm-10 { + -ms-flex-order: 10; + order: 10; + } + .order-sm-11 { + -ms-flex-order: 11; + order: 11; + } + .order-sm-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-md-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-md-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-md-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-md-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-md-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-md-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + -ms-flex-order: -1; + order: -1; + } + .order-md-last { + -ms-flex-order: 13; + order: 13; + } + .order-md-0 { + -ms-flex-order: 0; + order: 0; + } + .order-md-1 { + -ms-flex-order: 1; + order: 1; + } + .order-md-2 { + -ms-flex-order: 2; + order: 2; + } + .order-md-3 { + -ms-flex-order: 3; + order: 3; + } + .order-md-4 { + -ms-flex-order: 4; + order: 4; + } + .order-md-5 { + -ms-flex-order: 5; + order: 5; + } + .order-md-6 { + -ms-flex-order: 6; + order: 6; + } + .order-md-7 { + -ms-flex-order: 7; + order: 7; + } + .order-md-8 { + -ms-flex-order: 8; + order: 8; + } + .order-md-9 { + -ms-flex-order: 9; + order: 9; + } + .order-md-10 { + -ms-flex-order: 10; + order: 10; + } + .order-md-11 { + -ms-flex-order: 11; + order: 11; + } + .order-md-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-lg-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-lg-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-lg-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-lg-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-lg-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-lg-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + -ms-flex-order: -1; + order: -1; + } + .order-lg-last { + -ms-flex-order: 13; + order: 13; + } + .order-lg-0 { + -ms-flex-order: 0; + order: 0; + } + .order-lg-1 { + -ms-flex-order: 1; + order: 1; + } + .order-lg-2 { + -ms-flex-order: 2; + order: 2; + } + .order-lg-3 { + -ms-flex-order: 3; + order: 3; + } + .order-lg-4 { + -ms-flex-order: 4; + order: 4; + } + .order-lg-5 { + -ms-flex-order: 5; + order: 5; + } + .order-lg-6 { + -ms-flex-order: 6; + order: 6; + } + .order-lg-7 { + -ms-flex-order: 7; + order: 7; + } + .order-lg-8 { + -ms-flex-order: 8; + order: 8; + } + .order-lg-9 { + -ms-flex-order: 9; + order: 9; + } + .order-lg-10 { + -ms-flex-order: 10; + order: 10; + } + .order-lg-11 { + -ms-flex-order: 11; + order: 11; + } + .order-lg-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .row-cols-xl-1 > * { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-xl-2 > * { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-xl-3 > * { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .row-cols-xl-4 > * { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-xl-5 > * { + -ms-flex: 0 0 20%; + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-xl-6 > * { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + -ms-flex: 0 0 8.333333%; + flex: 0 0 8.333333%; + max-width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 16.666667%; + flex: 0 0 16.666667%; + max-width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 33.333333%; + flex: 0 0 33.333333%; + max-width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 41.666667%; + flex: 0 0 41.666667%; + max-width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 58.333333%; + flex: 0 0 58.333333%; + max-width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 66.666667%; + flex: 0 0 66.666667%; + max-width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 83.333333%; + flex: 0 0 83.333333%; + max-width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 91.666667%; + flex: 0 0 91.666667%; + max-width: 91.666667%; + } + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + -ms-flex-order: -1; + order: -1; + } + .order-xl-last { + -ms-flex-order: 13; + order: 13; + } + .order-xl-0 { + -ms-flex-order: 0; + order: 0; + } + .order-xl-1 { + -ms-flex-order: 1; + order: 1; + } + .order-xl-2 { + -ms-flex-order: 2; + order: 2; + } + .order-xl-3 { + -ms-flex-order: 3; + order: 3; + } + .order-xl-4 { + -ms-flex-order: 4; + order: 4; + } + .order-xl-5 { + -ms-flex-order: 5; + order: 5; + } + .order-xl-6 { + -ms-flex-order: 6; + order: 6; + } + .order-xl-7 { + -ms-flex-order: 7; + order: 7; + } + .order-xl-8 { + -ms-flex-order: 8; + order: 8; + } + .order-xl-9 { + -ms-flex-order: 9; + order: 9; + } + .order-xl-10 { + -ms-flex-order: 10; + order: 10; + } + .order-xl-11 { + -ms-flex-order: 11; + order: 11; + } + .order-xl-12 { + -ms-flex-order: 12; + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } +} + +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529; +} + +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; +} + +.table tbody + tbody { + border-top: 2px solid #dee2e6; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #dee2e6; +} + +.table-bordered th, +.table-bordered td { + border: 1px solid #dee2e6; +} + +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + color: #212529; + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8daff; +} + +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7abaff; +} + +.table-hover .table-primary:hover { + background-color: #9fcdff; +} + +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #9fcdff; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #d6d8db; +} + +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #b3b7bb; +} + +.table-hover .table-secondary:hover { + background-color: #c8cbcf; +} + +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #c8cbcf; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c3e6cb; +} + +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; +} + +.table-hover .table-success:hover { + background-color: #b1dfbb; +} + +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #b1dfbb; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #bee5eb; +} + +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #86cfda; +} + +.table-hover .table-info:hover { + background-color: #abdde5; +} + +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #abdde5; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #ffeeba; +} + +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #ffdf7e; +} + +.table-hover .table-warning:hover { + background-color: #ffe8a1; +} + +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #ffe8a1; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5c6cb; +} + +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed969e; +} + +.table-hover .table-danger:hover { + background-color: #f1b0b7; +} + +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f1b0b7; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fdfdfe; +} + +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfc; +} + +.table-hover .table-light:hover { + background-color: #ececf6; +} + +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #ececf6; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #c6c8ca; +} + +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #95999c; +} + +.table-hover .table-dark:hover { + background-color: #b9bbbe; +} + +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #b9bbbe; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55; +} + +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.table-dark { + color: #fff; + background-color: #343a40; +} + +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #454d55; +} + +.table-dark.table-bordered { + border: 0; +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; +} + +.form-control:focus { + color: #495057; + background-color: #fff; + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.form-control::-webkit-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-moz-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::-ms-input-placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control::placeholder { + color: #6c757d; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #e9ecef; + opacity: 1; +} + +input[type="date"].form-control, +input[type="time"].form-control, +input[type="datetime-local"].form-control, +input[type="month"].form-control { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +select.form-control:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + font-size: 1rem; + line-height: 1.5; + color: #212529; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} + +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} + +.form-row > .col, +.form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} + +.form-check-input[disabled] ~ .form-check-label, +.form-check-input:disabled ~ .form-check-label { + color: #6c757d; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-align: center; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #28a745; +} + +.valid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(40, 167, 69, 0.9); + border-radius: 0.25rem; +} + +.form-row > .col > .valid-tooltip, +.form-row > [class*="col-"] > .valid-tooltip { + left: 5px; +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #28a745; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #28a745; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; +} + +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #28a745; +} + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #28a745; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34ce57; + background-color: #34ce57; +} + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #28a745; +} + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #28a745; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #dc3545; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + left: 0; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(220, 53, 69, 0.9); + border-radius: 0.25rem; +} + +.form-row > .col > .invalid-tooltip, +.form-row > [class*="col-"] > .invalid-tooltip { + left: 5px; +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #dc3545; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #dc3545; + padding-right: calc(0.75em + 2.3125rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem) no-repeat; +} + +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #dc3545; +} + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #dc3545; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #e4606d; + background-color: #e4606d; +} + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #dc3545; +} + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #dc3545; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); +} + +.form-inline { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; +} + +.form-inline .form-check { + width: 100%; +} + +@media (min-width: 576px) { + .form-inline label { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: -ms-flexbox; + display: flex; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -ms-flex-align: center; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + -ms-flex-negative: 0; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} + +.btn:hover { + color: #212529; + text-decoration: none; +} + +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: 0.65; +} + +.btn:not(:disabled):not(.disabled) { + cursor: pointer; +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; +} + +.btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #0062cc; + border-color: #005cbf; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); +} + +.btn-secondary { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:hover { + color: #fff; + background-color: #5a6268; + border-color: #545b62; +} + +.btn-secondary:focus, .btn-secondary.focus { + color: #fff; + background-color: #5a6268; + border-color: #545b62; + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #545b62; + border-color: #4e555b; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); +} + +.btn-success { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:hover { + color: #fff; + background-color: #218838; + border-color: #1e7e34; +} + +.btn-success:focus, .btn-success.focus { + color: #fff; + background-color: #218838; + border-color: #1e7e34; + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #1e7e34; + border-color: #1c7430; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); +} + +.btn-info { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:hover { + color: #fff; + background-color: #138496; + border-color: #117a8b; +} + +.btn-info:focus, .btn-info.focus { + color: #fff; + background-color: #138496; + border-color: #117a8b; + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #117a8b; + border-color: #10707f; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); +} + +.btn-warning { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:hover { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; +} + +.btn-warning:focus, .btn-warning.focus { + color: #212529; + background-color: #e0a800; + border-color: #d39e00; + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: #212529; + background-color: #d39e00; + border-color: #c69500; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); +} + +.btn-danger { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130; +} + +.btn-danger:focus, .btn-danger.focus { + color: #fff; + background-color: #c82333; + border-color: #bd2130; + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #bd2130; + border-color: #b21f2d; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); +} + +.btn-light { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:hover { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; +} + +.btn-light:focus, .btn-light.focus { + color: #212529; + background-color: #e2e6ea; + border-color: #dae0e5; + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: #212529; + background-color: #dae0e5; + border-color: #d3d9df; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); +} + +.btn-dark { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; +} + +.btn-dark:focus, .btn-dark.focus { + color: #fff; + background-color: #23272b; + border-color: #1d2124; + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #1d2124; + border-color: #171a1d; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); +} + +.btn-outline-primary { + color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #007bff; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.btn-outline-secondary { + color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #6c757d; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.btn-outline-success { + color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #28a745; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #28a745; + border-color: #28a745; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.btn-outline-info { + color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #17a2b8; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #17a2b8; + border-color: #17a2b8; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.btn-outline-warning { + color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:hover { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #ffc107; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: #212529; + background-color: #ffc107; + border-color: #ffc107; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.btn-outline-danger { + color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #dc3545; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #dc3545; + border-color: #dc3545; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.btn-outline-light { + color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:hover { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fa; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.btn-outline-dark { + color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #343a40; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #343a40; + border-color: #343a40; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.btn-link { + font-weight: 400; + color: #007bff; + text-decoration: none; +} + +.btn-link:hover { + color: #0056b3; + text-decoration: underline; +} + +.btn-link:focus, .btn-link.focus { + text-decoration: underline; +} + +.btn-link:disabled, .btn-link.disabled { + color: #6c757d; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} + +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 1rem; + color: #212529; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} + +.dropdown-menu-left { + right: auto; + left: 0; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} + +.dropleft .dropdown-toggle::after { + display: none; +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #e9ecef; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #212529; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} + +.dropdown-item:hover, .dropdown-item:focus { + color: #16181b; + text-decoration: none; + background-color: #e9ecef; +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #007bff; +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #6c757d; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #212529; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} + +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} + +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: center; + justify-content: center; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} + +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} + +.btn-group-toggle > .btn input[type="radio"], +.btn-group-toggle > .btn input[type="checkbox"], +.btn-group-toggle > .btn-group > .btn input[type="radio"], +.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; +} + +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + min-width: 0; + margin-bottom: 0; +} + +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} + +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} + +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} + +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group > .custom-file { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; +} + +.input-group > .custom-file:not(:last-child) .custom-file-label, +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group:not(.has-validation) > .form-control:not(:last-child), +.input-group:not(.has-validation) > .custom-select:not(:last-child), +.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group.has-validation > .form-control:nth-last-child(n + 3), +.input-group.has-validation > .custom-select:nth-last-child(n + 3), +.input-group.has-validation > .custom-file:nth-last-child(n + 3) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: -ms-flexbox; + display: flex; +} + +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} + +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} + +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + text-align: center; + white-space: nowrap; + background-color: #e9ecef; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.input-group-text input[type="radio"], +.input-group-text input[type="checkbox"] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn, +.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text, +.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .btn, +.input-group.has-validation > .input-group-append:nth-last-child(n + 3) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + z-index: 1; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; + -webkit-print-color-adjust: exact; + color-adjust: exact; +} + +.custom-control-inline { + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + left: 0; + z-index: -1; + width: 1rem; + height: 1.25rem; + opacity: 0; +} + +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #007bff; + background-color: #007bff; +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #80bdff; +} + +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #b3d7ff; + border-color: #b3d7ff; +} + +.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { + color: #6c757d; +} + +.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { + background-color: #e9ecef; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} + +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #adb5bd solid 1px; +} + +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: 50% / 50% 50% no-repeat; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.25rem; +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #007bff; + background-color: #007bff; +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} + +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} + +.custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #adb5bd; + border-radius: 0.5rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} + +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + -webkit-transform: translateX(0.75rem); + transform: translateX(0.75rem); +} + +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(0, 123, 255, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #495057; + vertical-align: middle; + background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat; + border: 1px solid #ced4da; + border-radius: 0.25rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #80bdff; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-select:focus::-ms-value { + color: #495057; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #6c757d; + background-color: #e9ecef; +} + +.custom-select::-ms-expand { + display: none; +} + +.custom-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #495057; +} + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + overflow: hidden; + opacity: 0; +} + +.custom-file-input:focus ~ .custom-file-label { + border-color: #80bdff; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-file-input[disabled] ~ .custom-file-label, +.custom-file-input:disabled ~ .custom-file-label { + background-color: #e9ecef; +} + +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} + +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + overflow: hidden; + font-weight: 400; + line-height: 1.5; + color: #495057; + background-color: #fff; + border: 1px solid #ced4da; + border-radius: 0.25rem; +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #495057; + content: "Browse"; + background-color: #e9ecef; + border-left: inherit; + border-radius: 0 0.25rem 0.25rem 0; +} + +.custom-range { + width: 100%; + height: 1.4rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-range:focus { + outline: 0; +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.custom-range::-moz-focus-outer { + border: 0; +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} + +.custom-range::-moz-range-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #007bff; + border: 0; + border-radius: 1rem; + -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + -ms-transition: none; + transition: none; + } +} + +.custom-range::-ms-thumb:active { + background-color: #b3d7ff; +} + +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} + +.custom-range::-ms-fill-lower { + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dee2e6; + border-radius: 1rem; +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} + +.custom-range:disabled::-moz-range-track { + cursor: default; +} + +.custom-range:disabled::-ms-thumb { + background-color: #adb5bd; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; + } +} + +.nav { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} + +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} + +.nav-link.disabled { + color: #6c757d; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dee2e6; +} + +.nav-tabs .nav-link { + margin-bottom: -1px; + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #e9ecef #e9ecef #dee2e6; +} + +.nav-tabs .nav-link.disabled { + color: #6c757d; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #495057; + background-color: #fff; + border-color: #dee2e6 #dee2e6 #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.25rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #007bff; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 0.5rem 1rem; +} + +.navbar .container, +.navbar .container-fluid, .navbar .container-sm, .navbar .container-md, .navbar .container-lg, .navbar .container-xl { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} + +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} + +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-align: center; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: 50% / 100% 100% no-repeat; +} + +.navbar-nav-scroll { + max-height: 75vh; + overflow-y: auto; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid, .navbar-expand-sm > .container-sm, .navbar-expand-sm > .container-md, .navbar-expand-sm > .container-lg, .navbar-expand-sm > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid, .navbar-expand-md > .container-sm, .navbar-expand-md > .container-md, .navbar-expand-md > .container-lg, .navbar-expand-md > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid, .navbar-expand-lg > .container-sm, .navbar-expand-lg > .container-md, .navbar-expand-lg > .container-lg, .navbar-expand-lg > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid, .navbar-expand-xl > .container-sm, .navbar-expand-xl > .container-md, .navbar-expand-xl > .container-lg, .navbar-expand-xl > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} + +.navbar-expand { + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { + padding-right: 0; + padding-left: 0; +} + +.navbar-expand .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid, .navbar-expand > .container-sm, .navbar-expand > .container-md, .navbar-expand > .container-lg, .navbar-expand > .container-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; +} + +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} + +.navbar-expand .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; +} + +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-text a { + color: #fff; +} + +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} + +.card > hr { + margin-right: 0; + margin-left: 0; +} + +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} + +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + min-height: 1px; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; + border-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-top, +.card-img-bottom { + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-deck .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-deck { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + margin-right: -15px; + margin-left: -15px; + } + .card-deck .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-right: 15px; + margin-bottom: 0; + margin-left: 15px; + } +} + +.card-group > .card { + margin-bottom: 15px; +} + +@media (min-width: 576px) { + .card-group { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion { + overflow-anchor: none; +} + +.accordion > .card { + overflow: hidden; +} + +.accordion > .card:not(:last-of-type) { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.accordion > .card:not(:first-of-type) { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.accordion > .card > .card-header { + border-radius: 0; + margin-bottom: -1px; +} + +.breadcrumb { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} + +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 0.5rem; + color: #6c757d; + content: "/"; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} + +.breadcrumb-item.active { + color: #6c757d; +} + +.pagination { + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6; +} + +.page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.page-link:focus { + z-index: 3; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .badge { + transition: none; + } +} + +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #fff; + background-color: #007bff; +} + +a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #0062cc; +} + +a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); +} + +.badge-secondary { + color: #fff; + background-color: #6c757d; +} + +a.badge-secondary:hover, a.badge-secondary:focus { + color: #fff; + background-color: #545b62; +} + +a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); +} + +.badge-success { + color: #fff; + background-color: #28a745; +} + +a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #1e7e34; +} + +a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); +} + +.badge-info { + color: #fff; + background-color: #17a2b8; +} + +a.badge-info:hover, a.badge-info:focus { + color: #fff; + background-color: #117a8b; +} + +a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); +} + +.badge-warning { + color: #212529; + background-color: #ffc107; +} + +a.badge-warning:hover, a.badge-warning:focus { + color: #212529; + background-color: #d39e00; +} + +a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); +} + +.badge-danger { + color: #fff; + background-color: #dc3545; +} + +a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #bd2130; +} + +a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); +} + +.badge-light { + color: #212529; + background-color: #f8f9fa; +} + +a.badge-light:hover, a.badge-light:focus { + color: #212529; + background-color: #dae0e5; +} + +a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); +} + +.badge-dark { + color: #fff; + background-color: #343a40; +} + +a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #1d2124; +} + +a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #004085; + background-color: #cce5ff; + border-color: #b8daff; +} + +.alert-primary hr { + border-top-color: #9fcdff; +} + +.alert-primary .alert-link { + color: #002752; +} + +.alert-secondary { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; +} + +.alert-secondary hr { + border-top-color: #c8cbcf; +} + +.alert-secondary .alert-link { + color: #202326; +} + +.alert-success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; +} + +.alert-success hr { + border-top-color: #b1dfbb; +} + +.alert-success .alert-link { + color: #0b2e13; +} + +.alert-info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; +} + +.alert-info hr { + border-top-color: #abdde5; +} + +.alert-info .alert-link { + color: #062c33; +} + +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; +} + +.alert-warning hr { + border-top-color: #ffe8a1; +} + +.alert-warning .alert-link { + color: #533f03; +} + +.alert-danger { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; +} + +.alert-danger hr { + border-top-color: #f1b0b7; +} + +.alert-danger .alert-link { + color: #491217; +} + +.alert-light { + color: #818182; + background-color: #fefefe; + border-color: #fdfdfe; +} + +.alert-light hr { + border-top-color: #ececf6; +} + +.alert-light .alert-link { + color: #686868; +} + +.alert-dark { + color: #1b1e21; + background-color: #d6d8d9; + border-color: #c6c8ca; +} + +.alert-dark hr { + border-top-color: #b9bbbe; +} + +.alert-dark .alert-link { + color: #040505; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + line-height: 0; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + transition: width 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.media { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; +} + +.media-body { + -ms-flex: 1; + flex: 1; +} + +.list-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} + +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} + +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} + +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.list-group-item + .list-group-item { + border-top-width: 0; +} + +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + -ms-flex-direction: row; + flex-direction: row; +} + +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} + +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} + +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} + +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} + +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} + +.list-group-flush { + border-radius: 0; +} + +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} + +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #004085; + background-color: #b8daff; +} + +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #004085; + background-color: #9fcdff; +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #004085; + border-color: #004085; +} + +.list-group-item-secondary { + color: #383d41; + background-color: #d6d8db; +} + +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #383d41; + background-color: #c8cbcf; +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #383d41; + border-color: #383d41; +} + +.list-group-item-success { + color: #155724; + background-color: #c3e6cb; +} + +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #155724; + background-color: #b1dfbb; +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #155724; + border-color: #155724; +} + +.list-group-item-info { + color: #0c5460; + background-color: #bee5eb; +} + +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #0c5460; + background-color: #abdde5; +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #0c5460; + border-color: #0c5460; +} + +.list-group-item-warning { + color: #856404; + background-color: #ffeeba; +} + +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #856404; + background-color: #ffe8a1; +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #856404; + border-color: #856404; +} + +.list-group-item-danger { + color: #721c24; + background-color: #f5c6cb; +} + +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #721c24; + background-color: #f1b0b7; +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #721c24; + border-color: #721c24; +} + +.list-group-item-light { + color: #818182; + background-color: #fdfdfe; +} + +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #818182; + background-color: #ececf6; +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818182; + border-color: #818182; +} + +.list-group-item-dark { + color: #1b1e21; + background-color: #c6c8ca; +} + +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #1b1e21; + background-color: #b9bbbe; +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1b1e21; + border-color: #1b1e21; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} + +.close:hover { + color: #000; + text-decoration: none; +} + +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + -ms-flex-preferred-size: 350px; + flex-basis: 350px; + max-width: 350px; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + opacity: 0; + border-radius: 0.25rem; +} + +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast.showing { + opacity: 1; +} + +.toast.show { + display: block; + opacity: 1; +} + +.toast.hide { + display: none; +} + +.toast-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.25rem 0.75rem; + color: #6c757d; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} + +.modal.fade .modal-dialog { + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px); +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} + +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none; +} + +.modal.modal-static .modal-dialog { + -webkit-transform: scale(1.02); + transform: scale(1.02); +} + +.modal-dialog-scrollable { + display: -ms-flexbox; + display: flex; + max-height: calc(100% - 1rem); +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; +} + +.modal-dialog-scrollable .modal-header, +.modal-dialog-scrollable .modal-footer { + -ms-flex-negative: 0; + flex-shrink: 0; +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; + content: ""; +} + +.modal-dialog-centered.modal-dialog-scrollable { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + height: 100%; +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none; +} + +.modal-content { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #dee2e6; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #dee2e6; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); +} + +.modal-footer > * { + margin: 0.25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); + } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); + } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + height: -webkit-min-content; + height: -moz-min-content; + height: min-content; + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 0.9; +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; +} + +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; +} + +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; +} + +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; +} + +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; +} + +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; +} + +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} + +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; +} + +.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc(-0.5rem - 1px); +} + +.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; +} + +.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; +} + +.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc(-0.5rem - 1px); +} + +.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; +} + +.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} + +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #212529; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + -ms-touch-action: pan-y; + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + -webkit-transform: none; + transform: none; +} + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} + +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: 50% / 100% 100% no-repeat; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators li { + box-sizing: content-box; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} + +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: .75s linear infinite spinner-border; + animation: .75s linear infinite spinner-border; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: .75s linear infinite spinner-grow; + animation: .75s linear infinite spinner-grow; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #007bff !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #0062cc !important; +} + +.bg-secondary { + background-color: #6c757d !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #545b62 !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #1e7e34 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #117a8b !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #d39e00 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #bd2130 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #dae0e5 !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #1d2124 !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-right { + border-right: 1px solid #dee2e6 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-left { + border-left: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #007bff !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.border-white { + border-color: #fff !important; +} + +.rounded-sm { + border-radius: 0.2rem !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-lg { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-print-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} + +.embed-responsive::before { + display: block; + content: ""; +} + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.857143%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} + +.flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} + +.flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} + +.justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .float-sm-none { + float: none !important; + } +} + +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .float-md-none { + float: none !important; + } +} + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .float-lg-none { + float: none !important; + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .float-xl-none { + float: none !important; + } +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + -ms-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + .m-sm-n1 { + margin: -0.25rem !important; + } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; + } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; + } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; + } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; + } + .m-sm-n2 { + margin: -0.5rem !important; + } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; + } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; + } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; + } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; + } + .m-sm-n3 { + margin: -1rem !important; + } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; + } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; + } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; + } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; + } + .m-sm-n4 { + margin: -1.5rem !important; + } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; + } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; + } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; + } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; + } + .m-sm-n5 { + margin: -3rem !important; + } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; + } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; + } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; + } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + .p-md-0 { + padding: 0 !important; + } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + .m-md-n1 { + margin: -0.25rem !important; + } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; + } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; + } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; + } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; + } + .m-md-n2 { + margin: -0.5rem !important; + } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; + } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; + } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; + } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; + } + .m-md-n3 { + margin: -1rem !important; + } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; + } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; + } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; + } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; + } + .m-md-n4 { + margin: -1.5rem !important; + } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; + } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; + } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; + } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; + } + .m-md-n5 { + margin: -3rem !important; + } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; + } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; + } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; + } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + .m-lg-n1 { + margin: -0.25rem !important; + } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; + } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; + } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; + } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; + } + .m-lg-n2 { + margin: -0.5rem !important; + } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; + } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; + } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; + } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; + } + .m-lg-n3 { + margin: -1rem !important; + } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; + } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; + } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; + } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; + } + .m-lg-n4 { + margin: -1.5rem !important; + } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; + } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; + } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; + } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; + } + .m-lg-n5 { + margin: -3rem !important; + } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; + } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; + } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; + } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + .m-xl-n1 { + margin: -0.25rem !important; + } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; + } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; + } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; + } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; + } + .m-xl-n2 { + margin: -0.5rem !important; + } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; + } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; + } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; + } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; + } + .m-xl-n3 { + margin: -1rem !important; + } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; + } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; + } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; + } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; + } + .m-xl-n4 { + margin: -1.5rem !important; + } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; + } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; + } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; + } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; + } + .m-xl-n5 { + margin: -3rem !important; + } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; + } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; + } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; + } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #fff !important; +} + +.text-primary { + color: #007bff !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #0056b3 !important; +} + +.text-secondary { + color: #6c757d !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #494f54 !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #19692c !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:hover, a.text-info:focus { + color: #0f6674 !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #ba8b00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #a71d2a !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:hover, a.text-light:focus { + color: #cbd3da !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #121416 !important; +} + +.text-body { + color: #212529 !important; +} + +.text-muted { + color: #6c757d !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-break { + word-break: break-word !important; + word-wrap: break-word !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; + } + a:not(.btn) { + text-decoration: underline; + } + abbr[title]::after { + content: " (" attr(title) ")"; + } + pre { + white-space: pre-wrap !important; + } + pre, + blockquote { + border: 1px solid #adb5bd; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + @page { + size: a3; + } + body { + min-width: 992px !important; + } + .container { + min-width: 992px !important; + } + .navbar { + display: none; + } + .badge { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #dee2e6 !important; + } + .table-dark { + color: inherit; + } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #dee2e6; + } + .table .thead-dark th { + color: inherit; + border-color: #dee2e6; + } +} +/*# sourceMappingURL=bootstrap.css.map */ \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap.min.css b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000..ef399d2 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-sm-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-md-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-lg-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.row-cols-xl-4>*{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{color:#fff;background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{color:#212529;background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{color:#212529;background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{color:#fff;background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label::after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label::after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before,.custom-control-input[disabled]~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;overflow:hidden;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{-ms-flex-preferred-size:350px;flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/js/bootstrap.bundle.js b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/js/bootstrap.bundle.js new file mode 100644 index 0000000..d5c1983 --- /dev/null +++ b/Json2Delphi/Json2Delphi.Web/wwwroot/lib/bootstrap/js/bootstrap.bundle.js @@ -0,0 +1,7045 @@ +/*! + * Bootstrap v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) : + typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.bootstrap = {}, global.jQuery)); +}(this, (function (exports, $) { 'use strict'; + + function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + + var $__default = /*#__PURE__*/_interopDefaultLegacy($); + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.6.0): util.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Private TransitionEnd Helpers + * ------------------------------------------------------------------------ + */ + + var TRANSITION_END = 'transitionend'; + var MAX_UID = 1000000; + var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) + + function toType(obj) { + if (obj === null || typeof obj === 'undefined') { + return "" + obj; + } + + return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); + } + + function getSpecialTransitionEndEvent() { + return { + bindType: TRANSITION_END, + delegateType: TRANSITION_END, + handle: function handle(event) { + if ($__default['default'](event.target).is(this)) { + return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params + } + + return undefined; + } + }; + } + + function transitionEndEmulator(duration) { + var _this = this; + + var called = false; + $__default['default'](this).one(Util.TRANSITION_END, function () { + called = true; + }); + setTimeout(function () { + if (!called) { + Util.triggerTransitionEnd(_this); + } + }, duration); + return this; + } + + function setTransitionEndSupport() { + $__default['default'].fn.emulateTransitionEnd = transitionEndEmulator; + $__default['default'].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); + } + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ + + + var Util = { + TRANSITION_END: 'bsTransitionEnd', + getUID: function getUID(prefix) { + do { + prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here + } while (document.getElementById(prefix)); + + return prefix; + }, + getSelectorFromElement: function getSelectorFromElement(element) { + var selector = element.getAttribute('data-target'); + + if (!selector || selector === '#') { + var hrefAttr = element.getAttribute('href'); + selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; + } + + try { + return document.querySelector(selector) ? selector : null; + } catch (_) { + return null; + } + }, + getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { + if (!element) { + return 0; + } // Get transition-duration of the element + + + var transitionDuration = $__default['default'](element).css('transition-duration'); + var transitionDelay = $__default['default'](element).css('transition-delay'); + var floatTransitionDuration = parseFloat(transitionDuration); + var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found + + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } // If multiple durations are defined, take the first + + + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }, + reflow: function reflow(element) { + return element.offsetHeight; + }, + triggerTransitionEnd: function triggerTransitionEnd(element) { + $__default['default'](element).trigger(TRANSITION_END); + }, + supportsTransitionEnd: function supportsTransitionEnd() { + return Boolean(TRANSITION_END); + }, + isElement: function isElement(obj) { + return (obj[0] || obj).nodeType; + }, + typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { + for (var property in configTypes) { + if (Object.prototype.hasOwnProperty.call(configTypes, property)) { + var expectedTypes = configTypes[property]; + var value = config[property]; + var valueType = value && Util.isElement(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); + } + } + } + }, + findShadowRoot: function findShadowRoot(element) { + if (!document.documentElement.attachShadow) { + return null; + } // Can find the shadow root otherwise it'll return the document + + + if (typeof element.getRootNode === 'function') { + var root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + + if (element instanceof ShadowRoot) { + return element; + } // when we don't find a shadow root + + + if (!element.parentNode) { + return null; + } + + return Util.findShadowRoot(element.parentNode); + }, + jQueryDetection: function jQueryDetection() { + if (typeof $__default['default'] === 'undefined') { + throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); + } + + var version = $__default['default'].fn.jquery.split(' ')[0].split('.'); + var minMajor = 1; + var ltMajor = 2; + var minMinor = 9; + var minPatch = 1; + var maxMajor = 4; + + if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { + throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); + } + } + }; + Util.jQueryDetection(); + setTransitionEndSupport(); + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'alert'; + var VERSION = '4.6.0'; + var DATA_KEY = 'bs.alert'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME]; + var SELECTOR_DISMISS = '[data-dismiss="alert"]'; + var EVENT_CLOSE = "close" + EVENT_KEY; + var EVENT_CLOSED = "closed" + EVENT_KEY; + var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY; + var CLASS_NAME_ALERT = 'alert'; + var CLASS_NAME_FADE = 'fade'; + var CLASS_NAME_SHOW = 'show'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Alert = /*#__PURE__*/function () { + function Alert(element) { + this._element = element; + } // Getters + + + var _proto = Alert.prototype; + + // Public + _proto.close = function close(element) { + var rootElement = this._element; + + if (element) { + rootElement = this._getRootElement(element); + } + + var customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent.isDefaultPrevented()) { + return; + } + + this._removeElement(rootElement); + }; + + _proto.dispose = function dispose() { + $__default['default'].removeData(this._element, DATA_KEY); + this._element = null; + } // Private + ; + + _proto._getRootElement = function _getRootElement(element) { + var selector = Util.getSelectorFromElement(element); + var parent = false; + + if (selector) { + parent = document.querySelector(selector); + } + + if (!parent) { + parent = $__default['default'](element).closest("." + CLASS_NAME_ALERT)[0]; + } + + return parent; + }; + + _proto._triggerCloseEvent = function _triggerCloseEvent(element) { + var closeEvent = $__default['default'].Event(EVENT_CLOSE); + $__default['default'](element).trigger(closeEvent); + return closeEvent; + }; + + _proto._removeElement = function _removeElement(element) { + var _this = this; + + $__default['default'](element).removeClass(CLASS_NAME_SHOW); + + if (!$__default['default'](element).hasClass(CLASS_NAME_FADE)) { + this._destroyElement(element); + + return; + } + + var transitionDuration = Util.getTransitionDurationFromElement(element); + $__default['default'](element).one(Util.TRANSITION_END, function (event) { + return _this._destroyElement(element, event); + }).emulateTransitionEnd(transitionDuration); + }; + + _proto._destroyElement = function _destroyElement(element) { + $__default['default'](element).detach().trigger(EVENT_CLOSED).remove(); + } // Static + ; + + Alert._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $element = $__default['default'](this); + var data = $element.data(DATA_KEY); + + if (!data) { + data = new Alert(this); + $element.data(DATA_KEY, data); + } + + if (config === 'close') { + data[config](this); + } + }); + }; + + Alert._handleDismiss = function _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + }; + + _createClass(Alert, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }]); + + return Alert; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert._handleDismiss(new Alert())); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $__default['default'].fn[NAME] = Alert._jQueryInterface; + $__default['default'].fn[NAME].Constructor = Alert; + + $__default['default'].fn[NAME].noConflict = function () { + $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT; + return Alert._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$1 = 'button'; + var VERSION$1 = '4.6.0'; + var DATA_KEY$1 = 'bs.button'; + var EVENT_KEY$1 = "." + DATA_KEY$1; + var DATA_API_KEY$1 = '.data-api'; + var JQUERY_NO_CONFLICT$1 = $__default['default'].fn[NAME$1]; + var CLASS_NAME_ACTIVE = 'active'; + var CLASS_NAME_BUTTON = 'btn'; + var CLASS_NAME_FOCUS = 'focus'; + var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]'; + var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]'; + var SELECTOR_DATA_TOGGLE = '[data-toggle="button"]'; + var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn'; + var SELECTOR_INPUT = 'input:not([type="hidden"])'; + var SELECTOR_ACTIVE = '.active'; + var SELECTOR_BUTTON = '.btn'; + var EVENT_CLICK_DATA_API$1 = "click" + EVENT_KEY$1 + DATA_API_KEY$1; + var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY$1 + DATA_API_KEY$1 + " " + ("blur" + EVENT_KEY$1 + DATA_API_KEY$1); + var EVENT_LOAD_DATA_API = "load" + EVENT_KEY$1 + DATA_API_KEY$1; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Button = /*#__PURE__*/function () { + function Button(element) { + this._element = element; + this.shouldAvoidTriggerChange = false; + } // Getters + + + var _proto = Button.prototype; + + // Public + _proto.toggle = function toggle() { + var triggerChangeEvent = true; + var addAriaPressed = true; + var rootElement = $__default['default'](this._element).closest(SELECTOR_DATA_TOGGLES)[0]; + + if (rootElement) { + var input = this._element.querySelector(SELECTOR_INPUT); + + if (input) { + if (input.type === 'radio') { + if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE)) { + triggerChangeEvent = false; + } else { + var activeElement = rootElement.querySelector(SELECTOR_ACTIVE); + + if (activeElement) { + $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE); + } + } + } + + if (triggerChangeEvent) { + // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input + if (input.type === 'checkbox' || input.type === 'radio') { + input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE); + } + + if (!this.shouldAvoidTriggerChange) { + $__default['default'](input).trigger('change'); + } + } + + input.focus(); + addAriaPressed = false; + } + } + + if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) { + if (addAriaPressed) { + this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE)); + } + + if (triggerChangeEvent) { + $__default['default'](this._element).toggleClass(CLASS_NAME_ACTIVE); + } + } + }; + + _proto.dispose = function dispose() { + $__default['default'].removeData(this._element, DATA_KEY$1); + this._element = null; + } // Static + ; + + Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) { + return this.each(function () { + var $element = $__default['default'](this); + var data = $element.data(DATA_KEY$1); + + if (!data) { + data = new Button(this); + $element.data(DATA_KEY$1, data); + } + + data.shouldAvoidTriggerChange = avoidTriggerChange; + + if (config === 'toggle') { + data[config](); + } + }); + }; + + _createClass(Button, null, [{ + key: "VERSION", + get: function get() { + return VERSION$1; + } + }]); + + return Button; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $__default['default'](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE_CARROT, function (event) { + var button = event.target; + var initialButton = button; + + if (!$__default['default'](button).hasClass(CLASS_NAME_BUTTON)) { + button = $__default['default'](button).closest(SELECTOR_BUTTON)[0]; + } + + if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) { + event.preventDefault(); // work around Firefox bug #1540995 + } else { + var inputBtn = button.querySelector(SELECTOR_INPUT); + + if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) { + event.preventDefault(); // work around Firefox bug #1540995 + + return; + } + + if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') { + Button._jQueryInterface.call($__default['default'](button), 'toggle', initialButton.tagName === 'INPUT'); + } + } + }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) { + var button = $__default['default'](event.target).closest(SELECTOR_BUTTON)[0]; + $__default['default'](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type)); + }); + $__default['default'](window).on(EVENT_LOAD_DATA_API, function () { + // ensure correct active class is set to match the controls' actual values/states + // find all checkboxes/readio buttons inside data-toggle groups + var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS)); + + for (var i = 0, len = buttons.length; i < len; i++) { + var button = buttons[i]; + var input = button.querySelector(SELECTOR_INPUT); + + if (input.checked || input.hasAttribute('checked')) { + button.classList.add(CLASS_NAME_ACTIVE); + } else { + button.classList.remove(CLASS_NAME_ACTIVE); + } + } // find all button toggles + + + buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE)); + + for (var _i = 0, _len = buttons.length; _i < _len; _i++) { + var _button = buttons[_i]; + + if (_button.getAttribute('aria-pressed') === 'true') { + _button.classList.add(CLASS_NAME_ACTIVE); + } else { + _button.classList.remove(CLASS_NAME_ACTIVE); + } + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $__default['default'].fn[NAME$1] = Button._jQueryInterface; + $__default['default'].fn[NAME$1].Constructor = Button; + + $__default['default'].fn[NAME$1].noConflict = function () { + $__default['default'].fn[NAME$1] = JQUERY_NO_CONFLICT$1; + return Button._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$2 = 'carousel'; + var VERSION$2 = '4.6.0'; + var DATA_KEY$2 = 'bs.carousel'; + var EVENT_KEY$2 = "." + DATA_KEY$2; + var DATA_API_KEY$2 = '.data-api'; + var JQUERY_NO_CONFLICT$2 = $__default['default'].fn[NAME$2]; + var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key + + var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key + + var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + var SWIPE_THRESHOLD = 40; + var Default = { + interval: 5000, + keyboard: true, + slide: false, + pause: 'hover', + wrap: true, + touch: true + }; + var DefaultType = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean' + }; + var DIRECTION_NEXT = 'next'; + var DIRECTION_PREV = 'prev'; + var DIRECTION_LEFT = 'left'; + var DIRECTION_RIGHT = 'right'; + var EVENT_SLIDE = "slide" + EVENT_KEY$2; + var EVENT_SLID = "slid" + EVENT_KEY$2; + var EVENT_KEYDOWN = "keydown" + EVENT_KEY$2; + var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY$2; + var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY$2; + var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY$2; + var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY$2; + var EVENT_TOUCHEND = "touchend" + EVENT_KEY$2; + var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY$2; + var EVENT_POINTERUP = "pointerup" + EVENT_KEY$2; + var EVENT_DRAG_START = "dragstart" + EVENT_KEY$2; + var EVENT_LOAD_DATA_API$1 = "load" + EVENT_KEY$2 + DATA_API_KEY$2; + var EVENT_CLICK_DATA_API$2 = "click" + EVENT_KEY$2 + DATA_API_KEY$2; + var CLASS_NAME_CAROUSEL = 'carousel'; + var CLASS_NAME_ACTIVE$1 = 'active'; + var CLASS_NAME_SLIDE = 'slide'; + var CLASS_NAME_RIGHT = 'carousel-item-right'; + var CLASS_NAME_LEFT = 'carousel-item-left'; + var CLASS_NAME_NEXT = 'carousel-item-next'; + var CLASS_NAME_PREV = 'carousel-item-prev'; + var CLASS_NAME_POINTER_EVENT = 'pointer-event'; + var SELECTOR_ACTIVE$1 = '.active'; + var SELECTOR_ACTIVE_ITEM = '.active.carousel-item'; + var SELECTOR_ITEM = '.carousel-item'; + var SELECTOR_ITEM_IMG = '.carousel-item img'; + var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'; + var SELECTOR_INDICATORS = '.carousel-indicators'; + var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'; + var SELECTOR_DATA_RIDE = '[data-ride="carousel"]'; + var PointerType = { + TOUCH: 'touch', + PEN: 'pen' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Carousel = /*#__PURE__*/function () { + function Carousel(element, config) { + this._items = null; + this._interval = null; + this._activeElement = null; + this._isPaused = false; + this._isSliding = false; + this.touchTimeout = null; + this.touchStartX = 0; + this.touchDeltaX = 0; + this._config = this._getConfig(config); + this._element = element; + this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS); + this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); + + this._addEventListeners(); + } // Getters + + + var _proto = Carousel.prototype; + + // Public + _proto.next = function next() { + if (!this._isSliding) { + this._slide(DIRECTION_NEXT); + } + }; + + _proto.nextWhenVisible = function nextWhenVisible() { + var $element = $__default['default'](this._element); // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + + if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') { + this.next(); + } + }; + + _proto.prev = function prev() { + if (!this._isSliding) { + this._slide(DIRECTION_PREV); + } + }; + + _proto.pause = function pause(event) { + if (!event) { + this._isPaused = true; + } + + if (this._element.querySelector(SELECTOR_NEXT_PREV)) { + Util.triggerTransitionEnd(this._element); + this.cycle(true); + } + + clearInterval(this._interval); + this._interval = null; + }; + + _proto.cycle = function cycle(event) { + if (!event) { + this._isPaused = false; + } + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._config.interval && !this._isPaused) { + this._updateInterval(); + + this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); + } + }; + + _proto.to = function to(index) { + var _this = this; + + this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); + + var activeIndex = this._getItemIndex(this._activeElement); + + if (index > this._items.length - 1 || index < 0) { + return; + } + + if (this._isSliding) { + $__default['default'](this._element).one(EVENT_SLID, function () { + return _this.to(index); + }); + return; + } + + if (activeIndex === index) { + this.pause(); + this.cycle(); + return; + } + + var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV; + + this._slide(direction, this._items[index]); + }; + + _proto.dispose = function dispose() { + $__default['default'](this._element).off(EVENT_KEY$2); + $__default['default'].removeData(this._element, DATA_KEY$2); + this._items = null; + this._config = null; + this._element = null; + this._interval = null; + this._isPaused = null; + this._isSliding = null; + this._activeElement = null; + this._indicatorsElement = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _extends({}, Default, config); + Util.typeCheckConfig(NAME$2, config, DefaultType); + return config; + }; + + _proto._handleSwipe = function _handleSwipe() { + var absDeltax = Math.abs(this.touchDeltaX); + + if (absDeltax <= SWIPE_THRESHOLD) { + return; + } + + var direction = absDeltax / this.touchDeltaX; + this.touchDeltaX = 0; // swipe left + + if (direction > 0) { + this.prev(); + } // swipe right + + + if (direction < 0) { + this.next(); + } + }; + + _proto._addEventListeners = function _addEventListeners() { + var _this2 = this; + + if (this._config.keyboard) { + $__default['default'](this._element).on(EVENT_KEYDOWN, function (event) { + return _this2._keydown(event); + }); + } + + if (this._config.pause === 'hover') { + $__default['default'](this._element).on(EVENT_MOUSEENTER, function (event) { + return _this2.pause(event); + }).on(EVENT_MOUSELEAVE, function (event) { + return _this2.cycle(event); + }); + } + + if (this._config.touch) { + this._addTouchEventListeners(); + } + }; + + _proto._addTouchEventListeners = function _addTouchEventListeners() { + var _this3 = this; + + if (!this._touchSupported) { + return; + } + + var start = function start(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchStartX = event.originalEvent.clientX; + } else if (!_this3._pointerEvent) { + _this3.touchStartX = event.originalEvent.touches[0].clientX; + } + }; + + var move = function move(event) { + // ensure swiping with one touch and not pinching + if (event.originalEvent.touches && event.originalEvent.touches.length > 1) { + _this3.touchDeltaX = 0; + } else { + _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX; + } + }; + + var end = function end(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; + } + + _this3._handleSwipe(); + + if (_this3._config.pause === 'hover') { + // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + _this3.pause(); + + if (_this3.touchTimeout) { + clearTimeout(_this3.touchTimeout); + } + + _this3.touchTimeout = setTimeout(function (event) { + return _this3.cycle(event); + }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); + } + }; + + $__default['default'](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) { + return e.preventDefault(); + }); + + if (this._pointerEvent) { + $__default['default'](this._element).on(EVENT_POINTERDOWN, function (event) { + return start(event); + }); + $__default['default'](this._element).on(EVENT_POINTERUP, function (event) { + return end(event); + }); + + this._element.classList.add(CLASS_NAME_POINTER_EVENT); + } else { + $__default['default'](this._element).on(EVENT_TOUCHSTART, function (event) { + return start(event); + }); + $__default['default'](this._element).on(EVENT_TOUCHMOVE, function (event) { + return move(event); + }); + $__default['default'](this._element).on(EVENT_TOUCHEND, function (event) { + return end(event); + }); + } + }; + + _proto._keydown = function _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + + switch (event.which) { + case ARROW_LEFT_KEYCODE: + event.preventDefault(); + this.prev(); + break; + + case ARROW_RIGHT_KEYCODE: + event.preventDefault(); + this.next(); + break; + } + }; + + _proto._getItemIndex = function _getItemIndex(element) { + this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : []; + return this._items.indexOf(element); + }; + + _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { + var isNextDirection = direction === DIRECTION_NEXT; + var isPrevDirection = direction === DIRECTION_PREV; + + var activeIndex = this._getItemIndex(activeElement); + + var lastItemIndex = this._items.length - 1; + var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; + + if (isGoingToWrap && !this._config.wrap) { + return activeElement; + } + + var delta = direction === DIRECTION_PREV ? -1 : 1; + var itemIndex = (activeIndex + delta) % this._items.length; + return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; + }; + + _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { + var targetIndex = this._getItemIndex(relatedTarget); + + var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM)); + + var slideEvent = $__default['default'].Event(EVENT_SLIDE, { + relatedTarget: relatedTarget, + direction: eventDirectionName, + from: fromIndex, + to: targetIndex + }); + $__default['default'](this._element).trigger(slideEvent); + return slideEvent; + }; + + _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { + if (this._indicatorsElement) { + var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1)); + $__default['default'](indicators).removeClass(CLASS_NAME_ACTIVE$1); + + var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; + + if (nextIndicator) { + $__default['default'](nextIndicator).addClass(CLASS_NAME_ACTIVE$1); + } + } + }; + + _proto._updateInterval = function _updateInterval() { + var element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM); + + if (!element) { + return; + } + + var elementInterval = parseInt(element.getAttribute('data-interval'), 10); + + if (elementInterval) { + this._config.defaultInterval = this._config.defaultInterval || this._config.interval; + this._config.interval = elementInterval; + } else { + this._config.interval = this._config.defaultInterval || this._config.interval; + } + }; + + _proto._slide = function _slide(direction, element) { + var _this4 = this; + + var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); + + var activeElementIndex = this._getItemIndex(activeElement); + + var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); + + var nextElementIndex = this._getItemIndex(nextElement); + + var isCycling = Boolean(this._interval); + var directionalClassName; + var orderClassName; + var eventDirectionName; + + if (direction === DIRECTION_NEXT) { + directionalClassName = CLASS_NAME_LEFT; + orderClassName = CLASS_NAME_NEXT; + eventDirectionName = DIRECTION_LEFT; + } else { + directionalClassName = CLASS_NAME_RIGHT; + orderClassName = CLASS_NAME_PREV; + eventDirectionName = DIRECTION_RIGHT; + } + + if (nextElement && $__default['default'](nextElement).hasClass(CLASS_NAME_ACTIVE$1)) { + this._isSliding = false; + return; + } + + var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); + + if (slideEvent.isDefaultPrevented()) { + return; + } + + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + return; + } + + this._isSliding = true; + + if (isCycling) { + this.pause(); + } + + this._setActiveIndicatorElement(nextElement); + + this._activeElement = nextElement; + var slidEvent = $__default['default'].Event(EVENT_SLID, { + relatedTarget: nextElement, + direction: eventDirectionName, + from: activeElementIndex, + to: nextElementIndex + }); + + if ($__default['default'](this._element).hasClass(CLASS_NAME_SLIDE)) { + $__default['default'](nextElement).addClass(orderClassName); + Util.reflow(nextElement); + $__default['default'](activeElement).addClass(directionalClassName); + $__default['default'](nextElement).addClass(directionalClassName); + var transitionDuration = Util.getTransitionDurationFromElement(activeElement); + $__default['default'](activeElement).one(Util.TRANSITION_END, function () { + $__default['default'](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE$1); + $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE$1 + " " + orderClassName + " " + directionalClassName); + _this4._isSliding = false; + setTimeout(function () { + return $__default['default'](_this4._element).trigger(slidEvent); + }, 0); + }).emulateTransitionEnd(transitionDuration); + } else { + $__default['default'](activeElement).removeClass(CLASS_NAME_ACTIVE$1); + $__default['default'](nextElement).addClass(CLASS_NAME_ACTIVE$1); + this._isSliding = false; + $__default['default'](this._element).trigger(slidEvent); + } + + if (isCycling) { + this.cycle(); + } + } // Static + ; + + Carousel._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $__default['default'](this).data(DATA_KEY$2); + + var _config = _extends({}, Default, $__default['default'](this).data()); + + if (typeof config === 'object') { + _config = _extends({}, _config, config); + } + + var action = typeof config === 'string' ? config : _config.slide; + + if (!data) { + data = new Carousel(this, _config); + $__default['default'](this).data(DATA_KEY$2, data); + } + + if (typeof config === 'number') { + data.to(config); + } else if (typeof action === 'string') { + if (typeof data[action] === 'undefined') { + throw new TypeError("No method named \"" + action + "\""); + } + + data[action](); + } else if (_config.interval && _config.ride) { + data.pause(); + data.cycle(); + } + }); + }; + + Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { + var selector = Util.getSelectorFromElement(this); + + if (!selector) { + return; + } + + var target = $__default['default'](selector)[0]; + + if (!target || !$__default['default'](target).hasClass(CLASS_NAME_CAROUSEL)) { + return; + } + + var config = _extends({}, $__default['default'](target).data(), $__default['default'](this).data()); + + var slideIndex = this.getAttribute('data-slide-to'); + + if (slideIndex) { + config.interval = false; + } + + Carousel._jQueryInterface.call($__default['default'](target), config); + + if (slideIndex) { + $__default['default'](target).data(DATA_KEY$2).to(slideIndex); + } + + event.preventDefault(); + }; + + _createClass(Carousel, null, [{ + key: "VERSION", + get: function get() { + return VERSION$2; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return Carousel; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $__default['default'](document).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler); + $__default['default'](window).on(EVENT_LOAD_DATA_API$1, function () { + var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE)); + + for (var i = 0, len = carousels.length; i < len; i++) { + var $carousel = $__default['default'](carousels[i]); + + Carousel._jQueryInterface.call($carousel, $carousel.data()); + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $__default['default'].fn[NAME$2] = Carousel._jQueryInterface; + $__default['default'].fn[NAME$2].Constructor = Carousel; + + $__default['default'].fn[NAME$2].noConflict = function () { + $__default['default'].fn[NAME$2] = JQUERY_NO_CONFLICT$2; + return Carousel._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$3 = 'collapse'; + var VERSION$3 = '4.6.0'; + var DATA_KEY$3 = 'bs.collapse'; + var EVENT_KEY$3 = "." + DATA_KEY$3; + var DATA_API_KEY$3 = '.data-api'; + var JQUERY_NO_CONFLICT$3 = $__default['default'].fn[NAME$3]; + var Default$1 = { + toggle: true, + parent: '' + }; + var DefaultType$1 = { + toggle: 'boolean', + parent: '(string|element)' + }; + var EVENT_SHOW = "show" + EVENT_KEY$3; + var EVENT_SHOWN = "shown" + EVENT_KEY$3; + var EVENT_HIDE = "hide" + EVENT_KEY$3; + var EVENT_HIDDEN = "hidden" + EVENT_KEY$3; + var EVENT_CLICK_DATA_API$3 = "click" + EVENT_KEY$3 + DATA_API_KEY$3; + var CLASS_NAME_SHOW$1 = 'show'; + var CLASS_NAME_COLLAPSE = 'collapse'; + var CLASS_NAME_COLLAPSING = 'collapsing'; + var CLASS_NAME_COLLAPSED = 'collapsed'; + var DIMENSION_WIDTH = 'width'; + var DIMENSION_HEIGHT = 'height'; + var SELECTOR_ACTIVES = '.show, .collapsing'; + var SELECTOR_DATA_TOGGLE$1 = '[data-toggle="collapse"]'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Collapse = /*#__PURE__*/function () { + function Collapse(element, config) { + this._isTransitioning = false; + this._element = element; + this._config = this._getConfig(config); + this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); + var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$1)); + + for (var i = 0, len = toggleList.length; i < len; i++) { + var elem = toggleList[i]; + var selector = Util.getSelectorFromElement(elem); + var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { + return foundElem === element; + }); + + if (selector !== null && filterElement.length > 0) { + this._selector = selector; + + this._triggerArray.push(elem); + } + } + + this._parent = this._config.parent ? this._getParent() : null; + + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._element, this._triggerArray); + } + + if (this._config.toggle) { + this.toggle(); + } + } // Getters + + + var _proto = Collapse.prototype; + + // Public + _proto.toggle = function toggle() { + if ($__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) { + this.hide(); + } else { + this.show(); + } + }; + + _proto.show = function show() { + var _this = this; + + if (this._isTransitioning || $__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) { + return; + } + + var actives; + var activesData; + + if (this._parent) { + actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) { + if (typeof _this._config.parent === 'string') { + return elem.getAttribute('data-parent') === _this._config.parent; + } + + return elem.classList.contains(CLASS_NAME_COLLAPSE); + }); + + if (actives.length === 0) { + actives = null; + } + } + + if (actives) { + activesData = $__default['default'](actives).not(this._selector).data(DATA_KEY$3); + + if (activesData && activesData._isTransitioning) { + return; + } + } + + var startEvent = $__default['default'].Event(EVENT_SHOW); + $__default['default'](this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + if (actives) { + Collapse._jQueryInterface.call($__default['default'](actives).not(this._selector), 'hide'); + + if (!activesData) { + $__default['default'](actives).data(DATA_KEY$3, null); + } + } + + var dimension = this._getDimension(); + + $__default['default'](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING); + this._element.style[dimension] = 0; + + if (this._triggerArray.length) { + $__default['default'](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true); + } + + this.setTransitioning(true); + + var complete = function complete() { + $__default['default'](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$1); + _this._element.style[dimension] = ''; + + _this.setTransitioning(false); + + $__default['default'](_this._element).trigger(EVENT_SHOWN); + }; + + var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + var scrollSize = "scroll" + capitalizedDimension; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + this._element.style[dimension] = this._element[scrollSize] + "px"; + }; + + _proto.hide = function hide() { + var _this2 = this; + + if (this._isTransitioning || !$__default['default'](this._element).hasClass(CLASS_NAME_SHOW$1)) { + return; + } + + var startEvent = $__default['default'].Event(EVENT_HIDE); + $__default['default'](this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + var dimension = this._getDimension(); + + this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; + Util.reflow(this._element); + $__default['default'](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$1); + var triggerArrayLength = this._triggerArray.length; + + if (triggerArrayLength > 0) { + for (var i = 0; i < triggerArrayLength; i++) { + var trigger = this._triggerArray[i]; + var selector = Util.getSelectorFromElement(trigger); + + if (selector !== null) { + var $elem = $__default['default']([].slice.call(document.querySelectorAll(selector))); + + if (!$elem.hasClass(CLASS_NAME_SHOW$1)) { + $__default['default'](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false); + } + } + } + } + + this.setTransitioning(true); + + var complete = function complete() { + _this2.setTransitioning(false); + + $__default['default'](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN); + }; + + this._element.style[dimension] = ''; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $__default['default'](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + }; + + _proto.setTransitioning = function setTransitioning(isTransitioning) { + this._isTransitioning = isTransitioning; + }; + + _proto.dispose = function dispose() { + $__default['default'].removeData(this._element, DATA_KEY$3); + this._config = null; + this._parent = null; + this._element = null; + this._triggerArray = null; + this._isTransitioning = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _extends({}, Default$1, config); + config.toggle = Boolean(config.toggle); // Coerce string values + + Util.typeCheckConfig(NAME$3, config, DefaultType$1); + return config; + }; + + _proto._getDimension = function _getDimension() { + var hasWidth = $__default['default'](this._element).hasClass(DIMENSION_WIDTH); + return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT; + }; + + _proto._getParent = function _getParent() { + var _this3 = this; + + var parent; + + if (Util.isElement(this._config.parent)) { + parent = this._config.parent; // It's a jQuery object + + if (typeof this._config.parent.jquery !== 'undefined') { + parent = this._config.parent[0]; + } + } else { + parent = document.querySelector(this._config.parent); + } + + var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; + var children = [].slice.call(parent.querySelectorAll(selector)); + $__default['default'](children).each(function (i, element) { + _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); + }); + return parent; + }; + + _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { + var isOpen = $__default['default'](element).hasClass(CLASS_NAME_SHOW$1); + + if (triggerArray.length) { + $__default['default'](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen); + } + } // Static + ; + + Collapse._getTargetFromElement = function _getTargetFromElement(element) { + var selector = Util.getSelectorFromElement(element); + return selector ? document.querySelector(selector) : null; + }; + + Collapse._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $element = $__default['default'](this); + var data = $element.data(DATA_KEY$3); + + var _config = _extends({}, Default$1, $element.data(), typeof config === 'object' && config ? config : {}); + + if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) { + _config.toggle = false; + } + + if (!data) { + data = new Collapse(this, _config); + $element.data(DATA_KEY$3, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Collapse, null, [{ + key: "VERSION", + get: function get() { + return VERSION$3; + } + }, { + key: "Default", + get: function get() { + return Default$1; + } + }]); + + return Collapse; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $__default['default'](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$1, function (event) { + // preventDefault only for elements (which change the URL) not inside the collapsible element + if (event.currentTarget.tagName === 'A') { + event.preventDefault(); + } + + var $trigger = $__default['default'](this); + var selector = Util.getSelectorFromElement(this); + var selectors = [].slice.call(document.querySelectorAll(selector)); + $__default['default'](selectors).each(function () { + var $target = $__default['default'](this); + var data = $target.data(DATA_KEY$3); + var config = data ? 'toggle' : $trigger.data(); + + Collapse._jQueryInterface.call($target, config); + }); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $__default['default'].fn[NAME$3] = Collapse._jQueryInterface; + $__default['default'].fn[NAME$3].Constructor = Collapse; + + $__default['default'].fn[NAME$3].noConflict = function () { + $__default['default'].fn[NAME$3] = JQUERY_NO_CONFLICT$3; + return Collapse._jQueryInterface; + }; + + /**! + * @fileOverview Kickass library to create and place poppers near their reference elements. + * @version 1.16.1 + * @license + * Copyright (c) 2016 Federico Zivolo and contributors + * + * 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. + */ + var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined'; + + var timeoutDuration = function () { + var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; + for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { + if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) { + return 1; + } + } + return 0; + }(); + + function microtaskDebounce(fn) { + var called = false; + return function () { + if (called) { + return; + } + called = true; + window.Promise.resolve().then(function () { + called = false; + fn(); + }); + }; + } + + function taskDebounce(fn) { + var scheduled = false; + return function () { + if (!scheduled) { + scheduled = true; + setTimeout(function () { + scheduled = false; + fn(); + }, timeoutDuration); + } + }; + } + + var supportsMicroTasks = isBrowser && window.Promise; + + /** + * Create a debounced version of a method, that's asynchronously deferred + * but called in the minimum time possible. + * + * @method + * @memberof Popper.Utils + * @argument {Function} fn + * @returns {Function} + */ + var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce; + + /** + * Check if the given variable is a function + * @method + * @memberof Popper.Utils + * @argument {Any} functionToCheck - variable to check + * @returns {Boolean} answer to: is a function? + */ + function isFunction(functionToCheck) { + var getType = {}; + return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; + } + + /** + * Get CSS computed property of the given element + * @method + * @memberof Popper.Utils + * @argument {Eement} element + * @argument {String} property + */ + function getStyleComputedProperty(element, property) { + if (element.nodeType !== 1) { + return []; + } + // NOTE: 1 DOM access here + var window = element.ownerDocument.defaultView; + var css = window.getComputedStyle(element, null); + return property ? css[property] : css; + } + + /** + * Returns the parentNode or the host of the element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} parent + */ + function getParentNode(element) { + if (element.nodeName === 'HTML') { + return element; + } + return element.parentNode || element.host; + } + + /** + * Returns the scrolling parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} scroll parent + */ + function getScrollParent(element) { + // Return body, `getScroll` will take care to get the correct `scrollTop` from it + if (!element) { + return document.body; + } + + switch (element.nodeName) { + case 'HTML': + case 'BODY': + return element.ownerDocument.body; + case '#document': + return element.body; + } + + // Firefox want us to check `-x` and `-y` variations as well + + var _getStyleComputedProp = getStyleComputedProperty(element), + overflow = _getStyleComputedProp.overflow, + overflowX = _getStyleComputedProp.overflowX, + overflowY = _getStyleComputedProp.overflowY; + + if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) { + return element; + } + + return getScrollParent(getParentNode(element)); + } + + /** + * Returns the reference node of the reference object, or the reference object itself. + * @method + * @memberof Popper.Utils + * @param {Element|Object} reference - the reference element (the popper will be relative to this) + * @returns {Element} parent + */ + function getReferenceNode(reference) { + return reference && reference.referenceNode ? reference.referenceNode : reference; + } + + var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); + var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); + + /** + * Determines if the browser is Internet Explorer + * @method + * @memberof Popper.Utils + * @param {Number} version to check + * @returns {Boolean} isIE + */ + function isIE(version) { + if (version === 11) { + return isIE11; + } + if (version === 10) { + return isIE10; + } + return isIE11 || isIE10; + } + + /** + * Returns the offset parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} offset parent + */ + function getOffsetParent(element) { + if (!element) { + return document.documentElement; + } + + var noOffsetParent = isIE(10) ? document.body : null; + + // NOTE: 1 DOM access here + var offsetParent = element.offsetParent || null; + // Skip hidden elements which don't have an offsetParent + while (offsetParent === noOffsetParent && element.nextElementSibling) { + offsetParent = (element = element.nextElementSibling).offsetParent; + } + + var nodeName = offsetParent && offsetParent.nodeName; + + if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') { + return element ? element.ownerDocument.documentElement : document.documentElement; + } + + // .offsetParent will return the closest TH, TD or TABLE in case + // no offsetParent is present, I hate this job... + if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') { + return getOffsetParent(offsetParent); + } + + return offsetParent; + } + + function isOffsetContainer(element) { + var nodeName = element.nodeName; + + if (nodeName === 'BODY') { + return false; + } + return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element; + } + + /** + * Finds the root node (document, shadowDOM root) of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} node + * @returns {Element} root node + */ + function getRoot(node) { + if (node.parentNode !== null) { + return getRoot(node.parentNode); + } + + return node; + } + + /** + * Finds the offset parent common to the two provided nodes + * @method + * @memberof Popper.Utils + * @argument {Element} element1 + * @argument {Element} element2 + * @returns {Element} common offset parent + */ + function findCommonOffsetParent(element1, element2) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) { + return document.documentElement; + } + + // Here we make sure to give as "start" the element that comes first in the DOM + var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING; + var start = order ? element1 : element2; + var end = order ? element2 : element1; + + // Get common ancestor container + var range = document.createRange(); + range.setStart(start, 0); + range.setEnd(end, 0); + var commonAncestorContainer = range.commonAncestorContainer; + + // Both nodes are inside #document + + if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) { + if (isOffsetContainer(commonAncestorContainer)) { + return commonAncestorContainer; + } + + return getOffsetParent(commonAncestorContainer); + } + + // one of the nodes is inside shadowDOM, find which one + var element1root = getRoot(element1); + if (element1root.host) { + return findCommonOffsetParent(element1root.host, element2); + } else { + return findCommonOffsetParent(element1, getRoot(element2).host); + } + } + + /** + * Gets the scroll value of the given element in the given side (top and left) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {String} side `top` or `left` + * @returns {number} amount of scrolled pixels + */ + function getScroll(element) { + var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top'; + + var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft'; + var nodeName = element.nodeName; + + if (nodeName === 'BODY' || nodeName === 'HTML') { + var html = element.ownerDocument.documentElement; + var scrollingElement = element.ownerDocument.scrollingElement || html; + return scrollingElement[upperSide]; + } + + return element[upperSide]; + } + + /* + * Sum or subtract the element scroll values (left and top) from a given rect object + * @method + * @memberof Popper.Utils + * @param {Object} rect - Rect object you want to change + * @param {HTMLElement} element - The element from the function reads the scroll values + * @param {Boolean} subtract - set to true if you want to subtract the scroll values + * @return {Object} rect - The modifier rect object + */ + function includeScroll(rect, element) { + var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + var modifier = subtract ? -1 : 1; + rect.top += scrollTop * modifier; + rect.bottom += scrollTop * modifier; + rect.left += scrollLeft * modifier; + rect.right += scrollLeft * modifier; + return rect; + } + + /* + * Helper to detect borders of a given element + * @method + * @memberof Popper.Utils + * @param {CSSStyleDeclaration} styles + * Result of `getStyleComputedProperty` on the given element + * @param {String} axis - `x` or `y` + * @return {number} borders - The borders size of the given axis + */ + + function getBordersSize(styles, axis) { + var sideA = axis === 'x' ? 'Left' : 'Top'; + var sideB = sideA === 'Left' ? 'Right' : 'Bottom'; + + return parseFloat(styles['border' + sideA + 'Width']) + parseFloat(styles['border' + sideB + 'Width']); + } + + function getSize(axis, body, html, computedStyle) { + return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0); + } + + function getWindowSizes(document) { + var body = document.body; + var html = document.documentElement; + var computedStyle = isIE(10) && getComputedStyle(html); + + return { + height: getSize('Height', body, html, computedStyle), + width: getSize('Width', body, html, computedStyle) + }; + } + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + + + + + var defineProperty = function (obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + }; + + var _extends$1 = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + /** + * Given element offsets, generate an output similar to getBoundingClientRect + * @method + * @memberof Popper.Utils + * @argument {Object} offsets + * @returns {Object} ClientRect like output + */ + function getClientRect(offsets) { + return _extends$1({}, offsets, { + right: offsets.left + offsets.width, + bottom: offsets.top + offsets.height + }); + } + + /** + * Get bounding client rect of given element + * @method + * @memberof Popper.Utils + * @param {HTMLElement} element + * @return {Object} client rect + */ + function getBoundingClientRect(element) { + var rect = {}; + + // IE10 10 FIX: Please, don't ask, the element isn't + // considered in DOM in some circumstances... + // This isn't reproducible in IE10 compatibility mode of IE11 + try { + if (isIE(10)) { + rect = element.getBoundingClientRect(); + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + rect.top += scrollTop; + rect.left += scrollLeft; + rect.bottom += scrollTop; + rect.right += scrollLeft; + } else { + rect = element.getBoundingClientRect(); + } + } catch (e) {} + + var result = { + left: rect.left, + top: rect.top, + width: rect.right - rect.left, + height: rect.bottom - rect.top + }; + + // subtract scrollbar size from sizes + var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {}; + var width = sizes.width || element.clientWidth || result.width; + var height = sizes.height || element.clientHeight || result.height; + + var horizScrollbar = element.offsetWidth - width; + var vertScrollbar = element.offsetHeight - height; + + // if an hypothetical scrollbar is detected, we must be sure it's not a `border` + // we make this check conditional for performance reasons + if (horizScrollbar || vertScrollbar) { + var styles = getStyleComputedProperty(element); + horizScrollbar -= getBordersSize(styles, 'x'); + vertScrollbar -= getBordersSize(styles, 'y'); + + result.width -= horizScrollbar; + result.height -= vertScrollbar; + } + + return getClientRect(result); + } + + function getOffsetRectRelativeToArbitraryNode(children, parent) { + var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var isIE10 = isIE(10); + var isHTML = parent.nodeName === 'HTML'; + var childrenRect = getBoundingClientRect(children); + var parentRect = getBoundingClientRect(parent); + var scrollParent = getScrollParent(children); + + var styles = getStyleComputedProperty(parent); + var borderTopWidth = parseFloat(styles.borderTopWidth); + var borderLeftWidth = parseFloat(styles.borderLeftWidth); + + // In cases where the parent is fixed, we must ignore negative scroll in offset calc + if (fixedPosition && isHTML) { + parentRect.top = Math.max(parentRect.top, 0); + parentRect.left = Math.max(parentRect.left, 0); + } + var offsets = getClientRect({ + top: childrenRect.top - parentRect.top - borderTopWidth, + left: childrenRect.left - parentRect.left - borderLeftWidth, + width: childrenRect.width, + height: childrenRect.height + }); + offsets.marginTop = 0; + offsets.marginLeft = 0; + + // Subtract margins of documentElement in case it's being used as parent + // we do this only on HTML because it's the only element that behaves + // differently when margins are applied to it. The margins are included in + // the box of the documentElement, in the other cases not. + if (!isIE10 && isHTML) { + var marginTop = parseFloat(styles.marginTop); + var marginLeft = parseFloat(styles.marginLeft); + + offsets.top -= borderTopWidth - marginTop; + offsets.bottom -= borderTopWidth - marginTop; + offsets.left -= borderLeftWidth - marginLeft; + offsets.right -= borderLeftWidth - marginLeft; + + // Attach marginTop and marginLeft because in some circumstances we may need them + offsets.marginTop = marginTop; + offsets.marginLeft = marginLeft; + } + + if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') { + offsets = includeScroll(offsets, parent); + } + + return offsets; + } + + function getViewportOffsetRectRelativeToArtbitraryNode(element) { + var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var html = element.ownerDocument.documentElement; + var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html); + var width = Math.max(html.clientWidth, window.innerWidth || 0); + var height = Math.max(html.clientHeight, window.innerHeight || 0); + + var scrollTop = !excludeScroll ? getScroll(html) : 0; + var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0; + + var offset = { + top: scrollTop - relativeOffset.top + relativeOffset.marginTop, + left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft, + width: width, + height: height + }; + + return getClientRect(offset); + } + + /** + * Check if the given element is fixed or is inside a fixed parent + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {Element} customContainer + * @returns {Boolean} answer to "isFixed?" + */ + function isFixed(element) { + var nodeName = element.nodeName; + if (nodeName === 'BODY' || nodeName === 'HTML') { + return false; + } + if (getStyleComputedProperty(element, 'position') === 'fixed') { + return true; + } + var parentNode = getParentNode(element); + if (!parentNode) { + return false; + } + return isFixed(parentNode); + } + + /** + * Finds the first parent of an element that has a transformed property defined + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} first transformed parent or documentElement + */ + + function getFixedPositionOffsetParent(element) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element || !element.parentElement || isIE()) { + return document.documentElement; + } + var el = element.parentElement; + while (el && getStyleComputedProperty(el, 'transform') === 'none') { + el = el.parentElement; + } + return el || document.documentElement; + } + + /** + * Computed the boundaries limits and return them + * @method + * @memberof Popper.Utils + * @param {HTMLElement} popper + * @param {HTMLElement} reference + * @param {number} padding + * @param {HTMLElement} boundariesElement - Element used to define the boundaries + * @param {Boolean} fixedPosition - Is in fixed position mode + * @returns {Object} Coordinates of the boundaries + */ + function getBoundaries(popper, reference, padding, boundariesElement) { + var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + // NOTE: 1 DOM access here + + var boundaries = { top: 0, left: 0 }; + var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); + + // Handle viewport case + if (boundariesElement === 'viewport') { + boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition); + } else { + // Handle other cases based on DOM element used as boundaries + var boundariesNode = void 0; + if (boundariesElement === 'scrollParent') { + boundariesNode = getScrollParent(getParentNode(reference)); + if (boundariesNode.nodeName === 'BODY') { + boundariesNode = popper.ownerDocument.documentElement; + } + } else if (boundariesElement === 'window') { + boundariesNode = popper.ownerDocument.documentElement; + } else { + boundariesNode = boundariesElement; + } + + var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); + + // In case of HTML, we need a different computation + if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { + var _getWindowSizes = getWindowSizes(popper.ownerDocument), + height = _getWindowSizes.height, + width = _getWindowSizes.width; + + boundaries.top += offsets.top - offsets.marginTop; + boundaries.bottom = height + offsets.top; + boundaries.left += offsets.left - offsets.marginLeft; + boundaries.right = width + offsets.left; + } else { + // for all the other DOM elements, this one is good + boundaries = offsets; + } + } + + // Add paddings + padding = padding || 0; + var isPaddingNumber = typeof padding === 'number'; + boundaries.left += isPaddingNumber ? padding : padding.left || 0; + boundaries.top += isPaddingNumber ? padding : padding.top || 0; + boundaries.right -= isPaddingNumber ? padding : padding.right || 0; + boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; + + return boundaries; + } + + function getArea(_ref) { + var width = _ref.width, + height = _ref.height; + + return width * height; + } + + /** + * Utility used to transform the `auto` placement to the placement with more + * available space. + * @method + * @memberof Popper.Utils + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) { + var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + + if (placement.indexOf('auto') === -1) { + return placement; + } + + var boundaries = getBoundaries(popper, reference, padding, boundariesElement); + + var rects = { + top: { + width: boundaries.width, + height: refRect.top - boundaries.top + }, + right: { + width: boundaries.right - refRect.right, + height: boundaries.height + }, + bottom: { + width: boundaries.width, + height: boundaries.bottom - refRect.bottom + }, + left: { + width: refRect.left - boundaries.left, + height: boundaries.height + } + }; + + var sortedAreas = Object.keys(rects).map(function (key) { + return _extends$1({ + key: key + }, rects[key], { + area: getArea(rects[key]) + }); + }).sort(function (a, b) { + return b.area - a.area; + }); + + var filteredAreas = sortedAreas.filter(function (_ref2) { + var width = _ref2.width, + height = _ref2.height; + return width >= popper.clientWidth && height >= popper.clientHeight; + }); + + var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key; + + var variation = placement.split('-')[1]; + + return computedPlacement + (variation ? '-' + variation : ''); + } + + /** + * Get offsets to the reference element + * @method + * @memberof Popper.Utils + * @param {Object} state + * @param {Element} popper - the popper element + * @param {Element} reference - the reference element (the popper will be relative to this) + * @param {Element} fixedPosition - is in fixed position mode + * @returns {Object} An object containing the offsets which will be applied to the popper + */ + function getReferenceOffsets(state, popper, reference) { + var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + + var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference)); + return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition); + } + + /** + * Get the outer sizes of the given element (offset size + margins) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Object} object containing width and height properties + */ + function getOuterSizes(element) { + var window = element.ownerDocument.defaultView; + var styles = window.getComputedStyle(element); + var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0); + var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0); + var result = { + width: element.offsetWidth + y, + height: element.offsetHeight + x + }; + return result; + } + + /** + * Get the opposite placement of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement + * @returns {String} flipped placement + */ + function getOppositePlacement(placement) { + var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash[matched]; + }); + } + + /** + * Get offsets to the popper + * @method + * @memberof Popper.Utils + * @param {Object} position - CSS position the Popper will get applied + * @param {HTMLElement} popper - the popper element + * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this) + * @param {String} placement - one of the valid placement options + * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper + */ + function getPopperOffsets(popper, referenceOffsets, placement) { + placement = placement.split('-')[0]; + + // Get popper node sizes + var popperRect = getOuterSizes(popper); + + // Add position, width and height to our offsets object + var popperOffsets = { + width: popperRect.width, + height: popperRect.height + }; + + // depending by the popper placement we have to compute its offsets slightly differently + var isHoriz = ['right', 'left'].indexOf(placement) !== -1; + var mainSide = isHoriz ? 'top' : 'left'; + var secondarySide = isHoriz ? 'left' : 'top'; + var measurement = isHoriz ? 'height' : 'width'; + var secondaryMeasurement = !isHoriz ? 'height' : 'width'; + + popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2; + if (placement === secondarySide) { + popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement]; + } else { + popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)]; + } + + return popperOffsets; + } + + /** + * Mimics the `find` method of Array + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ + function find(arr, check) { + // use native find if supported + if (Array.prototype.find) { + return arr.find(check); + } + + // use `filter` to obtain the same behavior of `find` + return arr.filter(check)[0]; + } + + /** + * Return the index of the matching object + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ + function findIndex(arr, prop, value) { + // use native findIndex if supported + if (Array.prototype.findIndex) { + return arr.findIndex(function (cur) { + return cur[prop] === value; + }); + } + + // use `find` + `indexOf` if `findIndex` isn't supported + var match = find(arr, function (obj) { + return obj[prop] === value; + }); + return arr.indexOf(match); + } + + /** + * Loop trough the list of modifiers and run them in order, + * each of them will then edit the data object. + * @method + * @memberof Popper.Utils + * @param {dataObject} data + * @param {Array} modifiers + * @param {String} ends - Optional modifier name used as stopper + * @returns {dataObject} + */ + function runModifiers(modifiers, data, ends) { + var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends)); + + modifiersToRun.forEach(function (modifier) { + if (modifier['function']) { + // eslint-disable-line dot-notation + console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); + } + var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation + if (modifier.enabled && isFunction(fn)) { + // Add properties to offsets to make them a complete clientRect object + // we do this before each modifier to make sure the previous one doesn't + // mess with these values + data.offsets.popper = getClientRect(data.offsets.popper); + data.offsets.reference = getClientRect(data.offsets.reference); + + data = fn(data, modifier); + } + }); + + return data; + } + + /** + * Updates the position of the popper, computing the new offsets and applying + * the new style.
+ * Prefer `scheduleUpdate` over `update` because of performance reasons. + * @method + * @memberof Popper + */ + function update() { + // if popper is destroyed, don't perform any further update + if (this.state.isDestroyed) { + return; + } + + var data = { + instance: this, + styles: {}, + arrowStyles: {}, + attributes: {}, + flipped: false, + offsets: {} + }; + + // compute reference element offsets + data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); + + // store the computed placement inside `originalPlacement` + data.originalPlacement = data.placement; + + data.positionFixed = this.options.positionFixed; + + // compute the popper offsets + data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); + + data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; + + // run the modifiers + data = runModifiers(this.modifiers, data); + + // the first `update` will call `onCreate` callback + // the other ones will call `onUpdate` callback + if (!this.state.isCreated) { + this.state.isCreated = true; + this.options.onCreate(data); + } else { + this.options.onUpdate(data); + } + } + + /** + * Helper used to know if the given modifier is enabled. + * @method + * @memberof Popper.Utils + * @returns {Boolean} + */ + function isModifierEnabled(modifiers, modifierName) { + return modifiers.some(function (_ref) { + var name = _ref.name, + enabled = _ref.enabled; + return enabled && name === modifierName; + }); + } + + /** + * Get the prefixed supported property name + * @method + * @memberof Popper.Utils + * @argument {String} property (camelCase) + * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix) + */ + function getSupportedPropertyName(property) { + var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O']; + var upperProp = property.charAt(0).toUpperCase() + property.slice(1); + + for (var i = 0; i < prefixes.length; i++) { + var prefix = prefixes[i]; + var toCheck = prefix ? '' + prefix + upperProp : property; + if (typeof document.body.style[toCheck] !== 'undefined') { + return toCheck; + } + } + return null; + } + + /** + * Destroys the popper. + * @method + * @memberof Popper + */ + function destroy() { + this.state.isDestroyed = true; + + // touch DOM only if `applyStyle` modifier is enabled + if (isModifierEnabled(this.modifiers, 'applyStyle')) { + this.popper.removeAttribute('x-placement'); + this.popper.style.position = ''; + this.popper.style.top = ''; + this.popper.style.left = ''; + this.popper.style.right = ''; + this.popper.style.bottom = ''; + this.popper.style.willChange = ''; + this.popper.style[getSupportedPropertyName('transform')] = ''; + } + + this.disableEventListeners(); + + // remove the popper if user explicitly asked for the deletion on destroy + // do not use `remove` because IE11 doesn't support it + if (this.options.removeOnDestroy) { + this.popper.parentNode.removeChild(this.popper); + } + return this; + } + + /** + * Get the window associated with the element + * @argument {Element} element + * @returns {Window} + */ + function getWindow(element) { + var ownerDocument = element.ownerDocument; + return ownerDocument ? ownerDocument.defaultView : window; + } + + function attachToScrollParents(scrollParent, event, callback, scrollParents) { + var isBody = scrollParent.nodeName === 'BODY'; + var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; + target.addEventListener(event, callback, { passive: true }); + + if (!isBody) { + attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents); + } + scrollParents.push(target); + } + + /** + * Setup needed event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ + function setupEventListeners(reference, options, state, updateBound) { + // Resize event listener on window + state.updateBound = updateBound; + getWindow(reference).addEventListener('resize', state.updateBound, { passive: true }); + + // Scroll event listener on scroll parents + var scrollElement = getScrollParent(reference); + attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents); + state.scrollElement = scrollElement; + state.eventsEnabled = true; + + return state; + } + + /** + * It will add resize/scroll events and start recalculating + * position of the popper element when they are triggered. + * @method + * @memberof Popper + */ + function enableEventListeners() { + if (!this.state.eventsEnabled) { + this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate); + } + } + + /** + * Remove event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ + function removeEventListeners(reference, state) { + // Remove resize event listener on window + getWindow(reference).removeEventListener('resize', state.updateBound); + + // Remove scroll event listener on scroll parents + state.scrollParents.forEach(function (target) { + target.removeEventListener('scroll', state.updateBound); + }); + + // Reset state + state.updateBound = null; + state.scrollParents = []; + state.scrollElement = null; + state.eventsEnabled = false; + return state; + } + + /** + * It will remove resize/scroll events and won't recalculate popper position + * when they are triggered. It also won't trigger `onUpdate` callback anymore, + * unless you call `update` method manually. + * @method + * @memberof Popper + */ + function disableEventListeners() { + if (this.state.eventsEnabled) { + cancelAnimationFrame(this.scheduleUpdate); + this.state = removeEventListeners(this.reference, this.state); + } + } + + /** + * Tells if a given input is a number + * @method + * @memberof Popper.Utils + * @param {*} input to check + * @return {Boolean} + */ + function isNumeric(n) { + return n !== '' && !isNaN(parseFloat(n)) && isFinite(n); + } + + /** + * Set the style to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the style to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ + function setStyles(element, styles) { + Object.keys(styles).forEach(function (prop) { + var unit = ''; + // add unit if the value is numeric and is one of the following + if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) { + unit = 'px'; + } + element.style[prop] = styles[prop] + unit; + }); + } + + /** + * Set the attributes to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the attributes to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ + function setAttributes(element, attributes) { + Object.keys(attributes).forEach(function (prop) { + var value = attributes[prop]; + if (value !== false) { + element.setAttribute(prop, attributes[prop]); + } else { + element.removeAttribute(prop); + } + }); + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} data.styles - List of style properties - values to apply to popper element + * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The same data object + */ + function applyStyle(data) { + // any property present in `data.styles` will be applied to the popper, + // in this way we can make the 3rd party modifiers add custom styles to it + // Be aware, modifiers could override the properties defined in the previous + // lines of this modifier! + setStyles(data.instance.popper, data.styles); + + // any property present in `data.attributes` will be applied to the popper, + // they will be set as HTML attributes of the element + setAttributes(data.instance.popper, data.attributes); + + // if arrowElement is defined and arrowStyles has some properties + if (data.arrowElement && Object.keys(data.arrowStyles).length) { + setStyles(data.arrowElement, data.arrowStyles); + } + + return data; + } + + /** + * Set the x-placement attribute before everything else because it could be used + * to add margins to the popper margins needs to be calculated to get the + * correct popper offsets. + * @method + * @memberof Popper.modifiers + * @param {HTMLElement} reference - The reference element used to position the popper + * @param {HTMLElement} popper - The HTML element used as popper + * @param {Object} options - Popper.js options + */ + function applyStyleOnLoad(reference, popper, options, modifierOptions, state) { + // compute reference element offsets + var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding); + + popper.setAttribute('x-placement', placement); + + // Apply `position` to popper before anything else because + // without the position applied we can't guarantee correct computations + setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' }); + + return options; + } + + /** + * @function + * @memberof Popper.Utils + * @argument {Object} data - The data object generated by `update` method + * @argument {Boolean} shouldRound - If the offsets should be rounded at all + * @returns {Object} The popper's position offsets rounded + * + * The tale of pixel-perfect positioning. It's still not 100% perfect, but as + * good as it can be within reason. + * Discussion here: https://github.com/FezVrasta/popper.js/pull/715 + * + * Low DPI screens cause a popper to be blurry if not using full pixels (Safari + * as well on High DPI screens). + * + * Firefox prefers no rounding for positioning and does not have blurriness on + * high DPI screens. + * + * Only horizontal placement and left/right values need to be considered. + */ + function getRoundedOffsets(data, shouldRound) { + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + var round = Math.round, + floor = Math.floor; + + var noRound = function noRound(v) { + return v; + }; + + var referenceWidth = round(reference.width); + var popperWidth = round(popper.width); + + var isVertical = ['left', 'right'].indexOf(data.placement) !== -1; + var isVariation = data.placement.indexOf('-') !== -1; + var sameWidthParity = referenceWidth % 2 === popperWidth % 2; + var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1; + + var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor; + var verticalToInteger = !shouldRound ? noRound : round; + + return { + left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left), + top: verticalToInteger(popper.top), + bottom: verticalToInteger(popper.bottom), + right: horizontalToInteger(popper.right) + }; + } + + var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent); + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function computeStyle(data, options) { + var x = options.x, + y = options.y; + var popper = data.offsets.popper; + + // Remove this legacy support in Popper.js v2 + + var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'applyStyle'; + }).gpuAcceleration; + if (legacyGpuAccelerationOption !== undefined) { + console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); + } + var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration; + + var offsetParent = getOffsetParent(data.instance.popper); + var offsetParentRect = getBoundingClientRect(offsetParent); + + // Styles + var styles = { + position: popper.position + }; + + var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox); + + var sideA = x === 'bottom' ? 'top' : 'bottom'; + var sideB = y === 'right' ? 'left' : 'right'; + + // if gpuAcceleration is set to `true` and transform is supported, + // we use `translate3d` to apply the position to the popper we + // automatically use the supported prefixed version if needed + var prefixedProperty = getSupportedPropertyName('transform'); + + // now, let's make a step back and look at this code closely (wtf?) + // If the content of the popper grows once it's been positioned, it + // may happen that the popper gets misplaced because of the new content + // overflowing its reference element + // To avoid this problem, we provide two options (x and y), which allow + // the consumer to define the offset origin. + // If we position a popper on top of a reference element, we can set + // `x` to `top` to make the popper grow towards its top instead of + // its bottom. + var left = void 0, + top = void 0; + if (sideA === 'bottom') { + // when offsetParent is the positioning is relative to the bottom of the screen (excluding the scrollbar) + // and not the bottom of the html element + if (offsetParent.nodeName === 'HTML') { + top = -offsetParent.clientHeight + offsets.bottom; + } else { + top = -offsetParentRect.height + offsets.bottom; + } + } else { + top = offsets.top; + } + if (sideB === 'right') { + if (offsetParent.nodeName === 'HTML') { + left = -offsetParent.clientWidth + offsets.right; + } else { + left = -offsetParentRect.width + offsets.right; + } + } else { + left = offsets.left; + } + if (gpuAcceleration && prefixedProperty) { + styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'; + styles[sideA] = 0; + styles[sideB] = 0; + styles.willChange = 'transform'; + } else { + // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties + var invertTop = sideA === 'bottom' ? -1 : 1; + var invertLeft = sideB === 'right' ? -1 : 1; + styles[sideA] = top * invertTop; + styles[sideB] = left * invertLeft; + styles.willChange = sideA + ', ' + sideB; + } + + // Attributes + var attributes = { + 'x-placement': data.placement + }; + + // Update `data` attributes, styles and arrowStyles + data.attributes = _extends$1({}, attributes, data.attributes); + data.styles = _extends$1({}, styles, data.styles); + data.arrowStyles = _extends$1({}, data.offsets.arrow, data.arrowStyles); + + return data; + } + + /** + * Helper used to know if the given modifier depends from another one.
+ * It checks if the needed modifier is listed and enabled. + * @method + * @memberof Popper.Utils + * @param {Array} modifiers - list of modifiers + * @param {String} requestingName - name of requesting modifier + * @param {String} requestedName - name of requested modifier + * @returns {Boolean} + */ + function isModifierRequired(modifiers, requestingName, requestedName) { + var requesting = find(modifiers, function (_ref) { + var name = _ref.name; + return name === requestingName; + }); + + var isRequired = !!requesting && modifiers.some(function (modifier) { + return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order; + }); + + if (!isRequired) { + var _requesting = '`' + requestingName + '`'; + var requested = '`' + requestedName + '`'; + console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!'); + } + return isRequired; + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function arrow(data, options) { + var _data$offsets$arrow; + + // arrow depends on keepTogether in order to work + if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { + return data; + } + + var arrowElement = options.element; + + // if arrowElement is a string, suppose it's a CSS selector + if (typeof arrowElement === 'string') { + arrowElement = data.instance.popper.querySelector(arrowElement); + + // if arrowElement is not found, don't run the modifier + if (!arrowElement) { + return data; + } + } else { + // if the arrowElement isn't a query selector we must check that the + // provided DOM node is child of its popper node + if (!data.instance.popper.contains(arrowElement)) { + console.warn('WARNING: `arrow.element` must be child of its popper element!'); + return data; + } + } + + var placement = data.placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isVertical = ['left', 'right'].indexOf(placement) !== -1; + + var len = isVertical ? 'height' : 'width'; + var sideCapitalized = isVertical ? 'Top' : 'Left'; + var side = sideCapitalized.toLowerCase(); + var altSide = isVertical ? 'left' : 'top'; + var opSide = isVertical ? 'bottom' : 'right'; + var arrowElementSize = getOuterSizes(arrowElement)[len]; + + // + // extends keepTogether behavior making sure the popper and its + // reference have enough pixels in conjunction + // + + // top/left side + if (reference[opSide] - arrowElementSize < popper[side]) { + data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); + } + // bottom/right side + if (reference[side] + arrowElementSize > popper[opSide]) { + data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; + } + data.offsets.popper = getClientRect(data.offsets.popper); + + // compute center of the popper + var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; + + // Compute the sideValue using the updated popper offsets + // take popper margin in account because we don't have this info available + var css = getStyleComputedProperty(data.instance.popper); + var popperMarginSide = parseFloat(css['margin' + sideCapitalized]); + var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width']); + var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; + + // prevent arrowElement from being placed not contiguously to its popper + sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0); + + data.arrowElement = arrowElement; + data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow); + + return data; + } + + /** + * Get the opposite placement variation of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement variation + * @returns {String} flipped placement variation + */ + function getOppositeVariation(variation) { + if (variation === 'end') { + return 'start'; + } else if (variation === 'start') { + return 'end'; + } + return variation; + } + + /** + * List of accepted placements to use as values of the `placement` option.
+ * Valid placements are: + * - `auto` + * - `top` + * - `right` + * - `bottom` + * - `left` + * + * Each placement can have a variation from this list: + * - `-start` + * - `-end` + * + * Variations are interpreted easily if you think of them as the left to right + * written languages. Horizontally (`top` and `bottom`), `start` is left and `end` + * is right.
+ * Vertically (`left` and `right`), `start` is top and `end` is bottom. + * + * Some valid examples are: + * - `top-end` (on top of reference, right aligned) + * - `right-start` (on right of reference, top aligned) + * - `bottom` (on bottom, centered) + * - `auto-end` (on the side with more space available, alignment depends by placement) + * + * @static + * @type {Array} + * @enum {String} + * @readonly + * @method placements + * @memberof Popper + */ + var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; + + // Get rid of `auto` `auto-start` and `auto-end` + var validPlacements = placements.slice(3); + + /** + * Given an initial placement, returns all the subsequent placements + * clockwise (or counter-clockwise). + * + * @method + * @memberof Popper.Utils + * @argument {String} placement - A valid placement (it accepts variations) + * @argument {Boolean} counter - Set to true to walk the placements counterclockwise + * @returns {Array} placements including their variations + */ + function clockwise(placement) { + var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var index = validPlacements.indexOf(placement); + var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index)); + return counter ? arr.reverse() : arr; + } + + var BEHAVIORS = { + FLIP: 'flip', + CLOCKWISE: 'clockwise', + COUNTERCLOCKWISE: 'counterclockwise' + }; + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function flip(data, options) { + // if `inner` modifier is enabled, we can't use the `flip` modifier + if (isModifierEnabled(data.instance.modifiers, 'inner')) { + return data; + } + + if (data.flipped && data.placement === data.originalPlacement) { + // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides + return data; + } + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed); + + var placement = data.placement.split('-')[0]; + var placementOpposite = getOppositePlacement(placement); + var variation = data.placement.split('-')[1] || ''; + + var flipOrder = []; + + switch (options.behavior) { + case BEHAVIORS.FLIP: + flipOrder = [placement, placementOpposite]; + break; + case BEHAVIORS.CLOCKWISE: + flipOrder = clockwise(placement); + break; + case BEHAVIORS.COUNTERCLOCKWISE: + flipOrder = clockwise(placement, true); + break; + default: + flipOrder = options.behavior; + } + + flipOrder.forEach(function (step, index) { + if (placement !== step || flipOrder.length === index + 1) { + return data; + } + + placement = data.placement.split('-')[0]; + placementOpposite = getOppositePlacement(placement); + + var popperOffsets = data.offsets.popper; + var refOffsets = data.offsets.reference; + + // using floor because the reference offsets may contain decimals we are not going to consider here + var floor = Math.floor; + var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom); + + var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left); + var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right); + var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top); + var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom); + + var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; + + // flip the variation if required + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + + // flips variation if reference element overflows boundaries + var flippedVariationByRef = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); + + // flips variation if popper content overflows boundaries + var flippedVariationByContent = !!options.flipVariationsByContent && (isVertical && variation === 'start' && overflowsRight || isVertical && variation === 'end' && overflowsLeft || !isVertical && variation === 'start' && overflowsBottom || !isVertical && variation === 'end' && overflowsTop); + + var flippedVariation = flippedVariationByRef || flippedVariationByContent; + + if (overlapsRef || overflowsBoundaries || flippedVariation) { + // this boolean to detect any flip loop + data.flipped = true; + + if (overlapsRef || overflowsBoundaries) { + placement = flipOrder[index + 1]; + } + + if (flippedVariation) { + variation = getOppositeVariation(variation); + } + + data.placement = placement + (variation ? '-' + variation : ''); + + // this object contains `position`, we want to preserve it along with + // any additional property we may add in the future + data.offsets.popper = _extends$1({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement)); + + data = runModifiers(data.instance.modifiers, data, 'flip'); + } + }); + return data; + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function keepTogether(data) { + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var placement = data.placement.split('-')[0]; + var floor = Math.floor; + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + var side = isVertical ? 'right' : 'bottom'; + var opSide = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + if (popper[side] < floor(reference[opSide])) { + data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement]; + } + if (popper[opSide] > floor(reference[side])) { + data.offsets.popper[opSide] = floor(reference[side]); + } + + return data; + } + + /** + * Converts a string containing value + unit into a px value number + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} str - Value + unit string + * @argument {String} measurement - `height` or `width` + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @returns {Number|String} + * Value in pixels, or original string if no values were extracted + */ + function toValue(str, measurement, popperOffsets, referenceOffsets) { + // separate value from unit + var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/); + var value = +split[1]; + var unit = split[2]; + + // If it's not a number it's an operator, I guess + if (!value) { + return str; + } + + if (unit.indexOf('%') === 0) { + var element = void 0; + switch (unit) { + case '%p': + element = popperOffsets; + break; + case '%': + case '%r': + default: + element = referenceOffsets; + } + + var rect = getClientRect(element); + return rect[measurement] / 100 * value; + } else if (unit === 'vh' || unit === 'vw') { + // if is a vh or vw, we calculate the size based on the viewport + var size = void 0; + if (unit === 'vh') { + size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); + } else { + size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); + } + return size / 100 * value; + } else { + // if is an explicit pixel unit, we get rid of the unit and keep the value + // if is an implicit unit, it's px, and we return just the value + return value; + } + } + + /** + * Parse an `offset` string to extrapolate `x` and `y` numeric offsets. + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} offset + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @argument {String} basePlacement + * @returns {Array} a two cells array with x and y offsets in numbers + */ + function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { + var offsets = [0, 0]; + + // Use height if placement is left or right and index is 0 otherwise use width + // in this way the first offset will use an axis and the second one + // will use the other one + var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; + + // Split the offset string to obtain a list of values and operands + // The regex addresses values with the plus or minus sign in front (+10, -20, etc) + var fragments = offset.split(/(\+|\-)/).map(function (frag) { + return frag.trim(); + }); + + // Detect if the offset string contains a pair of values or a single one + // they could be separated by comma or space + var divider = fragments.indexOf(find(fragments, function (frag) { + return frag.search(/,|\s/) !== -1; + })); + + if (fragments[divider] && fragments[divider].indexOf(',') === -1) { + console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); + } + + // If divider is found, we divide the list of values and operands to divide + // them by ofset X and Y. + var splitRegex = /\s*,\s*|\s+/; + var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; + + // Convert the values with units to absolute pixels to allow our computations + ops = ops.map(function (op, index) { + // Most of the units rely on the orientation of the popper + var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; + var mergeWithPrevious = false; + return op + // This aggregates any `+` or `-` sign that aren't considered operators + // e.g.: 10 + +5 => [10, +, +5] + .reduce(function (a, b) { + if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { + a[a.length - 1] = b; + mergeWithPrevious = true; + return a; + } else if (mergeWithPrevious) { + a[a.length - 1] += b; + mergeWithPrevious = false; + return a; + } else { + return a.concat(b); + } + }, []) + // Here we convert the string values into number values (in px) + .map(function (str) { + return toValue(str, measurement, popperOffsets, referenceOffsets); + }); + }); + + // Loop trough the offsets arrays and execute the operations + ops.forEach(function (op, index) { + op.forEach(function (frag, index2) { + if (isNumeric(frag)) { + offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); + } + }); + }); + return offsets; + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @argument {Number|String} options.offset=0 + * The offset value as described in the modifier description + * @returns {Object} The data object, properly modified + */ + function offset(data, _ref) { + var offset = _ref.offset; + var placement = data.placement, + _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var basePlacement = placement.split('-')[0]; + + var offsets = void 0; + if (isNumeric(+offset)) { + offsets = [+offset, 0]; + } else { + offsets = parseOffset(offset, popper, reference, basePlacement); + } + + if (basePlacement === 'left') { + popper.top += offsets[0]; + popper.left -= offsets[1]; + } else if (basePlacement === 'right') { + popper.top += offsets[0]; + popper.left += offsets[1]; + } else if (basePlacement === 'top') { + popper.left += offsets[0]; + popper.top -= offsets[1]; + } else if (basePlacement === 'bottom') { + popper.left += offsets[0]; + popper.top += offsets[1]; + } + + data.popper = popper; + return data; + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function preventOverflow(data, options) { + var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); + + // If offsetParent is the reference element, we really want to + // go one step up and use the next offsetParent as reference to + // avoid to make this modifier completely useless and look like broken + if (data.instance.reference === boundariesElement) { + boundariesElement = getOffsetParent(boundariesElement); + } + + // NOTE: DOM access here + // resets the popper's position so that the document size can be calculated excluding + // the size of the popper element itself + var transformProp = getSupportedPropertyName('transform'); + var popperStyles = data.instance.popper.style; // assignment to help minification + var top = popperStyles.top, + left = popperStyles.left, + transform = popperStyles[transformProp]; + + popperStyles.top = ''; + popperStyles.left = ''; + popperStyles[transformProp] = ''; + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); + + // NOTE: DOM access here + // restores the original style properties after the offsets have been computed + popperStyles.top = top; + popperStyles.left = left; + popperStyles[transformProp] = transform; + + options.boundaries = boundaries; + + var order = options.priority; + var popper = data.offsets.popper; + + var check = { + primary: function primary(placement) { + var value = popper[placement]; + if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { + value = Math.max(popper[placement], boundaries[placement]); + } + return defineProperty({}, placement, value); + }, + secondary: function secondary(placement) { + var mainSide = placement === 'right' ? 'left' : 'top'; + var value = popper[mainSide]; + if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { + value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); + } + return defineProperty({}, mainSide, value); + } + }; + + order.forEach(function (placement) { + var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; + popper = _extends$1({}, popper, check[side](placement)); + }); + + data.offsets.popper = popper; + + return data; + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function shift(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var shiftvariation = placement.split('-')[1]; + + // if shift shiftvariation is specified, run the modifier + if (shiftvariation) { + var _data$offsets = data.offsets, + reference = _data$offsets.reference, + popper = _data$offsets.popper; + + var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1; + var side = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + var shiftOffsets = { + start: defineProperty({}, side, reference[side]), + end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement]) + }; + + data.offsets.popper = _extends$1({}, popper, shiftOffsets[shiftvariation]); + } + + return data; + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function hide(data) { + if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) { + return data; + } + + var refRect = data.offsets.reference; + var bound = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'preventOverflow'; + }).boundaries; + + if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === true) { + return data; + } + + data.hide = true; + data.attributes['x-out-of-boundaries'] = ''; + } else { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === false) { + return data; + } + + data.hide = false; + data.attributes['x-out-of-boundaries'] = false; + } + + return data; + } + + /** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ + function inner(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1; + + var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1; + + popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0); + + data.placement = getOppositePlacement(placement); + data.offsets.popper = getClientRect(popper); + + return data; + } + + /** + * Modifier function, each modifier can have a function of this type assigned + * to its `fn` property.
+ * These functions will be called on each update, this means that you must + * make sure they are performant enough to avoid performance bottlenecks. + * + * @function ModifierFn + * @argument {dataObject} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {dataObject} The data object, properly modified + */ + + /** + * Modifiers are plugins used to alter the behavior of your poppers.
+ * Popper.js uses a set of 9 modifiers to provide all the basic functionalities + * needed by the library. + * + * Usually you don't want to override the `order`, `fn` and `onLoad` props. + * All the other properties are configurations that could be tweaked. + * @namespace modifiers + */ + var modifiers = { + /** + * Modifier used to shift the popper on the start or end of its reference + * element.
+ * It will read the variation of the `placement` property.
+ * It can be one either `-end` or `-start`. + * @memberof modifiers + * @inner + */ + shift: { + /** @prop {number} order=100 - Index used to define the order of execution */ + order: 100, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: shift + }, + + /** + * The `offset` modifier can shift your popper on both its axis. + * + * It accepts the following units: + * - `px` or unit-less, interpreted as pixels + * - `%` or `%r`, percentage relative to the length of the reference element + * - `%p`, percentage relative to the length of the popper element + * - `vw`, CSS viewport width unit + * - `vh`, CSS viewport height unit + * + * For length is intended the main axis relative to the placement of the popper.
+ * This means that if the placement is `top` or `bottom`, the length will be the + * `width`. In case of `left` or `right`, it will be the `height`. + * + * You can provide a single value (as `Number` or `String`), or a pair of values + * as `String` divided by a comma or one (or more) white spaces.
+ * The latter is a deprecated method because it leads to confusion and will be + * removed in v2.
+ * Additionally, it accepts additions and subtractions between different units. + * Note that multiplications and divisions aren't supported. + * + * Valid examples are: + * ``` + * 10 + * '10%' + * '10, 10' + * '10%, 10' + * '10 + 10%' + * '10 - 5vh + 3%' + * '-10px + 5vh, 5px - 6%' + * ``` + * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap + * > with their reference element, unfortunately, you will have to disable the `flip` modifier. + * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373). + * + * @memberof modifiers + * @inner + */ + offset: { + /** @prop {number} order=200 - Index used to define the order of execution */ + order: 200, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: offset, + /** @prop {Number|String} offset=0 + * The offset value as described in the modifier description + */ + offset: 0 + }, + + /** + * Modifier used to prevent the popper from being positioned outside the boundary. + * + * A scenario exists where the reference itself is not within the boundaries.
+ * We can say it has "escaped the boundaries" — or just "escaped".
+ * In this case we need to decide whether the popper should either: + * + * - detach from the reference and remain "trapped" in the boundaries, or + * - if it should ignore the boundary and "escape with its reference" + * + * When `escapeWithReference` is set to`true` and reference is completely + * outside its boundaries, the popper will overflow (or completely leave) + * the boundaries in order to remain attached to the edge of the reference. + * + * @memberof modifiers + * @inner + */ + preventOverflow: { + /** @prop {number} order=300 - Index used to define the order of execution */ + order: 300, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: preventOverflow, + /** + * @prop {Array} [priority=['left','right','top','bottom']] + * Popper will try to prevent overflow following these priorities by default, + * then, it could overflow on the left and on top of the `boundariesElement` + */ + priority: ['left', 'right', 'top', 'bottom'], + /** + * @prop {number} padding=5 + * Amount of pixel used to define a minimum distance between the boundaries + * and the popper. This makes sure the popper always has a little padding + * between the edges of its container + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='scrollParent' + * Boundaries used by the modifier. Can be `scrollParent`, `window`, + * `viewport` or any DOM element. + */ + boundariesElement: 'scrollParent' + }, + + /** + * Modifier used to make sure the reference and its popper stay near each other + * without leaving any gap between the two. Especially useful when the arrow is + * enabled and you want to ensure that it points to its reference element. + * It cares only about the first axis. You can still have poppers with margin + * between the popper and its reference element. + * @memberof modifiers + * @inner + */ + keepTogether: { + /** @prop {number} order=400 - Index used to define the order of execution */ + order: 400, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: keepTogether + }, + + /** + * This modifier is used to move the `arrowElement` of the popper to make + * sure it is positioned between the reference element and its popper element. + * It will read the outer size of the `arrowElement` node to detect how many + * pixels of conjunction are needed. + * + * It has no effect if no `arrowElement` is provided. + * @memberof modifiers + * @inner + */ + arrow: { + /** @prop {number} order=500 - Index used to define the order of execution */ + order: 500, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: arrow, + /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */ + element: '[x-arrow]' + }, + + /** + * Modifier used to flip the popper's placement when it starts to overlap its + * reference element. + * + * Requires the `preventOverflow` modifier before it in order to work. + * + * **NOTE:** this modifier will interrupt the current update cycle and will + * restart it if it detects the need to flip the placement. + * @memberof modifiers + * @inner + */ + flip: { + /** @prop {number} order=600 - Index used to define the order of execution */ + order: 600, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: flip, + /** + * @prop {String|Array} behavior='flip' + * The behavior used to change the popper's placement. It can be one of + * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid + * placements (with optional variations) + */ + behavior: 'flip', + /** + * @prop {number} padding=5 + * The popper will flip if it hits the edges of the `boundariesElement` + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='viewport' + * The element which will define the boundaries of the popper position. + * The popper will never be placed outside of the defined boundaries + * (except if `keepTogether` is enabled) + */ + boundariesElement: 'viewport', + /** + * @prop {Boolean} flipVariations=false + * The popper will switch placement variation between `-start` and `-end` when + * the reference element overlaps its boundaries. + * + * The original placement should have a set variation. + */ + flipVariations: false, + /** + * @prop {Boolean} flipVariationsByContent=false + * The popper will switch placement variation between `-start` and `-end` when + * the popper element overlaps its reference boundaries. + * + * The original placement should have a set variation. + */ + flipVariationsByContent: false + }, + + /** + * Modifier used to make the popper flow toward the inner of the reference element. + * By default, when this modifier is disabled, the popper will be placed outside + * the reference element. + * @memberof modifiers + * @inner + */ + inner: { + /** @prop {number} order=700 - Index used to define the order of execution */ + order: 700, + /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */ + enabled: false, + /** @prop {ModifierFn} */ + fn: inner + }, + + /** + * Modifier used to hide the popper when its reference element is outside of the + * popper boundaries. It will set a `x-out-of-boundaries` attribute which can + * be used to hide with a CSS selector the popper when its reference is + * out of boundaries. + * + * Requires the `preventOverflow` modifier before it in order to work. + * @memberof modifiers + * @inner + */ + hide: { + /** @prop {number} order=800 - Index used to define the order of execution */ + order: 800, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: hide + }, + + /** + * Computes the style that will be applied to the popper element to gets + * properly positioned. + * + * Note that this modifier will not touch the DOM, it just prepares the styles + * so that `applyStyle` modifier can apply it. This separation is useful + * in case you need to replace `applyStyle` with a custom implementation. + * + * This modifier has `850` as `order` value to maintain backward compatibility + * with previous versions of Popper.js. Expect the modifiers ordering method + * to change in future major versions of the library. + * + * @memberof modifiers + * @inner + */ + computeStyle: { + /** @prop {number} order=850 - Index used to define the order of execution */ + order: 850, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: computeStyle, + /** + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: true, + /** + * @prop {string} [x='bottom'] + * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin. + * Change this if your popper should grow in a direction different from `bottom` + */ + x: 'bottom', + /** + * @prop {string} [x='left'] + * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin. + * Change this if your popper should grow in a direction different from `right` + */ + y: 'right' + }, + + /** + * Applies the computed styles to the popper element. + * + * All the DOM manipulations are limited to this modifier. This is useful in case + * you want to integrate Popper.js inside a framework or view library and you + * want to delegate all the DOM manipulations to it. + * + * Note that if you disable this modifier, you must make sure the popper element + * has its position set to `absolute` before Popper.js can do its work! + * + * Just disable this modifier and define your own to achieve the desired effect. + * + * @memberof modifiers + * @inner + */ + applyStyle: { + /** @prop {number} order=900 - Index used to define the order of execution */ + order: 900, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: applyStyle, + /** @prop {Function} */ + onLoad: applyStyleOnLoad, + /** + * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: undefined + } + }; + + /** + * The `dataObject` is an object containing all the information used by Popper.js. + * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks. + * @name dataObject + * @property {Object} data.instance The Popper.js instance + * @property {String} data.placement Placement applied to popper + * @property {String} data.originalPlacement Placement originally defined on init + * @property {Boolean} data.flipped True if popper has been flipped by flip modifier + * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper + * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier + * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.boundaries Offsets of the popper boundaries + * @property {Object} data.offsets The measurements of popper, reference and arrow elements + * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 + */ + + /** + * Default options provided to Popper.js constructor.
+ * These can be overridden using the `options` argument of Popper.js.
+ * To override an option, simply pass an object with the same + * structure of the `options` object, as the 3rd argument. For example: + * ``` + * new Popper(ref, pop, { + * modifiers: { + * preventOverflow: { enabled: false } + * } + * }) + * ``` + * @type {Object} + * @static + * @memberof Popper + */ + var Defaults = { + /** + * Popper's placement. + * @prop {Popper.placements} placement='bottom' + */ + placement: 'bottom', + + /** + * Set this to true if you want popper to position it self in 'fixed' mode + * @prop {Boolean} positionFixed=false + */ + positionFixed: false, + + /** + * Whether events (resize, scroll) are initially enabled. + * @prop {Boolean} eventsEnabled=true + */ + eventsEnabled: true, + + /** + * Set to true if you want to automatically remove the popper when + * you call the `destroy` method. + * @prop {Boolean} removeOnDestroy=false + */ + removeOnDestroy: false, + + /** + * Callback called when the popper is created.
+ * By default, it is set to no-op.
+ * Access Popper.js instance with `data.instance`. + * @prop {onCreate} + */ + onCreate: function onCreate() {}, + + /** + * Callback called when the popper is updated. This callback is not called + * on the initialization/creation of the popper, but only on subsequent + * updates.
+ * By default, it is set to no-op.
+ * Access Popper.js instance with `data.instance`. + * @prop {onUpdate} + */ + onUpdate: function onUpdate() {}, + + /** + * List of modifiers used to modify the offsets before they are applied to the popper. + * They provide most of the functionalities of Popper.js. + * @prop {modifiers} + */ + modifiers: modifiers + }; + + /** + * @callback onCreate + * @param {dataObject} data + */ + + /** + * @callback onUpdate + * @param {dataObject} data + */ + + // Utils + // Methods + var Popper = function () { + /** + * Creates a new Popper.js instance. + * @class Popper + * @param {Element|referenceObject} reference - The reference element used to position the popper + * @param {Element} popper - The HTML / XML element used as the popper + * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) + * @return {Object} instance - The generated Popper.js instance + */ + function Popper(reference, popper) { + var _this = this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + classCallCheck(this, Popper); + + this.scheduleUpdate = function () { + return requestAnimationFrame(_this.update); + }; + + // make update() debounced, so that it only runs at most once-per-tick + this.update = debounce(this.update.bind(this)); + + // with {} we create a new object with the options inside it + this.options = _extends$1({}, Popper.Defaults, options); + + // init state + this.state = { + isDestroyed: false, + isCreated: false, + scrollParents: [] + }; + + // get reference and popper elements (allow jQuery wrappers) + this.reference = reference && reference.jquery ? reference[0] : reference; + this.popper = popper && popper.jquery ? popper[0] : popper; + + // Deep merge modifiers options + this.options.modifiers = {}; + Object.keys(_extends$1({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) { + _this.options.modifiers[name] = _extends$1({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {}); + }); + + // Refactoring modifiers' list (Object => Array) + this.modifiers = Object.keys(this.options.modifiers).map(function (name) { + return _extends$1({ + name: name + }, _this.options.modifiers[name]); + }) + // sort the modifiers by order + .sort(function (a, b) { + return a.order - b.order; + }); + + // modifiers have the ability to execute arbitrary code when Popper.js get inited + // such code is executed in the same order of its modifier + // they could add new properties to their options configuration + // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`! + this.modifiers.forEach(function (modifierOptions) { + if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) { + modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state); + } + }); + + // fire the first update to position the popper in the right place + this.update(); + + var eventsEnabled = this.options.eventsEnabled; + if (eventsEnabled) { + // setup event listeners, they will take care of update the position in specific situations + this.enableEventListeners(); + } + + this.state.eventsEnabled = eventsEnabled; + } + + // We can't use class properties because they don't get listed in the + // class prototype and break stuff like Sinon stubs + + + createClass(Popper, [{ + key: 'update', + value: function update$$1() { + return update.call(this); + } + }, { + key: 'destroy', + value: function destroy$$1() { + return destroy.call(this); + } + }, { + key: 'enableEventListeners', + value: function enableEventListeners$$1() { + return enableEventListeners.call(this); + } + }, { + key: 'disableEventListeners', + value: function disableEventListeners$$1() { + return disableEventListeners.call(this); + } + + /** + * Schedules an update. It will run on the next UI update available. + * @method scheduleUpdate + * @memberof Popper + */ + + + /** + * Collection of utilities useful when writing custom modifiers. + * Starting from version 1.7, this method is available only if you + * include `popper-utils.js` before `popper.js`. + * + * **DEPRECATION**: This way to access PopperUtils is deprecated + * and will be removed in v2! Use the PopperUtils module directly instead. + * Due to the high instability of the methods contained in Utils, we can't + * guarantee them to follow semver. Use them at your own risk! + * @static + * @private + * @type {Object} + * @deprecated since version 1.8 + * @member Utils + * @memberof Popper + */ + + }]); + return Popper; + }(); + + /** + * The `referenceObject` is an object that provides an interface compatible with Popper.js + * and lets you use it as replacement of a real DOM node.
+ * You can use this method to position a popper relatively to a set of coordinates + * in case you don't have a DOM node to use as reference. + * + * ``` + * new Popper(referenceObject, popperNode); + * ``` + * + * NB: This feature isn't supported in Internet Explorer 10. + * @name referenceObject + * @property {Function} data.getBoundingClientRect + * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. + * @property {number} data.clientWidth + * An ES6 getter that will return the width of the virtual reference element. + * @property {number} data.clientHeight + * An ES6 getter that will return the height of the virtual reference element. + */ + + + Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils; + Popper.placements = placements; + Popper.Defaults = Defaults; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$4 = 'dropdown'; + var VERSION$4 = '4.6.0'; + var DATA_KEY$4 = 'bs.dropdown'; + var EVENT_KEY$4 = "." + DATA_KEY$4; + var DATA_API_KEY$4 = '.data-api'; + var JQUERY_NO_CONFLICT$4 = $__default['default'].fn[NAME$4]; + var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key + + var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key + + var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key + + var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key + + var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key + + var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) + + var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); + var EVENT_HIDE$1 = "hide" + EVENT_KEY$4; + var EVENT_HIDDEN$1 = "hidden" + EVENT_KEY$4; + var EVENT_SHOW$1 = "show" + EVENT_KEY$4; + var EVENT_SHOWN$1 = "shown" + EVENT_KEY$4; + var EVENT_CLICK = "click" + EVENT_KEY$4; + var EVENT_CLICK_DATA_API$4 = "click" + EVENT_KEY$4 + DATA_API_KEY$4; + var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY$4 + DATA_API_KEY$4; + var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY$4 + DATA_API_KEY$4; + var CLASS_NAME_DISABLED = 'disabled'; + var CLASS_NAME_SHOW$2 = 'show'; + var CLASS_NAME_DROPUP = 'dropup'; + var CLASS_NAME_DROPRIGHT = 'dropright'; + var CLASS_NAME_DROPLEFT = 'dropleft'; + var CLASS_NAME_MENURIGHT = 'dropdown-menu-right'; + var CLASS_NAME_POSITION_STATIC = 'position-static'; + var SELECTOR_DATA_TOGGLE$2 = '[data-toggle="dropdown"]'; + var SELECTOR_FORM_CHILD = '.dropdown form'; + var SELECTOR_MENU = '.dropdown-menu'; + var SELECTOR_NAVBAR_NAV = '.navbar-nav'; + var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; + var PLACEMENT_TOP = 'top-start'; + var PLACEMENT_TOPEND = 'top-end'; + var PLACEMENT_BOTTOM = 'bottom-start'; + var PLACEMENT_BOTTOMEND = 'bottom-end'; + var PLACEMENT_RIGHT = 'right-start'; + var PLACEMENT_LEFT = 'left-start'; + var Default$2 = { + offset: 0, + flip: true, + boundary: 'scrollParent', + reference: 'toggle', + display: 'dynamic', + popperConfig: null + }; + var DefaultType$2 = { + offset: '(number|string|function)', + flip: 'boolean', + boundary: '(string|element)', + reference: '(string|element)', + display: 'string', + popperConfig: '(null|object)' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Dropdown = /*#__PURE__*/function () { + function Dropdown(element, config) { + this._element = element; + this._popper = null; + this._config = this._getConfig(config); + this._menu = this._getMenuElement(); + this._inNavbar = this._detectNavbar(); + + this._addEventListeners(); + } // Getters + + + var _proto = Dropdown.prototype; + + // Public + _proto.toggle = function toggle() { + if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) { + return; + } + + var isActive = $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2); + + Dropdown._clearMenus(); + + if (isActive) { + return; + } + + this.show(true); + }; + + _proto.show = function show(usePopper) { + if (usePopper === void 0) { + usePopper = false; + } + + if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var showEvent = $__default['default'].Event(EVENT_SHOW$1, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $__default['default'](parent).trigger(showEvent); + + if (showEvent.isDefaultPrevented()) { + return; + } // Totally disable Popper for Dropdowns in Navbar + + + if (!this._inNavbar && usePopper) { + /** + * Check for Popper dependency + * Popper - https://popper.js.org + */ + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); + } + + var referenceElement = this._element; + + if (this._config.reference === 'parent') { + referenceElement = parent; + } else if (Util.isElement(this._config.reference)) { + referenceElement = this._config.reference; // Check if it's jQuery element + + if (typeof this._config.reference.jquery !== 'undefined') { + referenceElement = this._config.reference[0]; + } + } // If boundary is not `scrollParent`, then set position to `static` + // to allow the menu to "escape" the scroll parent's boundaries + // https://github.com/twbs/bootstrap/issues/24251 + + + if (this._config.boundary !== 'scrollParent') { + $__default['default'](parent).addClass(CLASS_NAME_POSITION_STATIC); + } + + this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()); + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement && $__default['default'](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) { + $__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop); + } + + this._element.focus(); + + this._element.setAttribute('aria-expanded', true); + + $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW$2); + $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_SHOWN$1, relatedTarget)); + }; + + _proto.hide = function hide() { + if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default['default'](this._menu).hasClass(CLASS_NAME_SHOW$2)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var hideEvent = $__default['default'].Event(EVENT_HIDE$1, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $__default['default'](parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + if (this._popper) { + this._popper.destroy(); + } + + $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW$2); + $__default['default'](parent).toggleClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, relatedTarget)); + }; + + _proto.dispose = function dispose() { + $__default['default'].removeData(this._element, DATA_KEY$4); + $__default['default'](this._element).off(EVENT_KEY$4); + this._element = null; + this._menu = null; + + if (this._popper !== null) { + this._popper.destroy(); + + this._popper = null; + } + }; + + _proto.update = function update() { + this._inNavbar = this._detectNavbar(); + + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Private + ; + + _proto._addEventListeners = function _addEventListeners() { + var _this = this; + + $__default['default'](this._element).on(EVENT_CLICK, function (event) { + event.preventDefault(); + event.stopPropagation(); + + _this.toggle(); + }); + }; + + _proto._getConfig = function _getConfig(config) { + config = _extends({}, this.constructor.Default, $__default['default'](this._element).data(), config); + Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType); + return config; + }; + + _proto._getMenuElement = function _getMenuElement() { + if (!this._menu) { + var parent = Dropdown._getParentFromElement(this._element); + + if (parent) { + this._menu = parent.querySelector(SELECTOR_MENU); + } + } + + return this._menu; + }; + + _proto._getPlacement = function _getPlacement() { + var $parentDropdown = $__default['default'](this._element.parentNode); + var placement = PLACEMENT_BOTTOM; // Handle dropup + + if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) { + placement = $__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP; + } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) { + placement = PLACEMENT_RIGHT; + } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) { + placement = PLACEMENT_LEFT; + } else if ($__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT)) { + placement = PLACEMENT_BOTTOMEND; + } + + return placement; + }; + + _proto._detectNavbar = function _detectNavbar() { + return $__default['default'](this._element).closest('.navbar').length > 0; + }; + + _proto._getOffset = function _getOffset() { + var _this2 = this; + + var offset = {}; + + if (typeof this._config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {}); + return data; + }; + } else { + offset.offset = this._config.offset; + } + + return offset; + }; + + _proto._getPopperConfig = function _getPopperConfig() { + var popperConfig = { + placement: this._getPlacement(), + modifiers: { + offset: this._getOffset(), + flip: { + enabled: this._config.flip + }, + preventOverflow: { + boundariesElement: this._config.boundary + } + } + }; // Disable Popper if we have a static display + + if (this._config.display === 'static') { + popperConfig.modifiers.applyStyle = { + enabled: false + }; + } + + return _extends({}, popperConfig, this._config.popperConfig); + } // Static + ; + + Dropdown._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $__default['default'](this).data(DATA_KEY$4); + + var _config = typeof config === 'object' ? config : null; + + if (!data) { + data = new Dropdown(this, _config); + $__default['default'](this).data(DATA_KEY$4, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + Dropdown._clearMenus = function _clearMenus(event) { + if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { + return; + } + + var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2)); + + for (var i = 0, len = toggles.length; i < len; i++) { + var parent = Dropdown._getParentFromElement(toggles[i]); + + var context = $__default['default'](toggles[i]).data(DATA_KEY$4); + var relatedTarget = { + relatedTarget: toggles[i] + }; + + if (event && event.type === 'click') { + relatedTarget.clickEvent = event; + } + + if (!context) { + continue; + } + + var dropdownMenu = context._menu; + + if (!$__default['default'](parent).hasClass(CLASS_NAME_SHOW$2)) { + continue; + } + + if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default['default'].contains(parent, event.target)) { + continue; + } + + var hideEvent = $__default['default'].Event(EVENT_HIDE$1, relatedTarget); + $__default['default'](parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + continue; + } // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + + if ('ontouchstart' in document.documentElement) { + $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop); + } + + toggles[i].setAttribute('aria-expanded', 'false'); + + if (context._popper) { + context._popper.destroy(); + } + + $__default['default'](dropdownMenu).removeClass(CLASS_NAME_SHOW$2); + $__default['default'](parent).removeClass(CLASS_NAME_SHOW$2).trigger($__default['default'].Event(EVENT_HIDDEN$1, relatedTarget)); + } + }; + + Dropdown._getParentFromElement = function _getParentFromElement(element) { + var parent; + var selector = Util.getSelectorFromElement(element); + + if (selector) { + parent = document.querySelector(selector); + } + + return parent || element.parentNode; + } // eslint-disable-next-line complexity + ; + + Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { + // If not input/textarea: + // - And not a key in REGEXP_KEYDOWN => not a dropdown command + // If input/textarea: + // - If space key => not a dropdown command + // - If key is other than escape + // - If key is not up or down => not a dropdown command + // - If trigger inside the menu => not a dropdown command + if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default['default'](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { + return; + } + + if (this.disabled || $__default['default'](this).hasClass(CLASS_NAME_DISABLED)) { + return; + } + + var parent = Dropdown._getParentFromElement(this); + + var isActive = $__default['default'](parent).hasClass(CLASS_NAME_SHOW$2); + + if (!isActive && event.which === ESCAPE_KEYCODE) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) { + if (event.which === ESCAPE_KEYCODE) { + $__default['default'](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus'); + } + + $__default['default'](this).trigger('click'); + return; + } + + var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) { + return $__default['default'](item).is(':visible'); + }); + + if (items.length === 0) { + return; + } + + var index = items.indexOf(event.target); + + if (event.which === ARROW_UP_KEYCODE && index > 0) { + // Up + index--; + } + + if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { + // Down + index++; + } + + if (index < 0) { + index = 0; + } + + items[index].focus(); + }; + + _createClass(Dropdown, null, [{ + key: "VERSION", + get: function get() { + return VERSION$4; + } + }, { + key: "Default", + get: function get() { + return Default$2; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$2; + } + }]); + + return Dropdown; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $__default['default'](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$4 + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$2, function (event) { + event.preventDefault(); + event.stopPropagation(); + + Dropdown._jQueryInterface.call($__default['default'](this), 'toggle'); + }).on(EVENT_CLICK_DATA_API$4, SELECTOR_FORM_CHILD, function (e) { + e.stopPropagation(); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $__default['default'].fn[NAME$4] = Dropdown._jQueryInterface; + $__default['default'].fn[NAME$4].Constructor = Dropdown; + + $__default['default'].fn[NAME$4].noConflict = function () { + $__default['default'].fn[NAME$4] = JQUERY_NO_CONFLICT$4; + return Dropdown._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$5 = 'modal'; + var VERSION$5 = '4.6.0'; + var DATA_KEY$5 = 'bs.modal'; + var EVENT_KEY$5 = "." + DATA_KEY$5; + var DATA_API_KEY$5 = '.data-api'; + var JQUERY_NO_CONFLICT$5 = $__default['default'].fn[NAME$5]; + var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key + + var Default$3 = { + backdrop: true, + keyboard: true, + focus: true, + show: true + }; + var DefaultType$3 = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean', + show: 'boolean' + }; + var EVENT_HIDE$2 = "hide" + EVENT_KEY$5; + var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY$5; + var EVENT_HIDDEN$2 = "hidden" + EVENT_KEY$5; + var EVENT_SHOW$2 = "show" + EVENT_KEY$5; + var EVENT_SHOWN$2 = "shown" + EVENT_KEY$5; + var EVENT_FOCUSIN = "focusin" + EVENT_KEY$5; + var EVENT_RESIZE = "resize" + EVENT_KEY$5; + var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY$5; + var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY$5; + var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY$5; + var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY$5; + var EVENT_CLICK_DATA_API$5 = "click" + EVENT_KEY$5 + DATA_API_KEY$5; + var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'; + var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'; + var CLASS_NAME_BACKDROP = 'modal-backdrop'; + var CLASS_NAME_OPEN = 'modal-open'; + var CLASS_NAME_FADE$1 = 'fade'; + var CLASS_NAME_SHOW$3 = 'show'; + var CLASS_NAME_STATIC = 'modal-static'; + var SELECTOR_DIALOG = '.modal-dialog'; + var SELECTOR_MODAL_BODY = '.modal-body'; + var SELECTOR_DATA_TOGGLE$3 = '[data-toggle="modal"]'; + var SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]'; + var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; + var SELECTOR_STICKY_CONTENT = '.sticky-top'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Modal = /*#__PURE__*/function () { + function Modal(element, config) { + this._config = this._getConfig(config); + this._element = element; + this._dialog = element.querySelector(SELECTOR_DIALOG); + this._backdrop = null; + this._isShown = false; + this._isBodyOverflowing = false; + this._ignoreBackdropClick = false; + this._isTransitioning = false; + this._scrollbarWidth = 0; + } // Getters + + + var _proto = Modal.prototype; + + // Public + _proto.toggle = function toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + }; + + _proto.show = function show(relatedTarget) { + var _this = this; + + if (this._isShown || this._isTransitioning) { + return; + } + + if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE$1)) { + this._isTransitioning = true; + } + + var showEvent = $__default['default'].Event(EVENT_SHOW$2, { + relatedTarget: relatedTarget + }); + $__default['default'](this._element).trigger(showEvent); + + if (this._isShown || showEvent.isDefaultPrevented()) { + return; + } + + this._isShown = true; + + this._checkScrollbar(); + + this._setScrollbar(); + + this._adjustDialog(); + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $__default['default'](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function (event) { + return _this.hide(event); + }); + $__default['default'](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () { + $__default['default'](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) { + if ($__default['default'](event.target).is(_this._element)) { + _this._ignoreBackdropClick = true; + } + }); + }); + + this._showBackdrop(function () { + return _this._showElement(relatedTarget); + }); + }; + + _proto.hide = function hide(event) { + var _this2 = this; + + if (event) { + event.preventDefault(); + } + + if (!this._isShown || this._isTransitioning) { + return; + } + + var hideEvent = $__default['default'].Event(EVENT_HIDE$2); + $__default['default'](this._element).trigger(hideEvent); + + if (!this._isShown || hideEvent.isDefaultPrevented()) { + return; + } + + this._isShown = false; + var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1); + + if (transition) { + this._isTransitioning = true; + } + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $__default['default'](document).off(EVENT_FOCUSIN); + $__default['default'](this._element).removeClass(CLASS_NAME_SHOW$3); + $__default['default'](this._element).off(EVENT_CLICK_DISMISS); + $__default['default'](this._dialog).off(EVENT_MOUSEDOWN_DISMISS); + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $__default['default'](this._element).one(Util.TRANSITION_END, function (event) { + return _this2._hideModal(event); + }).emulateTransitionEnd(transitionDuration); + } else { + this._hideModal(); + } + }; + + _proto.dispose = function dispose() { + [window, this._element, this._dialog].forEach(function (htmlElement) { + return $__default['default'](htmlElement).off(EVENT_KEY$5); + }); + /** + * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` + * Do not move `document` in `htmlElements` array + * It will remove `EVENT_CLICK_DATA_API` event that should remain + */ + + $__default['default'](document).off(EVENT_FOCUSIN); + $__default['default'].removeData(this._element, DATA_KEY$5); + this._config = null; + this._element = null; + this._dialog = null; + this._backdrop = null; + this._isShown = null; + this._isBodyOverflowing = null; + this._ignoreBackdropClick = null; + this._isTransitioning = null; + this._scrollbarWidth = null; + }; + + _proto.handleUpdate = function handleUpdate() { + this._adjustDialog(); + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _extends({}, Default$3, config); + Util.typeCheckConfig(NAME$5, config, DefaultType$3); + return config; + }; + + _proto._triggerBackdropTransition = function _triggerBackdropTransition() { + var _this3 = this; + + var hideEventPrevented = $__default['default'].Event(EVENT_HIDE_PREVENTED); + $__default['default'](this._element).trigger(hideEventPrevented); + + if (hideEventPrevented.isDefaultPrevented()) { + return; + } + + var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + if (!isModalOverflowing) { + this._element.style.overflowY = 'hidden'; + } + + this._element.classList.add(CLASS_NAME_STATIC); + + var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog); + $__default['default'](this._element).off(Util.TRANSITION_END); + $__default['default'](this._element).one(Util.TRANSITION_END, function () { + _this3._element.classList.remove(CLASS_NAME_STATIC); + + if (!isModalOverflowing) { + $__default['default'](_this3._element).one(Util.TRANSITION_END, function () { + _this3._element.style.overflowY = ''; + }).emulateTransitionEnd(_this3._element, modalTransitionDuration); + } + }).emulateTransitionEnd(modalTransitionDuration); + + this._element.focus(); + }; + + _proto._showElement = function _showElement(relatedTarget) { + var _this4 = this; + + var transition = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1); + var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null; + + if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { + // Don't move modal's DOM position + document.body.appendChild(this._element); + } + + this._element.style.display = 'block'; + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + this._element.setAttribute('role', 'dialog'); + + if ($__default['default'](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) { + modalBody.scrollTop = 0; + } else { + this._element.scrollTop = 0; + } + + if (transition) { + Util.reflow(this._element); + } + + $__default['default'](this._element).addClass(CLASS_NAME_SHOW$3); + + if (this._config.focus) { + this._enforceFocus(); + } + + var shownEvent = $__default['default'].Event(EVENT_SHOWN$2, { + relatedTarget: relatedTarget + }); + + var transitionComplete = function transitionComplete() { + if (_this4._config.focus) { + _this4._element.focus(); + } + + _this4._isTransitioning = false; + $__default['default'](_this4._element).trigger(shownEvent); + }; + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); + $__default['default'](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); + } else { + transitionComplete(); + } + }; + + _proto._enforceFocus = function _enforceFocus() { + var _this5 = this; + + $__default['default'](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop + .on(EVENT_FOCUSIN, function (event) { + if (document !== event.target && _this5._element !== event.target && $__default['default'](_this5._element).has(event.target).length === 0) { + _this5._element.focus(); + } + }); + }; + + _proto._setEscapeEvent = function _setEscapeEvent() { + var _this6 = this; + + if (this._isShown) { + $__default['default'](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) { + if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE$1) { + event.preventDefault(); + + _this6.hide(); + } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE$1) { + _this6._triggerBackdropTransition(); + } + }); + } else if (!this._isShown) { + $__default['default'](this._element).off(EVENT_KEYDOWN_DISMISS); + } + }; + + _proto._setResizeEvent = function _setResizeEvent() { + var _this7 = this; + + if (this._isShown) { + $__default['default'](window).on(EVENT_RESIZE, function (event) { + return _this7.handleUpdate(event); + }); + } else { + $__default['default'](window).off(EVENT_RESIZE); + } + }; + + _proto._hideModal = function _hideModal() { + var _this8 = this; + + this._element.style.display = 'none'; + + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._element.removeAttribute('role'); + + this._isTransitioning = false; + + this._showBackdrop(function () { + $__default['default'](document.body).removeClass(CLASS_NAME_OPEN); + + _this8._resetAdjustments(); + + _this8._resetScrollbar(); + + $__default['default'](_this8._element).trigger(EVENT_HIDDEN$2); + }); + }; + + _proto._removeBackdrop = function _removeBackdrop() { + if (this._backdrop) { + $__default['default'](this._backdrop).remove(); + this._backdrop = null; + } + }; + + _proto._showBackdrop = function _showBackdrop(callback) { + var _this9 = this; + + var animate = $__default['default'](this._element).hasClass(CLASS_NAME_FADE$1) ? CLASS_NAME_FADE$1 : ''; + + if (this._isShown && this._config.backdrop) { + this._backdrop = document.createElement('div'); + this._backdrop.className = CLASS_NAME_BACKDROP; + + if (animate) { + this._backdrop.classList.add(animate); + } + + $__default['default'](this._backdrop).appendTo(document.body); + $__default['default'](this._element).on(EVENT_CLICK_DISMISS, function (event) { + if (_this9._ignoreBackdropClick) { + _this9._ignoreBackdropClick = false; + return; + } + + if (event.target !== event.currentTarget) { + return; + } + + if (_this9._config.backdrop === 'static') { + _this9._triggerBackdropTransition(); + } else { + _this9.hide(); + } + }); + + if (animate) { + Util.reflow(this._backdrop); + } + + $__default['default'](this._backdrop).addClass(CLASS_NAME_SHOW$3); + + if (!callback) { + return; + } + + if (!animate) { + callback(); + return; + } + + var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + $__default['default'](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); + } else if (!this._isShown && this._backdrop) { + $__default['default'](this._backdrop).removeClass(CLASS_NAME_SHOW$3); + + var callbackRemove = function callbackRemove() { + _this9._removeBackdrop(); + + if (callback) { + callback(); + } + }; + + if ($__default['default'](this._element).hasClass(CLASS_NAME_FADE$1)) { + var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + + $__default['default'](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); + } else { + callbackRemove(); + } + } else if (callback) { + callback(); + } + } // ---------------------------------------------------------------------- + // the following methods are used to handle overflowing modals + // todo (fat): these should probably be refactored out of modal.js + // ---------------------------------------------------------------------- + ; + + _proto._adjustDialog = function _adjustDialog() { + var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + if (!this._isBodyOverflowing && isModalOverflowing) { + this._element.style.paddingLeft = this._scrollbarWidth + "px"; + } + + if (this._isBodyOverflowing && !isModalOverflowing) { + this._element.style.paddingRight = this._scrollbarWidth + "px"; + } + }; + + _proto._resetAdjustments = function _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + }; + + _proto._checkScrollbar = function _checkScrollbar() { + var rect = document.body.getBoundingClientRect(); + this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth; + this._scrollbarWidth = this._getScrollbarWidth(); + }; + + _proto._setScrollbar = function _setScrollbar() { + var _this10 = this; + + if (this._isBodyOverflowing) { + // Note: DOMNode.style.paddingRight returns the actual value or '' if not set + // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set + var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); + var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding + + $__default['default'](fixedContent).each(function (index, element) { + var actualPadding = element.style.paddingRight; + var calculatedPadding = $__default['default'](element).css('padding-right'); + $__default['default'](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px"); + }); // Adjust sticky content margin + + $__default['default'](stickyContent).each(function (index, element) { + var actualMargin = element.style.marginRight; + var calculatedMargin = $__default['default'](element).css('margin-right'); + $__default['default'](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px"); + }); // Adjust body padding + + var actualPadding = document.body.style.paddingRight; + var calculatedPadding = $__default['default'](document.body).css('padding-right'); + $__default['default'](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); + } + + $__default['default'](document.body).addClass(CLASS_NAME_OPEN); + }; + + _proto._resetScrollbar = function _resetScrollbar() { + // Restore fixed content padding + var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); + $__default['default'](fixedContent).each(function (index, element) { + var padding = $__default['default'](element).data('padding-right'); + $__default['default'](element).removeData('padding-right'); + element.style.paddingRight = padding ? padding : ''; + }); // Restore sticky content + + var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT)); + $__default['default'](elements).each(function (index, element) { + var margin = $__default['default'](element).data('margin-right'); + + if (typeof margin !== 'undefined') { + $__default['default'](element).css('margin-right', margin).removeData('margin-right'); + } + }); // Restore body padding + + var padding = $__default['default'](document.body).data('padding-right'); + $__default['default'](document.body).removeData('padding-right'); + document.body.style.paddingRight = padding ? padding : ''; + }; + + _proto._getScrollbarWidth = function _getScrollbarWidth() { + // thx d.walsh + var scrollDiv = document.createElement('div'); + scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER; + document.body.appendChild(scrollDiv); + var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; + } // Static + ; + + Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { + return this.each(function () { + var data = $__default['default'](this).data(DATA_KEY$5); + + var _config = _extends({}, Default$3, $__default['default'](this).data(), typeof config === 'object' && config ? config : {}); + + if (!data) { + data = new Modal(this, _config); + $__default['default'](this).data(DATA_KEY$5, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](relatedTarget); + } else if (_config.show) { + data.show(relatedTarget); + } + }); + }; + + _createClass(Modal, null, [{ + key: "VERSION", + get: function get() { + return VERSION$5; + } + }, { + key: "Default", + get: function get() { + return Default$3; + } + }]); + + return Modal; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $__default['default'](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE$3, function (event) { + var _this11 = this; + + var target; + var selector = Util.getSelectorFromElement(this); + + if (selector) { + target = document.querySelector(selector); + } + + var config = $__default['default'](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default['default'](target).data(), $__default['default'](this).data()); + + if (this.tagName === 'A' || this.tagName === 'AREA') { + event.preventDefault(); + } + + var $target = $__default['default'](target).one(EVENT_SHOW$2, function (showEvent) { + if (showEvent.isDefaultPrevented()) { + // Only register focus restorer if modal will actually get shown + return; + } + + $target.one(EVENT_HIDDEN$2, function () { + if ($__default['default'](_this11).is(':visible')) { + _this11.focus(); + } + }); + }); + + Modal._jQueryInterface.call($__default['default'](target), config, this); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $__default['default'].fn[NAME$5] = Modal._jQueryInterface; + $__default['default'].fn[NAME$5].Constructor = Modal; + + $__default['default'].fn[NAME$5].noConflict = function () { + $__default['default'].fn[NAME$5] = JQUERY_NO_CONFLICT$5; + return Modal._jQueryInterface; + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.6.0): tools/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; + var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + var DefaultWhitelist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }; + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi; + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; + + function allowedAttribute(attr, allowedAttributeList) { + var attrName = attr.nodeName.toLowerCase(); + + if (allowedAttributeList.indexOf(attrName) !== -1) { + if (uriAttrs.indexOf(attrName) !== -1) { + return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)); + } + + return true; + } + + var regExp = allowedAttributeList.filter(function (attrRegex) { + return attrRegex instanceof RegExp; + }); // Check if a regular expression validates the attribute. + + for (var i = 0, len = regExp.length; i < len; i++) { + if (attrName.match(regExp[i])) { + return true; + } + } + + return false; + } + + function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { + if (unsafeHtml.length === 0) { + return unsafeHtml; + } + + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeHtml); + } + + var domParser = new window.DOMParser(); + var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + var whitelistKeys = Object.keys(whiteList); + var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); + + var _loop = function _loop(i, len) { + var el = elements[i]; + var elName = el.nodeName.toLowerCase(); + + if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { + el.parentNode.removeChild(el); + return "continue"; + } + + var attributeList = [].slice.call(el.attributes); + var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); + attributeList.forEach(function (attr) { + if (!allowedAttribute(attr, whitelistedAttributes)) { + el.removeAttribute(attr.nodeName); + } + }); + }; + + for (var i = 0, len = elements.length; i < len; i++) { + var _ret = _loop(i); + + if (_ret === "continue") continue; + } + + return createdDocument.body.innerHTML; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$6 = 'tooltip'; + var VERSION$6 = '4.6.0'; + var DATA_KEY$6 = 'bs.tooltip'; + var EVENT_KEY$6 = "." + DATA_KEY$6; + var JQUERY_NO_CONFLICT$6 = $__default['default'].fn[NAME$6]; + var CLASS_PREFIX = 'bs-tooltip'; + var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); + var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; + var DefaultType$4 = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(number|string|function)', + container: '(string|element|boolean)', + fallbackPlacement: '(string|array)', + boundary: '(string|element)', + customClass: '(string|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + whiteList: 'object', + popperConfig: '(null|object)' + }; + var AttachmentMap = { + AUTO: 'auto', + TOP: 'top', + RIGHT: 'right', + BOTTOM: 'bottom', + LEFT: 'left' + }; + var Default$4 = { + animation: true, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + selector: false, + placement: 'top', + offset: 0, + container: false, + fallbackPlacement: 'flip', + boundary: 'scrollParent', + customClass: '', + sanitize: true, + sanitizeFn: null, + whiteList: DefaultWhitelist, + popperConfig: null + }; + var HOVER_STATE_SHOW = 'show'; + var HOVER_STATE_OUT = 'out'; + var Event = { + HIDE: "hide" + EVENT_KEY$6, + HIDDEN: "hidden" + EVENT_KEY$6, + SHOW: "show" + EVENT_KEY$6, + SHOWN: "shown" + EVENT_KEY$6, + INSERTED: "inserted" + EVENT_KEY$6, + CLICK: "click" + EVENT_KEY$6, + FOCUSIN: "focusin" + EVENT_KEY$6, + FOCUSOUT: "focusout" + EVENT_KEY$6, + MOUSEENTER: "mouseenter" + EVENT_KEY$6, + MOUSELEAVE: "mouseleave" + EVENT_KEY$6 + }; + var CLASS_NAME_FADE$2 = 'fade'; + var CLASS_NAME_SHOW$4 = 'show'; + var SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; + var SELECTOR_ARROW = '.arrow'; + var TRIGGER_HOVER = 'hover'; + var TRIGGER_FOCUS = 'focus'; + var TRIGGER_CLICK = 'click'; + var TRIGGER_MANUAL = 'manual'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Tooltip = /*#__PURE__*/function () { + function Tooltip(element, config) { + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); + } // private + + + this._isEnabled = true; + this._timeout = 0; + this._hoverState = ''; + this._activeTrigger = {}; + this._popper = null; // Protected + + this.element = element; + this.config = this._getConfig(config); + this.tip = null; + + this._setListeners(); + } // Getters + + + var _proto = Tooltip.prototype; + + // Public + _proto.enable = function enable() { + this._isEnabled = true; + }; + + _proto.disable = function disable() { + this._isEnabled = false; + }; + + _proto.toggleEnabled = function toggleEnabled() { + this._isEnabled = !this._isEnabled; + }; + + _proto.toggle = function toggle(event) { + if (!this._isEnabled) { + return; + } + + if (event) { + var dataKey = this.constructor.DATA_KEY; + var context = $__default['default'](event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $__default['default'](event.currentTarget).data(dataKey, context); + } + + context._activeTrigger.click = !context._activeTrigger.click; + + if (context._isWithActiveTrigger()) { + context._enter(null, context); + } else { + context._leave(null, context); + } + } else { + if ($__default['default'](this.getTipElement()).hasClass(CLASS_NAME_SHOW$4)) { + this._leave(null, this); + + return; + } + + this._enter(null, this); + } + }; + + _proto.dispose = function dispose() { + clearTimeout(this._timeout); + $__default['default'].removeData(this.element, this.constructor.DATA_KEY); + $__default['default'](this.element).off(this.constructor.EVENT_KEY); + $__default['default'](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler); + + if (this.tip) { + $__default['default'](this.tip).remove(); + } + + this._isEnabled = null; + this._timeout = null; + this._hoverState = null; + this._activeTrigger = null; + + if (this._popper) { + this._popper.destroy(); + } + + this._popper = null; + this.element = null; + this.config = null; + this.tip = null; + }; + + _proto.show = function show() { + var _this = this; + + if ($__default['default'](this.element).css('display') === 'none') { + throw new Error('Please use show on visible elements'); + } + + var showEvent = $__default['default'].Event(this.constructor.Event.SHOW); + + if (this.isWithContent() && this._isEnabled) { + $__default['default'](this.element).trigger(showEvent); + var shadowRoot = Util.findShadowRoot(this.element); + var isInTheDom = $__default['default'].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); + + if (showEvent.isDefaultPrevented() || !isInTheDom) { + return; + } + + var tip = this.getTipElement(); + var tipId = Util.getUID(this.constructor.NAME); + tip.setAttribute('id', tipId); + this.element.setAttribute('aria-describedby', tipId); + this.setContent(); + + if (this.config.animation) { + $__default['default'](tip).addClass(CLASS_NAME_FADE$2); + } + + var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; + + var attachment = this._getAttachment(placement); + + this.addAttachmentClass(attachment); + + var container = this._getContainer(); + + $__default['default'](tip).data(this.constructor.DATA_KEY, this); + + if (!$__default['default'].contains(this.element.ownerDocument.documentElement, this.tip)) { + $__default['default'](tip).appendTo(container); + } + + $__default['default'](this.element).trigger(this.constructor.Event.INSERTED); + this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment)); + $__default['default'](tip).addClass(CLASS_NAME_SHOW$4); + $__default['default'](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + if ('ontouchstart' in document.documentElement) { + $__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop); + } + + var complete = function complete() { + if (_this.config.animation) { + _this._fixTransition(); + } + + var prevHoverState = _this._hoverState; + _this._hoverState = null; + $__default['default'](_this.element).trigger(_this.constructor.Event.SHOWN); + + if (prevHoverState === HOVER_STATE_OUT) { + _this._leave(null, _this); + } + }; + + if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE$2)) { + var transitionDuration = Util.getTransitionDurationFromElement(this.tip); + $__default['default'](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + } + }; + + _proto.hide = function hide(callback) { + var _this2 = this; + + var tip = this.getTipElement(); + var hideEvent = $__default['default'].Event(this.constructor.Event.HIDE); + + var complete = function complete() { + if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { + tip.parentNode.removeChild(tip); + } + + _this2._cleanTipClass(); + + _this2.element.removeAttribute('aria-describedby'); + + $__default['default'](_this2.element).trigger(_this2.constructor.Event.HIDDEN); + + if (_this2._popper !== null) { + _this2._popper.destroy(); + } + + if (callback) { + callback(); + } + }; + + $__default['default'](this.element).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + $__default['default'](tip).removeClass(CLASS_NAME_SHOW$4); // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + if ('ontouchstart' in document.documentElement) { + $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop); + } + + this._activeTrigger[TRIGGER_CLICK] = false; + this._activeTrigger[TRIGGER_FOCUS] = false; + this._activeTrigger[TRIGGER_HOVER] = false; + + if ($__default['default'](this.tip).hasClass(CLASS_NAME_FADE$2)) { + var transitionDuration = Util.getTransitionDurationFromElement(tip); + $__default['default'](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + + this._hoverState = ''; + }; + + _proto.update = function update() { + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Protected + ; + + _proto.isWithContent = function isWithContent() { + return Boolean(this.getTitle()); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $__default['default'](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $__default['default'](this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var tip = this.getTipElement(); + this.setElementContent($__default['default'](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle()); + $__default['default'](tip).removeClass(CLASS_NAME_FADE$2 + " " + CLASS_NAME_SHOW$4); + }; + + _proto.setElementContent = function setElementContent($element, content) { + if (typeof content === 'object' && (content.nodeType || content.jquery)) { + // Content is a DOM node or a jQuery + if (this.config.html) { + if (!$__default['default'](content).parent().is($element)) { + $element.empty().append(content); + } + } else { + $element.text($__default['default'](content).text()); + } + + return; + } + + if (this.config.html) { + if (this.config.sanitize) { + content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); + } + + $element.html(content); + } else { + $element.text(content); + } + }; + + _proto.getTitle = function getTitle() { + var title = this.element.getAttribute('data-original-title'); + + if (!title) { + title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; + } + + return title; + } // Private + ; + + _proto._getPopperConfig = function _getPopperConfig(attachment) { + var _this3 = this; + + var defaultBsConfig = { + placement: attachment, + modifiers: { + offset: this._getOffset(), + flip: { + behavior: this.config.fallbackPlacement + }, + arrow: { + element: SELECTOR_ARROW + }, + preventOverflow: { + boundariesElement: this.config.boundary + } + }, + onCreate: function onCreate(data) { + if (data.originalPlacement !== data.placement) { + _this3._handlePopperPlacementChange(data); + } + }, + onUpdate: function onUpdate(data) { + return _this3._handlePopperPlacementChange(data); + } + }; + return _extends({}, defaultBsConfig, this.config.popperConfig); + }; + + _proto._getOffset = function _getOffset() { + var _this4 = this; + + var offset = {}; + + if (typeof this.config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element) || {}); + return data; + }; + } else { + offset.offset = this.config.offset; + } + + return offset; + }; + + _proto._getContainer = function _getContainer() { + if (this.config.container === false) { + return document.body; + } + + if (Util.isElement(this.config.container)) { + return $__default['default'](this.config.container); + } + + return $__default['default'](document).find(this.config.container); + }; + + _proto._getAttachment = function _getAttachment(placement) { + return AttachmentMap[placement.toUpperCase()]; + }; + + _proto._setListeners = function _setListeners() { + var _this5 = this; + + var triggers = this.config.trigger.split(' '); + triggers.forEach(function (trigger) { + if (trigger === 'click') { + $__default['default'](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) { + return _this5.toggle(event); + }); + } else if (trigger !== TRIGGER_MANUAL) { + var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN; + var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT; + $__default['default'](_this5.element).on(eventIn, _this5.config.selector, function (event) { + return _this5._enter(event); + }).on(eventOut, _this5.config.selector, function (event) { + return _this5._leave(event); + }); + } + }); + + this._hideModalHandler = function () { + if (_this5.element) { + _this5.hide(); + } + }; + + $__default['default'](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler); + + if (this.config.selector) { + this.config = _extends({}, this.config, { + trigger: 'manual', + selector: '' + }); + } else { + this._fixTitle(); + } + }; + + _proto._fixTitle = function _fixTitle() { + var titleType = typeof this.element.getAttribute('data-original-title'); + + if (this.element.getAttribute('title') || titleType !== 'string') { + this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); + this.element.setAttribute('title', ''); + } + }; + + _proto._enter = function _enter(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $__default['default'](event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $__default['default'](event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + } + + if ($__default['default'](context.getTipElement()).hasClass(CLASS_NAME_SHOW$4) || context._hoverState === HOVER_STATE_SHOW) { + context._hoverState = HOVER_STATE_SHOW; + return; + } + + clearTimeout(context._timeout); + context._hoverState = HOVER_STATE_SHOW; + + if (!context.config.delay || !context.config.delay.show) { + context.show(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HOVER_STATE_SHOW) { + context.show(); + } + }, context.config.delay.show); + }; + + _proto._leave = function _leave(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $__default['default'](event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $__default['default'](event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false; + } + + if (context._isWithActiveTrigger()) { + return; + } + + clearTimeout(context._timeout); + context._hoverState = HOVER_STATE_OUT; + + if (!context.config.delay || !context.config.delay.hide) { + context.hide(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HOVER_STATE_OUT) { + context.hide(); + } + }, context.config.delay.hide); + }; + + _proto._isWithActiveTrigger = function _isWithActiveTrigger() { + for (var trigger in this._activeTrigger) { + if (this._activeTrigger[trigger]) { + return true; + } + } + + return false; + }; + + _proto._getConfig = function _getConfig(config) { + var dataAttributes = $__default['default'](this.element).data(); + Object.keys(dataAttributes).forEach(function (dataAttr) { + if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { + delete dataAttributes[dataAttr]; + } + }); + config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {}); + + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + + Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType); + + if (config.sanitize) { + config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); + } + + return config; + }; + + _proto._getDelegateConfig = function _getDelegateConfig() { + var config = {}; + + if (this.config) { + for (var key in this.config) { + if (this.constructor.Default[key] !== this.config[key]) { + config[key] = this.config[key]; + } + } + } + + return config; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $__default['default'](this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); + + if (tabClass !== null && tabClass.length) { + $tip.removeClass(tabClass.join('')); + } + }; + + _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { + this.tip = popperData.instance.popper; + + this._cleanTipClass(); + + this.addAttachmentClass(this._getAttachment(popperData.placement)); + }; + + _proto._fixTransition = function _fixTransition() { + var tip = this.getTipElement(); + var initConfigAnimation = this.config.animation; + + if (tip.getAttribute('x-placement') !== null) { + return; + } + + $__default['default'](tip).removeClass(CLASS_NAME_FADE$2); + this.config.animation = false; + this.hide(); + this.show(); + this.config.animation = initConfigAnimation; + } // Static + ; + + Tooltip._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $element = $__default['default'](this); + var data = $element.data(DATA_KEY$6); + + var _config = typeof config === 'object' && config; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Tooltip(this, _config); + $element.data(DATA_KEY$6, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Tooltip, null, [{ + key: "VERSION", + get: function get() { + return VERSION$6; + } + }, { + key: "Default", + get: function get() { + return Default$4; + } + }, { + key: "NAME", + get: function get() { + return NAME$6; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY$6; + } + }, { + key: "Event", + get: function get() { + return Event; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY$6; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$4; + } + }]); + + return Tooltip; + }(); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $__default['default'].fn[NAME$6] = Tooltip._jQueryInterface; + $__default['default'].fn[NAME$6].Constructor = Tooltip; + + $__default['default'].fn[NAME$6].noConflict = function () { + $__default['default'].fn[NAME$6] = JQUERY_NO_CONFLICT$6; + return Tooltip._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$7 = 'popover'; + var VERSION$7 = '4.6.0'; + var DATA_KEY$7 = 'bs.popover'; + var EVENT_KEY$7 = "." + DATA_KEY$7; + var JQUERY_NO_CONFLICT$7 = $__default['default'].fn[NAME$7]; + var CLASS_PREFIX$1 = 'bs-popover'; + var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); + + var Default$5 = _extends({}, Tooltip.Default, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }); + + var DefaultType$5 = _extends({}, Tooltip.DefaultType, { + content: '(string|element|function)' + }); + + var CLASS_NAME_FADE$3 = 'fade'; + var CLASS_NAME_SHOW$5 = 'show'; + var SELECTOR_TITLE = '.popover-header'; + var SELECTOR_CONTENT = '.popover-body'; + var Event$1 = { + HIDE: "hide" + EVENT_KEY$7, + HIDDEN: "hidden" + EVENT_KEY$7, + SHOW: "show" + EVENT_KEY$7, + SHOWN: "shown" + EVENT_KEY$7, + INSERTED: "inserted" + EVENT_KEY$7, + CLICK: "click" + EVENT_KEY$7, + FOCUSIN: "focusin" + EVENT_KEY$7, + FOCUSOUT: "focusout" + EVENT_KEY$7, + MOUSEENTER: "mouseenter" + EVENT_KEY$7, + MOUSELEAVE: "mouseleave" + EVENT_KEY$7 + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var Popover = /*#__PURE__*/function (_Tooltip) { + _inheritsLoose(Popover, _Tooltip); + + function Popover() { + return _Tooltip.apply(this, arguments) || this; + } + + var _proto = Popover.prototype; + + // Overrides + _proto.isWithContent = function isWithContent() { + return this.getTitle() || this._getContent(); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $__default['default'](this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $__default['default'](this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var $tip = $__default['default'](this.getTipElement()); // We use append for html objects to maintain js events + + this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle()); + + var content = this._getContent(); + + if (typeof content === 'function') { + content = content.call(this.element); + } + + this.setElementContent($tip.find(SELECTOR_CONTENT), content); + $tip.removeClass(CLASS_NAME_FADE$3 + " " + CLASS_NAME_SHOW$5); + } // Private + ; + + _proto._getContent = function _getContent() { + return this.element.getAttribute('data-content') || this.config.content; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $__default['default'](this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1); + + if (tabClass !== null && tabClass.length > 0) { + $tip.removeClass(tabClass.join('')); + } + } // Static + ; + + Popover._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $__default['default'](this).data(DATA_KEY$7); + + var _config = typeof config === 'object' ? config : null; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Popover(this, _config); + $__default['default'](this).data(DATA_KEY$7, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Popover, null, [{ + key: "VERSION", + // Getters + get: function get() { + return VERSION$7; + } + }, { + key: "Default", + get: function get() { + return Default$5; + } + }, { + key: "NAME", + get: function get() { + return NAME$7; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY$7; + } + }, { + key: "Event", + get: function get() { + return Event$1; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY$7; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType$5; + } + }]); + + return Popover; + }(Tooltip); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $__default['default'].fn[NAME$7] = Popover._jQueryInterface; + $__default['default'].fn[NAME$7].Constructor = Popover; + + $__default['default'].fn[NAME$7].noConflict = function () { + $__default['default'].fn[NAME$7] = JQUERY_NO_CONFLICT$7; + return Popover._jQueryInterface; + }; + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME$8 = 'scrollspy'; + var VERSION$8 = '4.6.0'; + var DATA_KEY$8 = 'bs.scrollspy'; + var EVENT_KEY$8 = "." + DATA_KEY$8; + var DATA_API_KEY$6 = '.data-api'; + var JQUERY_NO_CONFLICT$8 = $__default['default'].fn[NAME$8]; + var Default$6 = { + offset: 10, + method: 'auto', + target: '' + }; + var DefaultType$6 = { + offset: 'number', + method: 'string', + target: '(string|element)' + }; + var EVENT_ACTIVATE = "activate" + EVENT_KEY$8; + var EVENT_SCROLL = "scroll" + EVENT_KEY$8; + var EVENT_LOAD_DATA_API$2 = "load" + EVENT_KEY$8 + DATA_API_KEY$6; + var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; + var CLASS_NAME_ACTIVE$2 = 'active'; + var SELECTOR_DATA_SPY = '[data-spy="scroll"]'; + var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; + var SELECTOR_NAV_LINKS = '.nav-link'; + var SELECTOR_NAV_ITEMS = '.nav-item'; + var SELECTOR_LIST_ITEMS = '.list-group-item'; + var SELECTOR_DROPDOWN = '.dropdown'; + var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'; + var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; + var METHOD_OFFSET = 'offset'; + var METHOD_POSITION = 'position'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + var ScrollSpy = /*#__PURE__*/function () { + function ScrollSpy(element, config) { + var _this = this; + + this._element = element; + this._scrollElement = element.tagName === 'BODY' ? window : element; + this._config = this._getConfig(config); + this._selector = this._config.target + " " + SELECTOR_NAV_LINKS + "," + (this._config.target + " " + SELECTOR_LIST_ITEMS + ",") + (this._config.target + " " + SELECTOR_DROPDOWN_ITEMS); + this._offsets = []; + this._targets = []; + this._activeTarget = null; + this._scrollHeight = 0; + $__default['default'](this._scrollElement).on(EVENT_SCROLL, function (event) { + return _this._process(event); + }); + this.refresh(); + + this._process(); + } // Getters + + + var _proto = ScrollSpy.prototype; + + // Public + _proto.refresh = function refresh() { + var _this2 = this; + + var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION; + var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; + var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0; + this._offsets = []; + this._targets = []; + this._scrollHeight = this._getScrollHeight(); + var targets = [].slice.call(document.querySelectorAll(this._selector)); + targets.map(function (element) { + var target; + var targetSelector = Util.getSelectorFromElement(element); + + if (targetSelector) { + target = document.querySelector(targetSelector); + } + + if (target) { + var targetBCR = target.getBoundingClientRect(); + + if (targetBCR.width || targetBCR.height) { + // TODO (fat): remove sketch reliance on jQuery position/offset + return [$__default['default'](target)[offsetMethod]().top + offsetBase, targetSelector]; + } + } + + return null; + }).filter(function (item) { + return item; + }).sort(function (a, b) { + return a[0] - b[0]; + }).forEach(function (item) { + _this2._offsets.push(item[0]); + + _this2._targets.push(item[1]); + }); + }; + + _proto.dispose = function dispose() { + $__default['default'].removeData(this._element, DATA_KEY$8); + $__default['default'](this._scrollElement).off(EVENT_KEY$8); + this._element = null; + this._scrollElement = null; + this._config = null; + this._selector = null; + this._offsets = null; + this._targets = null; + this._activeTarget = null; + this._scrollHeight = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _extends({}, Default$6, typeof config === 'object' && config ? config : {}); + + if (typeof config.target !== 'string' && Util.isElement(config.target)) { + var id = $__default['default'](config.target).attr('id'); + + if (!id) { + id = Util.getUID(NAME$8); + $__default['default'](config.target).attr('id', id); + } + + config.target = "#" + id; + } + + Util.typeCheckConfig(NAME$8, config, DefaultType$6); + return config; + }; + + _proto._getScrollTop = function _getScrollTop() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; + }; + + _proto._getScrollHeight = function _getScrollHeight() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); + }; + + _proto._getOffsetHeight = function _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; + }; + + _proto._process = function _process() { + var scrollTop = this._getScrollTop() + this._config.offset; + + var scrollHeight = this._getScrollHeight(); + + var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); + + if (this._scrollHeight !== scrollHeight) { + this.refresh(); + } + + if (scrollTop >= maxScroll) { + var target = this._targets[this._targets.length - 1]; + + if (this._activeTarget !== target) { + this._activate(target); + } + + return; + } + + if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { + this._activeTarget = null; + + this._clear(); + + return; + } + + for (var i = this._offsets.length; i--;) { + var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); + + if (isActiveTarget) { + this._activate(this._targets[i]); + } + } + }; + + _proto._activate = function _activate(target) { + this._activeTarget = target; + + this._clear(); + + var queries = this._selector.split(',').map(function (selector) { + return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; + }); + + var $link = $__default['default']([].slice.call(document.querySelectorAll(queries.join(',')))); + + if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) { + $link.closest(SELECTOR_DROPDOWN).find(SELECTOR_DROPDOWN_TOGGLE).addClass(CLASS_NAME_ACTIVE$2); + $link.addClass(CLASS_NAME_ACTIVE$2); + } else { + // Set triggered link as active + $link.addClass(CLASS_NAME_ACTIVE$2); // Set triggered links parents as active + // With both