├── .gitignore
├── .gitlab-ci.yml
├── README.md
├── Makefile
├── src
├── Lifechart.elm
└── Lifechart
│ ├── Demo.elm
│ ├── View.elm
│ ├── Serializer.elm
│ ├── Model.elm
│ ├── Update.elm
│ └── View
│ ├── Canvas.elm
│ └── Controls.elm
├── elm-package.json
├── LICENSE
├── lib
├── BasicsExtra.elm
└── DateExtra.elm
└── public
├── index.html
└── lifechart.min.js
/.gitignore:
--------------------------------------------------------------------------------
1 | /elm-stuff/
2 | /public/lifechart.js
3 | /mine.url
4 |
--------------------------------------------------------------------------------
/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | image: node:latest
2 |
3 | before_script:
4 | - export PATH=$PWD/node_modules/.bin:$PATH # we don't have perms to install with -g
5 | - npm install elm
6 | - npm install uglify-js
7 | - elm --version
8 |
9 | elm-make:
10 | script:
11 | - make
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Lifechart
2 |
3 | [](https://gitlab.com/infertux/lifechart/commits/master)
4 |
5 | Spend your time wisely.
6 |
7 | https://infertux.com/labs/lifechart/
8 |
9 | ## Elm
10 |
11 | [Elm](http://elm-lang.org/) rocks! Check it out.
12 |
13 | ## License
14 |
15 | AGPLv3+
16 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | all: lifechart
2 |
3 | lifechart: src/*.elm
4 | elm-make src/Lifechart.elm --yes --warn --output public/lifechart.js
5 | uglifyjs --mangle --screw-ie8 --output public/lifechart.min.js -- public/lifechart.js
6 | rm public/lifechart.js
7 |
8 | watch: src/*.elm
9 | elm-test --watch
10 |
11 | clean:
12 | $(RM) -r public/lifechart*.js elm-stuff/
13 |
14 | .PHONY: watch clean
15 |
--------------------------------------------------------------------------------
/src/Lifechart.elm:
--------------------------------------------------------------------------------
1 | module Lifechart exposing (main)
2 |
3 | import Navigation
4 | import Time
5 | import Lifechart.Model as Model
6 | import Lifechart.Update exposing (init, update)
7 | import Lifechart.View exposing (view)
8 |
9 |
10 | main : Program Never Model.Model Model.Msg
11 | main =
12 | Navigation.program Model.NewUrl
13 | { init = init
14 | , update = update
15 | , view = view
16 | , subscriptions = subscriptions
17 | }
18 |
19 |
20 | subscriptions : Model.Model -> Sub Model.Msg
21 | subscriptions model =
22 | Time.every (Time.second * 10) Model.Tick
23 |
--------------------------------------------------------------------------------
/elm-package.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.0.0",
3 | "summary": "helpful summary of your project, less than 80 characters",
4 | "repository": "https://github.com/user/project.git",
5 | "license": "AGPLv3+",
6 | "source-directories": [
7 | "src",
8 | "lib"
9 | ],
10 | "exposed-modules": [],
11 | "dependencies": {
12 | "elm-lang/core": "5.0.0 <= v < 6.0.0",
13 | "elm-lang/html": "2.0.0 <= v < 3.0.0",
14 | "elm-lang/navigation": "2.0.1 <= v < 3.0.0",
15 | "eskimoblood/elm-color-extra": "5.1.0 <= v < 6.0.0",
16 | "evancz/elm-graphics": "1.0.1 <= v < 2.0.0",
17 | "truqu/elm-base64": "2.0.3 <= v < 3.0.0"
18 | },
19 | "elm-version": "0.18.0 <= v < 0.19.0"
20 | }
21 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | AGPLv3+
2 |
3 | Lifechart
4 | Copyright (C) 2015-2018 Cédric Félizard
5 |
6 | This program is free software: you can redistribute it and/or modify
7 | it under the terms of the GNU Affero General Public License as
8 | published by the Free Software Foundation, either version 3 of the
9 | License, or (at your option) any later version.
10 |
11 | This program is distributed in the hope that it will be useful,
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | GNU Affero General Public License for more details.
15 |
16 | You should have received a copy of the GNU Affero General Public License
17 | along with this program. If not, see .
18 |
--------------------------------------------------------------------------------
/src/Lifechart/Demo.elm:
--------------------------------------------------------------------------------
1 | module Lifechart.Demo exposing (base64)
2 |
3 | import Base64
4 |
5 |
6 | base64 : String
7 | base64 =
8 | let
9 | json =
10 | """
11 | {
12 | "birth-date": "1988-07-24",
13 | "life-expectancy": 80,
14 | "kid-until": 18,
15 | "old-from": 70,
16 | "only-adult-years": false,
17 | "events": [
18 | {
19 | "from": "2010-09-14",
20 | "to": "2014-02-01",
21 | "color": "#f57900",
22 | "label": "college",
23 | "overlay": false
24 | },
25 | {
26 | "from": "2015-06-01",
27 | "to": "2016-05-31",
28 | "color": "#73d216",
29 | "label": "trip",
30 | "overlay": false
31 | }
32 | ]
33 | }
34 | """
35 | in
36 | Base64.encode json
37 |
--------------------------------------------------------------------------------
/src/Lifechart/View.elm:
--------------------------------------------------------------------------------
1 | module Lifechart.View exposing (view)
2 |
3 | import Html exposing (..)
4 | import Html.Attributes exposing (..)
5 | import Lifechart.Model exposing (..)
6 | import Lifechart.View.Canvas as Canvas
7 | import Lifechart.View.Controls as Controls
8 |
9 |
10 | view : Model -> Html Msg
11 | view model =
12 | div []
13 | [ Controls.modal model
14 | , div [ class "row" ]
15 | [ div [ class "col-6" ] [ Controls.controls model ]
16 | , div [ class "col-6" ]
17 | [ if model.now == 0 then
18 | h1 [ class "text-center" ] [ text "Loading..." ]
19 | else
20 | Canvas.canvas model
21 | ]
22 | ]
23 | ]
24 |
--------------------------------------------------------------------------------
/lib/BasicsExtra.elm:
--------------------------------------------------------------------------------
1 | module BasicsExtra exposing (..)
2 |
3 |
4 | roundTo : Int -> Float -> Float
5 | roundTo precision float =
6 | let
7 | factor =
8 | toFloat (10 ^ precision)
9 | in
10 | (float * factor |> round |> toFloat) / factor
11 |
12 |
13 | roundToPadded : Int -> Float -> String
14 | roundToPadded precision float =
15 | let
16 | rounded =
17 | roundTo precision float
18 |
19 | intLength =
20 | truncate (logBase 10 rounded) + 1
21 |
22 | baseString =
23 | toString rounded
24 |
25 | string =
26 | if String.contains "." baseString then
27 | baseString
28 | else
29 | baseString ++ "."
30 |
31 | totalLength =
32 | intLength + 1 + precision
33 | in
34 | string |> String.padRight totalLength '0'
35 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Lifechart
9 |
10 |
11 |
12 |
21 |
22 |
23 |
24 |
27 |
28 |
29 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/lib/DateExtra.elm:
--------------------------------------------------------------------------------
1 | module DateExtra exposing (..)
2 |
3 | import Date exposing (Date)
4 | import String
5 |
6 |
7 | unsafeFromString : String -> Date
8 | unsafeFromString string =
9 | case Date.fromString string of
10 | Ok date ->
11 | date
12 |
13 | Err msg ->
14 | Debug.crash <| "unsafeFromString: " ++ string
15 |
16 |
17 | fromStringWithFallback : String -> Date -> Date
18 | fromStringWithFallback string fallback =
19 | case Date.fromString string of
20 | Ok date ->
21 | date
22 |
23 | Err _ ->
24 | fallback
25 |
26 |
27 | toISOString : Date -> String
28 | toISOString date =
29 | let
30 | year =
31 | Date.year date
32 |
33 | month =
34 | Date.month date
35 |
36 | day =
37 | Date.day date
38 | in
39 | String.join "-"
40 | [ String.padLeft 4 '0' <| toString year
41 | , String.padLeft 2 '0' <| toString (monthToInt month)
42 | , String.padLeft 2 '0' <| toString day
43 | ]
44 |
45 |
46 | monthToInt : Date.Month -> Int
47 | monthToInt month =
48 | case month of
49 | Date.Jan ->
50 | 1
51 |
52 | Date.Feb ->
53 | 2
54 |
55 | Date.Mar ->
56 | 3
57 |
58 | Date.Apr ->
59 | 4
60 |
61 | Date.May ->
62 | 5
63 |
64 | Date.Jun ->
65 | 6
66 |
67 | Date.Jul ->
68 | 7
69 |
70 | Date.Aug ->
71 | 8
72 |
73 | Date.Sep ->
74 | 9
75 |
76 | Date.Oct ->
77 | 10
78 |
79 | Date.Nov ->
80 | 11
81 |
82 | Date.Dec ->
83 | 12
84 |
--------------------------------------------------------------------------------
/src/Lifechart/Serializer.elm:
--------------------------------------------------------------------------------
1 | module Lifechart.Serializer
2 | exposing
3 | ( serialize
4 | , serializeJson
5 | , deserialize
6 | , deserializeJson
7 | )
8 |
9 | import Color exposing (Color)
10 | import Color.Convert
11 | import Date exposing (Date)
12 | import DateExtra
13 | import Json.Decode as Decode
14 | import Json.Encode as Encode
15 | import Base64
16 | import Lifechart.Model exposing (..)
17 |
18 |
19 | serialize : Model -> String
20 | serialize model =
21 | Base64.encode <| serializeJson model
22 |
23 |
24 | deserialize : String -> Result String Model
25 | deserialize base64 =
26 | case Base64.decode base64 of
27 | Err error ->
28 | Err error
29 |
30 | Ok json ->
31 | deserializeJson json
32 |
33 |
34 | serializeJson : Model -> String
35 | serializeJson model =
36 | Encode.encode 2 <|
37 | Encode.object
38 | [ "birth-date" => encodeDate model.birthDate
39 | , "life-expectancy" => Encode.int model.lifeExpectancy
40 | , "kid-until" => Encode.int model.kidUntil
41 | , "old-from" => Encode.int model.oldFrom
42 | , "only-adult-years" => Encode.bool model.onlyAdultYears
43 | , "events" => (Encode.list <| List.map encodeEvent model.events)
44 | ]
45 |
46 |
47 | jsonDecoder : Decode.Decoder JsonModel
48 | jsonDecoder =
49 | Decode.map6 JsonModel
50 | (Decode.field "birth-date" dateDecoder)
51 | (Decode.field "kid-until" Decode.int)
52 | (Decode.field "old-from" Decode.int)
53 | (Decode.field "life-expectancy" Decode.int)
54 | (Decode.field "only-adult-years" Decode.bool)
55 | (Decode.field "events" <| Decode.list eventDecoder)
56 |
57 |
58 | deserializeJson : String -> Result String Model
59 | deserializeJson json =
60 | case
61 | Decode.decodeString jsonDecoder json
62 | of
63 | Err error ->
64 | Err error
65 |
66 | Ok jsonModel ->
67 | Ok (mergeJsonModel jsonModel)
68 |
69 |
70 | encodeEvent : Event -> Encode.Value
71 | encodeEvent event =
72 | Encode.object
73 | [ "from" => encodeDate event.from
74 | , "to" => encodeDate event.to
75 | , "color" => encodeColor event.color
76 | , "label" => Encode.string event.label
77 | , "overlay" => Encode.bool event.overlay
78 | ]
79 |
80 |
81 | eventDecoder : Decode.Decoder Event
82 | eventDecoder =
83 | Decode.map5 Event
84 | (Decode.field "from" dateDecoder)
85 | (Decode.field "to" dateDecoder)
86 | (Decode.field "color" colorDecoder)
87 | (Decode.field "label" Decode.string)
88 | (Decode.field "overlay" Decode.bool)
89 |
90 |
91 | encodeDate : Date -> Encode.Value
92 | encodeDate date =
93 | Encode.string <| DateExtra.toISOString date
94 |
95 |
96 | dateDecoder : Decode.Decoder Date.Date
97 | dateDecoder =
98 | Decode.string
99 | |> Decode.andThen
100 | (\string ->
101 | case Date.fromString string of
102 | Ok date ->
103 | Decode.succeed date
104 |
105 | Err error ->
106 | Decode.fail error
107 | )
108 |
109 |
110 | encodeColor : Color -> Encode.Value
111 | encodeColor color =
112 | Encode.string <| Color.Convert.colorToHex color
113 |
114 |
115 | colorDecoder : Decode.Decoder Color
116 | colorDecoder =
117 | Decode.string
118 | |> Decode.andThen
119 | (\hex ->
120 | Color.Convert.hexToColor hex
121 | |> Result.toMaybe
122 | |> Maybe.withDefault fallbackColor
123 | |> Decode.succeed
124 | )
125 |
--------------------------------------------------------------------------------
/src/Lifechart/Model.elm:
--------------------------------------------------------------------------------
1 | module Lifechart.Model exposing (..)
2 |
3 | import Date exposing (Date)
4 | import Color exposing (Color)
5 | import Color.Convert
6 | import Time exposing (Time)
7 | import Navigation
8 | import DateExtra
9 |
10 |
11 | type alias Model =
12 | { birthDate : Date
13 | , birthDateString : String
14 | , kidUntil : Int
15 | , oldFrom : Int
16 | , lifeExpectancy : Int
17 | , lifeExpectancyString : String
18 | , onlyAdultYears : Bool
19 | , events : List Event
20 | , eventFormOpen : Int
21 | , eventForm : EventForm
22 | , modalOpen : Bool
23 | , now : Time
24 | }
25 |
26 |
27 | type alias JsonModel =
28 | { birthDate : Date
29 | , kidUntil : Int
30 | , oldFrom : Int
31 | , lifeExpectancy : Int
32 | , onlyAdultYears : Bool
33 | , events : List Event
34 | }
35 |
36 |
37 | type alias Event =
38 | { from : Date
39 | , to : Date
40 | , color : Color
41 | , label : String
42 | , overlay : Bool
43 | }
44 |
45 |
46 | type alias EventForm =
47 | { from : String
48 | , to : String
49 | , color : String
50 | , label : String
51 | , overlay : Bool
52 | }
53 |
54 |
55 | initialModel : Model
56 | initialModel =
57 | { birthDate = DateExtra.unsafeFromString "1988-07-24"
58 | , birthDateString = "1988-07-24"
59 | , kidUntil = 18
60 | , oldFrom = 70
61 | , lifeExpectancy = 80
62 | , lifeExpectancyString = "80"
63 | , onlyAdultYears = False
64 | , events = []
65 | , eventFormOpen = -1
66 | , eventForm = EventForm "" "" "" "" False
67 | , modalOpen = False
68 | , now = 0
69 | }
70 |
71 |
72 | mergeJsonModel : JsonModel -> Model
73 | mergeJsonModel jsonModel =
74 | { initialModel
75 | | birthDate = jsonModel.birthDate
76 | , birthDateString = DateExtra.toISOString jsonModel.birthDate
77 | , kidUntil = jsonModel.kidUntil
78 | , oldFrom = jsonModel.oldFrom
79 | , lifeExpectancy = jsonModel.lifeExpectancy
80 | , lifeExpectancyString = toString jsonModel.lifeExpectancy
81 | , onlyAdultYears = jsonModel.onlyAdultYears
82 | , events = jsonModel.events
83 | }
84 |
85 |
86 | mergeModel : Model -> Model -> Model
87 | mergeModel baseModel newModel =
88 | { newModel
89 | | eventFormOpen = baseModel.eventFormOpen
90 | , eventForm = baseModel.eventForm
91 | , modalOpen = baseModel.modalOpen
92 | , now = baseModel.now
93 | }
94 |
95 |
96 | initialEventForm : Model -> EventForm
97 | initialEventForm model =
98 | { from = DateExtra.toISOString <| Date.fromTime model.now
99 | , to = DateExtra.toISOString <| Date.fromTime model.now
100 | , label = ""
101 | , overlay = False
102 | , color = Color.Convert.colorToHex fallbackColor
103 | }
104 |
105 |
106 | createEvent : EventForm -> Event
107 | createEvent form =
108 | { from = DateExtra.fromStringWithFallback form.from (Date.fromTime 0)
109 | , to = DateExtra.fromStringWithFallback form.to (Date.fromTime 0)
110 | , label = form.label
111 | , overlay = form.overlay
112 | , color =
113 | Color.Convert.hexToColor form.color
114 | |> Result.toMaybe
115 | |> Maybe.withDefault fallbackColor
116 | }
117 |
118 |
119 | fallbackColor : Color
120 | fallbackColor =
121 | Color.red
122 |
123 |
124 | type NewEventField
125 | = EventFrom
126 | | EventTo
127 | | EventColor
128 | | EventLabel
129 |
130 |
131 | type Msg
132 | = Tick Time
133 | | NewUrl Navigation.Location
134 | | NewBirthDate String
135 | | NewLifeExpectancy String
136 | | OnlyAdultYears Bool
137 | | ShowEventForm Int
138 | | UpdateEvent NewEventField String
139 | | UpdateEventOverlay Bool
140 | | SaveEvent
141 | | DeleteEvent
142 | | NewConfig String
143 | | ToggleModal
144 |
145 |
146 | relativeBirthDate : Model -> Date
147 | relativeBirthDate model =
148 | if model.onlyAdultYears then
149 | partialDate model (Date.year model.birthDate + model.kidUntil)
150 | else
151 | model.birthDate
152 |
153 |
154 | relativeDeathDate : Model -> Date
155 | relativeDeathDate model =
156 | if model.onlyAdultYears then
157 | partialDate model (Date.year model.birthDate + maxOldFrom model)
158 | else
159 | partialDate model (Date.year model.birthDate + model.lifeExpectancy)
160 |
161 |
162 | maxKidUntil : Model -> Int
163 | maxKidUntil model =
164 | Basics.min model.lifeExpectancy model.kidUntil
165 |
166 |
167 | maxOldFrom : Model -> Int
168 | maxOldFrom model =
169 | Basics.min model.lifeExpectancy model.oldFrom
170 |
171 |
172 | partialDate : Model -> Int -> Date
173 | partialDate model year =
174 | DateExtra.unsafeFromString <|
175 | String.join "-"
176 | [ toString year
177 | , toString <| DateExtra.monthToInt <| Date.month model.birthDate
178 | , toString <| Date.day model.birthDate
179 | ]
180 |
181 |
182 | eventInitial : Event -> String
183 | eventInitial event =
184 | event.label |> String.left 1 |> String.toUpper
185 |
186 |
187 | (=>) : a -> b -> ( a, b )
188 | (=>) =
189 | (,)
190 |
--------------------------------------------------------------------------------
/src/Lifechart/Update.elm:
--------------------------------------------------------------------------------
1 | module Lifechart.Update exposing (init, update)
2 |
3 | import Navigation
4 | import Date
5 | import DateExtra
6 | import Time
7 | import Task
8 | import Regex
9 | import Color.Convert
10 | import Lifechart.Model exposing (..)
11 | import Lifechart.Serializer as Serializer
12 |
13 |
14 | init : Navigation.Location -> ( Model, Cmd Msg )
15 | init location =
16 | let
17 | model =
18 | decodeModel location |> Result.toMaybe |> Maybe.withDefault initialModel
19 | in
20 | ( model, Task.perform Tick Time.now )
21 |
22 |
23 | update : Msg -> Model -> ( Model, Cmd Msg )
24 | update msg model =
25 | case msg of
26 | Tick time ->
27 | ( { model | now = time }, Cmd.none )
28 |
29 | NewUrl location ->
30 | let
31 | newModel =
32 | case decodeModel location of
33 | Ok urlModel ->
34 | mergeModel model urlModel
35 |
36 | Err _ ->
37 | model
38 | in
39 | ( newModel, Cmd.none )
40 |
41 | NewBirthDate string ->
42 | let
43 | stringModel =
44 | { model | birthDateString = string }
45 |
46 | validFormat =
47 | Regex.contains (Regex.regex "^\\d{4}-\\d{2}-\\d{2}$") string
48 |
49 | -- XXX: we need this pre-check for browsers without support for
50 | -- input[type='date'] which may send garbage as the date string
51 | date =
52 | if validFormat then
53 | Date.fromString string
54 | else
55 | Err ""
56 | in
57 | case date of
58 | Ok date ->
59 | let
60 | newModel =
61 | { stringModel | birthDate = date }
62 | in
63 | ( newModel, updateUrl newModel )
64 |
65 | Err _ ->
66 | ( stringModel, Cmd.none )
67 |
68 | NewLifeExpectancy string ->
69 | let
70 | stringModel =
71 | { model | lifeExpectancyString = string }
72 |
73 | int =
74 | String.toInt string |> Result.toMaybe |> Maybe.withDefault 0
75 | in
76 | if int < minLifeExpectancy model || int > 500 then
77 | ( stringModel, Cmd.none )
78 | else
79 | let
80 | newModel =
81 | { stringModel | lifeExpectancy = int }
82 | in
83 | ( newModel, updateUrl newModel )
84 |
85 | OnlyAdultYears bool ->
86 | let
87 | -- TODO: fix this dirty hack somehow
88 | tempModel =
89 | { model | onlyAdultYears = bool }
90 |
91 | newModel =
92 | { tempModel
93 | | lifeExpectancy =
94 | Basics.max tempModel.lifeExpectancy (minLifeExpectancy tempModel)
95 | }
96 | in
97 | ( newModel, updateUrl newModel )
98 |
99 | ShowEventForm id ->
100 | let
101 | newId =
102 | if model.eventFormOpen == id then
103 | -1
104 | else
105 | id
106 |
107 | event =
108 | List.take newId model.events |> List.reverse |> List.head
109 |
110 | eventForm =
111 | case event of
112 | Nothing ->
113 | initialEventForm model
114 |
115 | Just event ->
116 | { from = DateExtra.toISOString event.from
117 | , to = DateExtra.toISOString event.to
118 | , color = Color.Convert.colorToHex event.color
119 | , label = event.label
120 | , overlay = event.overlay
121 | }
122 | in
123 | ( { model | eventFormOpen = newId, eventForm = eventForm }, Cmd.none )
124 |
125 | UpdateEvent field value ->
126 | let
127 | form =
128 | model.eventForm
129 |
130 | -- TODO: this is kinda gross, is there a better way?
131 | newForm =
132 | case field of
133 | EventFrom ->
134 | { form | from = value }
135 |
136 | EventTo ->
137 | { form | to = value }
138 |
139 | EventColor ->
140 | { form | color = value }
141 |
142 | EventLabel ->
143 | { form | label = value }
144 | in
145 | ( { model | eventForm = newForm }, Cmd.none )
146 |
147 | UpdateEventOverlay bool ->
148 | let
149 | form =
150 | model.eventForm
151 |
152 | newForm =
153 | { form | overlay = bool }
154 | in
155 | ( { model | eventForm = newForm }, Cmd.none )
156 |
157 | SaveEvent ->
158 | let
159 | existingEvent =
160 | model.eventFormOpen /= 0
161 |
162 | currentEvent =
163 | createEvent model.eventForm
164 |
165 | otherEvents =
166 | if existingEvent then
167 | deleteItem (model.eventFormOpen - 1) model.events
168 | else
169 | model.events
170 |
171 | events =
172 | (currentEvent :: otherEvents)
173 | |> List.sortBy (\event -> DateExtra.toISOString event.from)
174 |
175 | newModel =
176 | { model | events = events, eventFormOpen = -1 }
177 | in
178 | ( newModel, updateUrl newModel )
179 |
180 | DeleteEvent ->
181 | let
182 | events =
183 | deleteItem (model.eventFormOpen - 1) model.events
184 |
185 | newModel =
186 | { model | events = events, eventFormOpen = -1 }
187 | in
188 | ( newModel, updateUrl newModel )
189 |
190 | NewConfig json ->
191 | let
192 | newModel =
193 | case Serializer.deserializeJson json of
194 | Ok jsonModel ->
195 | mergeModel model jsonModel
196 |
197 | Err _ ->
198 | model
199 | in
200 | ( newModel, updateUrl newModel )
201 |
202 | ToggleModal ->
203 | ( { model | modalOpen = not model.modalOpen }, Cmd.none )
204 |
205 |
206 | decodeModel : Navigation.Location -> Result String Model
207 | decodeModel location =
208 | let
209 | dataWithoutHash =
210 | String.dropLeft 1 location.hash
211 | in
212 | if String.isEmpty dataWithoutHash then
213 | Ok initialModel
214 | else
215 | Serializer.deserialize dataWithoutHash
216 |
217 |
218 | updateUrl : Model -> Cmd Msg
219 | updateUrl model =
220 | let
221 | base64 =
222 | Serializer.serialize model
223 |
224 | url =
225 | "#" ++ base64
226 | in
227 | Navigation.newUrl url
228 |
229 |
230 | minLifeExpectancy : Model -> Int
231 | minLifeExpectancy model =
232 | if model.onlyAdultYears then
233 | model.kidUntil
234 | else
235 | 1
236 |
237 |
238 | deleteItem : Int -> List a -> List a
239 | deleteItem index list =
240 | List.indexedMap
241 | (\i ->
242 | \item ->
243 | if i == index then
244 | Nothing
245 | else
246 | Just item
247 | )
248 | list
249 | |> List.filterMap identity
250 |
--------------------------------------------------------------------------------
/src/Lifechart/View/Canvas.elm:
--------------------------------------------------------------------------------
1 | module Lifechart.View.Canvas exposing (canvas)
2 |
3 | import Html exposing (..)
4 | import Collage exposing (Form, LineStyle)
5 | import Element exposing (Element)
6 | import Text exposing (Text)
7 | import Color exposing (Color)
8 | import Color.Interpolate
9 | import Date exposing (Date)
10 | import Time exposing (Time)
11 | import DateExtra
12 | import Lifechart.Model as Model exposing (..)
13 |
14 |
15 | lineHeight : number
16 | lineHeight =
17 | 16
18 |
19 |
20 | canvasHeight : number -> Float
21 | canvasHeight lifeExpectancy =
22 | lifeExpectancy * (weekWidth + weekBorder * 2)
23 |
24 |
25 | canvasWidth : number
26 | canvasWidth =
27 | indexWidth + 52 * (weekWidth + weekBorder * 2) + legendWidth
28 |
29 |
30 | indexWidth : number
31 | indexWidth =
32 | 60
33 |
34 |
35 | legendWidth : number
36 | legendWidth =
37 | 20
38 |
39 |
40 | weekWidth : number
41 | weekWidth =
42 | 10
43 |
44 |
45 | weekBorder : number
46 | weekBorder =
47 | 1
48 |
49 |
50 | oneDay : number
51 | oneDay =
52 | 86400 * 1000
53 |
54 |
55 | oneWeek : number
56 | oneWeek =
57 | oneDay * 7
58 |
59 |
60 | canvas : Model -> Html Msg
61 | canvas model =
62 | let
63 | height =
64 | lineHeight * 2 + canvasHeight model.lifeExpectancy
65 |
66 | grid =
67 | Collage.group (years model)
68 | |> Collage.moveX (-canvasWidth / 2)
69 | |> Collage.moveY (height / 2)
70 |
71 | theLegend =
72 | legend model
73 | |> Collage.moveX (canvasWidth / 2 - legendWidth + lineHeight)
74 |
75 | form =
76 | if model.onlyAdultYears then
77 | Collage.group [ grid ]
78 | else
79 | Collage.group [ grid, theLegend ]
80 | in
81 | Collage.collage canvasWidth (ceiling height) [ form ] |> Element.toHtml
82 |
83 |
84 | legend : Model -> Form
85 | legend model =
86 | let
87 | makeText text =
88 | Text.fromString text
89 | |> Collage.text
90 | |> Collage.rotate (degrees -90)
91 |
92 | ( textOffset, markOffset ) =
93 | ( 11, 6 )
94 |
95 | ( kidUntil, oldFrom, lifeExpectancy ) =
96 | ( toFloat model.kidUntil
97 | , toFloat model.oldFrom
98 | , toFloat model.lifeExpectancy
99 | )
100 |
101 | maxKidUntil =
102 | Model.maxKidUntil model |> toFloat
103 |
104 | kid =
105 | makeText "kid"
106 | |> Collage.moveY
107 | (canvasHeight ((lifeExpectancy - maxKidUntil) / 2) - textOffset)
108 |
109 | kidMark =
110 | Collage.rect 10 1
111 | |> Collage.filled Color.black
112 | |> Collage.moveX -2
113 | |> Collage.moveY
114 | (canvasHeight (lifeExpectancy / 2 - kidUntil) - markOffset)
115 |
116 | maxOldFrom =
117 | Model.maxOldFrom model |> toFloat
118 |
119 | adult =
120 | if maxOldFrom - kidUntil < 8 then
121 | makeText ""
122 | else
123 | makeText "adult years"
124 | |> Collage.moveY
125 | (canvasHeight (lifeExpectancy / 2 - (kidUntil + maxOldFrom) / 2) - textOffset)
126 |
127 | oldMark =
128 | Collage.rect 10 1
129 | |> Collage.filled Color.black
130 | |> Collage.moveX -2
131 | |> Collage.moveY
132 | -(canvasHeight (oldFrom - lifeExpectancy / 2) + markOffset)
133 |
134 | old =
135 | if lifeExpectancy - oldFrom < 1 then
136 | makeText ""
137 | else
138 | makeText "old"
139 | |> Collage.moveY
140 | -(canvasHeight ((lifeExpectancy + oldFrom) / 2 - lifeExpectancy / 2) + textOffset)
141 | in
142 | Collage.group [ kid, kidMark, adult, oldMark, old ]
143 |
144 |
145 | years : Model -> List Form
146 | years model =
147 | let
148 | makeYear i =
149 | Collage.group (year model i)
150 | |> Collage.moveY
151 | ((0 - toFloat (i - from + 1)) * (weekWidth + weekBorder * 2) - lineHeight)
152 |
153 | ( from, to ) =
154 | if model.onlyAdultYears then
155 | ( model.kidUntil, maxOldFrom model )
156 | else
157 | ( 0, model.lifeExpectancy )
158 | in
159 | weekIndexes :: (List.range from to |> List.map makeYear)
160 |
161 |
162 | weekIndexes : Form
163 | weekIndexes =
164 | let
165 | makeIndex i =
166 | Text.fromString (toString i)
167 | |> Collage.text
168 | |> Collage.moveX (toFloat i * (weekWidth + weekBorder * 2))
169 | in
170 | List.range 1 52
171 | |> List.filter (\i -> i % 2 /= 0)
172 | |> List.map makeIndex
173 | |> Collage.group
174 | |> Collage.move ( indexWidth, -10 )
175 |
176 |
177 | year : Model -> Int -> List Form
178 | year model index =
179 | let
180 | year =
181 | Date.year model.birthDate + index
182 |
183 | paddedIndex =
184 | String.padLeft 2 '0' (toString index)
185 |
186 | label =
187 | Text.fromString (toString year ++ " / " ++ paddedIndex)
188 | |> Collage.text
189 | |> Collage.move ( 32, 2 )
190 |
191 | makeWeek i =
192 | week model index i
193 | |> Collage.moveX
194 | (toFloat i * (weekWidth + weekBorder * 2) + indexWidth)
195 | in
196 | label :: (List.range 1 52 |> List.map makeWeek)
197 |
198 |
199 | week : Model -> Int -> Int -> Form
200 | week model year week =
201 | let
202 | time =
203 | yearWeekToTime model ( year, week )
204 |
205 | match event =
206 | (Date.toTime event.from <= time) && (Date.toTime event.to >= time)
207 |
208 | ( overlays, events ) =
209 | List.filter match model.events |> List.partition .overlay
210 |
211 | weekColor =
212 | List.map .color events |> mixColors
213 |
214 | initial =
215 | List.head overlays |> Maybe.andThen makeInitial
216 |
217 | makeInitial event =
218 | Just
219 | (eventInitial event
220 | |> Text.fromString
221 | |> Text.monospace
222 | |> Text.height weekWidth
223 | |> Text.bold
224 | |> Text.color Color.white
225 | |> Collage.text
226 | |> Collage.moveY 1
227 | )
228 |
229 | square color =
230 | Collage.square weekWidth |> Collage.filled color
231 |
232 | filled color =
233 | case initial of
234 | Nothing ->
235 | square color
236 |
237 | Just initial ->
238 | Collage.group [ square color, initial ]
239 |
240 | outlined =
241 | Collage.square (weekWidth - weekBorder) |> Collage.outlined lineStyle
242 | in
243 | if isCurrentWeek model time then
244 | filled Color.black |> Collage.alpha 0.5
245 | else
246 | case weekColor of
247 | Nothing ->
248 | if outOfBounds model time then
249 | filled Color.lightGrey
250 | else if isKid model time || isOld model time then
251 | filled Color.grey
252 | else if isPast model time then
253 | filled Color.black
254 | else
255 | outlined
256 |
257 | Just color ->
258 | filled color
259 |
260 |
261 | mixColors : List Color -> Maybe Color
262 | mixColors colors =
263 | case colors of
264 | [] ->
265 | Nothing
266 |
267 | firstColor :: otherColors ->
268 | Just <|
269 | List.foldl
270 | (\oldColor ->
271 | \newColor ->
272 | Color.Interpolate.interpolate
273 | Color.Interpolate.HSL
274 | oldColor
275 | newColor
276 | 0.5
277 | )
278 | firstColor
279 | otherColors
280 |
281 |
282 | outOfBounds : Model -> Time -> Bool
283 | outOfBounds model time =
284 | (time < Date.toTime (relativeBirthDate model))
285 | || (time > Date.toTime (relativeDeathDate model))
286 |
287 |
288 | isCurrentWeek : Model -> Time -> Bool
289 | isCurrentWeek model time =
290 | let
291 | now =
292 | model.now
293 |
294 | halfWeek =
295 | oneWeek / 2
296 | in
297 | now - halfWeek <= time && time < now + halfWeek
298 |
299 |
300 | isPast : Model -> Time -> Bool
301 | isPast model time =
302 | time < model.now
303 |
304 |
305 | isKid : Model -> Time -> Bool
306 | isKid model time =
307 | let
308 | kidDate =
309 | partialDate model (Date.year (relativeBirthDate model) + model.kidUntil)
310 | in
311 | if model.onlyAdultYears then
312 | False
313 | else
314 | Date.toTime kidDate >= time
315 |
316 |
317 | isOld : Model -> Time -> Bool
318 | isOld model time =
319 | let
320 | oldDate =
321 | partialDate model (Date.year (relativeBirthDate model) + model.oldFrom)
322 | in
323 | if model.onlyAdultYears then
324 | False
325 | else
326 | Date.toTime oldDate <= time
327 |
328 |
329 | yearWeekToTime : Model -> ( Int, Int ) -> Time
330 | yearWeekToTime model ( year, week ) =
331 | let
332 | currentYear =
333 | Date.year model.birthDate + year
334 |
335 | beginningOfYear =
336 | DateExtra.unsafeFromString <| toString currentYear ++ "-01-01"
337 |
338 | firstMondayOffset =
339 | case Date.dayOfWeek beginningOfYear of
340 | Date.Mon ->
341 | 0
342 |
343 | Date.Tue ->
344 | 1
345 |
346 | Date.Wed ->
347 | 2
348 |
349 | Date.Thu ->
350 | 3
351 |
352 | Date.Fri ->
353 | 4
354 |
355 | Date.Sat ->
356 | 5
357 |
358 | Date.Sun ->
359 | 6
360 |
361 | yearOffset =
362 | toFloat (week - 1) * oneWeek + toFloat firstMondayOffset * oneDay
363 | in
364 | Date.toTime beginningOfYear + yearOffset
365 |
366 |
367 | lineStyle : LineStyle
368 | lineStyle =
369 | let
370 | default =
371 | Collage.defaultLine
372 | in
373 | { default | width = weekBorder }
374 |
--------------------------------------------------------------------------------
/src/Lifechart/View/Controls.elm:
--------------------------------------------------------------------------------
1 | module Lifechart.View.Controls exposing (controls, modal)
2 |
3 | import Date exposing (Date)
4 | import Time exposing (Time)
5 | import BasicsExtra exposing (roundToPadded)
6 | import DateExtra
7 | import Color.Convert
8 | import Html exposing (..)
9 | import Html.Attributes exposing (..)
10 | import Html.Events exposing (..)
11 | import Lifechart.Model exposing (..)
12 | import Lifechart.Serializer as Serializer
13 | import Lifechart.Demo as Demo
14 |
15 |
16 | modal : Model -> Html Msg
17 | modal model =
18 | let
19 | open =
20 | if model.modalOpen then
21 | "block"
22 | else
23 | "none"
24 |
25 | json =
26 | Serializer.serializeJson model
27 | in
28 | div
29 | [ style [ "display" => open ], class "modal in" ]
30 | [ div [ class "modal-dialog" ]
31 | [ div [ class "modal-content" ]
32 | [ div [ class "modal-body" ]
33 | [ div
34 | [ class "mb-1" ]
35 | [ text "You can copy/paste JSON below to export/import data." ]
36 | , textarea
37 | [ class "form-control"
38 | , rows 20
39 | , onInput NewConfig
40 | ]
41 | [ text json ]
42 | ]
43 | , div [ class "modal-footer" ]
44 | [ button
45 | [ type_ "button"
46 | , class "btn btn-primary"
47 | , onClick ToggleModal
48 | ]
49 | [ text "Close" ]
50 | ]
51 | ]
52 | ]
53 | ]
54 |
55 |
56 | controls : Model -> Html Msg
57 | controls model =
58 | div [] <|
59 | List.concat
60 | [ [ h1 [ class "text-center mb-2" ] [ text "Spend your time wisely." ] ]
61 | , [ div [ class "text-center text-muted mb-1" ] [ text "This will either inspire you or terrify you - hopefully the former." ] ]
62 | , links model
63 | , config model
64 | , metrics model
65 | , events model
66 | , footer
67 | ]
68 |
69 |
70 | links : Model -> List (Html Msg)
71 | links model =
72 | let
73 | current =
74 | Serializer.serialize model
75 | in
76 | [ ul [ class "nav justify-content-center mb-2" ]
77 | [ li [ class "nav-item" ]
78 | [ a [ class "nav-link active", href "#" ] [ text "blank chart" ] ]
79 | , li [ class "nav-item" ]
80 | [ a [ class "nav-link", href <| "#" ++ Demo.base64 ] [ text "demo chart" ] ]
81 | , li [ class "nav-item" ]
82 | [ a [ class "nav-link", href <| "#" ++ current ] [ text "bookmark your own chart" ] ]
83 | ]
84 | ]
85 |
86 |
87 | circled : Attribute Msg
88 | circled =
89 | style
90 | [ ( "background", "#D3D7CF" )
91 | , ( "border-radius", "1rem" )
92 | , ( "padding", "0 0.35rem" )
93 | , ( "margin-left", "0.2rem" )
94 | ]
95 |
96 |
97 | config : Model -> List (Html Msg)
98 | config model =
99 | [ div [ class "row form-group" ]
100 | [ label [ class "col-5 col-form-label col-form-label-lg" ] [ text "Date of Birth" ]
101 | , div [ class "col-7" ]
102 | [ input
103 | (List.append dateInputAttributes
104 | [ class "form-control form-control-lg"
105 | , value model.birthDateString
106 | , Html.Attributes.max <| DateExtra.toISOString <| Date.fromTime model.now
107 | , onInput NewBirthDate
108 | ]
109 | )
110 | []
111 | ]
112 | ]
113 | , div [ class "row form-group" ]
114 | [ label [ class "col-5 col-form-label col-form-label-lg" ]
115 | [ text "Life Expectancy "
116 | , a
117 | [ href
118 | "https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy"
119 | , target "_blank"
120 | , circled
121 | ]
122 | [ text "?" ]
123 | ]
124 | , div [ class "col-7" ]
125 | [ input
126 | [ class "form-control form-control-lg"
127 | , type_ "number"
128 | , required True
129 | , value model.lifeExpectancyString
130 | , Html.Attributes.min "1"
131 | , Html.Attributes.max "500"
132 | , onInput NewLifeExpectancy
133 | ]
134 | []
135 | ]
136 | ]
137 | , div [ class "row form-group" ]
138 | [ label [ class "col-5 col-form-label col-form-label-lg" ]
139 | [ text "Non-Adult Years "
140 | , a
141 | [ href
142 | "https://www.reddit.com/r/GetMotivated/comments/1vyf9r/made_for_myself_thought_of_you_weeks_left/cexas8u/"
143 | , target "_blank"
144 | , circled
145 | ]
146 | [ text "?" ]
147 | ]
148 | , div [ class "col-7" ]
149 | [ label [ class "form-check-inline form-control-lg" ]
150 | [ input
151 | [ class "form-check-input"
152 | , type_ "radio"
153 | , checked <| not model.onlyAdultYears
154 | , onClick <| OnlyAdultYears False
155 | ]
156 | []
157 | , text " Show"
158 | ]
159 | , label [ class "form-check-inline form-control-lg" ]
160 | [ input
161 | [ class "form-check-input"
162 | , type_ "radio"
163 | , checked model.onlyAdultYears
164 | , onClick <| OnlyAdultYears True
165 | ]
166 | []
167 | , text " Hide"
168 | ]
169 | ]
170 | ]
171 | ]
172 |
173 |
174 | newEvent : Model -> List (Html Msg)
175 | newEvent model =
176 | [ li [ class "list-group-item" ]
177 | [ h5 [ class "mb-0" ]
178 | [ span [] [ text "Events" ]
179 | , a
180 | [ href "javascript:void(0)"
181 | , onClick (ShowEventForm 0)
182 | , class "float-right"
183 | ]
184 | [ text "Add event" ]
185 | ]
186 | ]
187 | , eventForm model 0
188 | ]
189 |
190 |
191 | eventForm : Model -> Int -> Html Msg
192 | eventForm model index =
193 | let
194 | event =
195 | model.eventForm
196 |
197 | visibility =
198 | if model.eventFormOpen == index then
199 | ""
200 | else
201 | " d-none"
202 |
203 | newEvent =
204 | index == 0
205 |
206 | delete =
207 | a
208 | [ class "btn btn-danger"
209 | , href "javascript:void(0)"
210 | , onClick DeleteEvent
211 | ]
212 | [ text "Delete" ]
213 |
214 | submit =
215 | input
216 | [ class "btn btn-primary ml-1"
217 | , type_ "submit"
218 | , value
219 | (if newEvent then
220 | "Add"
221 | else
222 | "Save"
223 | )
224 | ]
225 | []
226 |
227 | actions =
228 | if newEvent then
229 | [ submit ]
230 | else
231 | [ delete, submit ]
232 | in
233 | li [ class <| "list-group-item" ++ visibility ]
234 | [ Html.form [ onSubmit SaveEvent ]
235 | [ div [ class "row form-group" ]
236 | [ div [ class "col" ]
237 | [ div [ class "input-group" ]
238 | [ div [ class "input-group-prepend" ]
239 | [ div [ class "input-group-text" ] [ text "From" ]
240 | ]
241 | , input
242 | (List.append dateInputAttributes
243 | [ class "form-control"
244 | , value event.from
245 | , Html.Attributes.max event.to
246 | , onInput (UpdateEvent EventFrom)
247 | ]
248 | )
249 | []
250 | ]
251 | ]
252 | , div [ class "col" ]
253 | [ div [ class "input-group" ]
254 | [ div [ class "input-group-prepend" ]
255 | [ div [ class "input-group-text" ] [ text "To" ]
256 | ]
257 | , input
258 | (List.append dateInputAttributes
259 | [ class "form-control"
260 | , value event.to
261 | , Html.Attributes.min event.from
262 | , onInput (UpdateEvent EventTo)
263 | ]
264 | )
265 | []
266 | ]
267 | ]
268 | ]
269 | , div [ class "row form-group" ]
270 | [ div [ class "col" ]
271 | [ div [ class "input-group" ]
272 | [ div [ class "input-group-prepend" ]
273 | [ div [ class "input-group-text" ] [ text "Label" ]
274 | ]
275 | , input
276 | [ class "form-control"
277 | , placeholder "label"
278 | , type_ "text"
279 | , required True
280 | , value event.label
281 | , onInput (UpdateEvent EventLabel)
282 | ]
283 | []
284 | ]
285 | ]
286 | , div [ class "col" ]
287 | [ label
288 | [ class "form-check-inline"
289 | , style [ "line-height" => "2.5rem" ]
290 | ]
291 | [ input
292 | [ class "form-check-input"
293 | , type_ "checkbox"
294 | , checked event.overlay
295 | , onCheck UpdateEventOverlay
296 | ]
297 | []
298 | , text " overlay"
299 | ]
300 | , input
301 | [ class <|
302 | "float-right"
303 | ++ if event.overlay then
304 | " d-none"
305 | else
306 | ""
307 | , type_ "color"
308 | , required True
309 | , value event.color
310 | , style [ "height" => "2.5rem" ]
311 | , onInput (UpdateEvent EventColor)
312 | ]
313 | []
314 | ]
315 | ]
316 | , div [ class "row form-group" ]
317 | [ div [ class "col-12 text-right" ] actions
318 | ]
319 | ]
320 | ]
321 |
322 |
323 | events : Model -> List (Html Msg)
324 | events model =
325 | let
326 | makeEvent event index =
327 | [ li [ class "list-group-item" ]
328 | [ div
329 | [ class "row" ]
330 | [ div [ class "col-3" ]
331 | [ eventIcon event
332 | , span [] [ text event.label ]
333 | ]
334 | , div [ class "col-7 text-right text-muted" ]
335 | [ text <|
336 | DateExtra.toISOString event.from
337 | ++ " to "
338 | ++ DateExtra.toISOString event.to
339 | ++ " ("
340 | ++ eventPercentage event model
341 | ++ "%)"
342 | ]
343 | , div [ class "col-2 text-right" ]
344 | [ a
345 | [ href "javascript:void(0)"
346 | , onClick (ShowEventForm index)
347 | ]
348 | [ text "edit" ]
349 | ]
350 | ]
351 | ]
352 | , eventForm model index
353 | ]
354 |
355 | eventIcon event =
356 | div
357 | [ class "float-left"
358 | , style
359 | [ "width" => "1rem"
360 | , "height" => "1rem"
361 | , "line-height" => "1rem"
362 | , "font-weight" => "bold"
363 | , "color" => "#FFFFFF"
364 | , "margin" => "3px 0.5rem 0 0"
365 | , "padding"
366 | => if event.overlay then
367 | "0 0 3px 3px"
368 | else
369 | "0"
370 | , "background-color"
371 | => if event.overlay then
372 | "#000000"
373 | else
374 | Color.Convert.colorToHex event.color
375 | ]
376 | ]
377 | [ text <|
378 | if event.overlay then
379 | eventInitial event
380 | else
381 | ""
382 | ]
383 |
384 | eventPercentage event model =
385 | 100
386 | * (Date.toTime event.to - Date.toTime event.from)
387 | / (Date.toTime (relativeDeathDate model) - Date.toTime (relativeBirthDate model))
388 | |> roundToPadded 1
389 |
390 | list =
391 | if List.isEmpty events then
392 | [ li [ class "list-group-item" ]
393 | [ div [ class "text-muted text-center" ] [ text "no events yet" ]
394 | ]
395 | ]
396 | else
397 | List.concat <|
398 | List.indexedMap
399 | (\index -> \event -> makeEvent event (index + 1))
400 | events
401 |
402 | events =
403 | model.events
404 | in
405 | [ div [ class "card mt-4 mb-4" ]
406 | [ ul [ class "list-group list-group-flush" ] <|
407 | List.concat [ newEvent model, list ]
408 | ]
409 | ]
410 |
411 |
412 | metrics : Model -> List (Html Msg)
413 | metrics model =
414 | let
415 | left =
416 | weeksLeft model
417 |
418 | percentage =
419 | 100
420 | * (model.now - Date.toTime (relativeBirthDate model))
421 | / (Date.toTime (relativeDeathDate model) - Date.toTime (relativeBirthDate model))
422 | |> clamp 0 100
423 | |> roundToPadded 6
424 | in
425 | [ div [ class "row mt-2" ]
426 | [ div [ class "col" ]
427 | [ h4 [] [ span [ class "badge badge-primary" ] [ text <| percentage ++ "% elapsed" ] ]
428 | ]
429 | , div [ class "col text-right" ]
430 | [ h4 [] [ span [ class "badge badge-primary" ] [ text <| left ++ " weeks left" ] ]
431 | ]
432 | ]
433 | , div [ class "row mt-1" ]
434 | [ div [ class "col-12" ]
435 | [ div
436 | [ class "progress"
437 | , style [ "height" => "1.7rem" ]
438 | ]
439 | [ div
440 | [ class "progress-bar progress-bar-striped progress-bar-animated"
441 | , style [ "width" => (percentage ++ "%") ]
442 | ]
443 | []
444 | ]
445 | ]
446 | ]
447 | ]
448 |
449 |
450 | footer : List (Html Msg)
451 | footer =
452 | [ div [ class "row mt-1" ]
453 | [ div [ class "col-12" ]
454 | [ div [ class "alert alert-info" ]
455 | [ strong [] [ text "Privacy: " ]
456 | , text "this page runs entirely in your browser so no data is sent to any server."
457 | ]
458 | , p [ class "text-center" ]
459 | [ text "Inspired by "
460 | , a [ href "https://i.imgur.com/67aHKhF.jpg", target "_blank" ] [ text "this chart" ]
461 | , text " - "
462 | , a [ href "http://waitbutwhy.com/2014/05/life-weeks.html", target "_blank" ] [ text "Terrified?" ]
463 | , text " - "
464 | , a [ href "https://github.com/infertux/lifechart", target "_blank" ] [ text "Source code" ]
465 | , text " - "
466 | , a [ href "javascript:void(0)", onClick ToggleModal ] [ text "Export raw data" ]
467 | ]
468 | , div [ class "d-none" ]
469 | [ strong [] [ text "Reminder: " ]
470 | , text "every single person you've ever known will die eventually - and so will you - but "
471 | , a [ href "https://youtu.be/k5RH3BdXDOY", target "_blank" ] [ text "don't worry" ]
472 | , text " :)"
473 | ]
474 | ]
475 | ]
476 | ]
477 |
478 |
479 | dateInputAttributes : List (Attribute Msg)
480 | dateInputAttributes =
481 | [ type_ "date"
482 | , required True
483 | , placeholder "YYYY-MM-DD"
484 | , pattern "[1-2]\\d{3}-[0-1]\\d-[0-3]\\d"
485 | ]
486 |
487 |
488 | weeksLeft : Model -> String
489 | weeksLeft model =
490 | let
491 | left =
492 | Date.toTime (relativeDeathDate model) - model.now
493 |
494 | weeks =
495 | (Time.inHours left) / 24 / 7 |> Basics.max 0
496 | in
497 | roundToPadded 6 weeks
498 |
--------------------------------------------------------------------------------
/public/lifechart.min.js:
--------------------------------------------------------------------------------
1 | (function(){"use strict";function r(r){function t(t){return function(e){return r(t,e)}}t.arity=2;t.func=r;return t}function t(r){function t(t){return function(e){return function(n){return r(t,e,n)}}}t.arity=3;t.func=r;return t}function e(r){function t(t){return function(e){return function(n){return function(a){return r(t,e,n,a)}}}}t.arity=4;t.func=r;return t}function n(r){function t(t){return function(e){return function(n){return function(a){return function(o){return r(t,e,n,a,o)}}}}}t.arity=5;t.func=r;return t}function a(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return r(t,e,n,a,o,c)}}}}}}t.arity=6;t.func=r;return t}function o(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return r(t,e,n,a,o,c,u)}}}}}}}t.arity=7;t.func=r;return t}function c(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return r(t,e,n,a,o,c,u,i)}}}}}}}}t.arity=8;t.func=r;return t}function u(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return r(t,e,n,a,o,c,u,i,_)}}}}}}}}}t.arity=9;t.func=r;return t}function i(r,t,e){return r.arity===2?r.func(t,e):r(t)(e)}function _(r,t,e,n){return r.arity===3?r.func(t,e,n):r(t)(e)(n)}function v(r,t,e,n,a){return r.arity===4?r.func(t,e,n,a):r(t)(e)(n)(a)}function l(r,t,e,n,a,o){return r.arity===5?r.func(t,e,n,a,o):r(t)(e)(n)(a)(o)}function f(r,t,e,n,a,o,c){return r.arity===6?r.func(t,e,n,a,o,c):r(t)(e)(n)(a)(o)(c)}function s(r,t,e,n,a,o,c,u){return r.arity===7?r.func(t,e,n,a,o,c,u):r(t)(e)(n)(a)(o)(c)(u)}function d(r,t,e,n,a,o,c,u,i){return r.arity===8?r.func(t,e,n,a,o,c,u,i):r(t)(e)(n)(a)(o)(c)(u)(i)}function h(r,t,e,n,a,o,c,u,i,_){return r.arity===9?r.func(t,e,n,a,o,c,u,i,_):r(t)(e)(n)(a)(o)(c)(u)(i)(_)}var p=function(){var e=32;var n=2;var a={ctor:"_Array",height:0,table:[]};function o(r,t){if(r<0||r>=z(t)){throw new Error("Index "+r+" is out of range. Check the length of "+"your array first or use getMaybe or getWithDefault.")}return c(r,t)}function c(r,t){for(var e=t.height;e>0;e--){var n=r>>e*5;while(t.lengths[n]<=r){n++}if(n>0){r-=t.lengths[n-1]}t=t.table[n]}return t.table[r]}function u(r,t,e){if(r<0||z(e)<=r){return e}return _(r,t,e)}function _(r,t,e){e=P(e);if(e.height===0){e.table[r]=t}else{var n=J(r,e);if(n>0){r-=e.lengths[n-1]}e.table[n]=_(r,t,e.table[n])}return e}function v(r,t){if(r<=0){return a}var n=Math.floor(Math.log(r)/Math.log(e));return l(t,n,0,r)}function l(r,t,n,a){if(t===0){var o=new Array((a-n)%(e+1));for(var c=0;c0?i[c-1]:0)}return{ctor:"_Array",height:t,table:o,lengths:i}}function f(r){if(r.ctor==="[]"){return a}var t=new Array(e);var n=[];var o=0;while(r.ctor!=="[]"){t[o]=r._0;r=r._1;o++;if(o===e){var c={ctor:"_Array",height:0,table:t};s(c,n);t=new Array(e);o=0}}if(o>0){var c={ctor:"_Array",height:0,table:t.splice(0,o)};s(c,n)}for(var u=0;u0){s(n[u],n)}}var i=n[n.length-1];if(i.height>0&&i.table.length===1){return i.table[0]}else{return i}}function s(r,t){var n=r.height;if(t.length===n){var a={ctor:"_Array",height:n+1,table:[],lengths:[]};t.push(a)}t[n].table.push(r);var o=z(r);if(t[n].lengths.length>0){o+=t[n].lengths[t[n].lengths.length-1]}t[n].lengths.push(o);if(t[n].table.length===e){s(t[n],t);t[n]={ctor:"_Array",height:n+1,table:[],lengths:[]}}}function d(r,t){var e=h(r,t);if(e!==null){return e}var n=U(r,t.height);return q(t,n)}function h(r,t){if(t.height===0){if(t.table.length=0;e--){r=t.height===0?mr.Cons(t.table[e],r):g(r,t.table[e])}return r}function m(r,t){var e={ctor:"_Array",height:t.height,table:new Array(t.table.length)};if(t.height>0){e.lengths=t.lengths}for(var n=0;n0){n.lengths=t.lengths}for(var a=0;a0?t.lengths[n-1]:0),t.table[n]);if(n===0){return a}var e={ctor:"_Array",height:t.height,table:t.table.slice(0,n),lengths:t.lengths.slice(0,n)};if(a.table.length>0){e.table[n]=a;e.lengths[n]=z(a)+(n>0?e.lengths[n-1]:0)}return e}function N(r,t){if(r===0){return t}if(t.height===0){var e={ctor:"_Array",height:0};e.table=t.table.slice(r,t.table.length+1);return e}var n=J(r,t);var a=N(r-(n>0?t.lengths[n-1]:0),t.table[n]);if(n===t.table.length-1){return a}var e={ctor:"_Array",height:t.height,table:t.table.slice(n,t.table.length+1),lengths:new Array(t.table.length-n)};e.table[0]=a;var o=0;for(var c=0;c0){var o=z(a[0]);for(var c=0;c0){var u=S(r,t);if(u>n){a=M(a[0],a[1],u)}}return q(a[0],a[1])}function B(r,t){if(r.height===0&&t.height===0){return[r,t]}if(r.height!==1||t.height!==1){if(r.height===t.height){r=P(r);t=P(t);var e=B(D(r),I(t));A(r,e[1]);R(t,e[0])}else if(r.height>t.height){r=P(r);var e=B(D(r),t);A(r,e[0]);t=j(e[1],e[1].height+1)}else{t=P(t);var e=B(r,I(t));var a=e[0].table.length===0?0:1;var o=a===0?1:0;R(t,e[a]);r=j(e[o],e[o].height+1)}}if(r.table.length===0||t.table.length===0){return[r,t]}var c=S(r,t);if(c<=n){return[r,t]}return M(r,t,c)}function A(r,t){var e=r.table.length-1;r.table[e]=t;r.lengths[e]=z(t);r.lengths[e]+=e>0?r.lengths[e-1]:0}function R(r,t){if(t.table.length>0){r.table[0]=t;r.lengths[0]=z(t);var e=z(r.table[0]);for(var n=1;n0){e.lengths=new Array(t)}return e}function M(r,t,n){var a=F(r.height,Math.min(e,r.table.length+t.table.length-n));var o=F(r.height,a.table.length-(r.table.length+t.table.length-n));var c=0;while(C(r.table,t.table,c).table.length%e===0){L(a.table,o.table,c,C(r.table,t.table,c));L(a.lengths,o.lengths,c,C(r.lengths,t.lengths,c));c++}var u=c;var i=new F(r.height-1,0);var _=0;while(c-u-(i.table.length>0?1:0)0){var f=i.lengths.length;for(var s=f;s0?i.lengths[s-1]:0}}_+=l;if(v.table.length<=l){c++;_=0}if(i.table.length===e){O(a,o,u,i);i=F(r.height-1,0);u++}}if(i.table.length>0){O(a,o,u,i);u++}while(c0){t.lengths=r.lengths.slice()}return t}function z(r){if(r.height===0){return r.table.length}else{return r.lengths[r.lengths.length-1]}}function J(r,t){var e=r>>5*t.height;while(t.lengths[e]<=r){e++}return e}function U(r,t){if(t===0){return{ctor:"_Array",height:0,table:[r]}}return{ctor:"_Array",height:t,table:[U(r,t-1)],lengths:[1]}}function j(r,t){if(t===r.height){return r}return{ctor:"_Array",height:t,table:[j(r,t-1)],lengths:[z(r)]}}function q(r,t){return{ctor:"_Array",height:r.height+1,table:[r,t],lengths:[z(r),z(r)+z(t)]}}function W(r){var t=new Array(z(r));H(t,0,r);return t}function H(r,t,e){for(var n=0;n0?u[i-1]:0)}return{ctor:"_Array",height:t,table:c,lengths:u}}return{empty:a,fromList:f,toList:p,initialize:r(v),append:r(E),push:r(d),slice:t(T),get:r(o),set:t(u),map:r(m),indexedMap:r(b),foldl:t(w),foldr:t(k),length:z,toJSArray:W,fromJSArray:Y}}();var g=function(){function e(r,t){return r/t|0}function n(r,t){return r%t}function a(r,t){if(t===0){throw new Error("Cannot perform mod 0. Division by zero error.")}var e=r%t;var n=r===0?0:t>0?r>=0?e:e+t:-a(-r,-t);return n===t?0:n}function o(r,t){return Math.log(t)/Math.log(r)}function c(r){return-r}function u(r){return r<0?-r:r}function i(r,t){return m.cmp(r,t)<0?r:t}function _(r,t){return m.cmp(r,t)>0?r:t}function v(r,t,e){return m.cmp(e,r)<0?r:m.cmp(e,t)>0?t:e}var l=["LT","EQ","GT"];function f(r,t){return{ctor:l[m.cmp(r,t)+1]}}function s(r,t){return r!==t}function d(r){return!r}function h(r){return r===Infinity||r===-Infinity}function p(r){return r|0}function g(r){return r*Math.PI/180}function b(r){return 2*Math.PI*r}function y(r){var t=r._0;var e=r._1;return m.Tuple2(t*Math.cos(e),t*Math.sin(e))}function w(r){var t=r._0;var e=r._1;return m.Tuple2(Math.sqrt(t*t+e*e),Math.atan2(e,t))}return{div:r(e),rem:r(n),mod:r(a),pi:Math.PI,e:Math.E,cos:Math.cos,sin:Math.sin,tan:Math.tan,acos:Math.acos,asin:Math.asin,atan:Math.atan,atan2:r(Math.atan2),degrees:g,turns:b,fromPolar:y,toPolar:w,sqrt:Math.sqrt,logBase:r(o),negate:c,abs:u,min:r(i),max:r(_),clamp:t(v),compare:r(f),xor:r(s),not:d,truncate:p,ceiling:Math.ceil,floor:Math.floor,round:Math.round,toFloat:function(r){return r},isNaN:isNaN,isInfinite:h}}();var m=function(){function t(r,t){var n=[];var a=e(r,t,0,n);var o;while(a&&(o=n.pop())){a=e(o.x,o.y,0,n)}return a}function e(r,t,n,a){if(n>100){a.push({x:r,y:t});return true}if(r===t){return true}if(typeof r!=="object"){if(typeof r==="function"){throw new Error('Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense.'+" Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#=="+" which describes why it is this way and what the better version will look like.")}return false}if(r===null||t===null){return false}if(r instanceof Date){return r.getTime()===t.getTime()}if(!("ctor"in r)){for(var o in r){if(!e(r[o],t[o],n+1,a)){return false}}return true}if(r.ctor==="RBNode_elm_builtin"||r.ctor==="RBEmpty_elm_builtin"){r=Ia(r);t=Ia(t)}if(r.ctor==="Set_elm_builtin"){r=_elm_lang$core$Set$toList(r);t=_elm_lang$core$Set$toList(t)}if(r.ctor==="::"){var c=r;var u=t;while(c.ctor==="::"&&u.ctor==="::"){if(!e(c._0,u._0,n+1,a)){return false}c=c._1;u=u._1}return c.ctor===u.ctor}if(r.ctor==="_Array"){var i=p.toJSArray(r);var _=p.toJSArray(t);if(i.length!==_.length){return false}for(var v=0;v=1){i=c(r._0,t._0);if(i!==a)return i;if(_>=2){i=c(r._1,t._1);if(i!==a)return i;if(_>=3){i=c(r._2,t._2);if(i!==a)return i;if(_>=4){i=c(r._3,t._3);if(i!==a)return i;if(_>=5){i=c(r._4,t._4);if(i!==a)return i;if(_>=6){i=c(r._5,t._5);if(i!==a)return i;if(_>=7)throw new Error("Comparison error: "+v)}}}}}}return a}throw new Error("Comparison error: comparison is only defined on ints, "+"floats, times, chars, strings, lists of comparable values, "+"and tuples of comparable values.")}var u={ctor:"_Tuple0"};function i(r,t){return{ctor:"_Tuple2",_0:r,_1:t}}function _(r){return new String(r)}var v=0;function l(r){return v++}function f(r,t){var e={};for(var n in r){e[n]=r[n]}for(var n in t){e[n]=t[n]}return e}var s={ctor:"[]"};function d(r,t){return{ctor:"::",_0:r,_1:t}}function h(r,t){if(typeof r==="string"){return r+t}if(r.ctor==="[]"){return t}var e=d(r._0,s);var n=e;r=r._1;while(r.ctor!=="[]"){n._1=d(r._0,s);r=r._1;n=n._1}n._1=t;return e}function g(r,t){return function(e){throw new Error("Ran into a `Debug.crash` in module `"+r+"` "+b(t)+"\n"+"The message provided by the code author is:\n\n "+e)}}function m(r,t,e){return function(n){throw new Error("Ran into a `Debug.crash` in module `"+r+"`\n\n"+"This was caused by the `case` expression "+b(t)+".\n"+"One of the branches ended with a crash and the following value got through:\n\n "+y(e)+"\n\n"+"The message provided by the code author is:\n\n "+n)}}function b(r){if(r.start.line==r.end.line){return"on line "+r.start.line}return"between lines "+r.start.line+" and "+r.end.line}function y(r){var t=typeof r;if(t==="function"){return""}if(t==="boolean"){return r?"True":"False"}if(t==="number"){return r+""}if(r instanceof String){return"'"+w(r,true)+"'"}if(t==="string"){return'"'+w(r,false)+'"'}if(r===null){return"null"}if(t==="object"&&"ctor"in r){var e=r.ctor.substring(0,5);if(e==="_Tupl"){var n=[];for(var a in r){if(a==="ctor")continue;n.push(y(r[a]))}return"("+n.join(",")+")"}if(e==="_Task"){return""}if(r.ctor==="_Array"){var o=Tt(r);return"Array.fromList "+y(o)}if(r.ctor===""){return""}if(r.ctor==="_Process"){return""}if(r.ctor==="::"){var n="["+y(r._0);r=r._1;while(r.ctor==="::"){n+=","+y(r._0);r=r._1}return n+"]"}if(r.ctor==="[]"){return"[]"}if(r.ctor==="Set_elm_builtin"){return"Set.fromList "+y(_elm_lang$core$Set$toList(r))}if(r.ctor==="RBNode_elm_builtin"||r.ctor==="RBEmpty_elm_builtin"){return"Dict.fromList "+y(Ia(r))}var n="";for(var c in r){if(c==="ctor")continue;var u=y(r[c]);var i=u[0];var _=i==="{"||i==="("||i==="<"||i==='"'||u.indexOf(" ")<0;n+=" "+(_?u:"("+u+")")}return r.ctor+n}if(t==="object"){if(r instanceof Date){return"<"+r.toString()+">"}if(r.elm_web_socket){return""}var n=[];for(var a in r){n.push(a+" = "+y(r[a]))}if(n.length===0){return"{}"}return"{ "+n.join(", ")+" }"}return""}function w(r,t){var e=r.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r").replace(/\v/g,"\\v").replace(/\0/g,"\\0");if(t){return e.replace(/\'/g,"\\'")}else{return e.replace(/\"/g,'\\"')}}return{eq:t,cmp:c,Tuple0:u,Tuple2:i,chr:_,update:f,guid:l,append:r(h),crash:g,crashCase:m,toString:y}}();var b=function(r){r:while(true){var t=r;var e=t._0;r=e;continue r}};var y=r(function(r,t){var e=t;return i(r,e._0,e._1)});var w=t(function(r,t,e){return r({ctor:"_Tuple2",_0:t,_1:e})});var k=t(function(r,t,e){return i(r,e,t)});var T=r(function(r,t){return r});var x=function(r){return r};var N=N||{};N["<|"]=r(function(r,t){return r(t)});var N=N||{};N["|>"]=r(function(r,t){return t(r)});var N=N||{};N[">>"]=t(function(r,t,e){return t(r(e))});var N=N||{};N["<<"]=t(function(r,t,e){return r(t(e))});var N=N||{};N["++"]=m.append;var E=m.toString;var B=g.isInfinite;var A=g.isNaN;var R=g.toFloat;var S=g.ceiling;var C=g.floor;var L=g.truncate;var O=g.round;var F=g.not;var M=g.xor;var N=N||{};N["||"]=g.or;var N=N||{};N["&&"]=g.and;var D=g.max;var I=g.min;var P=g.compare;var N=N||{};N[">="]=g.ge;var N=N||{};N["<="]=g.le;var N=N||{};N[">"]=g.gt;var N=N||{};N["<"]=g.lt;var N=N||{};N["/="]=g.neq;var N=N||{};N["=="]=g.eq;var z=g.e;var J=g.pi;var U=g.clamp;var j=g.logBase;var q=g.abs;var W=g.negate;var H=g.sqrt;var Y=g.atan2;var V=g.atan;var G=g.asin;var Q=g.acos;var $=g.tan;var K=g.sin;var Z=g.cos;var N=N||{};N["^"]=g.exp;var N=N||{};N["%"]=g.mod;var X=g.rem;var N=N||{};N["//"]=g.div;var N=N||{};N["/"]=g.floatDiv;var N=N||{};N["*"]=g.mul;var N=N||{};N["-"]=g.sub;var N=N||{};N["+"]=g.add;var rr=g.toPolar;var tr=g.fromPolar;var er=g.turns;var nr=g.degrees;var ar=function(r){return r};var or={ctor:"GT"};var cr={ctor:"EQ"};var ur={ctor:"LT"};var ir=function(r){return{ctor:"JustOneMore",_0:r}};var _r=r(function(r,t){var e=t;if(e.ctor==="Just"){return e._0}else{return r}});var vr={ctor:"Nothing"};var lr=r(function(r,t){var e=t;if(e.ctor==="Just"){return r(e._0)}else{return vr}});var fr=function(r){return{ctor:"Just",_0:r}};var sr=r(function(r,t){var e=t;if(e.ctor==="Just"){return fr(r(e._0))}else{return vr}});var dr=t(function(r,t,e){var n={ctor:"_Tuple2",_0:t,_1:e};if(n.ctor==="_Tuple2"&&n._0.ctor==="Just"&&n._1.ctor==="Just"){return fr(i(r,n._0._0,n._1._0))}else{return vr}});var hr=e(function(r,t,e,n){var a={ctor:"_Tuple3",_0:t,_1:e,_2:n};if(a.ctor==="_Tuple3"&&a._0.ctor==="Just"&&a._1.ctor==="Just"&&a._2.ctor==="Just"){return fr(_(r,a._0._0,a._1._0,a._2._0))}else{return vr}});var pr=n(function(r,t,e,n,a){var o={ctor:"_Tuple4",_0:t,_1:e,_2:n,_3:a};if(o.ctor==="_Tuple4"&&o._0.ctor==="Just"&&o._1.ctor==="Just"&&o._2.ctor==="Just"&&o._3.ctor==="Just"){return fr(v(r,o._0._0,o._1._0,o._2._0,o._3._0))}else{return vr}});var gr=a(function(r,t,e,n,a,o){var c={ctor:"_Tuple5",_0:t,_1:e,_2:n,_3:a,_4:o};if(c.ctor==="_Tuple5"&&c._0.ctor==="Just"&&c._1.ctor==="Just"&&c._2.ctor==="Just"&&c._3.ctor==="Just"&&c._4.ctor==="Just"){return fr(l(r,c._0._0,c._1._0,c._2._0,c._3._0,c._4._0))}else{return vr}});var mr=function(){var o={ctor:"[]"};function c(r,t){return{ctor:"::",_0:r,_1:t}}function u(r){var t=o;for(var e=r.length;e--;){t=c(r[e],t)}return t}function f(r){var t=[];while(r.ctor!=="[]"){t.push(r._0);r=r._1}return t}function s(r,t,e){var n=f(e);var a=t;for(var o=n.length;o--;){a=i(r,n[o],a)}return a}function d(r,t,e){var n=[];while(t.ctor!=="[]"&&e.ctor!=="[]"){n.push(i(r,t._0,e._0));t=t._1;e=e._1}return u(n)}function h(r,t,e,n){var a=[];while(t.ctor!=="[]"&&e.ctor!=="[]"&&n.ctor!=="[]"){a.push(_(r,t._0,e._0,n._0));t=t._1;e=e._1;n=n._1}return u(a)}function p(r,t,e,n,a){var o=[];while(t.ctor!=="[]"&&e.ctor!=="[]"&&n.ctor!=="[]"&&a.ctor!=="[]"){o.push(v(r,t._0,e._0,n._0,a._0));t=t._1;e=e._1;n=n._1;a=a._1}return u(o)}function g(r,t,e,n,a,o){var c=[];while(t.ctor!=="[]"&&e.ctor!=="[]"&&n.ctor!=="[]"&&a.ctor!=="[]"&&o.ctor!=="[]"){c.push(l(r,t._0,e._0,n._0,a._0,o._0));t=t._1;e=e._1;n=n._1;a=a._1;o=o._1}return u(c)}function b(r,t){return u(f(t).sort(function(t,e){return m.cmp(r(t),r(e))}))}function y(r,t){return u(f(t).sort(function(t,e){var n=r(t)(e).ctor;return n==="EQ"?0:n==="LT"?-1:1}))}return{Nil:o,Cons:c,cons:r(c),toArray:f,fromArray:u,foldr:t(s),map2:t(d),map3:e(h),map4:n(p),map5:a(g),sortBy:r(b),sortWith:r(y)}}();var br=mr.sortWith;var yr=mr.sortBy;var wr=function(r){return i(yr,x,r)};var kr=function(r){return{ctor:"::",_0:r,_1:{ctor:"[]"}}};var Tr=r(function(r,t){r:while(true){if(m.cmp(r,0)<1){return t}else{var e=t;if(e.ctor==="[]"){return t}else{var n=r-1,a=e._1;r=n;t=a;continue r}}}});var xr=mr.map5;var Nr=mr.map4;var Er=mr.map3;var Br=mr.map2;var Ar=r(function(r,t){r:while(true){var e=t;if(e.ctor==="[]"){return false}else{if(r(e._0)){return true}else{var n=r,a=e._1;r=n;t=a;continue r}}}});var Rr=r(function(r,t){return!i(Ar,function(t){return!r(t)},t)});var Sr=mr.foldr;var Cr=t(function(r,t,e){r:while(true){var n=e;if(n.ctor==="[]"){return t}else{var a=r,o=i(r,n._0,t),c=n._1;r=a;t=o;e=c;continue r}}});var Lr=function(t){return _(Cr,r(function(r,t){return t+1}),0,t)};var Or=function(t){return _(Cr,r(function(r,t){return r+t}),0,t)};var Fr=function(t){return _(Cr,r(function(r,t){return r*t}),1,t)};var Mr=function(r){var t=r;if(t.ctor==="::"){return fr(_(Cr,D,t._0,t._1))}else{return vr}};var Dr=function(r){var t=r;if(t.ctor==="::"){return fr(_(Cr,I,t._0,t._1))}else{return vr}};var Ir=r(function(r,t){return i(Ar,function(t){return m.eq(t,r)},t)});var Pr=function(r){var t=r;if(t.ctor==="[]"){return true}else{return false}};var zr=function(r){var t=r;if(t.ctor==="::"){return fr(t._1)}else{return vr}};var Jr=function(r){var t=r;if(t.ctor==="::"){return fr(t._0)}else{return vr}};var Ur=Ur||{};Ur["::"]=mr.cons;var jr=r(function(t,e){return _(Sr,r(function(r,e){return{ctor:"::",_0:t(r),_1:e}}),{ctor:"[]"},e)});var qr=r(function(t,e){var n=r(function(r,e){return t(r)?{ctor:"::",_0:r,_1:e}:e});return _(Sr,n,{ctor:"[]"},e)});var Wr=t(function(r,t,e){var n=r(t);if(n.ctor==="Just"){return{ctor:"::",_0:n._0,_1:e}}else{return e}});var Hr=r(function(r,t){return _(Sr,Wr(r),{ctor:"[]"},t)});var Yr=function(t){return _(Cr,r(function(r,t){return{ctor:"::",_0:r,_1:t}}),{ctor:"[]"},t)};var Vr=t(function(t,e,n){var a=r(function(r,e){var n=e;if(n.ctor==="::"){return{ctor:"::",_0:i(t,r,n._0),_1:e}}else{return{ctor:"[]"}}});return Yr(_(Cr,a,{ctor:"::",_0:e,_1:{ctor:"[]"}},n))});var Gr=r(function(t,e){var n=e;if(n.ctor==="[]"){return t}else{return _(Sr,r(function(r,t){return{ctor:"::",_0:r,_1:t}}),e,t)}});var Qr=function(r){return _(Sr,Gr,{ctor:"[]"},r)};var $r=r(function(r,t){return Qr(i(jr,r,t))});var Kr=r(function(t,e){var n=r(function(r,e){var n=e;var a=n._0;var o=n._1;return t(r)?{ctor:"_Tuple2",_0:{ctor:"::",_0:r,_1:a},_1:o}:{ctor:"_Tuple2",_0:a,_1:{ctor:"::",_0:r,_1:o}}});return _(Sr,n,{ctor:"_Tuple2",_0:{ctor:"[]"},_1:{ctor:"[]"}},e)});var Zr=function(t){var e=r(function(r,t){var e=r;var n=t;return{ctor:"_Tuple2",_0:{ctor:"::",_0:e._0,_1:n._0},_1:{ctor:"::",_0:e._1,_1:n._1}}});return _(Sr,e,{ctor:"_Tuple2",_0:{ctor:"[]"},_1:{ctor:"[]"}},t)};var Xr=r(function(t,e){var n=e;if(n.ctor==="[]"){return{ctor:"[]"}}else{var a=r(function(r,e){return{ctor:"::",_0:t,_1:{ctor:"::",_0:r,_1:e}}});var o=_(Sr,a,{ctor:"[]"},n._1);return{ctor:"::",_0:n._0,_1:o}}});var rt=t(function(r,t,e){r:while(true){if(m.cmp(r,0)<1){return e}else{var n=t;if(n.ctor==="[]"){return e}else{var a=r-1,o=n._1,c={ctor:"::",_0:n._0,_1:e};r=a;t=o;e=c;continue r}}}});var tt=r(function(r,t){return Yr(_(rt,r,t,{ctor:"[]"}))});var et=t(function(r,t,e){if(m.cmp(t,0)<1){return{ctor:"[]"}}else{var n={ctor:"_Tuple2",_0:t,_1:e};r:do{t:do{if(n.ctor==="_Tuple2"){if(n._1.ctor==="[]"){return e}else{if(n._1._1.ctor==="::"){switch(n._0){case 1:break t;case 2:return{ctor:"::",_0:n._1._0,_1:{ctor:"::",_0:n._1._1._0,_1:{ctor:"[]"}}};case 3:if(n._1._1._1.ctor==="::"){return{ctor:"::",_0:n._1._0,_1:{ctor:"::",_0:n._1._1._0,_1:{ctor:"::",_0:n._1._1._1._0,_1:{ctor:"[]"}}}}}else{break r}default:if(n._1._1._1.ctor==="::"&&n._1._1._1._1.ctor==="::"){var a=n._1._1._1._0;var o=n._1._1._0;var c=n._1._0;var u=n._1._1._1._1._0;var v=n._1._1._1._1._1;return m.cmp(r,1e3)>0?{ctor:"::",_0:c,_1:{ctor:"::",_0:o,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:u,_1:i(tt,t-4,v)}}}}:{ctor:"::",_0:c,_1:{ctor:"::",_0:o,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:u,_1:_(et,r+1,t-4,v)}}}}}else{break r}}}else{if(n._0===1){break t}else{break r}}}}else{break r}}while(false);return{ctor:"::",_0:n._1._0,_1:{ctor:"[]"}}}while(false);return e}});var nt=r(function(r,t){return _(et,0,r,t)});var at=t(function(r,t,e){r:while(true){if(m.cmp(t,0)<1){return r}else{var n={ctor:"::",_0:e,_1:r},a=t-1,o=e;r=n;t=a;e=o;continue r}}});var ot=r(function(r,t){return _(at,{ctor:"[]"},r,t)});var ct=t(function(r,t,e){r:while(true){if(m.cmp(r,t)<1){var n=r,a=t-1,o={ctor:"::",_0:t,_1:e};r=n;t=a;e=o;continue r}else{return e}}});var ut=r(function(r,t){return _(ct,r,t,{ctor:"[]"})});var it=r(function(r,t){return _(Br,r,i(ut,0,Lr(t)-1),t)});var _t=p.append;var vt=p.length;var lt=function(r){return m.eq(vt(r),0)};var ft=p.slice;var st=p.set;var dt=r(function(r,t){return m.cmp(0,r)<1&&m.cmp(r,p.length(t))<0?fr(i(p.get,r,t)):vr});var ht=p.push;var pt=p.empty;var gt=r(function(t,e){var n=r(function(r,e){return t(r)?i(p.push,r,e):e});return _(p.foldl,n,p.empty,e)});var mt=p.foldr;var bt=p.foldl;var yt=p.indexedMap;var wt=p.map;var kt=function(t){return _(Br,r(function(r,t){return{ctor:"_Tuple2",_0:r,_1:t}}),i(ut,0,p.length(t)-1),p.toList(t))};var Tt=p.toList;var xt=p.fromList;var Nt=p.initialize;var Et=r(function(r,t){return i(Nt,r,T(t))});var Bt={ctor:"Array"};var At=function(){return{and:r(function r(t,e){return t&e}),or:r(function r(t,e){return t|e}),xor:r(function r(t,e){return t^e}),complement:function r(t){return~t},shiftLeftBy:r(function(r,t){return t<>r}),shiftRightZfBy:r(function(r,t){return t>>>r})}}();var Rt=At.shiftRightZfBy;var St=At.shiftRightBy;var Ct=At.shiftLeftBy;var Lt=At.complement;var Ot=At.xor;var Ft=At.or;var Mt=At.and;var Dt=function(){return{fromCode:function(r){return m.chr(String.fromCharCode(r))},toCode:function(r){return r.charCodeAt(0)},toUpper:function(r){return m.chr(r.toUpperCase())},toLower:function(r){return m.chr(r.toLowerCase())},toLocaleUpper:function(r){return m.chr(r.toLocaleUpperCase())},toLocaleLower:function(r){return m.chr(r.toLocaleLowerCase())}}}();var It=Dt.fromCode;var Pt=Dt.toCode;var zt=Dt.toLocaleLower;var Jt=Dt.toLocaleUpper;var Ut=Dt.toLower;var jt=Dt.toUpper;var qt=t(function(r,t,e){var n=Pt(e);return m.cmp(n,Pt(r))>-1&&m.cmp(n,Pt(t))<1});var Wt=i(qt,m.chr("A"),m.chr("Z"));var Ht=i(qt,m.chr("a"),m.chr("z"));var Yt=i(qt,m.chr("0"),m.chr("9"));var Vt=i(qt,m.chr("0"),m.chr("7"));var Gt=function(r){return Yt(r)||(_(qt,m.chr("a"),m.chr("f"),r)||_(qt,m.chr("A"),m.chr("F"),r))};var Qt=r(function(r,t){var e=C(r);return R(i(N["%"],e,t))+r-R(e)});var $t=t(function(r,t,e){var n=R(e)/255;var a=R(t)/255;var o=R(r)/255;var c=i(D,i(D,o,a),n);var u=i(I,i(I,o,a),n);var _=c-u;var v=(c+u)/2;var l=m.eq(v,0)?0:_/(1-q(2*v-1));var f=nr(60)*(m.eq(c,o)?i(Qt,(a-n)/_,6):m.eq(c,a)?(n-o)/_+2:(o-a)/_+4);return{ctor:"_Tuple3",_0:f,_1:l,_2:v}});var Kt=t(function(r,t,e){var n=r/nr(60);var a=(1-q(2*e-1))*t;var o=a*(1-q(i(Qt,n,2)-1));var c=m.cmp(n,0)<0?{ctor:"_Tuple3",_0:0,_1:0,_2:0}:m.cmp(n,1)<0?{ctor:"_Tuple3",_0:a,_1:o,_2:0}:m.cmp(n,2)<0?{ctor:"_Tuple3",_0:o,_1:a,_2:0}:m.cmp(n,3)<0?{ctor:"_Tuple3",_0:0,_1:a,_2:o}:m.cmp(n,4)<0?{ctor:"_Tuple3",_0:0,_1:o,_2:a}:m.cmp(n,5)<0?{ctor:"_Tuple3",_0:o,_1:0,_2:a}:m.cmp(n,6)<0?{ctor:"_Tuple3",_0:a,_1:0,_2:o}:{ctor:"_Tuple3",_0:0,_1:0,_2:0};var u=c._0;var _=c._1;var v=c._2;var l=e-a/2;return{ctor:"_Tuple3",_0:u+l,_1:_+l,_2:v+l}});var Zt=function(r){var t=r;if(t.ctor==="RGBA"){return{red:t._0,green:t._1,blue:t._2,alpha:t._3}}else{var e=_(Kt,t._0,t._1,t._2);var n=e._0;var a=e._1;var o=e._2;return{red:O(255*n),green:O(255*a),blue:O(255*o),alpha:t._3}}};var Xt=function(r){var t=r;if(t.ctor==="HSLA"){return{hue:t._0,saturation:t._1,lightness:t._2,alpha:t._3}}else{var e=_($t,t._0,t._1,t._2);var n=e._0;var a=e._1;var o=e._2;return{hue:n,saturation:a,lightness:o,alpha:t._3}}};var re=e(function(r,t,e,n){return{ctor:"HSLA",_0:r,_1:t,_2:e,_3:n}});var te=e(function(r,t,e,n){return v(re,r-er(R(C(r/(2*J)))),t,e,n)});var ee=t(function(r,t,e){return v(te,r,t,e,1)});var ne=function(r){var t=r;if(t.ctor==="HSLA"){return v(te,t._0+nr(180),t._1,t._2,t._3)}else{var e=_($t,t._0,t._1,t._2);var n=e._0;var a=e._1;var o=e._2;return v(te,n+nr(180),a,o,t._3)}};var ae=function(r){return v(re,0,0,1-r,1)};var oe=function(r){return v(re,0,0,1-r,1)};var ce=e(function(r,t,e,n){return{ctor:"RGBA",_0:r,_1:t,_2:e,_3:n}});var ue=ce;var ie=t(function(r,t,e){return v(ce,r,t,e,1)});var _e=v(ce,239,41,41,1);var ve=v(ce,204,0,0,1);var le=v(ce,164,0,0,1);var fe=v(ce,252,175,62,1);var se=v(ce,245,121,0,1);var de=v(ce,206,92,0,1);var he=v(ce,255,233,79,1);var pe=v(ce,237,212,0,1);var ge=v(ce,196,160,0,1);var me=v(ce,138,226,52,1);var be=v(ce,115,210,22,1);var ye=v(ce,78,154,6,1);var we=v(ce,114,159,207,1);var ke=v(ce,52,101,164,1);var Te=v(ce,32,74,135,1);var xe=v(ce,173,127,168,1);var Ne=v(ce,117,80,123,1);var Ee=v(ce,92,53,102,1);var Be=v(ce,233,185,110,1);var Ae=v(ce,193,125,17,1);var Re=v(ce,143,89,2,1);var Se=v(ce,0,0,0,1);var Ce=v(ce,255,255,255,1);var Le=v(ce,238,238,236,1);var Oe=v(ce,211,215,207,1);var Fe=v(ce,186,189,182,1);var Me=v(ce,238,238,236,1);var De=v(ce,211,215,207,1);var Ie=v(ce,186,189,182,1);var Pe=v(ce,136,138,133,1);var ze=v(ce,85,87,83,1);var Je=v(ce,46,52,54,1);var Ue=n(function(r,t,e,n,a){return{ctor:"Radial",_0:r,_1:t,_2:e,_3:n,_4:a}});var je=Ue;var qe=t(function(r,t,e){return{ctor:"Linear",_0:r,_1:t,_2:e}});var We=qe;var He=function(){function r(r){var t=new Date(r);return isNaN(t.getTime())?hn("Unable to parse '"+r+"' as a date. Dates must be in the ISO 8601 format."):gn(t)}var t=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return{fromString:r,year:function(r){return r.getFullYear()},month:function(r){return{ctor:e[r.getMonth()]}},day:function(r){return r.getDate()},hour:function(r){return r.getHours()},minute:function(r){return r.getMinutes()},second:function(r){return r.getSeconds()},millisecond:function(r){return r.getMilliseconds()},toTime:function(r){return r.getTime()},fromTime:function(r){return new Date(r)},dayOfWeek:function(r){return{ctor:t[r.getDay()]}}}}();var Ye=function(){var t=1e4;function e(r){return{ctor:"_Task_succeed",value:r}}function n(r){return{ctor:"_Task_fail",value:r}}function a(r){return{ctor:"_Task_nativeBinding",callback:r,cancel:null}}function o(r,t){return{ctor:"_Task_andThen",callback:r,task:t}}function c(r,t){return{ctor:"_Task_onError",callback:r,task:t}}function u(r){return{ctor:"_Task_receive",callback:r}}function i(r){var t={ctor:"_Process",id:m.guid(),root:r,stack:null,mailbox:[]};g(t);return t}function _(r){return a(function(t){var n=i(r);t(e(n))})}function v(r,t){r.mailbox.push(t);g(r)}function l(r,t){return a(function(n){v(r,t);n(e(m.Tuple0))})}function f(r){return a(function(t){var n=r.root;if(n.ctor==="_Task_nativeBinding"&&n.cancel){n.cancel()}r.root=null;t(e(m.Tuple0))})}function s(r){return a(function(t){var n=setTimeout(function(){t(e(m.Tuple0))},r);return function(){clearTimeout(n)}})}function d(r,e){while(r=0){e.splice(t,1)}}return{subscribe:c,unsubscribe:i}}function A(r,t){x(r);u[r]={tag:"sub",subMap:R,converter:t,isForeign:true};return p(r)}var R=r(function r(t,e){return function(r){return t(e(r))}});function S(r,e){var n=[];var a=mr.Nil;var o=u[r].converter;var c=l;var _=d;var v=Ye.succeed(null);function l(r,t,e){var a=f(r,t,e);for(var o=0;o0){if(r&1){e+=t}r>>=1,t+=t}return e}function g(r,t,e){return e.slice(r,t)}function b(r,t){return r<1?"":t.slice(0,r)}function y(r,t){return r<1?"":t.slice(-r)}function w(r,t){return r<1?t:t.slice(r)}function k(r,t){return r<1?t:t.slice(0,-r)}function T(r,t,e){var n=(r-e.length)/2;return p(Math.ceil(n),t)+e+p(n|0,t)}function x(r,t,e){return e+p(r-e.length,t)}function N(r,t,e){return p(r-e.length,t)+e}function E(r){return r.trim()}function B(r){return r.replace(/^\s+/,"")}function A(r){return r.replace(/\s+$/,"")}function R(r){return mr.fromArray(r.trim().split(/\s+/g))}function S(r){return mr.fromArray(r.split(/\r\n|\r|\n/g))}function C(r){return r.toUpperCase()}function L(r){return r.toLowerCase()}function O(r,t){for(var e=t.length;e--;){if(r(m.chr(t[e]))){return true}}return false}function F(r,t){for(var e=t.length;e--;){if(!r(m.chr(t[e]))){return false}}return true}function M(r,t){return t.indexOf(r)>-1}function D(r,t){return t.indexOf(r)===0}function I(r,t){return t.length>=r.length&&t.lastIndexOf(r)===t.length-r.length}function P(r,t){var e=r.length;if(e<1){return mr.Nil}var n=0;var a=[];while((n=t.indexOf(r,n))>-1){a.push(n);n=n+e}return mr.fromArray(a)}function z(r){var t=r.length;if(t===0){return J(r)}var e=r[0];if(e==="0"&&r[1]==="x"){for(var n=2;n"9"||e<"0"&&e!=="-"&&e!=="+"){return J(r)}for(var n=1;n0){return{ctor:"_Tuple2",_0:i,_1:_(a,r,t,u)}}else{return{ctor:"_Tuple2",_0:f,_1:v(n,d,s,t,u)}}}}}});var l=_(Pa,i,{ctor:"_Tuple2",_0:Ia(o),_1:u},c);var f=l._0;var s=l._1;return _(Cr,r(function(r,t){var n=r;return _(e,n._0,n._1,t)}),s,f)});var Ja=e(function(r,t,e,n){return Hn.crash(Aa({ctor:"::",_0:"Internal red-black tree invariant violated, expected ",_1:{ctor:"::",_0:r,_1:{ctor:"::",_0:" and got ",_1:{ctor:"::",_0:E(t),_1:{ctor:"::",_0:"/",_1:{ctor:"::",_0:e,_1:{ctor:"::",_0:"/",_1:{ctor:"::",_0:n,_1:{ctor:"::",_0:"\nPlease report this bug to ",_1:{ctor:"[]"}}}}}}}}}}))});var Ua=function(r){var t=r;r:do{if(t.ctor==="RBNode_elm_builtin"){if(t._0.ctor==="BBlack"){return true}else{break r}}else{if(t._0.ctor==="LBBlack"){return true}else{break r}}}while(false);return false};var ja=r(function(r,t){r:while(true){var e=t;if(e.ctor==="RBEmpty_elm_builtin"){return r}else{var n=i(ja,r+1,e._4),a=e._3;r=n;t=a;continue r}}});var qa=function(r){return i(ja,0,r)};var Wa=r(function(r,t){r:while(true){var e=t;if(e.ctor==="RBEmpty_elm_builtin"){return vr}else{var n=i(P,r,e._1);switch(n.ctor){case"LT":var a=r,o=e._3;r=a;t=o;continue r;case"EQ":return fr(e._2);default:var c=r,u=e._4;r=c;t=u;continue r}}}});var Ha=r(function(r,t){var e=i(Wa,r,t);if(e.ctor==="Just"){return true}else{return false}});var Ya=t(function(r,t,e){r:while(true){var n=e;if(n.ctor==="RBEmpty_elm_builtin"){return{ctor:"_Tuple2",_0:r,_1:t}}else{var a=n._1,o=n._2,c=n._4;r=a;t=o;e=c;continue r}}});var Va={ctor:"NBlack"};var Ga={ctor:"BBlack"};var Qa={ctor:"Black"};var $a=function(r){var t=r;if(t.ctor==="RBNode_elm_builtin"){var e=t._0;return m.eq(e,Qa)||m.eq(e,Ga)}else{return true}};var Ka={ctor:"Red"};var Za=function(r){var t=r;switch(t.ctor){case"Black":return Ga;case"Red":return Qa;case"NBlack":return Ka;default:return Hn.crash("Can't make a double black node more black!")}};var Xa=function(r){var t=r;switch(t.ctor){case"BBlack":return Qa;case"Black":return Ka;case"Red":return Va;default:return Hn.crash("Can't make a negative black node less black!")}};var ro={ctor:"LBBlack"};var to={ctor:"LBlack"};var eo=function(r){return{ctor:"RBEmpty_elm_builtin",_0:r}};var no=eo(to);var ao=function(r){return m.eq(r,no)};var oo=n(function(r,t,e,n,a){return{ctor:"RBNode_elm_builtin",_0:r,_1:t,_2:e,_3:n,_4:a}});var co=function(r){var t=r;if(t.ctor==="RBNode_elm_builtin"&&t._0.ctor==="Red"){return l(oo,Qa,t._1,t._2,t._3,t._4)}else{return r}};var uo=function(r){var t=r;if(t.ctor==="RBNode_elm_builtin"){return l(oo,Xa(t._0),t._1,t._2,t._3,t._4)}else{return eo(to)}};var io=function(r){return function(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return function(v){return l(oo,Xa(r),n,a,l(oo,Qa,t,e,u,i),l(oo,Qa,o,c,_,v))}}}}}}}}}}};var _o=function(r){var t=r;if(t.ctor==="RBEmpty_elm_builtin"){return eo(to)}else{return l(oo,Qa,t._1,t._2,t._3,t._4)}};var vo=function(r){var t=r;if(t.ctor==="RBEmpty_elm_builtin"){return Hn.crash("can't make a Leaf red")}else{return l(oo,Ka,t._1,t._2,t._3,t._4)}};var lo=function(r){var t=r;r:do{t:do{e:do{n:do{a:do{o:do{c:do{if(t.ctor==="RBNode_elm_builtin"){if(t._3.ctor==="RBNode_elm_builtin"){if(t._4.ctor==="RBNode_elm_builtin"){switch(t._3._0.ctor){case"Red":switch(t._4._0.ctor){case"Red":if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{break r}}}}case"NBlack":if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{if(t._0.ctor==="BBlack"&&t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{break r}}}default:if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{break r}}}case"NBlack":switch(t._4._0.ctor){case"Red":if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{if(t._0.ctor==="BBlack"&&t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}}}case"NBlack":if(t._0.ctor==="BBlack"){if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}}}else{break r}default:if(t._0.ctor==="BBlack"&&t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}}default:switch(t._4._0.ctor){case"Red":if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{break r}}case"NBlack":if(t._0.ctor==="BBlack"&&t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{break r}default:break r}}}else{switch(t._3._0.ctor){case"Red":if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{break r}}case"NBlack":if(t._0.ctor==="BBlack"&&t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}default:break r}}}else{if(t._4.ctor==="RBNode_elm_builtin"){switch(t._4._0.ctor){case"Red":if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{break r}}case"NBlack":if(t._0.ctor==="BBlack"&&t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{break r}default:break r}}else{break r}}}else{break r}}while(false);return io(t._0)(t._3._3._1)(t._3._3._2)(t._3._1)(t._3._2)(t._1)(t._2)(t._3._3._3)(t._3._3._4)(t._3._4)(t._4)}while(false);return io(t._0)(t._3._1)(t._3._2)(t._3._4._1)(t._3._4._2)(t._1)(t._2)(t._3._3)(t._3._4._3)(t._3._4._4)(t._4)}while(false);return io(t._0)(t._1)(t._2)(t._4._3._1)(t._4._3._2)(t._4._1)(t._4._2)(t._3)(t._4._3._3)(t._4._3._4)(t._4._4)}while(false);return io(t._0)(t._1)(t._2)(t._4._1)(t._4._2)(t._4._4._1)(t._4._4._2)(t._3)(t._4._3)(t._4._4._3)(t._4._4._4)}while(false);return l(oo,Qa,t._4._3._1,t._4._3._2,l(oo,Qa,t._1,t._2,t._3,t._4._3._3),l(fo,Qa,t._4._1,t._4._2,t._4._3._4,vo(t._4._4)))}while(false);return l(oo,Qa,t._3._4._1,t._3._4._2,l(fo,Qa,t._3._1,t._3._2,vo(t._3._3),t._3._4._3),l(oo,Qa,t._1,t._2,t._3._4._4,t._4))}while(false);return r};var fo=n(function(r,t,e,n,a){var o=l(oo,r,t,e,n,a);return $a(o)?lo(o):o});var so=n(function(r,t,e,n,a){return Ua(n)||Ua(a)?l(fo,Za(r),t,e,uo(n),uo(a)):l(oo,r,t,e,n,a)});var ho=n(function(r,t,e,n,a){var o=a;if(o.ctor==="RBEmpty_elm_builtin"){return _(po,r,n,a)}else{return l(so,r,t,e,n,l(ho,o._0,o._1,o._2,o._3,o._4))}});var po=t(function(r,t,e){var n={ctor:"_Tuple2",_0:t,_1:e};if(n._0.ctor==="RBEmpty_elm_builtin"){if(n._1.ctor==="RBEmpty_elm_builtin"){var a=r;switch(a.ctor){case"Red":return eo(to);case"Black":return eo(ro);default:return Hn.crash("cannot have bblack or nblack nodes at this point")}}else{var o=n._1._0;var c=n._0._0;var u={ctor:"_Tuple3",_0:r,_1:c,_2:o};if(u.ctor==="_Tuple3"&&u._0.ctor==="Black"&&u._1.ctor==="LBlack"&&u._2.ctor==="Red"){return l(oo,Qa,n._1._1,n._1._2,n._1._3,n._1._4)}else{return v(Ja,"Black/LBlack/Red",r,E(c),E(o))}}}else{if(n._1.ctor==="RBEmpty_elm_builtin"){var i=n._1._0;var f=n._0._0;var s={ctor:"_Tuple3",_0:r,_1:f,_2:i};if(s.ctor==="_Tuple3"&&s._0.ctor==="Black"&&s._1.ctor==="Red"&&s._2.ctor==="LBlack"){return l(oo,Qa,n._0._1,n._0._2,n._0._3,n._0._4)}else{return v(Ja,"Black/Red/LBlack",r,E(f),E(i))}}else{var d=n._0._2;var h=n._0._4;var p=n._0._1;var g=l(ho,n._0._0,p,d,n._0._3,h);var m=_(Ya,p,d,h);var b=m._0;var y=m._1;return l(so,r,b,y,g,e)}}});var go=r(function(r,t){var e=t;if(e.ctor==="RBEmpty_elm_builtin"){return eo(to)}else{var n=e._1;return l(oo,e._0,n,i(r,n,e._2),i(go,r,e._3),i(go,r,e._4))}});var mo={ctor:"Same"};var bo={ctor:"Remove"};var yo={ctor:"Insert"};var wo=t(function(r,t,e){var n=function(e){var a=e;if(a.ctor==="RBEmpty_elm_builtin"){var o=t(vr);if(o.ctor==="Nothing"){return{ctor:"_Tuple2",_0:mo,_1:no}}else{return{ctor:"_Tuple2",_0:yo,_1:l(oo,Ka,r,o._0,no,no)}}}else{var c=a._2;var u=a._4;var v=a._3;var f=a._1;var s=a._0;var d=i(P,r,f);switch(d.ctor){case"EQ":var h=t(fr(c));if(h.ctor==="Nothing"){return{ctor:"_Tuple2",_0:bo,_1:_(po,s,v,u)}}else{return{ctor:"_Tuple2",_0:mo,_1:l(oo,s,f,h._0,v,u)}}case"LT":var p=n(v);var g=p._0;var m=p._1;var b=g;switch(b.ctor){case"Same":return{ctor:"_Tuple2",_0:mo,_1:l(oo,s,f,c,m,u)};case"Insert":return{ctor:"_Tuple2",_0:yo,_1:l(fo,s,f,c,m,u)};default:return{ctor:"_Tuple2",_0:bo,_1:l(so,s,f,c,m,u)}}default:var y=n(u);var g=y._0;var w=y._1;var k=g;switch(k.ctor){case"Same":return{ctor:"_Tuple2",_0:mo,_1:l(oo,s,f,c,v,w)};case"Insert":return{ctor:"_Tuple2",_0:yo,_1:l(fo,s,f,c,v,w)};default:return{ctor:"_Tuple2",_0:bo,_1:l(so,s,f,c,v,w)}}}}};var a=n(e);var o=a._0;var c=a._1;var u=o;switch(u.ctor){case"Same":return c;case"Insert":return co(c);default:return _o(c)}});var ko=t(function(r,t,e){return _(wo,r,T(fr(t)),e)});var To=r(function(r,t){return _(ko,r,t,no)});var xo=r(function(r,t){return _(Pa,ko,t,r)});var No=r(function(r,e){var n=t(function(t,e,n){return i(r,t,e)?_(ko,t,e,n):n});return _(Pa,n,no,e)});var Eo=r(function(t,e){return i(No,r(function(r,t){return i(Ha,r,e)}),t)});var Bo=r(function(r,e){var n=t(function(t,e,n){var a=n;var o=a._1;var c=a._0;return i(r,t,e)?{ctor:"_Tuple2",_0:_(ko,t,e,c),_1:o}:{ctor:"_Tuple2",_0:c,_1:_(ko,t,e,o)}});return _(Pa,n,{ctor:"_Tuple2",_0:no,_1:no},e)});var Ao=function(t){return _(Cr,r(function(r,t){var e=r;return _(ko,e._0,e._1,t)}),no,t)};var Ro=r(function(r,t){return _(wo,r,T(vr),t)});var So=r(function(r,e){return _(Pa,t(function(r,t,e){return i(Ro,r,e)}),r,e)});var Co=function(){var t=Ye.nativeBinding(function(r){r(Ye.succeed(Date.now()))});function e(r,t){return Ye.nativeBinding(function(e){var n=setInterval(function(){Ye.rawSpawn(t)},r);return function(){clearInterval(n)}})}return{now:t,setInterval_:r(e)}}();var Lo=Co.setInterval_;var Oo=t(function(r,t,e){var n=t;if(n.ctor==="[]"){return Sn(e)}else{var a=n._0;var o=function(t){return _(Oo,r,n._1,_(ko,a,t,e))};var c=Ye.spawn(i(Lo,a,i(an,r,a)));return i(En,o,c)}});var Fo=r(function(r,t){var e=r;var n=e._1;var a=e._0;var o=i(Wa,a,t);if(o.ctor==="Nothing"){return _(ko,a,{ctor:"::",_0:n,_1:{ctor:"[]"}},t)}else{return _(ko,a,{ctor:"::",_0:n,_1:o._0},t)}});var Mo=function(r){return r};var Do=1;var Io=1e3*Do;var Po=60*Io;var zo=60*Po;var Jo=function(r){return r/zo};var Uo=function(r){return r/Po};var jo=function(r){return r/Io};var qo=Co.now;var Wo=t(function(r,t,e){var n=i(Wa,t,e.taggers);if(n.ctor==="Nothing"){return Sn(e)}else{var a=function(t){return Dn(i(jr,function(e){return i(on,r,e(t))},n._0))};return i(En,function(r){return Sn(e)},i(En,a,qo))}});var Ho=Ve.leaf("Time");var Yo=r(function(r,t){return{taggers:r,processes:t}});var Vo=Sn(i(Yo,no,no));var Go=t(function(r,n,a){var o=a;var c=t(function(r,t,e){var n=e;return{ctor:"_Tuple3",_0:n._0,_1:n._1,_2:i(En,function(r){return n._2},Ye.kill(t))}});var u=e(function(r,t,e,n){var a=n;return{ctor:"_Tuple3",_0:a._0,_1:_(ko,r,e,a._1),_2:a._2}});var v=t(function(r,t,e){var n=e;return{ctor:"_Tuple3",_0:{ctor:"::",_0:r,_1:n._0},_1:n._1,_2:n._2}});var l=_(Cr,Fo,no,n);var s=f(za,v,u,c,l,o.processes,{ctor:"_Tuple3",_0:{ctor:"[]"},_1:no,_2:Sn({ctor:"_Tuple0"})});var d=s._0;var h=s._1;var p=s._2;return i(En,function(r){return Sn(i(Yo,l,r))},i(En,function(t){return _(Oo,r,d,h)},p))});var Qo=r(function(r,t){return{ctor:"Every",_0:r,_1:t}});var $o=r(function(r,t){return Ho(i(Qo,r,t))});var Ko=r(function(r,t){var e=t;return i(Qo,e._0,function(t){return r(e._1(t))})});Ve.effectManagers["Time"]={pkg:"elm-lang/core",init:Vo,onEffects:Go,onSelfMsg:Wo,tag:"sub",subMap:Ko};var Zo=He.millisecond;var Xo=He.second;var rc=He.minute;var tc=He.hour;var ec=He.dayOfWeek;var nc=He.day;var ac=He.month;var oc=He.year;var cc=He.fromTime;var uc=He.toTime;var ic=He.fromString;var _c=i(Cn,cc,qo);var vc={ctor:"Date"};var lc={ctor:"Sun"};var fc={ctor:"Sat"};var sc={ctor:"Fri"};var dc={ctor:"Thu"};var hc={ctor:"Wed"};var pc={ctor:"Tue"};var gc={ctor:"Mon"};var mc={ctor:"Dec"};var bc={ctor:"Nov"};var yc={ctor:"Oct"};var wc={ctor:"Sep"};var kc={ctor:"Aug"};var Tc={ctor:"Jul"};var xc={ctor:"Jun"};var Nc={ctor:"May"};var Ec={ctor:"Apr"};var Bc={ctor:"Mar"};var Ac={ctor:"Feb"};var Rc={ctor:"Jan"};var Sc=Hn.crash;var Cc=Hn.log;var Lc=function(){function i(r){return{ctor:"",tag:"succeed",msg:r}}function _(r){return{ctor:"",tag:"fail",msg:r}}function v(r){return{ctor:"",tag:r}}function l(r,t){return{ctor:"",tag:r,decoder:t}}function f(r){return{ctor:"",tag:"null",value:r}}function s(r,t){return{ctor:"",tag:"field",field:r,decoder:t}}function d(r,t){return{ctor:"",tag:"index",index:r,decoder:t}}function h(r){return{ctor:"",tag:"key-value",decoder:r}}function g(r,t){return{ctor:"",tag:"map-many",func:r,decoders:t}}function b(r,t){return{ctor:"",tag:"andThen",decoder:t,callback:r}}function y(r){return{ctor:"",tag:"oneOf",decoders:r}}function w(r,t){return g(r,[t])}function k(r,t,e){return g(r,[t,e])}function T(r,t,e,n){return g(r,[t,e,n])}function x(r,t,e,n,a){return g(r,[t,e,n,a])}function N(r,t,e,n,a,o){return g(r,[t,e,n,a,o])}function E(r,t,e,n,a,o,c){return g(r,[t,e,n,a,o,c])}function B(r,t,e,n,a,o,c,u){return g(r,[t,e,n,a,o,c,u])}function A(r,t,e,n,a,o,c,u,i){return g(r,[t,e,n,a,o,c,u,i])}function R(r){return{tag:"ok",value:r}}function S(r,t){return{tag:"primitive",type:r,value:t}}function C(r,t){return{tag:"index",index:r,rest:t}}function L(r,t){return{tag:"field",field:r,rest:t}}function C(r,t){return{tag:"index",index:r,rest:t}}function O(r){return{tag:"oneOf",problems:r}}function F(r){return{tag:"fail",msg:r}}function M(r){var t="_";while(r){switch(r.tag){case"primitive":return"Expecting "+r.type+(t==="_"?"":" at "+t)+" but instead got: "+D(r.value);case"index":t+="["+r.index+"]";r=r.rest;break;case"field":t+="."+r.field;r=r.rest;break;case"oneOf":var e=r.problems;for(var n=0;n=t.length){return S("a longer array. Need index "+i+" but there are only "+t.length+" entries",t)}var a=z(r.decoder,t[i]);return a.tag==="ok"?a:C(i,a);case"key-value":if(typeof t!=="object"||t===null||t instanceof Array){return S("an object",t)}var _=mr.Nil;for(var v in t){var a=z(r.decoder,t[v]);if(a.tag!=="ok"){return L(v,a)}var l=m.Tuple2(v,a.value);_=mr.Cons(l,_)}return R(_);case"map-many":var f=r.func;var s=r.decoders;for(var n=0;n0){var l=i[_];v[--_]=l===undefined?vr:fr(l)}n.push({match:i[0],submatches:mr.fromArray(v),index:i.index,number:a});u=t.lastIndex}t.lastIndex=c;return mr.fromArray(n)}function i(r,t,e,n){r=r.ctor==="All"?Infinity:r._0;var a=0;function o(t){if(a++>=r){return t}var n=arguments.length-3;var o=new Array(n);while(n>0){var c=arguments[n];o[--n]=c===undefined?vr:fr(c)}return e({match:t,submatches:mr.fromArray(o),index:arguments[arguments.length-2],number:a})}return n.replace(t,o)}function _(r,t,e){r=r.ctor==="All"?Infinity:r._0;if(r===Infinity){return mr.fromArray(e.split(t))}var n=e;var a;var o=[];var c=t.lastIndex;var u=t.lastIndex;while(r--){if(!(a=t.exec(n)))break;o.push(n.slice(c,a.index));c=t.lastIndex}o.push(n.slice(c));t.lastIndex=u;return mr.fromArray(o)}return{regex:o,caseInsensitive:a,escape:n,contains:r(c),find:t(u),replace:e(i),split:t(_)}}();var wu=Ye.kill;var ku=Ye.sleep;var Tu=Ye.spawn;var xu=r(function(r,t){var e=t;return{ctor:"_Tuple2",_0:e._0,_1:r(e._1)}});var Nu=r(function(r,t){var e=t;return{ctor:"_Tuple2",_0:r(e._0),_1:e._1}});var Eu=function(r){var t=r;return t._1};var Bu=function(r){var t=r;return t._0};var Au=yu.split;var Ru=yu.replace;var Su=yu.find;var Cu=yu.contains;var Lu=yu.caseInsensitive;var Ou=yu.regex;var Fu=yu.escape;var Mu=e(function(r,t,e,n){return{match:r,submatches:t,index:e,number:n}});var Du={ctor:"Regex"};var Iu=function(r){return{ctor:"AtMost",_0:r}};var Pu={ctor:"All"};var zu=function(){var e={addEventListener:function(){},removeEventListener:function(){}};var n=o(typeof document!=="undefined"?document:e);var a=o(typeof window!=="undefined"?window:e);function o(r){return function(t,e,n){return Ye.nativeBinding(function(a){function o(r){var t=i(Qc,e,r);if(t.ctor==="Ok"){Ye.rawSpawn(n(t._0))}}r.addEventListener(t,o);return function(){r.removeEventListener(t,o)}})}}var c=typeof requestAnimationFrame!=="undefined"?requestAnimationFrame:function(r){r()};function u(r,t){return Ye.nativeBinding(function(e){c(function(){var n=document.getElementById(r);if(n===null){e(Ye.fail({ctor:"NotFound",_0:r}));return}e(Ye.succeed(t(n)))})})}function _(r){return u(r,function(r){r.focus();return m.Tuple0})}function v(r){return u(r,function(r){r.blur();return m.Tuple0})}function l(r){return u(r,function(r){return r.scrollTop})}function f(r,t){return u(r,function(r){r.scrollTop=t;return m.Tuple0})}function s(r){return u(r,function(r){r.scrollTop=r.scrollHeight;return m.Tuple0})}function d(r){return u(r,function(r){return r.scrollLeft})}function h(r,t){return u(r,function(r){r.scrollLeft=t;return m.Tuple0})}function p(r){return u(r,function(r){r.scrollLeft=r.scrollWidth;return m.Tuple0})}function g(r,t){return u(t,function(t){switch(r.ctor){case"Content":return t.scrollWidth;case"VisibleContent":return t.clientWidth;case"VisibleContentWithBorders":return t.offsetWidth;case"VisibleContentWithBordersAndMargins":var e=t.getBoundingClientRect();return e.right-e.left}})}function b(r,t){return u(t,function(t){switch(r.ctor){case"Content":return t.scrollHeight;case"VisibleContent":return t.clientHeight;case"VisibleContentWithBorders":return t.offsetHeight;case"VisibleContentWithBordersAndMargins":var e=t.getBoundingClientRect();return e.bottom-e.top}})}return{onDocument:t(n),onWindow:t(a),focus:_,blur:v,getScrollTop:l,setScrollTop:r(f),getScrollLeft:d,setScrollLeft:r(h),toBottom:s,toRight:p,height:r(b),width:r(g)}}();var Ju=zu.onWindow;var Uu=zu.onDocument;var ju;var qu;var Wu=function(){var n="STYLE";var a="EVENT";var o="ATTR";var c="ATTR_NS";var u=typeof document!=="undefined"?document:{};function v(r){return{type:"text",text:r}}function l(t){return r(function(r,e){return f(t,r,e)})}function f(r,t,e){var n=w(t);var a=n.namespace;var o=n.facts;var c=[];var u=0;while(e.ctor!=="[]"){var i=e._0;u+=i.descendantsCount||0;c.push(i);e=e._1}u+=c.length;return{type:"node",tag:r,facts:o,children:c,namespace:a,descendantsCount:u}}function s(r,t,e){var n=w(t);var a=n.namespace;var o=n.facts;var c=[];var u=0;while(e.ctor!=="[]"){var i=e._0;u+=i._1.descendantsCount||0;c.push(i);e=e._1}u+=c.length;return{type:"keyed-node",tag:r,facts:o,children:c,namespace:a,descendantsCount:u}}function d(r,t,e){var n=w(r).facts;return{type:"custom",facts:n,model:t,impl:e}}function h(r,t){return{type:"tagger",tagger:r,node:t,descendantsCount:1+(t.descendantsCount||0)}}function p(r,t,e){return{type:"thunk",func:r,args:t,thunk:e,node:undefined}}function g(r,t){return p(r,[t],function(){return r(t)})}function b(r,t,e){return p(r,[t,e],function(){return i(r,t,e)})}function y(r,t,e,n){return p(r,[t,e,n],function(){return _(r,t,e,n)})}function w(r){var t,e={};while(r.ctor!=="[]"){var u=r._0;var i=u.key;if(i===o||i===c||i===a){var _=e[i]||{};_[u.realKey]=u.value;e[i]=_}else if(i===n){var v=e[i]||{};var l=u.value;while(l.ctor!=="[]"){var f=l._0;v[f._0]=f._1;l=l._1}e[i]=v}else if(i==="namespace"){t=u.value}else if(i==="className"){var s=e[i];e[i]=typeof s==="undefined"?u.value:s+" "+u.value}else{e[i]=u.value}r=r._1}return{facts:e,namespace:t}}function k(r){return{key:n,value:r}}function T(r,t){return{key:r,value:t}}function x(r,t){return{key:o,realKey:r,value:t}}function N(r,t,e){return{key:c,realKey:t,value:{value:e,namespace:r}}}function E(r,t,e){return{key:a,realKey:r,value:{options:t,decoder:e}}}function B(r,t){if(r.options!==t.options){if(r.options.stopPropagation!==t.options.stopPropagation||r.options.preventDefault!==t.options.preventDefault){return false}}return Lc.equality(r.decoder,t.decoder)}function A(r,t){if(t.key!==a){return t}return E(t.realKey,t.value.options,i(au,r,t.value.decoder))}function R(r,t){switch(r.type){case"thunk":if(!r.node){r.node=r.thunk()}return R(r.node,t);case"tagger":var e=r.node;var n=r.tagger;while(e.type==="tagger"){typeof n!=="object"?n=[n,e.tagger]:n.push(e.tagger);e=e.node}var a={tagger:n,parent:t};var o=R(e,a);o.elm_event_node_ref=a;return o;case"text":return u.createTextNode(r.text);case"node":var o=r.namespace?u.createElementNS(r.namespace,r.tag):u.createElement(r.tag);S(o,t,r.facts);var c=r.children;for(var i=0;i0){e.push(I("p-thunk",n,v))}return;case"tagger":var l=r.tagger;var f=t.tagger;var s=false;var d=r.node;while(d.type==="tagger"){s=true;typeof l!=="object"?l=[l,d.tagger]:l.push(d.tagger);d=d.node}var h=t.node;while(h.type==="tagger"){s=true;typeof f!=="object"?f=[f,h.tagger]:f.push(h.tagger);h=h.node}if(s&&l.length!==f.length){e.push(I("p-redraw",n,t));return}if(s?!z(l,f):l!==f){e.push(I("p-tagger",n,f))}P(d,h,e,n+1);return;case"text":if(r.text!==t.text){e.push(I("p-text",n,t.text));return}return;case"node":if(r.tag!==t.tag||r.namespace!==t.namespace){e.push(I("p-redraw",n,t));return}var p=J(r.facts,t.facts);if(typeof p!=="undefined"){e.push(I("p-facts",n,p))}U(r,t,e,n);return;case"keyed-node":if(r.tag!==t.tag||r.namespace!==t.namespace){e.push(I("p-redraw",n,t));return}var p=J(r.facts,t.facts);if(typeof p!=="undefined"){e.push(I("p-facts",n,p))}j(r,t,e,n);return;case"custom":if(r.impl!==t.impl){e.push(I("p-redraw",n,t));return}var p=J(r.facts,t.facts);if(typeof p!=="undefined"){e.push(I("p-facts",n,p))}var g=t.impl.diff(r,t);if(g){e.push(I("p-custom",n,g));return}return}}function z(r,t){for(var e=0;eu){e.push(I("p-remove-last",n,c-u))}else if(c0||c.length>0||typeof S!=="undefined"){e.push(I("p-reorder",n,{patches:a,inserts:c,endInserts:S}))}}var q="_elmW6BL";function W(r,t,e,n,a,o){var c=r[e];if(typeof c==="undefined"){c={tag:"insert",vnode:n,index:a,data:undefined};o.push({index:a,entry:c});r[e]=c;return}if(c.tag==="remove"){o.push({index:a,entry:c});c.tag="move";var u=[];P(c.vnode,n,u,c.index);c.index=a;c.data.data={patches:u,entry:c};return}W(r,t,e+q,n,a,o)}function H(r,t,e,n,a){var o=r[e];if(typeof o==="undefined"){var c=I("p-remove",a,undefined);t.push(c);r[e]={tag:"remove",vnode:n,index:a,data:c};return}if(o.tag==="insert"){o.tag="move";var u=[];P(n,o.vnode,u,a);var c=I("p-remove",a,{patches:u,entry:o});t.push(c);return}H(r,t,e+q,n,a)}function Y(r,t,e,n){V(r,t,e,0,0,t.descendantsCount,n)}function V(r,t,e,n,a,o,c){var u=e[n];var i=u.index;while(i===a){var _=u.type;if(_==="p-thunk"){Y(r,t.node,u.data,c)}else if(_==="p-reorder"){u.domNode=r;u.eventNode=c;var v=u.data.patches;if(v.length>0){V(r,t,v,0,a,o,c)}}else if(_==="p-remove"){u.domNode=r;u.eventNode=c;var l=u.data;if(typeof l!=="undefined"){l.entry.data=r;var v=l.patches;if(v.length>0){V(r,t,v,0,a,o,c)}}}else{u.domNode=r;u.eventNode=c}n++;if(!(u=e[n])||(i=u.index)>o){return n}}switch(t.type){case"tagger":var f=t.node;while(f.type==="tagger"){f=f.node}return V(r,f,e,n,a+1,o,r.elm_event_node_ref);case"node":var s=t.children;var d=r.childNodes;for(var h=0;ho){return n}}a=g}return n;case"keyed-node":var s=t.children;var d=r.childNodes;for(var h=0;ho){return n}}a=g}return n;case"text":case"thunk":throw new Error("should never traverse `text` or `thunk` nodes like this")}}function G(r,t,e,n){if(e.length===0){return r}Y(r,t,e,n);return Q(r,e)}function Q(r,t){for(var e=0;e'+'Oops! Something went wrong when starting your Elm program.
'+''+r+"
"+""}throw new Error(r)}function ur(r,t,e,n){t["embed"]=function t(e,a){while(e.lastChild){e.removeChild(e.lastChild)}return Ve.initialize(n(r.init,a,e),r.update,r.subscriptions,ir(e,r.view))};t["fullscreen"]=function t(e){return Ve.initialize(n(r.init,e,document.body),r.update,r.subscriptions,ir(document.body,r.view))}}function ir(r,t){return function(e,n){var a={tagger:e,parent:undefined};var o=t(n);var c=R(o,a);r.appendChild(c);return vr(c,t,o,a)}}var _r=typeof requestAnimationFrame!=="undefined"?requestAnimationFrame:function(r){setTimeout(r,1e3/60)};function vr(r,t,e,n){var a="NO_REQUEST";var o=e;var c;function u(){switch(a){case"NO_REQUEST":throw new Error("Unexpected draw callback.\n"+"Please report this to .");case"PENDING_REQUEST":_r(u);a="EXTRA_REQUEST";var e=t(c);var i=D(o,e);r=G(r,o,i,n);o=e;return;case"EXTRA_REQUEST":a="NO_REQUEST";return}}return function r(t){if(a==="NO_REQUEST"){_r(u)}a="PENDING_REQUEST";c=t}}function lr(r,t,e,n){t["fullscreen"]=function t(a){var o={doc:undefined};return Ve.initialize(n(r.init,a,document.body),r.update(fr(o)),r.subscriptions,sr(e,document.body,o,r.view,r.viewIn,r.viewOut))};t["embed"]=function t(a,o){var c={doc:undefined};return Ve.initialize(n(r.init,o,a),r.update(fr(c)),r.subscriptions,sr(e,a,c,r.view,r.viewIn,r.viewOut))}}function fr(r){return Ye.nativeBinding(function(t){var e=r.doc;if(e){var n=e.getElementsByClassName("debugger-sidebar-messages")[0];if(n){n.scrollTop=n.scrollHeight}}t(Ye.succeed(m.Tuple0))})}function sr(r,t,e,n,a,o){return function(c,u){var i={tagger:c,parent:undefined};var _={tagger:c,parent:undefined};var v=n(u);var l=R(v,i);t.appendChild(l);var f=vr(l,n,v,i);var s=a(u)._1;var d=R(s,_);t.appendChild(d);var h=pr(i,d,a);var p=vr(d,h,s,_);var g=dr(u,o,_,t,r,e);return function r(t){f(t);p(t);g(t)}}}function dr(r,t,e,n,a,o){var c;var i;return function r(n){if(!n.isDebuggerOpen){return}if(!o.doc){c=t(n);i=hr(a,o,c,e);return}u=o.doc;var _=t(n);var v=D(c,_);i=G(i,c,v,e);c=_;u=document}}function hr(r,t,e,n){var a=900;var o=360;var c=screen.width-a;var i=screen.height-o;var _=window.open("","","width="+a+",height="+o+",left="+c+",top="+i);u=_.document;t.doc=u;u.title="Debugger - "+r;u.body.style.margin="0";u.body.style.padding="0";var v=R(e,n);u.body.appendChild(v);u.addEventListener("keydown",function(r){if(r.metaKey&&r.which===82){window.location.reload()}if(r.which===38){n.tagger({ctor:"Up"});r.preventDefault()}if(r.which===40){n.tagger({ctor:"Down"});r.preventDefault()}});function l(){t.doc=undefined;_.close()}window.addEventListener("unload",l);_.addEventListener("unload",function(){t.doc=undefined;window.removeEventListener("unload",l);n.tagger({ctor:"Close"})});u=document;return v}function pr(r,t,e){var n=br(t);var a="Normal";var o;var c=r.tagger;var u=function(){};return function(t){var i=e(t);var _=i._0.ctor;r.tagger=_==="Normal"?c:u;if(a!==_){gr("removeEventListener",n,a);gr("addEventListener",n,_);if(a==="Normal"){o=document.body.style.overflow;document.body.style.overflow="hidden"}if(_==="Normal"){document.body.style.overflow=o}a=_}return i._1}}function gr(r,t,e){switch(e){case"Normal":return;case"Pause":return mr(r,t,yr);case"Message":return mr(r,t,wr)}}function mr(r,t,e){for(var n=0;n"]=r(function(r,t){return i(En,function(r){return t},r)});var Rf=t(function(r,t,e){var n=function(t){var n=t;return i(on,r,n._0(e))};return i(Af["&>"],Dn(i(jr,n,t)),Sn({ctor:"_Tuple0"}))});var Sf=t(function(r,t,e){var n=e;switch(n.ctor){case"Jump":return Nf(n._0);case"New":return i(En,i(Rf,r,t),xf(n._0));case"Modify":return i(En,i(Rf,r,t),Tf(n._0));case"Visit":return Bf(n._0);default:return Ef(n._0)}});var Cf=function(r){var t=r;if(t.ctor==="Normal"){return wu(t._0)}else{return i(Af["&>"],wu(t._0),wu(t._1))}};var Lf=t(function(r,t,e){return i(Af["&>"],_(Rf,r,e.subs,t),Sn(e))});var Of=Ve.leaf("Navigation");var Ff=Ve.leaf("Navigation");var Mf=function(r){return function(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return function(v){return{href:r,host:t,hostname:e,protocol:n,origin:a,port_:o,pathname:c,search:u,hash:i,username:_,password:v}}}}}}}}}}}};var Df=r(function(r,t){return{subs:r,popWatcher:t}});var If=Sn(i(Df,{ctor:"[]"},vr));var Pf=function(r){return{ctor:"Reload",_0:r}};var zf=Ff(Pf(false));var Jf=Ff(Pf(true));var Uf=function(r){return{ctor:"Visit",_0:r}};var jf=function(r){return Ff(Uf(r))};var qf=function(r){return{ctor:"Modify",_0:r}};var Wf=function(r){return Ff(qf(r))};var Hf=function(r){return{ctor:"New",_0:r}};var Yf=function(r){return Ff(Hf(r))};var Vf=function(r){return{ctor:"Jump",_0:r}};var Gf=function(r){return Ff(Vf(0-r))};var Qf=function(r){return Ff(Vf(r))};var $f=r(function(r,t){var e=t;switch(e.ctor){case"Jump":return Vf(e._0);case"New":return Hf(e._0);case"Modify":return qf(e._0);case"Visit":return Uf(e._0);default:return Pf(e._0)}});var Kf=function(r){return{ctor:"Monitor",_0:r}};var Zf=r(function(r,t){var e=t.init(kf.getLocation({ctor:"_Tuple0"}));var n=function(e){return Xe({ctor:"::",_0:Of(Kf(r)),_1:{ctor:"::",_0:t.subscriptions(e),_1:{ctor:"[]"}}})};return fi({init:e,view:t.view,update:t.update,subscriptions:n})});var Xf=r(function(r,t){var e=function(r){return i(t.init,r,kf.getLocation({ctor:"_Tuple0"}))};var n=function(e){return Xe({ctor:"::",_0:Of(Kf(r)),_1:{ctor:"::",_0:t.subscriptions(e),_1:{ctor:"[]"}}})};return li({init:e,view:t.view,update:t.update,subscriptions:n})});var rs=r(function(r,t){var e=t;return Kf(function(t){return r(e._0(t))})});var ts=r(function(r,t){return{ctor:"InternetExplorer",_0:r,_1:t}});var es=function(r){return{ctor:"Normal",_0:r}};var ns=function(r){var t=function(t){return i(an,r,kf.getLocation({ctor:"_Tuple0"}))};return kf.isInternetExplorer11({ctor:"_Tuple0"})?_(Ln,ts,Tu(_(Ju,"popstate",Wc,t)),Tu(_(Ju,"hashchange",Wc,t))):i(Cn,es,Tu(_(Ju,"popstate",Wc,t)))};var as=e(function(r,t,e,n){var a=n;var o=a.popWatcher;var c=function(){var t={ctor:"_Tuple2",_0:e,_1:o};r:do{if(t._0.ctor==="[]"){if(t._1.ctor==="Just"){return i(Af["&>"],Cf(t._1._0),Sn(i(Df,e,vr)))}else{break r}}else{if(t._1.ctor==="Nothing"){return i(Cn,function(r){return i(Df,e,fr(r))},ns(r))}else{break r}}}while(false);return Sn(i(Df,e,o))}();return i(Af["&>"],Dn(i(jr,i(Sf,r,e),t)),c)});Ve.effectManagers["Navigation"]={pkg:"elm-lang/navigation",init:If,onEffects:as,onSelfMsg:Lf,tag:"fx",cmdMap:$f,subMap:rs};var os=function(r){return m.cmp(r,10)<0?It(r+Pt(m.chr("0"))):m.cmp(r,36)<0?It(r-10+Pt(m.chr("A"))):m.crash("ParseInt",{start:{line:158,column:9},end:{line:158,column:20}})(E(r))};var cs=r(function(r,t){return m.cmp(t,r)<0?La(os(t)):i(N["++"],i(cs,r,t/r|0),La(os(i(N["%"],t,r))))});var us=cs(8);var is=cs(16);var _s=t(function(r,t,e){var n=Pt(e);return m.cmp(Pt(r),n)<1&&m.cmp(n,Pt(t))<1});var vs=r(function(r,t){return Pt(t)-Pt(r)});var ls=function(r){return{ctor:"InvalidRadix",_0:r}};var fs=r(function(r,t){return m.cmp(2,r)<1&&m.cmp(r,36)<1?m.cmp(t,0)<0?gn(i(N["++"],"-",i(cs,r,0-t))):gn(i(cs,r,t)):hn(ls(r))});var ss=function(r){return{ctor:"OutOfRange",_0:r}};var ds=function(r){return{ctor:"InvalidChar",_0:r}};var hs=r(function(r,t){var e=function(e){return m.cmp(e,r)<0?gn(e):hn(ss(t))};var n=_(_s,m.chr("0"),m.chr("9"),t)?gn(i(vs,m.chr("0"),t)):_(_s,m.chr("a"),m.chr("z"),t)?gn(10+i(vs,m.chr("a"),t)):_(_s,m.chr("A"),m.chr("Z"),t)?gn(10+i(vs,m.chr("A"),t)):hn(ds(t));return i(pn,e,n)});var ps=r(function(r,t){var e=Sa(t);if(e.ctor==="Nothing"){return gn(0)}else{return i(pn,function(t){return i(pn,function(e){return gn(t+e*r)},i(ps,r,e._0._1))},i(hs,r,e._0._0))}});var gs=r(function(r,t){return m.cmp(2,r)<1&&m.cmp(r,36)<1?i(ps,r,xa(t)):hn(ls(r))});var ms=gs(10);var bs=gs(8);var ys=gs(16);var ws=function(r){var t=r;var e=function(r){var t=m.cmp(r,.0031308)>0?1.055*Math.pow(r,1/2.4)-.055:12.92*r;return O(_(U,0,255,t*255))};var n=t.z/100;var a=t.y/100;var o=t.x/100;var c=o*3.2404542+a*-1.5371385+n*-.4986;var u=o*-.969266+a*1.8760108+n*.041556;var i=o*.0556434+a*-.2040259+n*1.0572252;return _(ie,e(c),e(u),e(i))};var ks=function(r){var t=r;var e=(t.l+16)/116;var n=function(r){var t=r*r*r;return m.cmp(t,.008856)>0?t:(r-16/116)/7.787};return{y:n(e)*100,x:n(e+t.a/500)*95.047,z:n(e-t.b/200)*108.883}};var Ts=function(r){return ws(ks(r))};var xs=function(r){var t=r;var e=function(r){return m.cmp(r,.008856)>0?Math.pow(r,1/3):7.787*r+16/116};var n=e(t.x/95.047);var a=e(t.y/100);var o=e(t.z/108.883);return{l:116*a-16,a:500*(n-a),b:200*(a-o)}};var Ns=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=function(r){var t=R(r)/255;var e=m.cmp(t,.04045)>0?Math.pow((t+.055)/1.055,2.4):t/12.92;return e*100};var c=o(e);var u=o(n);var i=o(a);return{x:c*.4124+u*.3576+i*.1805,y:c*.2126+u*.7152+i*.0722,z:c*.0193+u*.1192+i*.9505}};var Es=function(r){return xs(Ns(r))};var Bs=function(r){var t=function(r){return m.cmp(r,10)<0?E(r):La(It(87+r))};return m.cmp(r,16)<0?t(r):i(N["++"],Bs(r/16|0),t(i(N["%"],r,16)))};var As=function(r){return _(fa,2,m.chr("0"),Bs(r))};var Rs=function(t){var e=Zt(t);var n=e.red;var a=e.green;var o=e.blue;return i(ya,"",i(r(function(r,t){return{ctor:"::",_0:r,_1:t}}),"#",i(jr,As,{ctor:"::",_0:n,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:o,_1:{ctor:"[]"}}}})))};var Ss=function(t){var e=Zt(t);var n=e.red;var a=e.green;var o=e.blue;var c=e.alpha;return m.eq(c,1)?Rs(t):i(ya,"",i(r(function(r,t){return{ctor:"::",_0:r,_1:t}}),"#",i(jr,As,{ctor:"::",_0:n,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:o,_1:{ctor:"::",_0:O(c*255),_1:{ctor:"[]"}}}}})))};var Cs=r(function(r,t){var e=R(Math.pow(10,r));return R(O(t*e))/e});var Ls=function(){var r=i(N["++"],"",i(N["++"],"^",i(N["++"],"#?",i(N["++"],"(?:",i(N["++"],"(?:([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2}))",i(N["++"],"|",i(N["++"],"(?:([a-f\\d])([a-f\\d])([a-f\\d]))",i(N["++"],"|",i(N["++"],"(?:([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2}))",i(N["++"],"|",i(N["++"],"(?:([a-f\\d])([a-f\\d])([a-f\\d])([a-f\\d]))",i(N["++"],")","$"))))))))))));var t=function(r){var t=Gn(r);if(t.ctor==="::"&&t._1.ctor==="[]"){var e=t._0;return Vn({ctor:"::",_0:e,_1:{ctor:"::",_0:e,_1:{ctor:"[]"}}})}else{return r}};return function(e){return i(pn,function(r){var e=i(jr,function(r){return ys(t(r))},r);r:do{if(e.ctor==="::"&&e._0.ctor==="Ok"&&e._1.ctor==="::"&&e._1._0.ctor==="Ok"&&e._1._1.ctor==="::"&&e._1._1._0.ctor==="Ok"){if(e._1._1._1.ctor==="::"){if(e._1._1._1._0.ctor==="Ok"&&e._1._1._1._1.ctor==="[]"){return gn(v(ue,e._0._0,e._1._0._0,e._1._1._0._0,i(Cs,2,R(e._1._1._1._0._0)/255)))}else{break r}}else{return gn(_(ie,e._0._0,e._1._0._0,e._1._1._0._0))}}else{break r}}while(false);return hn("Parsing ints from hex failed")},i(xn,"Parsing hex regex failed",i(sr,Hr(x),i(sr,function(r){return r.submatches},Jr(_(Su,Iu(1),Ou(r),aa(e)))))))}}();var Os=r(function(r,t){return i(N["++"],r,i(N["++"],"(",i(N["++"],i(ya,", ",t),")")))});var Fs=function(t){return _(k,r(function(r,t){return i(N["++"],r,t)}),"%",E(O(i(r(function(r,t){return r*t}),100,t))))};var Ms=function(t){return E(O(_(k,r(function(r,t){return r/t}),J,i(r(function(r,t){return r*t}),180,t))))};var Ds=function(r){var t=Xt(r);var e=t.hue;var n=t.saturation;var a=t.lightness;var o=t.alpha;return i(Os,"hsla",{ctor:"::",_0:Ms(e),_1:{ctor:"::",_0:Fs(n),_1:{ctor:"::",_0:Fs(a),_1:{ctor:"::",_0:E(o),_1:{ctor:"[]"}}}}})};var Is=function(r){var t=Xt(r);var e=t.hue;var n=t.saturation;var a=t.lightness;var o=t.alpha;return i(Os,"hsl",{ctor:"::",_0:Ms(e),_1:{ctor:"::",_0:Fs(n),_1:{ctor:"::",_0:Fs(a),_1:{ctor:"[]"}}}})};var Ps=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=t.alpha;return i(Os,"rgba",{ctor:"::",_0:E(e),_1:{ctor:"::",_0:E(n),_1:{ctor:"::",_0:E(a),_1:{ctor:"::",_0:E(o),_1:{ctor:"[]"}}}}})};var zs=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=t.alpha;return i(Os,"rgb",{ctor:"::",_0:E(e),_1:{ctor:"::",_0:E(n),_1:{ctor:"::",_0:E(a),_1:{ctor:"[]"}}}})};var Js=t(function(r,t,e){return{x:r,y:t,z:e}});var Us=t(function(r,t,e){return{l:r,a:t,b:e}});var js=t(function(r,t,e){return t+(e-t)*r});var qs=nr(360);var Ws=nr(180);var Hs=e(function(r,t,e,n){var a=js(n);var o=r;switch(o.ctor){case"RGB":var c=Zt(e);var u=Zt(t);return v(ue,O(i(a,R(u.red),R(c.red))),O(i(a,R(u.green),R(c.green))),O(i(a,R(u.blue),R(c.blue))),i(a,u.alpha,c.alpha));case"HSL":var c=Xt(e);var _=c.hue;var u=Xt(t);var l=u.hue;var f=m.cmp(_,l)>0&&m.cmp(_-l,Ws)>0?_-l+qs:m.cmp(_,l)<0&&m.cmp(l-_,Ws)>0?_+qs-l:_-l;return v(te,l+n*f,i(a,u.saturation,c.saturation),i(a,u.lightness,c.lightness),i(a,u.alpha,c.alpha));default:var s=Es(e);var d=Es(t);return Ts({l:i(a,d.l,s.l),a:i(a,d.a,s.a),b:i(a,d.b,s.b)})}});var Ys={ctor:"LAB"};var Vs={ctor:"HSL"};var Gs={ctor:"RGB"};var Qs=function(){var r=typeof document==="undefined"?function(r){return{style:{},appendChild:function(){}}}:function(r){var t=document.createElement(r);t.style.padding="0";t.style.margin="0";return t};function e(r,t,e){return{ctor:"Element_elm_builtin",_0:{element:e,props:{width:r,height:t,opacity:1,color:vr,href:"",tag:""}}}}function n(t,e){var n=t.props;var a=t.element;var o=n.width-(a.adjustWidth||0);var c=n.height-(a.adjustHeight||0);e.style.width=(o|0)+"px";e.style.height=(c|0)+"px";if(n.opacity!==1){e.style.opacity=n.opacity}if(n.color.ctor==="Just"){e.style.backgroundColor=rd(n.color._0)}if(n.tag!==""){e.id=n.tag}if(n.href!==""){var u=r("a");u.href=n.href;u.style.display="block";u.style.pointerEvents="auto";u.appendChild(e);e=u}return e}function a(r,t){switch(t._0.ctor){case"Plain":return o(t._3);case"Fitted":return u(r.width,r.height,t._3);case"Cropped":return i(t,r.width,r.height,t._3);case"Tiled":return c(t._3)}}function o(t){var e=r("img");e.src=t;e.name=t;e.style.display="block";return e}function c(t){var e=r("div");e.style.backgroundImage="url("+t+")";return e}function u(t,e,n){var a=r("div");a.style.background="url("+n+") no-repeat center";a.style.webkitBackgroundSize="cover";a.style.MozBackgroundSize="cover";a.style.OBackgroundSize="cover";a.style.backgroundSize="cover";return a}function i(t,e,n,a){var o=t._0._0;var c=r("div");c.style.overflow="hidden";var u=r("img");u.onload=function(){var r=e/t._1,a=n/t._2;u.style.width=(this.width*r|0)+"px";u.style.height=(this.height*a|0)+"px";u.style.marginLeft=(-o._0*r|0)+"px";u.style.marginTop=(-o._1*a|0)+"px"};u.src=a;u.name=a;c.appendChild(u);return c}function _(r){r.style.position="absolute";return r}function v(r){return r}function l(r){r.style.styleFloat="left";r.style.cssFloat="left";return r}var f={DUp:v,DDown:v,DLeft:l,DRight:l,DIn:_,DOut:_};function s(r){return r==="DUp"||r==="DLeft"||r==="DIn"}function d(t,e){var n=mr.toArray(e);var a=r("div");var o=f[t];if(o===_){a.style.pointerEvents="none"}if(s(t)){n.reverse()}var c=n.length;for(var u=0;u0){e.style.width=r+"px"}e.style.visibility="hidden";e.style.styleFloat="left";e.style.cssFloat="left";document.body.appendChild(e);var n=window.getComputedStyle(e,null);var a=Math.ceil(n.getPropertyValue("width").slice(0,-2)-0);var o=Math.ceil(n.getPropertyValue("height").slice(0,-2)-0);document.body.removeChild(e);return m.Tuple2(a,o)}return{toHtml:w,render:N,update:A,createNode:r,newElement:t(e),addTransform:g,block:S}}();var $s=t(function(r,t,e){var n=function(){var t=r;if(t.ctor==="Nothing"){return e}else{return i(N["++"],'',i(N["++"],e,""))))}}();return m.eq(t,"")?n:i(N["++"],'',i(N["++"],n,""))))});var Ks=t(function(r,t,e){return v(Ru,Pu,Ou(r),function(r){return t},e)});var Zs=function(r){return _(Xs,vr,"",r)};var Xs=t(function(r,t,e){r:while(true){var n=e;switch(n.ctor){case"Str":return _($s,r,t,i(ya,"
",i(jr,i(Ks," "," "),ca(_(Ks,">",">",_(Ks,"<","<",_(Ks,"'","'",_(Ks,'"',""",n._0))))))));case"Append":return _($s,r,t,i(N["++"],Zs(n._0),Zs(n._1)));case"Link":var a=fr(i(_r,n._0,r)),o=t,c=n._1;r=a;t=o;e=c;continue r;default:var u=r,v=i(N["++"],t,i(N["++"],n._0,i(N["++"],":",i(N["++"],n._1,";")))),l=n._2;r=u;t=v;e=l;continue r}}});var rd=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=t.alpha;return i(N["++"],"rgba(",i(N["++"],E(e),i(N["++"],", ",i(N["++"],E(n),i(N["++"],", ",i(N["++"],E(a),i(N["++"],", ",i(N["++"],E(o),")"))))))))};var td=function(r){return i(N["++"],"'",i(N["++"],i(ya,"', '",r),"'"))};var ed=t(function(r,t,e){var n=t;if(n.ctor==="Nothing"){return e}else{return i(r,n._0,e)}});var nd={typeface:{ctor:"[]"},height:vr,color:Se,bold:false,italic:false,line:vr};var ad=a(function(r,t,e,n,a,o){return{typeface:r,height:t,color:e,bold:n,italic:a,line:o}});var od=t(function(r,t,e){return{ctor:"Meta",_0:r,_1:t,_2:e}});var cd=r(function(r,t){var e=r;if(e.ctor==="[]"){return t}else{return _(od,"font-family",td(r),t)}});var ud=function(r){return _(od,"font-family","monospace",r)};var id=r(function(r,t){return _(od,"font-size",i(N["++"],E(r),"px"),t)});var _d=r(function(r,t){return _(od,"color",rd(r),t)});var vd=function(r){return _(od,"font-weight","bold",r)};var ld=function(r){return _(od,"font-style","italic",r)};var fd=r(function(r,t){var e=function(){var t=r;switch(t.ctor){case"Under":return"underline";case"Over":return"overline";default:return"line-through"}}();return _(od,"text-decoration",e,t)});var sd=r(function(r,t){return _(ed,id,r.height,_(ed,fd,r.line,(r.italic?ld:x)((r.bold?vd:x)(i(cd,r.typeface,i(_d,r.color,t))))))});var dd=r(function(r,t){return{ctor:"Link",_0:r,_1:t}});var hd=dd;var pd=r(function(r,t){return{ctor:"Append",_0:r,_1:t}});var gd=pd;var md=function(r){return{ctor:"Str",_0:r}};var bd=md;var yd=bd("");var wd=function(r){return _(Sr,gd,yd,r)};var kd=r(function(r,t){return wd(i(Xr,r,t))});var Td={ctor:"Through"};var xd={ctor:"Over"};var Nd={ctor:"Under"};var Ed=Qs.block("justify");var Bd=Qs.block("center");var Ad=Qs.block("right");var Rd=Qs.block("left");var Sd=function(r){return Rd(ud(bd(E(r))))};var Cd=Qs.newElement;var Ld=function(r){var t=r;var e=t._0;return{ctor:"_Tuple2",_0:e.props.width,_1:e.props.height}};var Od=function(r){var t=r;return t._0.props.height};var Fd=function(r){var t=r;return t._0.props.width};var Md=Qs.toHtml;var Dd=a(function(r,t,e,n,a,o){return{width:r,height:t,opacity:e,color:n,href:a,tag:o}});var Id=e(function(r,t,e,n){return{horizontal:r,vertical:t,x:e,y:n}});var Pd=function(r){return{ctor:"Element_elm_builtin",_0:r}};var zd=r(function(r,t){var e=t;var n=e._0.props;var a=e._0.element;var o=function(){var t=a;switch(t.ctor){case"Image":return O(R(t._2)/R(t._1)*R(r));case"RawHtml":return Eu(i(Qs.htmlHeight,r,a));default:return n.height}}();return Pd({element:a,props:m.update(n,{width:r,height:o})})});var Jd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{height:r})})});var Ud=t(function(r,t,e){return i(Jd,t,i(zd,r,e))});var jd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{opacity:r})})});var qd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{color:fr(r)})})});var Wd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{tag:r})})});var Hd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{href:r})})});var Yd={ctor:"Custom"};var Vd={ctor:"RawHtml"};var Gd={ctor:"Spacer"};var Qd=r(function(r,t){return _(Cd,r,t,Gd)});var $d=i(Qd,0,0);var Kd=r(function(r,t){return{ctor:"Flow",_0:r,_1:t}});var Zd=r(function(t,e){var n=r(function(r,n){return _(Cd,r,n,i(Kd,t,e))});var a=function(r){return i(_r,0,Mr(r))};var o=i(jr,Od,e);var c=i(jr,Fd,e);if(m.eq(e,{ctor:"[]"})){return $d}else{var u=t;switch(u.ctor){case"DUp":return i(n,a(c),Or(o));case"DDown":return i(n,a(c),Or(o));case"DLeft":return i(n,Or(c),a(o));case"DRight":return i(n,Or(c),a(o));case"DIn":return i(n,a(c),a(o));default:return i(n,a(c),a(o))}}});var Xd=r(function(r,t){return{ctor:"Container",_0:r,_1:t}});var rh=e(function(r,t,e,n){var a=e;return _(Cd,r,t,i(Xd,a._0,n))});var th=e(function(r,t,e,n){return{ctor:"Image",_0:r,_1:t,_2:e,_3:n}});var eh={ctor:"Tiled"};var nh=t(function(r,t,e){return _(Cd,r,t,v(th,eh,r,t,e))});var ah=function(r){return{ctor:"Cropped",_0:r}};var oh=e(function(r,t,e,n){return _(Cd,t,e,v(th,ah(r),t,e,n))});var ch={ctor:"Fitted"};var uh=t(function(r,t,e){return _(Cd,r,t,v(th,ch,r,t,e))});var ih={ctor:"Plain"};var _h=t(function(r,t,e){return _(Cd,r,t,v(th,ih,r,t,e))});var vh={ctor:"N"};var lh={ctor:"Z"};var fh={ctor:"P"};var sh=function(r){return{ctor:"Relative",_0:r}};var dh=sh;var hh=function(r){return{ctor:"Absolute",_0:r}};var ph=hh;var gh=function(r){return{ctor:"Position",_0:r}};var mh=gh({horizontal:lh,vertical:lh,x:sh(.5),y:sh(.5)});var bh=gh({horizontal:vh,vertical:fh,x:hh(0),y:hh(0)});var yh=gh({horizontal:fh,vertical:fh,x:hh(0),y:hh(0)});var wh=gh({horizontal:vh,vertical:vh,x:hh(0),y:hh(0)});var kh=gh({horizontal:fh,vertical:vh,x:hh(0),y:hh(0)});var Th=gh({horizontal:vh,vertical:lh,x:hh(0),y:sh(.5)});var xh=gh({horizontal:fh,vertical:lh,x:hh(0),y:sh(.5)});var Nh=gh({horizontal:lh,vertical:fh,x:sh(.5),y:hh(0)});var Eh=gh({horizontal:lh,vertical:vh,x:sh(.5),y:hh(0)});var Bh=r(function(r,t){return gh({horizontal:lh,vertical:lh,x:r,y:t})});var Ah=r(function(r,t){return gh({horizontal:vh,vertical:fh,x:r,y:t})});var Rh=r(function(r,t){return gh({horizontal:fh,vertical:fh,x:r,y:t})});var Sh=r(function(r,t){return gh({horizontal:vh,vertical:vh,x:r,y:t})});var Ch=r(function(r,t){return gh({horizontal:fh,vertical:vh,x:r,y:t})});var Lh=r(function(r,t){return gh({horizontal:vh,vertical:lh,x:r,y:t})});var Oh=r(function(r,t){return gh({horizontal:fh,vertical:lh,x:r,y:t})});var Fh=r(function(r,t){return gh({horizontal:lh,vertical:fh,x:r,y:t})});var Mh=r(function(r,t){return gh({horizontal:lh,vertical:vh,x:r,y:t})});var Dh={ctor:"DOut"};var Ih=function(r){var t=i(jr,Od,r);var e=i(jr,Fd,r);return _(Cd,i(_r,0,Mr(e)),i(_r,0,Mr(t)),i(Kd,Dh,r))};var Ph=Dh;var zh={ctor:"DIn"};var Jh=zh;var Uh={ctor:"DRight"};var jh=Uh;var qh=r(function(r,t){return _(Cd,Fd(r)+Fd(t),i(D,Od(r),Od(t)),i(Kd,jh,{ctor:"::",_0:r,_1:{ctor:"::",_0:t,_1:{ctor:"[]"}}}))});var Wh={ctor:"DLeft"};var Hh=Wh;var Yh={ctor:"DDown"};var Vh=r(function(r,t){return _(Cd,i(D,Fd(r),Fd(t)),Od(r)+Od(t),i(Kd,Yh,{ctor:"::",_0:r,_1:{ctor:"::",_0:t,_1:{ctor:"[]"}}}))});var Gh=r(function(r,t){return _(Cd,i(D,Fd(t),Fd(r)),Od(t)+Od(r),i(Kd,Yh,{ctor:"::",_0:t,_1:{ctor:"::",_0:r,_1:{ctor:"[]"}}}))});var Qh=Yh;var $h={ctor:"DUp"};var Kh=$h;var Zh=function(){function r(r,t){r.lineWidth=t.width;var e=t.cap.ctor;r.lineCap=e==="Flat"?"butt":e==="Round"?"round":"square";var n=t.join.ctor;r.lineJoin=n==="Smooth"?"round":n==="Sharp"?"miter":"bevel";r.miterLimit=t.join._0||10;r.strokeStyle=rd(t.color)}function e(r,t,e){var n=e.ctor;t.fillStyle=n==="Solid"?rd(e._0):n==="Texture"?u(r,t,e._0):v(t,e._0)}function n(r,t){var e=mr.toArray(t);var n=e.length-1;if(n<=0){return}r.moveTo(e[n]._0,e[n]._1);while(n--){r.lineTo(e[n]._0,e[n]._1)}if(t.closed){n=e.length-1;r.lineTo(e[n]._0,e[n]._1)}}function a(r,t,e){if(t.dashing.ctor==="[]"){n(r,e)}else{o(r,t,e)}r.scale(1,-1);r.stroke()}function o(r,t,e){var n=mr.toArray(e);if(e.closed){n.push(n[0])}var a=mr.toArray(t.dashing);var o=n.length-1;if(o<=0){return}var c=n[o]._0,u=n[o]._1;var i=0,_=0,v=0,l=0,f=0;var s=0,d=a.length;var h=true,p=a[0];r.moveTo(c,u);while(o--){i=n[o]._0;_=n[o]._1;v=i-c;l=_-u;f=Math.sqrt(v*v+l*l);while(p<=f){c+=v*p/f;u+=l*p/f;r[h?"lineTo":"moveTo"](c,u);v=i-c;l=_-u;f=Math.sqrt(v*v+l*l);h=!h;s=(s+1)%d;p=a[s]}if(f>0){r[h?"lineTo":"moveTo"](i,_);p-=f}c=i;u=_}}function c(t,e,n){r(t,e);return a(t,e,n)}function u(r,t,e){var n=new Image;n.src=e;n.onload=r;return t.createPattern(n,"repeat")}function v(r,t){var e;var n=[];if(t.ctor==="Linear"){var a=t._0,o=t._1;e=r.createLinearGradient(a._0,-a._1,o._0,-o._1);n=mr.toArray(t._2)}else{var a=t._0,c=t._2;e=r.createRadialGradient(a._0,-a._1,t._1,c._0,-c._1,t._3);n=mr.toArray(t._4)}var u=n.length;for(var i=0;io){o=i.height}}var v=-a/2;for(var u=0;u-1e-5){return 0}return r}function x(r,t,e,n){var a=e.form._0._0.props;var o=f(ep,1,0,0,-1,(r-a.width)/2,(t-a.height)/2);var c=n.length;for(var u=0;u>>10),_1:{ctor:"::",_0:It(56320|1023&t),_1:{ctor:"[]"}}})}};var lg=r(function(r,t){var e=t;var n=e._2;var a=e._1;var o=function(r){return 63&r|e._0<<6};return m.eq(a,0)?m.eq(128&r,0)?{ctor:"_Tuple3",_0:0,_1:0,_2:i(N["++"],n,vg(r))}:m.eq(224&r,192)?{ctor:"_Tuple3",_0:31&r,_1:1,_2:n}:m.eq(240&r,224)?{ctor:"_Tuple3",_0:15&r,_1:2,_2:n}:{ctor:"_Tuple3",_0:7&r,_1:3,_2:n}:m.eq(a,1)?{ctor:"_Tuple3",_0:0,_1:0,_2:i(N["++"],n,vg(o(r)))}:{ctor:"_Tuple3",_0:o(r),_1:a-1,_2:n}});var fg=r(function(r,t){return{ctor:"_Tuple3",_0:0,_1:0,_2:i(lg,255&r>>>0,i(lg,255&r>>>8,i(lg,255&r>>>16,t)))}});var sg=r(function(r,t){var e=t;var n=e._2;var a=e._0;var o=e._1;var c=_g(r);var u=o;if(u===3){return i(fg,a|c,n)}else{return{ctor:"_Tuple3",_0:c<<(3-o)*6|a,_1:o+1,_2:n}}});var dg={ctor:"_Tuple3",_0:0,_1:0,_2:{ctor:"_Tuple3",_0:0,_1:0,_2:""}};var hg=function(r){var t=r;return m.cmp(t._2._1,0)>0?hn("Invalid UTF-16"):gn(t._2._2)};var pg=r(function(r,t){return i(Xn,"==",r)?i(da,2,t):i(Xn,"=",r)?i(da,1,t):t});var gg=Ou("^([A-Za-z0-9\\/+]{4})*([A-Za-z0-9\\/+]{2}[A-Za-z0-9\\/+=]{2})?$");var mg=function(r){return i(Cu,gg,r)?gn(r):hn("Invalid base64")};var bg=function(r){var t=i(X,Ba(r),4);switch(t){case 3:return i(N["++"],r,"=");case 2:return i(N["++"],r,"==");default:return r}};var yg=function(r){return i(mn,pg(r),i(pn,function(r){return hg(_(Ta,sg,dg,r))},mg(r)))};var wg=function(r){return yg(bg(r))};var kg=function(r){var t=r;switch(t){case 0:return"A";case 1:return"B";case 2:return"C";case 3:return"D";case 4:return"E";case 5:return"F";case 6:return"G";case 7:return"H";case 8:return"I";case 9:return"J";case 10:return"K";case 11:return"L";case 12:return"M";case 13:return"N";case 14:return"O";case 15:return"P";case 16:return"Q";case 17:return"R";case 18:return"S";case 19:return"T";case 20:return"U";case 21:return"V";case 22:return"W";case 23:return"X";case 24:return"Y";case 25:return"Z";case 26:return"a";case 27:return"b";case 28:return"c";case 29:return"d";case 30:return"e";case 31:return"f";case 32:return"g";case 33:return"h";case 34:return"i";case 35:return"j";case 36:return"k";case 37:return"l";case 38:return"m";case 39:return"n";case 40:return"o";case 41:return"p";case 42:return"q";case 43:return"r";case 44:return"s";case 45:return"t";case 46:return"u";case 47:return"v";case 48:return"w";case 49:return"x";case 50:return"y";case 51:return"z";case 52:return"0";case 53:return"1";case 54:return"2";case 55:return"3";case 56:return"4";case 57:return"5";case 58:return"6";case 59:return"7";case 60:return"8";case 61:return"9";case 62:return"+";default:return"/"}};var Tg=function(r){return i(N["++"],kg(63&r>>>18),i(N["++"],kg(63&r>>>12),i(N["++"],kg(63&r>>>6),kg(63&r>>>0))))};var xg=r(function(r,t){var e=t;var n=e._0;var a=e._1;var o=e._2<<8|r;var c=a;if(c===2){return{ctor:"_Tuple3",_0:i(N["++"],n,Tg(o)),_1:0,_2:0}}else{return{ctor:"_Tuple3",_0:n,_1:a+1,_2:o}}});var Ng=r(function(t,e){var n=e;var a=n._1;var o=Pt(t);var c=n._0;if(c.ctor==="Nothing"){return m.cmp(o,128)<0?{ctor:"_Tuple2",_0:vr,_1:i(xg,o,a)}:m.cmp(o,2048)<0?{ctor:"_Tuple2",_0:vr,_1:i(xg,128|63&o,i(xg,192|o>>>6,a))}:m.cmp(o,55296)<0||m.cmp(o,57344)>-1?{ctor:"_Tuple2",_0:vr,_1:i(xg,128|63&o,i(xg,128|63&o>>>6,i(xg,224|o>>>12,a)))}:{ctor:"_Tuple2",_0:fr(o),_1:a}}else{var u=i(r(function(r,t){return r+t}),65536,1023&o|(1023&c._0)<<10);return{ctor:"_Tuple2",_0:vr,_1:i(xg,128|63&u,i(xg,128|63&u>>>6,i(xg,128|63&u>>>12,i(xg,240|u>>>18,a))))}}});var Eg=function(r){var t=r;var e=t._1._0;var n=t._1._2;var a=t._1._1;switch(a){case 1:return i(N["++"],e,i(N["++"],kg(63&n>>>2),i(N["++"],kg(63&n<<4),"==")));case 2:return i(N["++"],e,i(N["++"],kg(63&n>>>10),i(N["++"],kg(63&n>>>4),i(N["++"],kg(63&n<<2),"="))));default:return e}};var Bg={ctor:"_Tuple2",_0:vr,_1:{ctor:"_Tuple3",_0:"",_1:0,_2:0}};var Ag=function(r){return Eg(_(Ta,Ng,Bg,r))};var Rg=wg;var Sg=Ag;var Cg=r(function(r,t){var e=R(Math.pow(10,r));return R(O(t*e))/e});var Lg=r(function(r,t){var e=i(Cg,r,t);var n=L(i(j,10,e))+1;var a=n+1+r;var o=E(e);var c=i(ta,".",o)?o:i(N["++"],o,".");return _(la,a,m.chr("0"),c)});var Og=function(r){var t=r;switch(t.ctor){case"Jan":return 1;case"Feb":return 2;case"Mar":return 3;case"Apr":return 4;case"May":return 5;case"Jun":return 6;case"Jul":return 7;case"Aug":return 8;case"Sep":return 9;case"Oct":return 10;case"Nov":return 11;default:return 12}};var Fg=function(r){var t=nc(r);var e=ac(r);var n=oc(r);return i(ya,"-",{ctor:"::",_0:_(fa,4,m.chr("0"),E(n)),_1:{ctor:"::",_0:_(fa,2,m.chr("0"),E(Og(e))),_1:{ctor:"::",_0:_(fa,2,m.chr("0"),E(t)),_1:{ctor:"[]"}}}})};var Mg=r(function(r,t){var e=ic(r);if(e.ctor==="Ok"){return e._0}else{return t}});var Dg=function(r){var t=ic(r);if(t.ctor==="Ok"){return t._0}else{return m.crashCase("DateExtra",{start:{line:9,column:5},end:{line:14,column:58}},t)(i(N["++"],"unsafeFromString: ",r))}};var Ig=Ig||{};Ig["=>"]=r(function(r,t){return{ctor:"_Tuple2",_0:r,_1:t}});var Pg=function(r){return oa(i(ga,1,r.label))};var zg=r(function(r,t){return Dg(i(ya,"-",{ctor:"::",_0:E(t),_1:{ctor:"::",_0:E(Og(ac(r.birthDate))),_1:{ctor:"::",_0:E(nc(r.birthDate)),_1:{ctor:"[]"}}}}))});var Jg=function(r){return i(I,r.lifeExpectancy,r.oldFrom)};var Ug=function(r){return i(I,r.lifeExpectancy,r.kidUntil)};var jg=function(r){return r.onlyAdultYears?i(zg,r,oc(r.birthDate)+Jg(r)):i(zg,r,oc(r.birthDate)+r.lifeExpectancy)};var qg=function(r){return r.onlyAdultYears?i(zg,r,oc(r.birthDate)+r.kidUntil):r.birthDate};var Wg=ve;var Hg=function(r){return{from:i(Mg,r.from,cc(0)),to:i(Mg,r.to,cc(0)),label:r.label,overlay:r.overlay,color:i(_r,Wg,sn(Ls(r.color)))}};var Yg=function(r){return{from:Fg(cc(r.now)),to:Fg(cc(r.now)),label:"",overlay:false,color:Rs(Wg)}};var Vg=r(function(r,t){return m.update(t,{eventFormOpen:r.eventFormOpen,eventForm:r.eventForm,modalOpen:r.modalOpen,now:r.now})});var Gg=function(r){return function(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return function(v){return function(l){return{birthDate:r,birthDateString:t,kidUntil:e,oldFrom:n,lifeExpectancy:a,lifeExpectancyString:o,onlyAdultYears:c,events:u,eventFormOpen:i,eventForm:_,modalOpen:v,now:l}}}}}}}}}}}}};var Qg=a(function(r,t,e,n,a,o){return{birthDate:r,kidUntil:t,oldFrom:e,lifeExpectancy:n,onlyAdultYears:a,events:o}});var $g=n(function(r,t,e,n,a){return{from:r,to:t,color:e,label:n,overlay:a}});var Kg=n(function(r,t,e,n,a){return{from:r,to:t,color:e,label:n,overlay:a}});var Zg={birthDate:Dg("1988-07-24"),birthDateString:"1988-07-24",kidUntil:18,oldFrom:70,lifeExpectancy:80,lifeExpectancyString:"80",onlyAdultYears:false,events:{ctor:"[]"},eventFormOpen:-1,eventForm:l(Kg,"","","","",false),modalOpen:false,now:0};var Xg=function(r){return m.update(Zg,{birthDate:r.birthDate,birthDateString:Fg(r.birthDate),kidUntil:r.kidUntil,oldFrom:r.oldFrom,lifeExpectancy:r.lifeExpectancy,lifeExpectancyString:E(r.lifeExpectancy),onlyAdultYears:r.onlyAdultYears,events:r.events})};var rm={ctor:"EventLabel"};var tm={ctor:"EventColor"};var em={ctor:"EventTo"};var nm={ctor:"EventFrom"};var am={ctor:"ToggleModal"};var om=function(r){return{ctor:"NewConfig",_0:r}};var cm={ctor:"DeleteEvent"};var um={ctor:"SaveEvent"};var im=function(r){return{ctor:"UpdateEventOverlay",_0:r}};var _m=r(function(r,t){return{ctor:"UpdateEvent",_0:r,_1:t}});var vm=function(r){return{ctor:"ShowEventForm",_0:r}};var lm=function(r){return{ctor:"OnlyAdultYears",_0:r}};var fm=function(r){return{ctor:"NewLifeExpectancy",_0:r}};var sm=function(r){return{ctor:"NewBirthDate",_0:r}};var dm=function(r){return{ctor:"NewUrl",_0:r}};var hm=function(r){return{ctor:"Tick",_0:r}};var pm=i(Hc,function(r){return Vc(i(_r,Wg,sn(Ls(r))))},mu);var gm=function(r){return Jc(Rs(r))};var mm=i(Hc,function(r){var t=ic(r);if(t.ctor==="Ok"){return Vc(t._0)}else{return Yc(t._0)}},mu);var bm=function(r){return Jc(Fg(r))};var ym=f(ru,$g,i(iu,"from",mm),i(iu,"to",mm),i(iu,"color",pm),i(iu,"label",mu),i(iu,"overlay",gu));var wm=function(r){return Mc({ctor:"::",_0:i(Ig["=>"],"from",bm(r.from)),_1:{ctor:"::",_0:i(Ig["=>"],"to",bm(r.to)),_1:{ctor:"::",_0:i(Ig["=>"],"color",gm(r.color)),_1:{ctor:"::",_0:i(Ig["=>"],"label",Jc(r.label)),_1:{ctor:"::",_0:i(Ig["=>"],"overlay",Ic(r.overlay)),_1:{ctor:"[]"}}}}}})};var km=s(Xc,Qg,i(iu,"birth-date",mm),i(iu,"kid-until",pu),i(iu,"old-from",pu),i(iu,"life-expectancy",pu),i(iu,"only-adult-years",gu),i(iu,"events",su(ym)));var Tm=function(r){var t=i($c,km,r);if(t.ctor==="Err"){return hn(t._0)}else{return gn(Xg(t._0))}};var xm=function(r){return i(Uc,2,Mc({ctor:"::",_0:i(Ig["=>"],"birth-date",bm(r.birthDate)),_1:{ctor:"::",_0:i(Ig["=>"],"life-expectancy",zc(r.lifeExpectancy)),_1:{ctor:"::",_0:i(Ig["=>"],"kid-until",zc(r.kidUntil)),_1:{ctor:"::",_0:i(Ig["=>"],"old-from",zc(r.oldFrom)),_1:{ctor:"::",_0:i(Ig["=>"],"only-adult-years",Ic(r.onlyAdultYears)),_1:{ctor:"::",_0:i(Ig["=>"],"events",Oc(i(jr,wm,r.events))),_1:{ctor:"[]"}}}}}}}))};var Nm=function(r){var t=Rg(r);if(t.ctor==="Err"){return hn(t._0)}else{return Tm(t._0)}};var Em=function(r){return Sg(xm(r))};var Bm=r(function(t,e){return i(Hr,x,i(it,r(function(r,e){return m.eq(r,t)?vr:fr(e)}),e))});var Am=function(r){return r.onlyAdultYears?r.kidUntil:1};var Rm=function(r){var t=Em(r);var e=i(N["++"],"#",t);return Yf(e)};var Sm=function(r){var t=i(ha,1,r.hash);return Oa(t)?gn(Zg):Nm(t)};var Cm=r(function(r,t){var e=r;switch(e.ctor){case"Tick":return{ctor:"_Tuple2",_0:m.update(t,{now:e._0}),_1:Qe};case"NewUrl":var n=function(){var r=Sm(e._0);if(r.ctor==="Ok"){return i(Vg,t,r._0)}else{return t}}();return{ctor:"_Tuple2",_0:n,_1:Qe};case"NewBirthDate":var a=e._0;var o=i(Cu,Ou("^\\d{4}-\\d{2}-\\d{2}$"),a);var c=o?ic(a):hn("");var u=m.update(t,{birthDateString:a});var _=c;if(_.ctor==="Ok"){var n=m.update(u,{birthDate:_._0});return{ctor:"_Tuple2",_0:n,_1:Rm(n)}}else{return{ctor:"_Tuple2",_0:u,_1:Qe}}case"NewLifeExpectancy":var v=e._0;var l=i(_r,0,sn($n(v)));var u=m.update(t,{lifeExpectancyString:v});if(m.cmp(l,Am(t))<0||m.cmp(l,500)>0){return{ctor:"_Tuple2",_0:u,_1:Qe}}else{var n=m.update(u,{lifeExpectancy:l});return{ctor:"_Tuple2",_0:n,_1:Rm(n)}}case"OnlyAdultYears":var f=m.update(t,{onlyAdultYears:e._0});var n=m.update(f,{lifeExpectancy:i(D,f.lifeExpectancy,Am(f))});return{ctor:"_Tuple2",_0:n,_1:Rm(n)};case"ShowEventForm":var s=e._0;var d=m.eq(t.eventFormOpen,s)?-1:s;var h=Jr(Yr(i(nt,d,t.events)));var p=function(){var r=h;if(r.ctor==="Nothing"){return Yg(t)}else{var e=r._0;return{from:Fg(e.from),to:Fg(e.to),color:Rs(e.color),label:e.label,overlay:e.overlay}}}();return{ctor:"_Tuple2",_0:m.update(t,{eventFormOpen:d,eventForm:p}),_1:Qe};case"UpdateEvent":var g=e._1;var b=t.eventForm;var y=function(){var r=e._0;switch(r.ctor){case"EventFrom":return m.update(b,{from:g});case"EventTo":return m.update(b,{to:g});case"EventColor":return m.update(b,{color:g});default:return m.update(b,{label:g})}}();return{ctor:"_Tuple2",_0:m.update(t,{eventForm:y}),_1:Qe};case"UpdateEventOverlay":var b=t.eventForm;var y=m.update(b,{overlay:e._0});return{ctor:"_Tuple2",_0:m.update(t,{eventForm:y}),_1:Qe};case"SaveEvent":var w=Hg(t.eventForm);var k=!m.eq(t.eventFormOpen,0);var T=k?i(Bm,t.eventFormOpen-1,t.events):t.events;var x=i(yr,function(r){return Fg(r.from)},{ctor:"::",_0:w,_1:T});var n=m.update(t,{events:x,eventFormOpen:-1});return{ctor:"_Tuple2",_0:n,_1:Rm(n)};case"DeleteEvent":var x=i(Bm,t.eventFormOpen-1,t.events);var n=m.update(t,{events:x,eventFormOpen:-1});return{ctor:"_Tuple2",_0:n,_1:Rm(n)};case"NewConfig":var n=function(){var r=Tm(e._0);if(r.ctor==="Ok"){return i(Vg,t,r._0)}else{return t}}();return{ctor:"_Tuple2",_0:n,_1:Rm(n)};default:return{ctor:"_Tuple2",_0:m.update(t,{modalOpen:!t.modalOpen}),_1:Qe}}});var Lm=function(r){var t=i(_r,Zg,sn(Sm(r)));return{ctor:"_Tuple2",_0:t,_1:i(jn,hm,qo)}};var Om=r(function(r,t){var e=i(zg,r,oc(qg(r))+r.oldFrom);return r.onlyAdultYears?false:m.cmp(uc(e),t)<1});var Fm=r(function(r,t){var e=i(zg,r,oc(qg(r))+r.kidUntil);return r.onlyAdultYears?false:m.cmp(uc(e),t)>-1});var Mm=r(function(r,t){return m.cmp(t,r.now)<0});var Dm=r(function(r,t){return m.cmp(t,uc(qg(r)))<0||m.cmp(t,uc(jg(r)))>0});var Im=function(t){var e=t;if(e.ctor==="[]"){return vr}else{return fr(_(Cr,r(function(r,t){return v(Hs,Vs,r,t,.5)}),e._0,e._1))}};var Pm=86400*1e3;var zm=Pm*7;var Jm=r(function(r,t){var e=zm/2;var n=r.now;return m.cmp(n-e,t)<1&&m.cmp(t,n+e)<0});var Um=r(function(r,t){var e=t;var n=oc(r.birthDate)+e._0;var a=Dg(i(N["++"],E(n),"-01-01"));var o=function(){var r=ec(a);switch(r.ctor){case"Mon":return 0;case"Tue":return 1;case"Wed":return 2;case"Thu":return 3;case"Fri":return 4;case"Sat":return 5;default:return 6}}();var c=R(e._1-1)*zm+R(o)*Pm;return uc(a)+c});var jm=1;var qm=function(){var r=Bp;return m.update(r,{width:jm})}();var Wm=10;var Hm=t(function(r,t,e){var n=i(Zp,qm,og(Wm-jm));var a=function(r){return i(Gp,r,og(Wm))};var o=function(r){return fr(i(hp,1,Jp(i(_d,Ce,vd(i(id,Wm,ud(bd(Pg(r)))))))))};var c=i(Um,r,{ctor:"_Tuple2",_0:t,_1:e});var u=function(r){return m.cmp(uc(r.from),c)<1&&m.cmp(uc(r.to),c)>-1};var _=i(Kr,function(r){return r.overlay},i(qr,u,r.events));var v=_._0;var l=_._1;var f=Im(i(jr,function(r){return r.color},l));var s=i(lr,o,Jr(v));var d=function(r){var t=s;if(t.ctor==="Nothing"){return a(r)}else{return Op({ctor:"::",_0:a(r),_1:{ctor:"::",_0:t._0,_1:{ctor:"[]"}}})}};if(i(Jm,r,c)){return i(mp,.5,d(Se))}else{var h=f;if(h.ctor==="Nothing"){return i(Dm,r,c)?d(Le):i(Fm,r,c)||i(Om,r,c)?d(Oe):i(Mm,r,c)?d(Se):n}else{return d(h._0)}}});var Ym=20;var Vm=60;var Gm=function(){var r=function(r){return i(dp,R(r)*(Wm+jm*2),Jp(bd(E(r))))};return i(sp,{ctor:"_Tuple2",_0:Vm,_1:-10},Op(i(jr,r,i(qr,function(r){return!m.eq(i(N["%"],r,2),0)},i(ut,1,52)))))}();var Qm=r(function(r,t){var e=function(e){return i(dp,R(e)*(Wm+jm*2)+Vm,_(Hm,r,t,e))};var n=_(fa,2,m.chr("0"),E(t));var a=oc(r.birthDate)+t;var o=i(sp,{ctor:"_Tuple2",_0:32,_1:2},Jp(bd(i(N["++"],E(a),i(N["++"]," / ",n)))));return{ctor:"::",_0:o,_1:i(jr,e,i(ut,1,52))}});var $m=Vm+52*(Wm+jm*2)+Ym;var Km=function(r){return r*(Wm+jm*2)};var Zm=function(r){var t=R(Jg(r));var e=R(Ug(r));var n={ctor:"_Tuple3",_0:R(r.kidUntil),_1:R(r.oldFrom),_2:R(r.lifeExpectancy)};var a=n._0;var o=n._1;var c=n._2;var u={ctor:"_Tuple2",_0:11,_1:6};var _=u._0;var v=u._1;var l=i(hp,Km(c/2-a)-v,i(dp,-2,i(Gp,Se,i(ag,10,1))));var f=i(hp,0-(Km(o-c/2)+v),i(dp,-2,i(Gp,Se,i(ag,10,1))));var s=function(r){return i(gp,nr(-90),Jp(bd(r)))};var d=i(hp,Km((c-e)/2)-_,s("kid"));var h=m.cmp(t-a,8)<0?s(""):i(hp,Km(c/2-(a+t)/2)-_,s("adult years"));var p=m.cmp(c-o,1)<0?s(""):i(hp,0-(Km((c+o)/2-c/2)+_),s("old"));return Op({ctor:"::",_0:d,_1:{ctor:"::",_0:l,_1:{ctor:"::",_0:h,_1:{ctor:"::",_0:f,_1:{ctor:"::",_0:p,_1:{ctor:"[]"}}}}}})};var Xm=16;var rb=function(r){var t=r.onlyAdultYears?{ctor:"_Tuple2",_0:r.kidUntil,_1:Jg(r)}:{ctor:"_Tuple2",_0:0,_1:r.lifeExpectancy};var e=t._0;var n=t._1;var a=function(t){return i(hp,(0-R(t-e+1))*(Wm+jm*2)-Xm,Op(i(Qm,r,t)))};return{ctor:"::",_0:Gm,_1:i(jr,a,i(ut,e,n))}};var tb=function(r){var t=i(dp,$m/2-Ym+Xm,Zm(r));var e=Xm*2+Km(r.lifeExpectancy);var n=i(hp,e/2,i(dp,(0-$m)/2,Op(rb(r))));var a=r.onlyAdultYears?Op({ctor:"::",_0:n,_1:{ctor:"[]"}}):Op({ctor:"::",_0:n,_1:{ctor:"::",_0:t,_1:{ctor:"[]"}}});return Md(_(_p,$m,S(e),{ctor:"::",_0:a,_1:{ctor:"[]"}}))};var eb=function(){var r='\n{\n "birth-date": "1988-07-24",\n "life-expectancy": 80,\n "kid-until": 18,\n "old-from": 70,\n "only-adult-years": false,\n "events": [\n {\n "from": "2010-09-14",\n "to": "2014-02-01",\n "color": "#f57900",\n "label": "college",\n "overlay": false\n },\n {\n "from": "2015-06-01",\n "to": "2016-05-31",\n "color": "#73d216",\n "label": "trip",\n "overlay": false\n }\n ]\n}\n';return Sg(r)}();var nb=function(r){var t=uc(jg(r))-r.now;var e=i(D,0,Jo(t)/24/7);return i(Lg,6,e)};var ab={ctor:"::",_0:Zv("date"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:tl("YYYY-MM-DD"),_1:{ctor:"::",_0:_l("[1-2]\\d{3}-[0-1]\\d-[0-3]\\d"),_1:{ctor:"[]"}}}}};var ob={ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row mt-1"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-12"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("alert alert-info"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Vi,{ctor:"[]"},{ctor:"::",_0:hi("Privacy: "),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi("this page runs entirely in your browser so no data is sent to any server."),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Li,{ctor:"::",_0:Fv("text-center"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Inspired by "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://i.imgur.com/67aHKhF.jpg"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("this chart"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" - "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("http://waitbutwhy.com/2014/05/life-weeks.html"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("Terrified?"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" - "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://github.com/infertux/lifechart"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("Source code"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" - "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(am),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("Export raw data"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}}}}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("d-none"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Vi,{ctor:"[]"},{ctor:"::",_0:hi("Reminder: "),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi("every single person you've ever known will die eventually - and so will you - but "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://youtu.be/k5RH3BdXDOY"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("don't worry"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" :)"),_1:{ctor:"[]"}}}}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}};var cb=function(r){var t=i(Lg,6,_(U,0,100,100*(r.now-uc(qg(r)))/(uc(jg(r))-uc(qg(r)))));var e=nb(r);return{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row mt-2"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ni,{ctor:"[]"},{ctor:"::",_0:i(p_,{ctor:"::",_0:Fv("badge badge-primary"),_1:{ctor:"[]"}},{ctor:"::",_0:hi(i(N["++"],t,"% elapsed")),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col text-right"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ni,{ctor:"[]"},{ctor:"::",_0:i(p_,{ctor:"::",_0:Fv("badge badge-primary"),_1:{ctor:"[]"}},{ctor:"::",_0:hi(i(N["++"],e," weeks left")),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row mt-1"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-12"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("progress"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"height","1.7rem"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("progress-bar progress-bar-striped progress-bar-animated"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"width",i(N["++"],t,"%")),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}},{ctor:"[]"}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}};var ub=r(function(r,t){var e=i(Hi,{ctor:"::",_0:Fv("btn btn-danger"),_1:{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(cm),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("Delete"),_1:{ctor:"[]"}});var n=m.eq(t,0);var a=i(Y_,{ctor:"::",_0:Fv("btn btn-primary ml-1"),_1:{ctor:"::",_0:Zv("submit"),_1:{ctor:"::",_0:Xv(n?"Add":"Save"),_1:{ctor:"[]"}}}},{ctor:"[]"});var o=n?{ctor:"::",_0:a,_1:{ctor:"[]"}}:{ctor:"::",_0:e,_1:{ctor:"::",_0:a,_1:{ctor:"[]"}}};var c=m.eq(r.eventFormOpen,t)?"":" d-none";var u=r.eventForm;return i(Pi,{ctor:"::",_0:Fv(i(N["++"],"list-group-item",c)),_1:{ctor:"[]"}},{ctor:"::",_0:i(j_,{ctor:"::",_0:vf(um),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-prepend"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-text"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("From"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Y_,i(Gr,ab,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:Xv(u.from),_1:{ctor:"::",_0:ll(u.to),_1:{ctor:"::",_0:ff(_m(nm)),_1:{ctor:"[]"}}}}}),{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-prepend"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-text"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("To"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Y_,i(Gr,ab,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:Xv(u.to),_1:{ctor:"::",_0:fl(u.from),_1:{ctor:"::",_0:ff(_m(em)),_1:{ctor:"[]"}}}}}),{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-prepend"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-text"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Label"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:tl("label"),_1:{ctor:"::",_0:Zv("text"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:Xv(u.label),_1:{ctor:"::",_0:ff(_m(rm)),_1:{ctor:"[]"}}}}}}},{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("form-check-inline"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"line-height","2.5rem"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-check-input"),_1:{ctor:"::",_0:Zv("checkbox"),_1:{ctor:"::",_0:Ul(u.overlay),_1:{ctor:"::",_0:lf(im),_1:{ctor:"[]"}}}}},{ctor:"[]"}),_1:{ctor:"::",_0:hi(" overlay"),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv(i(N["++"],"float-right",u.overlay?" d-none":"")),_1:{ctor:"::",_0:Zv("color"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:Xv(u.color),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"height","2.5rem"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:ff(_m(tm)),_1:{ctor:"[]"}}}}}}},{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-12 text-right"),_1:{ctor:"[]"}},o),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}})});var ib=function(r){return{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("list-group-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ei,{ctor:"::",_0:Fv("mb-0"),_1:{ctor:"[]"}},{ctor:"::",_0:i(p_,{ctor:"[]"},{ctor:"::",_0:hi("Events"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(vm(0)),_1:{ctor:"::",_0:Fv("float-right"),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("Add event"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(ub,r,0),_1:{ctor:"[]"}}}};var _b=function(t){var e=t.events;var n=r(function(r,t){return i(Lg,1,100*(uc(r.to)-uc(r.from))/(uc(jg(t))-uc(qg(t))))});var a=function(r){return i(Wi,{ctor:"::",_0:Fv("float-left"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"width","1rem"),_1:{ctor:"::",_0:i(Ig["=>"],"height","1rem"),_1:{ctor:"::",_0:i(Ig["=>"],"line-height","1rem"),_1:{ctor:"::",_0:i(Ig["=>"],"font-weight","bold"),_1:{ctor:"::",_0:i(Ig["=>"],"color","#FFFFFF"),_1:{ctor:"::",_0:i(Ig["=>"],"margin","3px 0.5rem 0 0"),_1:{ctor:"::",_0:i(Ig["=>"],"padding",r.overlay?"0 0 3px 3px":"0"),_1:{ctor:"::",_0:i(Ig["=>"],"background-color",r.overlay?"#000000":Rs(r.color)),_1:{ctor:"[]"}}}}}}}}}),_1:{ctor:"[]"}}},{ctor:"::",_0:hi(r.overlay?Pg(r):""),_1:{ctor:"[]"}})};var o=r(function(r,e){return{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("list-group-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-3"),_1:{ctor:"[]"}},{ctor:"::",_0:a(r),_1:{ctor:"::",_0:i(p_,{ctor:"[]"},{ctor:"::",_0:hi(r.label),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7 text-right text-muted"),_1:{ctor:"[]"}},{ctor:"::",_0:hi(i(N["++"],Fg(r.from),i(N["++"]," to ",i(N["++"],Fg(r.to),i(N["++"]," (",i(N["++"],i(n,r,t),"%)")))))),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-2 text-right"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(vm(e)),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("edit"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(ub,t,e),_1:{ctor:"[]"}}}});var c=Pr(e)?{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("list-group-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("text-muted text-center"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("no events yet"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}:Qr(i(it,r(function(r,t){return i(o,t,r+1)}),e));return{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("card mt-4 mb-4"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ii,{ctor:"::",_0:Fv("list-group list-group-flush"),_1:{ctor:"[]"}},Qr({ctor:"::",_0:ib(t),_1:{ctor:"::",_0:c,_1:{ctor:"[]"}}})),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}};var vb=Xl({ctor:"::",_0:{ctor:"_Tuple2",_0:"background",_1:"#D3D7CF"},_1:{ctor:"::",_0:{ctor:"_Tuple2",_0:"border-radius",_1:"1rem"},_1:{ctor:"::",_0:{ctor:"_Tuple2",_0:"padding",_1:"0 0.35rem"},_1:{ctor:"::",_0:{ctor:"_Tuple2",_0:"margin-left",_1:"0.2rem"},_1:{ctor:"[]"}}}}});var lb=function(r){return{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("col-5 col-form-label col-form-label-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Date of Birth"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,i(Gr,ab,{ctor:"::",_0:Fv("form-control form-control-lg"),_1:{ctor:"::",_0:Xv(r.birthDateString),_1:{ctor:"::",_0:ll(Fg(cc(r.now))),_1:{ctor:"::",_0:ff(sm),_1:{ctor:"[]"}}}}}),{ctor:"[]"}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("col-5 col-form-label col-form-label-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Life Expectancy "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"::",_0:vb,_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("?"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-control form-control-lg"),_1:{ctor:"::",_0:Zv("number"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:Xv(r.lifeExpectancyString),_1:{ctor:"::",_0:fl("1"),_1:{ctor:"::",_0:ll("500"),_1:{ctor:"::",_0:ff(fm),_1:{ctor:"[]"}}}}}}}},{ctor:"[]"}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("col-5 col-form-label col-form-label-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Non-Adult Years "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://www.reddit.com/r/GetMotivated/comments/1vyf9r/made_for_myself_thought_of_you_weeks_left/cexas8u/"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"::",_0:vb,_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("?"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("form-check-inline form-control-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-check-input"),_1:{ctor:"::",_0:Zv("radio"),_1:{ctor:"::",_0:Ul(!r.onlyAdultYears),_1:{ctor:"::",_0:yf(lm(false)),_1:{ctor:"[]"}}}}},{ctor:"[]"}),_1:{ctor:"::",_0:hi(" Show"),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("form-check-inline form-control-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-check-input"),_1:{ctor:"::",_0:Zv("radio"),_1:{ctor:"::",_0:Ul(r.onlyAdultYears),_1:{ctor:"::",_0:yf(lm(true)),_1:{ctor:"[]"}}}}},{ctor:"[]"}),_1:{ctor:"::",_0:hi(" Hide"),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}}};var fb=function(r){var t=Em(r);return{ctor:"::",_0:i(Ii,{ctor:"::",_0:Fv("nav justify-content-center mb-2"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("nav-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:Fv("nav-link active"),_1:{ctor:"::",_0:wl("#"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("blank chart"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("nav-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:Fv("nav-link"),_1:{ctor:"::",_0:wl(i(N["++"],"#",eb)),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("demo chart"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("nav-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:Fv("nav-link"),_1:{ctor:"::",_0:wl(i(N["++"],"#",t)),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("bookmark your own chart"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}}};var sb=function(r){return i(Wi,{ctor:"[]"},Qr({ctor:"::",_0:{ctor:"::",_0:i(ki,{ctor:"::",_0:Fv("text-center mb-2"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Spend your time wisely."),_1:{ctor:"[]"}}),_1:{ctor:"[]"}},_1:{ctor:"::",_0:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("text-center text-muted mb-1"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("This will either inspire you or terrify you - hopefully the former."),_1:{ctor:"[]"}}),_1:{ctor:"[]"}},_1:{ctor:"::",_0:fb(r),_1:{ctor:"::",_0:lb(r),_1:{ctor:"::",_0:cb(r),_1:{ctor:"::",_0:_b(r),_1:{ctor:"::",_0:ob,_1:{ctor:"[]"}}}}}}}}))};var db=function(r){var t=xm(r);var e=r.modalOpen?"block":"none";return i(Wi,{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"display",e),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:Fv("modal in"),_1:{ctor:"[]"}}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-dialog"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-content"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-body"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("mb-1"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("You can copy/paste JSON below to export/import data."),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Z_,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:Tv(20),_1:{ctor:"::",_0:ff(om),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi(t),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-footer"),_1:{ctor:"[]"}},{ctor:"::",_0:i(V_,{ctor:"::",_0:Zv("button"),_1:{ctor:"::",_0:Fv("btn btn-primary"),_1:{ctor:"::",_0:yf(am),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("Close"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}})};var hb=function(r){return i(Wi,{ctor:"[]"},{ctor:"::",_0:db(r),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-6"),_1:{ctor:"[]"}},{ctor:"::",_0:sb(r),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-6"),_1:{ctor:"[]"}},{ctor:"::",_0:m.eq(r.now,0)?i(ki,{ctor:"::",_0:Fv("text-center"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Loading..."),_1:{ctor:"[]"}}):tb(r),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}})};var pb=function(r){return i($o,Io*10,hm)};var gb=i(Zf,dm,{init:Lm,update:Cm,view:hb,subscriptions:pb})();var mb={};mb["Lifechart"]=mb["Lifechart"]||{};if(typeof gb!=="undefined"){gb(mb["Lifechart"],"Lifechart",undefined)}if(typeof define==="function"&&define["amd"]){define([],function(){return mb});return}if(typeof module==="object"){module["exports"]=mb;return}var bb=this["Elm"];if(typeof bb==="undefined"){this["Elm"]=mb;return}for(var yb in mb){if(yb in bb){throw new Error("There are two Elm modules called `"+yb+"` on this page! Rename one of them.")}bb[yb]=mb[yb]}}).call(this);
--------------------------------------------------------------------------------