diff --git a/.gitignore b/.gitignore
index 30527c7d..9e28974e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,7 @@ pom.xml.asc
*.class
/.lein-*
/.nrepl-port
-/resources/public/js/compiled
+resources/public/js/compiled
*.log
examples/
\#*\#
diff --git a/config/dev.edn b/config/dev.edn
index 8a49fc09..e0b68e0c 100644
--- a/config/dev.edn
+++ b/config/dev.edn
@@ -1,5 +1,6 @@
{:db {:server "localhost"}
:scheme "http"
+ :base-url "http://localhost:3449"
:solr-uri "http://localhost:8983"
:solr-impl :solr
:client-config {:server-type :dev-local
@@ -24,103 +25,22 @@
:yodlee-cobrand-name "restserver"
:yodlee-cobrand-login "sbCobda48aa19712a83c3ca4e935dd5e5d46b1a"
:yodlee-cobrand-password "0a07ea32-1b5d-461b-ad0f-2752cdd77602"
- :yodlee-user-login "sbMemda48aa19712a83c3ca4e935dd5e5d46b1a4"
+ :yodlee-user-login "G7T9kiwaG8rMiykdV4pckmQnfj4OM2pf"
:yodlee-user-password "sbMemda48aa19712a83c3ca4e935dd5e5d46b1a4#123"
:yodlee-base-url "https://developer.api.yodlee.com/ysl"
:yodlee-app "10003600"
- :yodlee-fastlink "https://node.developer.yodlee.com/authenticate/restserver/?channelAppName=restserver"
+ :yodlee-fastlink "https://fl4.sandbox.yodlee.com/authenticate/restserver/fastlink"
:run-web? true
:run-background? true
:dd-env "dev"
:dd-service "integreat-app"
- :yodlee2-admin-user "e02b38f9-9865-4264-8e4f-6a5ac2c500b0_ADMIN"
+ :yodlee2-admin-user "50ec7e57-297d-4970-941e-1cb07b8dcb4e_ADMIN"
:yodlee2-integreat-user "integreat-main"
- :yodlee2-client-id "l6sUyK2NEq3mwopISHlFGWUcJ1U8OUQd"
- :yodlee2-client-secret "wZQHoGEkv5AGG2ZH"
- :yodlee2-base-url "https://development.api.yodlee.com/ysl"
- :yodlee2-fastlink "https://fl4.preprod.yodlee.com/authenticate/USDevexPreProd2-195/fastlink/?channelAppName=usdevexpreprod2"
-
- :square-config {"NGE1"
- {:square-location "SCX0Y8CTGM1S0",
- :location "UC",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGOP"
- {:square-location "L3GMNBFARX9GG",
- :location "OP",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGDG"
- {:square-location "LQTHXQY69MYB6",
- :location "DB",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGPG"
- {:square-location "AMQ0NPA8FGDEF",
- :location "SZ",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGEZ"
- {:square-location "L0Z167T2T7W7F",
- :location "JS",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGLK"
- {:square-location "LRC7WVD77ZM81",
- :location "SM",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGA1"
- {:square-location "FZ3ZYC77T3W1T",
- :location "KA",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGKG"
- {:square-location "8JT71V8XGYAT3",
- :location "NB",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGEB"
- {:square-location "LEV4GM1JPJS6R",
- :location "CV",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGGG"
- {:square-location "L7S9MXZBJ00HY",
- :location "LM",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGRV"
- {:square-location "L0J45VZKHWXVR",
- :location "RV",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGSM"
- {:square-location "LG5X0MHA4NZDM",
- :location "SM",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGZO"
- {:square-location "KMVFQ9CRCXJ10",
- :location "VT",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGWL"
- {:square-location "LSWNP14T0YKD9",
- :location "WL",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGMJ"
- {:square-location "FNH5VRT890WK8",
- :location "SC",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGHG"
- {:square-location "LXJCAHYGZVNEJ",
- :location "DC",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGVZ"
- {:square-location "ACNTYY8WVZ6DV",
- :location "NP",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGAK"
- {:square-location "2RVBYER6QSV7W",
- :location "MH",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"},
- "NGGH"
- {:square-location "LT322EK0S2TRD",
- :location "FM",
- :token "EAAAEO2xSqesDutZz71hz3eulKmrlKTiEqG3uZ4j25x5GYlOluQ2cj2JxNUXqXD7"}
- "20TY"
- {:square-location "L2579ATQ0X1ET",
- :location "WG",
- :token "EAAAEEr749Ea6AdPTdngsmUPwIM3ETbPwcx3QQl_NS0KWuIL-JNzAg4f3W9DGQhb"}}
-
+ :yodlee2-test-user "sbMem5f61421aba2161"
+ :yodlee2-client-id "G7T9kiwaG8rMiykdV4pckmQnfj4OM2pf"
+ :yodlee2-client-secret "8I0mmq1wmAWSSpr9"
+ :yodlee2-base-url "https://sandbox.api.yodlee.com/ysl"
+ :yodlee2-fastlink "https://fl4.sandbox.yodlee.com/authenticate/restserver/fastlink"
:intuit {:client-id "ABBAQI0qeck149vEC1e8tV6b3YJNujOCdwsUMkJ1ZoptzumyYu"
:client-secret "7DriIEend1K9RHlzhupIxPFQozXHELLfeFW2GfTR"
:redirect-uri "https://developer.intuit.com/v2/OAuth2Playground/RedirectUrl"}}
diff --git a/config/prod-cloud.edn b/config/prod-cloud.edn
index 44b742d7..db5449f8 100644
--- a/config/prod-cloud.edn
+++ b/config/prod-cloud.edn
@@ -1,5 +1,6 @@
{:scheme "https"
:db-name "prod-mirror2"
+ :base-url "https://prod-cloud.app.integreatconsult.com"
:solr-uri "http://solr-prod-cloud.local:8983"
:solr-impl :solr
:datomic-url "datomic:ddb://us-east-1/iol-dev/dev"
diff --git a/config/prod.edn b/config/prod.edn
index ed829225..6629a8cd 100644
--- a/config/prod.edn
+++ b/config/prod.edn
@@ -1,5 +1,6 @@
{:db {:server "database"}
:datomic-url "datomic:ddb://us-east-1/integreat/integreat-prod"
+ :base-url "https://app.integreatconsult.com"
:solr-uri "http://solr-prod.local:8983"
:solr-impl :solr
:scheme "https"
@@ -23,7 +24,6 @@
:yodlee-proxy-port 8888
:run-background? false
:run-web? true
- :yodlee2-admin-user "93398522-412b-470d-8400-3691392b12fb_ADMIN"
:yodlee2-integreat-user "integreat-main"
:yodlee2-client-id "3AATcwfPsWP1rP9oDoo4HvZhtaroGVcA"
:yodlee2-client-secret "cXTBmKbGfkaBFIpM"
diff --git a/data/inference-outcome.csv b/data/inference-outcome.csv
new file mode 100644
index 00000000..35d51ccc
--- /dev/null
+++ b/data/inference-outcome.csv
@@ -0,0 +1,1871 @@
+,transaction,best_vendor,best_account,confidence
+2,7375524016070717,6891738899426960,101155069755498,0.8820305
+9,7406310341674089,6891738899431434,101155069755498,0.9972274
+10,7393116202138345,6891738899431434,101155069755498,0.99865675
+11,7419504481208074,6891738899431434,101155069755498,0.99880815
+12,7410708388184670,6891738899431434,101155069755498,0.9974873
+13,7419504481218904,6891738899431434,101155069755498,0.9982944
+14,7419504481207955,6891738899431434,101155069755498,0.9982961
+15,7393116202139150,6891738899430508,101155069755498,0.9683728
+43,7393116202119634,6891738899431499,101155069755498,0.98397344
+44,7204000201967862,6891738899431499,101155069755498,0.99966
+45,7384320109106309,6891738899431499,101155069755498,0.9995789
+46,7278766992720605,6891738899431499,101155069755498,0.99992275
+47,7454688853344701,6891738899431499,101155069755498,0.9996809
+48,7384320109084176,6891738899431499,101155069755498,0.99981064
+49,7265572853191149,6891738899431499,101155069755498,0.99878305
+50,7195204108925870,6891738899431499,101155069755498,0.9998323
+51,7265572853180808,6891738899431499,101155069755498,0.9994603
+52,7459086899859663,6891738899431499,101155069755498,0.99929535
+53,7296359178777838,6891738899431499,101155069755498,0.9997775
+54,7393116202118754,6891738899431499,101155069755498,0.99986696
+55,7353533783487642,6891738899431499,101155069755498,0.99982566
+56,7463484946370446,6891738899431499,101155069755498,0.99935395
+57,7441494713784294,6891738899431499,101155069755498,0.99964607
+58,7300757225308029,6891738899431499,101155069755498,0.99945027
+59,7353533783476503,6891738899431499,101155069755498,0.99924797
+60,7300757225311308,6891738899431499,101155069755498,0.99970347
+61,7287563085773279,6891738899431499,101155069755498,0.9997032
+62,7212796294988315,6891738899431499,101155069755498,0.999845
+63,7353533783487801,6891738899431499,101155069755498,0.9997894
+64,7406310341676762,6891738899431499,101155069755498,0.9499903
+65,7423902527749145,6891738899431499,101155069755498,0.9996456
+66,7318349411369342,6891738899431499,101155069755498,0.9995807
+67,7459086899859815,6891738899431499,101155069755498,0.99935335
+68,7401912295165083,6891738899431499,101155069755498,0.99973696
+69,7388718155600749,6891738899431499,101155069755498,0.99982697
+70,7265572853191105,6891738899431499,101155069755498,0.99993837
+71,7371125969557199,6891738899431499,101155069755498,0.9998623
+72,7555843923185794,6891738899431499,101155069755498,0.9998801
+73,7357931830004992,6891738899431499,101155069755498,0.9993605
+74,7353533783487813,6891738899431499,101155069755498,0.9998192
+75,7401912295165014,6891738899431499,101155069755498,0.97123575
+76,7234786527584605,6891738899431499,101155069755498,0.9996537
+77,7300757225306962,6891738899431499,101155069755498,0.9995807
+78,7384320109087217,6891738899431499,101155069755498,0.99652666
+79,7472281039392856,6891738899431499,101155069755498,0.99935323
+80,7379922062584624,6891738899431499,101155069755498,0.99979204
+81,7437096667294162,6891738899431499,101155069755498,0.99980944
+82,7287563085747385,6891738899431499,101155069755498,0.9974221
+83,7393116202113882,6891738899431499,101155069755498,0.99820983
+84,7472281039392895,6891738899431499,101155069755498,0.9988764
+85,7234786527577233,6891738899431499,101155069755498,0.9981317
+86,7459086899859751,6891738899431499,101155069755498,0.99887735
+87,7459086899859703,6891738899431499,101155069755498,0.9992949
+88,7204000201967910,6891738899431499,101155069755498,0.999426
+89,7287563085747313,6891738899431499,101155069755498,0.9999025
+90,7357931830014297,6891738899431499,101155069755498,0.9992261
+91,7503067365024257,6891738899431499,101155069755498,0.9986803
+92,7230388481073915,6891738899431499,101155069755498,0.9996538
+93,7371125969558760,6891738899431499,101155069755498,0.9999217
+94,7327145504388516,6891738899431499,101155069755498,0.9998989
+95,7371125969549167,6891738899431499,101155069755498,0.99973696
+96,7432698620769790,6891738899431499,101155069755498,0.96603274
+97,7459086899850257,6891738899431499,101155069755498,0.99086505
+98,7331543550909023,6891738899431499,101155069755498,0.9999008
+99,7173213876371317,6891738899431499,101155069755498,0.9996743
+100,7371125969557225,6891738899431499,101155069755498,0.99599695
+101,7388718155600692,6891738899431499,101155069755498,0.9997477
+102,7393116202118786,6891738899431499,101155069755498,0.9985055
+103,7265572853191113,6891738899431499,101155069755498,0.9999397
+104,7287563085774234,6891738899431499,101155069755498,0.9995807
+105,7384320109084175,6891738899431499,101155069755498,0.99956876
+106,7278766992720417,6891738899431499,101155069755498,0.9975631
+107,7371125969556963,6891738899431499,101155069755498,0.99987257
+108,7410708388195262,6891738899431499,101155069755498,0.9995969
+109,7401912295164979,6891738899431499,101155069755498,0.9709839
+110,7371125969555589,6891738899431499,101155069755498,0.9961612
+111,7401912295164970,6891738899431499,101155069755498,0.96404606
+112,7419504481229795,6891738899431499,101155069755498,0.99968016
+113,7300757225306899,6891738899431499,101155069755498,0.9995809
+114,7463484946370997,6891738899431499,101155069755498,0.9992944
+115,7366727923049406,6891738899431499,101155069755498,0.99973375
+116,7388718155601791,6891738899431499,101155069755498,0.9998932
+117,7296359178781865,6891738899431499,101155069755498,0.99858165
+118,7428300574243492,6891738899431499,101155069755498,0.96879107
+119,7195204108925876,6891738899431499,101155069755498,0.9998203
+120,7287563085754557,6891738899431499,101155069755498,0.9977252
+121,7555843923185774,6891738899431499,101155069755498,0.99985933
+122,7278766992720581,6891738899431499,101155069755498,0.9999242
+123,7287563085754514,6891738899431499,101155069755498,0.9998776
+124,7463484946370953,6891738899431499,101155069755498,0.9988764
+125,7371125969552918,6891738899431499,101155069755498,0.9994604
+126,7234786527584616,6891738899431499,101155069755498,0.9996538
+127,7371125969555637,6891738899431499,101155069755498,0.99990857
+128,7454688853339535,6891738899431499,101155069755498,0.99937075
+129,7498669318502603,6891738899431499,101155069755498,0.99840456
+130,7274368946207419,6891738899431499,101155069755498,0.9999138
+131,7472281039392834,6891738899431499,101155069755498,0.9993537
+132,7437096667267542,6891738899431499,101155069755498,0.9997049
+133,7419504481218887,6891738899431499,101155069755498,0.999423
+134,7300757225311342,6891738899431499,101155069755498,0.9997032
+135,7366727923042183,6891738899431499,101155069755498,0.9993162
+136,7467882992890463,6891738899431499,101155069755498,0.99988484
+137,7520659551076135,6891738899431499,101155069755498,0.99992216
+138,7419504481229785,6891738899431108,101155069755498,0.9076722
+139,7256776760165601,6874146713381684,101155069755498,0.90578693
+140,7256776760165640,6874146713381684,101155069755498,0.87459755
+141,7388718155600206,6874146713381684,101155069755498,0.93064946
+142,7432698620764161,6891738899427024,101155069755498,0.9913657
+144,7309553318323835,6891738899431297,101155069755498,0.99797994
+145,7195204108937229,6891738899433273,101155069755498,0.9966893
+146,7234786527562323,6891738899433273,101155069755498,0.9972765
+147,7393116202141652,6891738899431492,101155069755498,0.9959746
+148,7353533783504120,6891738899430721,101155069755498,0.99609333
+151,7371125969557050,6874146713381364,101155069755498,0.999905
+152,7278766992720689,6874146713381364,101155069755498,0.9998981
+153,7265572853193239,6874146713381364,101155069755498,0.9997154
+154,7428300574252127,6874146713381364,101155069755498,0.9935759
+155,7388718155601786,6874146713381364,101155069755498,0.9997948
+156,7516261504546438,6874146713381364,101155069755498,0.9951061
+157,7287563085747377,6874146713381364,101155069755498,0.99988973
+158,7287563085754527,6874146713381364,101155069755498,0.99984777
+159,7274368946213260,6874146713381364,101155069755498,0.9998816
+160,7371125969558750,6874146713381364,101155069755498,0.9999032
+161,7274368946207442,6874146713381364,101155069755498,0.9997305
+162,7375524016066652,6874146713381364,101155069755498,0.9999157
+163,7375524016066474,6874146713381364,101155069755498,0.9998097
+164,7507465411524394,6874146713381364,101155069755498,0.99005973
+165,7362329876534270,6874146713381364,101155069755498,0.99989176
+166,7256776760160405,6891738899426920,101155069755498,0.99968016
+167,7265572853189856,6891738899426920,101155069755498,0.99935347
+168,7476679085908956,6891738899426920,101155069755498,0.9996321
+169,7357931829996174,6891738899426920,101155069755498,0.99968696
+170,7287563085747236,6891738899426920,101155069755498,0.99972516
+172,7278766992738893,6882942806404219,101155069755498,0.96263045
+174,7362329876535665,6891738899432322,101155069755498,0.9928093
+175,7529455644107178,6891738899432322,101155069755498,0.99032193
+176,7371125969552907,6891738899432278,101155069755498,0.8260893
+177,7353533783487914,6891738899433014,101155069755508,0.97364
+178,7261174806676906,101155069755482,101155069755508,0.9990036
+179,7353533783499931,101155069755482,101155069755508,0.9970192
+180,7173213876375254,101155069755482,101155069755508,0.99866664
+181,7300757225304971,101155069755482,101155069755508,0.9959721
+182,7375524016055632,101155069755482,101155069755508,0.9983303
+183,7274368946202213,101155069755482,101155069755508,0.9986665
+184,7503067365024226,101155069755482,101155069755508,0.9976386
+185,7560241969711904,101155069755482,101155069755508,0.98745793
+186,7300757225306722,6891738899432835,101155069755508,0.9991553
+187,7256776760145017,6891738899432835,101155069755508,0.9993457
+188,7428300574251142,6891738899432835,101155069755508,0.9989147
+189,7300757225306981,6891738899432835,101155069755508,0.99905306
+190,7322747457869210,6891738899432835,101155069755508,0.9989881
+191,7423902527743833,6891738899432835,101155069755508,0.9992099
+192,7230388481059910,6891738899432835,101155069755508,0.9976494
+193,7186408015914362,6891738899432835,101155069755508,0.9992099
+194,7195204108948058,6891738899432835,101155069755508,0.99926084
+195,7300757225309674,6891738899432835,101155069755508,0.99914944
+196,7190806062435001,6891738899432835,101155069755508,0.99927396
+197,7234786527584687,6891738899432835,101155069755508,0.9991493
+198,7252378713628635,6891738899432835,101155069755508,0.9992182
+199,7256776760145003,6891738899432835,101155069755508,0.999316
+200,7256776760140770,6891738899432835,101155069755508,0.9990233
+201,7300757225306733,6891738899432835,101155069755508,0.999257
+202,7204000201958003,6891738899432835,101155069755508,0.99927396
+203,7287563085774318,6891738899432835,101155069755508,0.9992304
+204,7476679085906140,6891738899432835,101155069755508,0.99335974
+205,7247980667118720,6891738899432835,101155069755508,0.99920005
+206,7459086899863592,6891738899432835,101155069755508,0.99500763
+207,7195204108948121,6891738899432835,101155069755508,0.9992607
+208,7190806062409346,6891738899432835,101155069755508,0.99209845
+209,7212796294989986,6891738899432835,101155069755508,0.99927396
+210,7318349411369335,6891738899432835,101155069755508,0.99925345
+211,7256776760143613,6891738899432835,101155069755508,0.9987972
+212,7195204108927402,6891738899432835,101155069755508,0.9992099
+213,7300757225307939,6891738899432835,101155069755508,0.99927264
+214,7300757225306862,6891738899432835,101155069755508,0.9992254
+215,7190806062435087,6891738899432835,101155069755508,0.9992099
+216,7287563085774337,6891738899432835,101155069755508,0.9992254
+217,7441494713793280,6891738899432835,101155069755508,0.9989147
+218,7256776760141271,6891738899432835,101155069755508,0.9989837
+219,7313951364844467,6891738899432835,101155069755508,0.9991493
+220,7195204108948115,6891738899432835,101155069755508,0.99927396
+221,7300757225307987,6891738899432835,101155069755508,0.99913687
+222,7296359178799765,6891738899432835,101155069755508,0.9992725
+223,7450290806816330,6891738899432835,101155069755508,0.9108708
+224,7195204108948185,6891738899432835,101155069755508,0.9992304
+225,7300757225311495,6891738899432835,101155069755508,0.9992254
+226,7230388481073997,6891738899432835,101155069755508,0.9989837
+227,7287563085773274,6891738899432835,101155069755508,0.99928826
+228,7274368946213107,6891738899432835,101155069755508,0.99591225
+229,7212796294989823,6891738899432835,101155069755508,0.99926347
+230,7256776760140744,6891738899432835,101155069755508,0.99921715
+231,7256776760140757,6891738899432835,101155069755508,0.9991493
+232,7256776760140841,6891738899432835,101155069755508,0.9989837
+233,7256776760140775,6891738899432835,101155069755508,0.9991493
+234,7300757225309582,6891738899432835,101155069755508,0.9989837
+235,7287563085773289,6891738899432835,101155069755508,0.9991167
+236,7300757225306976,6891738899432835,101155069755508,0.9992637
+237,7204000201967878,6891738899432835,101155069755508,0.9992662
+238,7195204108948210,6891738899432835,101155069755508,0.9990233
+239,7569038062739187,6891738899432835,101155069755508,0.9924476
+240,7234786527586098,6891738899432835,101155069755508,0.99921715
+241,7318349411369433,6891738899432835,101155069755508,0.9989837
+242,7520659551067393,6891738899432835,101155069755508,0.9924326
+244,7322747457873481,6891738899432835,101155069755508,0.99927264
+245,7300757225311387,6891738899432835,101155069755508,0.9992304
+246,7173213876371315,6891738899432835,101155069755508,0.99927396
+247,7503067365011967,6891738899432835,101155069755508,0.9995067
+248,7234786527584543,6891738899432835,101155069755508,0.9991429
+249,7441494713793253,6891738899432835,101155069755508,0.9989147
+250,7375524016071457,6891738899432835,101155069755508,0.9890372
+251,7186408015914369,6891738899432835,101155069755508,0.99927396
+252,7437096667270130,6891738899432835,101155069755508,0.99873
+253,7300757225306786,6891738899432835,101155069755508,0.9991326
+254,7423902527739761,6891738899432835,101155069755508,0.9989147
+255,7291961132288852,6891738899432835,101155069755508,0.99922025
+256,7190806062434209,6891738899432835,101155069755508,0.99925786
+257,7300757225307073,6891738899432835,101155069755508,0.99905294
+258,7252378713628612,6891738899432835,101155069755508,0.99933773
+259,7322747457873492,6891738899432835,101155069755508,0.99922025
+260,7195204108947769,6891738899432835,101155069755508,0.99921715
+261,7384320109087090,6891738899432835,101155069755508,0.9957377
+262,7234786527586058,6891738899432835,101155069755508,0.99921715
+263,7190806062434210,6891738899432835,101155069755508,0.99934584
+264,7287563085774308,6891738899432835,101155069755508,0.99927264
+265,7287563085773222,6891738899432835,101155069755508,0.99922025
+266,7243582620610884,6891738899432835,101155069755508,0.99925774
+267,7287563085774323,6891738899432835,101155069755508,0.9989837
+268,7199602155459080,6891738899432835,101155069755508,0.9991429
+269,7375524016066543,6891738899432835,101155069755508,0.9957482
+270,7300757225308023,6891738899432835,101155069755508,0.9992674
+271,7296359178799694,6891738899432835,101155069755508,0.99890304
+272,7234786527584540,6891738899432835,101155069755508,0.99921715
+273,7190806062434255,6891738899432835,101155069755508,0.99933773
+274,7300757225309572,6891738899432835,101155069755508,0.99905354
+275,7296359178796160,6891738899432835,101155069755508,0.99905294
+276,7247980667118799,6891738899432835,101155069755508,0.9989837
+277,7190806062435023,6891738899432835,101155069755508,0.99928635
+278,7204000201957941,6891738899432835,101155069755508,0.99922633
+279,7287563085773204,6891738899432835,101155069755508,0.9989837
+280,7230388481073002,6891738899432835,101155069755508,0.99921834
+281,7234786527586077,6891738899432835,101155069755508,0.99921715
+282,7195204108948206,6891738899432835,101155069755508,0.9992637
+283,7186408015914303,6891738899432835,101155069755508,0.99922645
+284,7195204108927420,6891738899432835,101155069755508,0.9992662
+285,7190806062434940,6891738899432835,101155069755508,0.9992766
+286,7195204108927408,6891738899432835,101155069755508,0.99927396
+287,7318349411369394,6891738899432835,101155069755508,0.99914753
+288,7195204108947777,6891738899432835,101155069755508,0.99922645
+289,7520659551073583,6891738899432835,101155069755508,0.9966538
+290,7230388481074598,6891738899432835,101155069755508,0.9991374
+291,7419504481229827,6891738899432835,101155069755508,0.9987301
+292,7287563085773227,6891738899432835,101155069755508,0.99927753
+293,7318349411369398,6891738899432835,101155069755508,0.9992034
+294,7173213876371364,6891738899432835,101155069755508,0.99927396
+295,7388718155601310,6891738899432835,101155069755508,0.9993311
+296,7300757225307080,6891738899432835,101155069755508,0.9992248
+297,7234786527586005,6891738899432835,101155069755508,0.9991374
+298,7415106434707179,6891738899432835,101155069755508,0.99924624
+299,7247980667119537,6891738899432835,101155069755508,0.9991374
+300,7375524016071328,6891738899432835,101155069755508,0.9939902
+301,7199602155458906,6891738899432835,101155069755508,0.9992607
+302,7204000201969439,6891738899432835,101155069755508,0.9991153
+303,7283165039233379,6891738899432835,101155069755508,0.99937385
+304,7278766992732814,6891738899432835,101155069755508,0.9954852
+305,7309553318321931,6891738899432835,101155069755508,0.99362296
+306,7322747457873464,6891738899432835,101155069755508,0.9989015
+307,7529455644113295,6891738899432566,101155069755508,0.9983499
+308,7503067365011976,6891738899432566,101155069755508,0.9992981
+309,7428300574238390,6891738899432566,101155069755508,0.99900407
+310,7388718155600679,6891738899432566,101155069755508,0.99823856
+311,7393116202141162,6891738899432566,101155069755508,0.99852544
+312,7252378713625150,6891738899432566,101155069755508,0.9980819
+313,7252378713625141,6891738899432566,101155069755508,0.9973109
+314,7503067365011962,6891738899432566,101155069755508,0.9990921
+315,7256776760137881,6891738899432566,101155069755508,0.99787927
+316,7287563085747359,6891738899432566,101155069755508,0.99506605
+317,7327145504412157,6891738899432566,101155069755508,0.9988275
+318,7177611922887302,6891738899432566,101155069755508,0.9991874
+319,7190806062425114,6891738899432566,101155069755508,0.998884
+320,7401912295171495,6891738899432566,101155069755508,0.9982034
+321,7274368946207436,6891738899432566,101155069755508,0.9940971
+322,7177611922887380,6891738899432566,101155069755508,0.99888057
+323,7327145504412111,6891738899432566,101155069755508,0.9982608
+324,7529455644113290,6891738899432566,101155069755508,0.99792767
+325,7428300574238387,6891738899432566,101155069755508,0.9992206
+326,7379922062584700,6891738899432566,101155069755508,0.9953323
+327,7230388481073895,6891738899432566,101155069755508,0.99354845
+328,7371125969558982,6891738899432566,101155069755508,0.99424523
+329,7265572853193219,6891738899432566,101155069755508,0.99754983
+330,7327145504412138,6891738899432566,101155069755508,0.9988649
+331,7327145504412967,6891738899432566,101155069755508,0.9981645
+332,7269970899700465,6891738899432566,101155069755508,0.99515414
+333,7265572853192558,6891738899432566,101155069755508,0.99808466
+334,7393116202113991,6891738899432566,101155069755508,0.99423146
+335,7362329876535570,6891738899432566,101155069755508,0.9979849
+336,7190806062425125,6891738899432566,101155069755508,0.99946207
+337,7401912295171583,6891738899432566,101155069755508,0.9448945
+338,7393116202134894,6891738899432566,101155069755508,0.99842393
+339,7371125969557350,6891738899432566,101155069755508,0.994414
+340,7243582620598747,6891738899432566,101155069755508,0.9977477
+341,7287563085747308,6891738899432566,101155069755508,0.99383885
+342,7560241969717553,6891738899432566,101155069755508,0.9994025
+343,7327145504412152,6891738899432566,101155069755508,0.99858296
+344,7362329876535575,6891738899432566,101155069755508,0.9986261
+345,7503067365011958,6891738899432566,101155069755508,0.9990895
+346,7560241969717587,6891738899432566,101155069755508,0.998871
+347,7362329876535562,6891738899432566,101155069755508,0.99828583
+348,7388718155624566,6891738899432566,101155069755508,0.9987822
+349,7428300574238829,6891738899432566,101155069755508,0.99900633
+350,7327145504412159,6891738899432566,101155069755508,0.99852496
+351,7247980667124815,6891738899432566,101155069755508,0.9970162
+352,7393116202141172,6891738899432566,101155069755508,0.99820733
+353,7393116202134893,6891738899432566,101155069755508,0.9990356
+354,7547047830157925,6891738899432566,101155069755508,0.9986772
+355,7190806062425133,6891738899432566,101155069755508,0.99924207
+356,7190806062420303,6891738899432566,101155069755508,0.9994118
+357,7256776760137914,6891738899432566,101155069755508,0.99819714
+359,7212796294988273,6891738899432566,101155069755508,0.99443746
+360,7371125969555048,6891738899432566,101155069755508,0.99748826
+361,7560241969717562,6891738899432566,101155069755508,0.9992125
+362,7371125969556985,6891738899432566,101155069755508,0.9952691
+363,7256776760137874,6891738899432566,101155069755508,0.9985513
+364,7437096667294525,6874146713382768,101155069755508,0.996182
+365,7459086899850412,6874146713382768,101155069755508,0.99617165
+366,7300757225291166,6874146713382768,101155069755508,0.9988199
+367,7432698620769726,6874146713382768,101155069755508,0.99855155
+368,7313951364850822,6874146713382768,101155069755508,0.99832195
+369,7459086899850441,6874146713382768,101155069755508,0.9961701
+370,7432698620769717,6874146713382768,101155069755508,0.9985505
+371,7313951364850989,6874146713382768,101155069755508,0.998323
+372,7300757225291178,6874146713382768,101155069755508,0.9988201
+373,7318349411365243,6874146713382768,101155069755508,0.99872345
+374,7335941597429112,6874146713382768,101155069755508,0.9985898
+375,7335941597422189,6874146713382768,101155069755508,0.9983203
+376,7331543550904263,6874146713382768,101155069755508,0.99764854
+377,7362329876532149,6874146713382768,101155069755508,0.99860555
+378,7313951364850967,6874146713382768,101155069755508,0.9983176
+379,7375524016070867,6891738899432833,101155069755508,0.99819607
+380,7318349411377352,6891738899432833,101155069755508,0.99779785
+381,7401912295148400,6891738899432833,101155069755508,0.9904565
+382,7397514248633076,6891738899432833,101155069755508,0.9987613
+383,7243582620599783,6891738899432833,101155069755508,0.9986141
+384,7371125969551756,6891738899432833,101155069755508,0.9991372
+385,7516261504546425,6891738899432833,101155069755508,0.98995376
+386,7564640016221493,6891738899432833,101155069755508,0.9982722
+387,7423902527729800,6891738899432833,101155069755508,0.99732375
+388,7221592388027918,6891738899432833,101155069755508,0.9980896
+389,7322747457871588,6891738899432833,101155069755508,0.99752945
+390,7331543550908359,6891738899432833,101155069755508,0.998468
+391,7182009969405600,6891738899432833,101155069755508,0.99313265
+392,7450290806836877,6900534992449855,101155069755508,0.9620501
+393,7459086899863600,6874146713380882,101155069755508,0.8309146
+394,7516261504544552,6874146713380882,101155069755508,0.9080236
+395,7230388481059901,6874146713380882,101155069755508,0.97070944
+396,7177611922878808,6891738899431701,101155069755508,0.8207027
+397,7459086899861845,6891738899431701,101155069755508,0.98915976
+398,7498669318503892,6891738899431701,101155069755508,0.84226143
+399,7481077132431712,6891738899431701,101155069755508,0.8207425
+405,7547047830175105,6891738899431532,4085785217347644,0.99666256
+406,7305155271832687,6891738899432463,4085785217347644,0.9995616
+407,7335941597429080,6891738899432463,4085785217347644,0.99944586
+408,7335941597422206,6891738899432463,4085785217347644,0.99944586
+409,7247980667124762,6891738899432463,4085785217347644,0.9992774
+410,7371125969559015,6891738899431774,4085785217347644,0.9986761
+411,7300757225311375,6874146713382657,4085785217347644,0.9997328
+412,7322747457867710,6874146713382657,4085785217347644,0.9997373
+413,7313951364844823,6874146713382657,4085785217347644,0.9997521
+414,7322747457867809,6874146713382657,4085785217347644,0.99972373
+415,7313951364844867,6874146713382657,4085785217347644,0.9997682
+416,7300757225311477,6874146713382657,4085785217347644,0.9997838
+417,7322747457867622,6874146713382657,4085785217347644,0.99978393
+418,7322747457867795,6874146713382657,4085785217347644,0.9997234
+419,7300757225311457,6874146713382657,4085785217347644,0.9997832
+420,7322747457867699,6874146713382657,4085785217347644,0.9995952
+421,7186408015909615,6874146713381270,4085785217347644,0.99972814
+422,7182009969404893,6874146713381270,4085785217347644,0.9993406
+423,7529455644099198,6891738899425541,4085785217347644,0.9994252
+424,7384320109091349,6891738899431018,4085785217347662,0.9944041
+425,7208398248493496,6891738899431018,4085785217347662,0.9430324
+426,7467882992897857,6891738899431018,4085785217347662,0.9595148
+427,7300757225311318,6891738899431018,4085785217347662,0.99113184
+428,7463484946369472,6891738899431018,4085785217347662,0.956374
+429,7393116202139805,6891738899431899,4085785217347663,0.99749315
+431,7305155271814857,6896136945937614,4085785217347666,0.9974591
+432,7265572853180819,6896136945937614,4085785217347666,0.9981623
+433,7313951364850860,6896136945937614,4085785217347666,0.9982292
+434,7349135736987561,6896136945937614,4085785217347666,0.9831646
+435,7362329876525195,6896136945937614,4085785217347666,0.99642015
+436,7362329876525190,6896136945937614,4085785217347666,0.9970517
+437,7313951364850870,6896136945937614,4085785217347666,0.99743515
+438,7459086899850385,6896136945937614,4085785217347666,0.99626094
+439,7472281039403504,6896136945937614,4085785217347666,0.9971596
+440,7375524016055475,6896136945937614,4085785217347666,0.9930139
+441,7406310341679920,6896136945937614,4085785217347666,0.9984413
+442,7300757225317378,6896136945937614,4085785217347666,0.9974362
+443,7362329876530838,6896136945937614,4085785217347666,0.99733317
+444,7397514248650746,6896136945937614,4085785217347666,0.9883845
+445,7507465411539446,6896136945937614,4085785217347666,0.9977875
+446,7353533783475517,6896136945937614,4085785217347666,0.99930143
+447,7459086899853799,6896136945937614,4085785217347666,0.9917446
+448,7265572853180856,6896136945937614,4085785217347666,0.99818486
+449,7287563085745569,6896136945937614,4085785217347666,0.99572766
+450,7357931830012248,6896136945937614,4085785217347666,0.9992167
+451,7463484946359869,6896136945937614,4085785217347666,0.9967301
+452,7164417783333170,6896136945937614,4085785217347666,0.9963201
+453,7450290806838832,6896136945937614,4085785217347666,0.99722123
+454,7401912295171680,6896136945937614,4085785217347666,0.99821633
+455,7230388481064667,6896136945937614,4085785217347666,0.99866307
+456,7234786527576239,6896136945937614,4085785217347666,0.9946695
+457,7406310341661110,6896136945937614,4085785217347666,0.9846705
+458,7437096667294174,6896136945937614,4085785217347666,0.9996369
+459,7300757225317457,6896136945937614,4085785217347666,0.99743736
+460,7340339643939119,6896136945937614,4085785217347666,0.9888095
+461,7516261504558029,6896136945937614,4085785217347666,0.9908618
+462,7463484946370434,6896136945937614,4085785217347666,0.9995796
+463,7481077132427097,6896136945937614,4085785217347666,0.9944353
+464,7230388481068723,6896136945937614,4085785217347666,0.9989184
+465,7313951364850845,6896136945937614,4085785217347666,0.9974354
+466,7300757225317383,6896136945937614,4085785217347666,0.9974362
+467,7371125969545105,6896136945937614,4085785217347666,0.99796754
+468,7393116202132419,6896136945937614,4085785217347666,0.99652416
+469,7551445876686494,6896136945937614,4085785217347666,0.97494566
+470,7256776760158668,6896136945937614,4085785217347666,0.9974394
+471,7379922062576628,6896136945937614,4085785217347666,0.99907386
+472,7410708388184647,6896136945937614,4085785217347666,0.99624556
+473,7309553318324181,6896136945937614,4085785217347666,0.99900013
+474,7406310341679904,6896136945937614,4085785217347666,0.99844056
+475,7410708388178803,6896136945937614,4085785217347666,0.9997873
+476,7300757225317402,6896136945937614,4085785217347666,0.9974361
+477,7353533783499837,6896136945937614,4085785217347666,0.99757737
+478,7472281039398451,6896136945937614,4085785217347666,0.98984504
+479,7300757225317393,6896136945937614,4085785217347666,0.9975189
+480,7313951364850850,6896136945937614,4085785217347666,0.9974354
+481,7511863458044110,6896136945937614,4085785217347666,0.9943297
+482,7300757225317415,6896136945937614,4085785217347666,0.99743587
+483,7265572853180828,6896136945937614,4085785217347666,0.99823713
+484,7287563085771915,6896136945937614,4085785217347666,0.99767417
+485,7445892760297672,6896136945937614,4085785217347666,0.99828315
+486,7349135736987554,6896136945937614,4085785217347666,0.99317414
+487,7349135736965459,6896136945937614,4085785217347666,0.9981071
+488,7454688853334828,6896136945937614,4085785217347666,0.99912757
+489,7269970899703946,6896136945937614,4085785217347666,0.9975701
+490,7300757225317453,6896136945937614,4085785217347666,0.997437
+491,7300757225317352,6896136945937614,4085785217347666,0.9974367
+492,7459086899859809,6896136945937614,4085785217347666,0.9967704
+493,7256776760158664,6896136945937614,4085785217347666,0.99823725
+494,7357931830015384,6896136945937614,4085785217347666,0.99319506
+495,7560241969699655,6896136945937614,4085785217347666,0.9984781
+496,7472281039398484,6896136945937614,4085785217347666,0.99175876
+497,7573436109243977,6896136945937614,4085785217347666,0.99730694
+498,7225990434555879,6896136945937614,4085785217347666,0.99871004
+499,7313951364850875,6896136945937614,4085785217347666,0.9974353
+500,7313951364850825,6896136945937614,4085785217347666,0.99743575
+501,7507465411539463,6896136945937614,4085785217347666,0.9938135
+502,7300757225317407,6896136945937614,4085785217347666,0.99743587
+503,7331543550920355,6896136945937614,4085785217347666,0.98015726
+504,7423902527733393,6896136945937614,4085785217347666,0.9977842
+505,7397514248653225,6896136945937614,4085785217347666,0.9975721
+506,7393116202139838,6896136945937614,4085785217347666,0.9916407
+507,7393116202139856,6896136945937614,4085785217347666,0.99055356
+508,7353533783499934,6896136945937614,4085785217347666,0.994183
+509,7428300574265394,6896136945937614,4085785217347666,0.9985619
+510,7445892760306611,6891738899430553,4085785217347666,0.9960967
+511,7186408015906675,6891738899430553,4085785217347666,0.9894007
+512,7283165039253665,6891738899430553,4085785217347666,0.9948467
+513,7445892760317758,6891738899430741,4085785217347668,0.99875
+514,7437096667294696,6891738899430741,4085785217347668,0.9990206
+515,7393116202119525,6891738899430741,4085785217347668,0.99968183
+516,7516261504558015,6891738899433148,4085785217347668,0.9897626
+519,7481077132431749,6896136945937655,4085785217347716,0.9995795
+520,7353533783494174,6896136945937655,4085785217347716,0.9994648
+521,7481077132431759,6896136945937655,4085785217347716,0.99963856
+522,7371125969559265,6891738899432703,4085785217347716,0.9967913
+523,7371125969559226,6891738899432703,4085785217347716,0.99738806
+524,7327145504406367,6900534992448969,4085785217347716,0.99938476
+525,7283165039253893,6900534992448969,4085785217347716,0.9994518
+526,7560241969710927,6900534992448969,4085785217347716,0.9994338
+527,7401912295171519,6891738899433217,4085785217347716,0.9873453
+528,7450290806837000,6891738899431149,4085785217347716,0.9998004
+529,7410708388178664,6874146713382634,4085785217347729,0.995751
+530,7401912295156846,6874146713382634,4085785217347729,0.99575114
+531,7401912295156821,6874146713382634,4085785217347729,0.99575114
+532,7401912295156721,6874146713382634,4085785217347729,0.995751
+533,7410708388178684,6874146713382634,4085785217347729,0.995751
+534,7410708388178655,6874146713382634,4085785217347729,0.99575114
+535,7401912295156690,6874146713382634,4085785217347729,0.995751
+538,7322747457867712,6891738899431763,4085785217347738,0.9952213
+539,7401912295170761,6891738899431763,4085785217347738,0.88004035
+540,7300757225317349,6891738899431763,4085785217347738,0.9998659
+542,7296359178777889,6874146713381313,4085785217347745,0.99927026
+543,7252378713625055,6874146713381313,4085785217347745,0.9997185
+544,7190806062425732,6874146713381313,4085785217347745,0.99415624
+545,7494271271986787,6874146713381313,4085785217347745,0.9997845
+546,7379922062584518,6874146713381313,4085785217347745,0.9900367
+547,7331543550920652,6874146713381313,4085785217347745,0.99933016
+548,7327145504409020,6874146713381313,4085785217347745,0.99973184
+549,7322747457891763,6874146713381313,4085785217347745,0.9980823
+550,7353533783492613,6874146713381313,4085785217347745,0.99968266
+551,7327145504409014,6874146713381313,4085785217347745,0.99972695
+552,7555843923185745,6874146713381313,4085785217347745,0.9980671
+553,7481077132431543,6874146713381313,4085785217347745,0.99975294
+554,7283165039253887,6874146713381313,4085785217347745,0.99286085
+555,7327145504408924,6874146713381313,4085785217347745,0.9994692
+556,7212796295007935,6874146713381313,4085785217347745,0.99969935
+557,7327145504406192,6874146713381313,4085785217347745,0.99918467
+558,7463484946370488,6874146713381313,4085785217347745,0.9987349
+559,7397514248645081,6874146713381313,4085785217347745,0.9994137
+560,7274368946212403,6874146713381313,4085785217347745,0.9996296
+561,7371125969563556,6874146713381313,4085785217347745,0.999315
+562,7327145504412206,6874146713381313,4085785217347745,0.99856794
+563,7481077132422699,6874146713381313,4085785217347745,0.9992291
+564,7463484946370383,6874146713381313,4085785217347745,0.998919
+565,7353533783497416,6874146713381313,4085785217347745,0.9997546
+566,7265572853181951,6874146713381313,4085785217347745,0.9979068
+567,7525057597593353,6874146713381313,4085785217347745,0.99964094
+568,7463484946370958,6874146713381313,4085785217347745,0.9988181
+569,7437096667294179,6874146713381313,4085785217347745,0.99967813
+570,7186408015914208,6874146713381313,4085785217347745,0.9992137
+571,7419504481229574,6874146713381313,4085785217347745,0.9994765
+572,7362329876534220,6874146713381313,4085785217347745,0.9993055
+573,7459086899855567,6874146713381313,4085785217347745,0.99966216
+574,7243582620599777,6874146713381313,4085785217347745,0.9997913
+575,7459086899859764,6874146713381313,4085785217347745,0.99868554
+576,7533853690618523,6874146713381313,4085785217347745,0.99975616
+577,7494271271986763,6874146713381313,4085785217347745,0.9940943
+578,7463484946370476,6874146713381313,4085785217347745,0.9986847
+579,7560241969710139,6874146713381313,4085785217347745,0.994166
+580,7428300574238832,6874146713381313,4085785217347745,0.9910228
+581,7265572853185989,6874146713381313,4085785217347745,0.9987109
+582,7388718155600685,6874146713381313,4085785217347745,0.9997732
+583,7401912295159180,6874146713381313,4085785217347745,0.99927956
+584,7349135736968028,6874146713381313,4085785217347745,0.9997472
+585,7516261504563440,6874146713381313,4085785217347745,0.9979443
+586,7296359178777927,6874146713381313,4085785217347745,0.99927026
+587,7463484946371094,6874146713381313,4085785217347745,0.99884063
+588,7494271271986713,6874146713381313,4085785217347745,0.99975663
+589,7560241969710232,6874146713381313,4085785217347745,0.99791485
+590,7190806062434276,6874146713381313,4085785217347745,0.9987469
+591,7344737690463308,6874146713381313,4085785217347745,0.99938834
+592,7287563085745496,6874146713381313,4085785217347745,0.999548
+593,7520659551061719,6874146713381313,4085785217347745,0.9998671
+594,7199602155446145,6874146713381313,4085785217347745,0.9996681
+595,7375524016070820,6874146713381313,4085785217347745,0.9978969
+596,7199602155440810,6874146713381313,4085785217347745,0.99975294
+597,7353533783497538,6874146713381313,4085785217347745,0.99003977
+598,7459086899860108,6874146713381313,4085785217347745,0.99818075
+599,7186408015909608,6874146713381313,4085785217347745,0.9995944
+600,7344737690463209,6874146713381313,4085785217347745,0.9933549
+601,7463484946370490,6874146713381313,4085785217347745,0.99865794
+602,7357931830005114,6874146713381313,4085785217347745,0.9972499
+603,7463484946370485,6874146713381313,4085785217347745,0.9986608
+604,7247980667108697,6874146713381313,4085785217347745,0.9996772
+605,7269970899705066,6874146713381313,4085785217347745,0.9995364
+606,7428300574238408,6874146713381313,4085785217347745,0.9998406
+607,7388718155600673,6874146713381313,4085785217347745,0.999777
+608,7388718155622518,6874146713381313,4085785217347745,0.99938726
+609,7450290806821132,6874146713381313,4085785217347745,0.9995741
+610,7511863458053500,6874146713381313,4085785217347745,0.9996381
+611,7195204108937219,6874146713381313,4085785217347745,0.99791485
+612,7551445876686518,6874146713381313,4085785217347745,0.9972499
+613,7243582620602256,6874146713381313,4085785217347745,0.9995691
+614,7423902527742865,6874146713381313,4085785217347745,0.99959
+615,7498669318483702,6874146713381313,4085785217347745,0.99972755
+616,7401912295164813,6874146713381313,4085785217347745,0.99922633
+617,7472281039392810,6874146713381313,4085785217347745,0.9988103
+618,7494271271986767,6874146713381313,4085785217347745,0.99408686
+619,7265572853181942,6874146713381313,4085785217347745,0.9993105
+620,7419504481209753,6874146713381313,4085785217347745,0.99959606
+621,7305155271833327,6874146713381313,4085785217347745,0.99968433
+622,7366727923042094,6891738899426872,4085785217347752,0.98099077
+623,7467882992891266,6891738899426872,4085785217347752,0.9904553
+624,7415106434695589,6900534992449861,4085785217347753,0.9958715
+625,7371125969559130,6891738899431191,4085785217347753,0.9995415
+626,7384320109091323,6891738899431191,4085785217347753,0.9996389
+627,7463484946386313,6891738899431191,4085785217347753,0.99927944
+628,7485475178942163,6891738899431191,4085785217347753,0.9992467
+629,7397514248645072,6891738899431191,4085785217347753,0.9996656
+630,7419504481208013,6891738899431191,4085785217347753,0.9993968
+631,7428300574265337,6891738899431191,4085785217347753,0.9971814
+632,7353533783475467,6874146713381355,4085785217347753,0.9994361
+633,7331543550908783,6874146713381355,4085785217347753,0.9993992
+634,7401912295159156,6874146713381355,4085785217347753,0.9995721
+635,7375524016071417,6874146713381355,4085785217347753,0.9995721
+636,7406310341676906,6891738899430892,4085785217347780,0.9969131
+637,7401912295163142,6891738899430892,4085785217347780,0.99637836
+638,7331543550908439,6874146713382780,4085785217347785,0.9680378
+639,7393116202141091,6874146713382780,4085785217347785,0.96406454
+640,7168815829857622,6891738899431732,4085785217347791,0.9967656
+641,7182009969390853,6891738899431732,4085785217347791,0.9974136
+642,7573436109244663,6891738899431732,4085785217347791,0.9968731
+643,7507465411517128,6891738899431732,4085785217347791,0.99061185
+644,7428300574265467,6891738899431732,4085785217347791,0.97379446
+645,7182009969390762,6891738899431732,4085785217347791,0.9974136
+646,7182009969390767,6891738899431732,4085785217347791,0.9967656
+647,7445892760317779,6891738899431732,4085785217347791,0.9975216
+648,7459086899853607,6891738899430454,4085785217347792,0.99888045
+649,7287563085769091,6891738899430454,4085785217347792,0.99889296
+650,7357931830015291,6896136945937136,4085785217347802,0.9990569
+651,7353533783500361,6896136945937136,4085785217347802,0.9990569
+652,7340339643952322,6896136945937136,4085785217347802,0.9998635
+653,7234786527587765,6896136945937136,4085785217347802,0.99505866
+654,7393116202141112,6896136945937136,4085785217347802,0.99508804
+655,7472281039392886,6900534992448981,4085785217347803,0.9954137
+656,7353533783487752,6900534992448981,4085785217347803,0.9947725
+657,7375524016070748,6900534992448981,4085785217347803,0.97532666
+658,7261174806677999,6900534992448981,4085785217347803,0.9955818
+659,7278766992732975,6900534992448981,4085785217347803,0.99600816
+660,7511863458053072,6900534992448981,4085785217347803,0.9789627
+661,7375524016070674,6900534992448981,4085785217347803,0.9926116
+662,7401912295166406,6900534992448981,4085785217347803,0.995666
+663,7459086899859725,6900534992448981,4085785217347803,0.994572
+664,7410708388176282,6900534992448981,4085785217347803,0.9947436
+665,7401912295165055,6900534992448981,4085785217347803,0.99387264
+666,7520659551076142,6900534992448981,4085785217347803,0.99350005
+667,7278766992720468,6900534992448981,4085785217347803,0.9942061
+668,7375524016066641,6900534992448981,4085785217347803,0.9943778
+669,7507465411539468,6900534992448981,4085785217347803,0.99502665
+670,7261174806681819,6900534992448981,4085785217347803,0.9945537
+671,7564640016220236,6900534992448981,4085785217347803,0.995027
+672,7437096667294140,6900534992448981,4085785217347803,0.99456453
+673,7401912295170514,6900534992448981,4085785217347803,0.99558145
+674,7269970899702695,6900534992448981,4085785217347803,0.97819704
+675,7221592388027930,6900534992448981,4085785217347803,0.99565256
+676,7463484946370499,6900534992448981,4085785217347803,0.99571335
+677,7261174806672684,6900534992448981,4085785217347803,0.9936021
+678,7384320109087181,6900534992448981,4085785217347803,0.99622923
+679,7371125969549184,6900534992448981,4085785217347803,0.99387276
+680,7516261504546571,6900534992448981,4085785217347803,0.98929113
+681,7384320109096444,6900534992448981,4085785217347803,0.9956657
+682,7375524016066607,6900534992448981,4085785217347803,0.99421644
+683,7327145504408937,6900534992448981,4085785217347803,0.99448484
+684,7423902527733267,6900534992448981,4085785217347803,0.9955329
+685,7503067365024154,6891738899431738,4085785217347803,0.99960953
+686,7371125969557333,6891738899431738,4085785217347803,0.99965656
+687,7375524016073709,6891738899431738,4085785217347803,0.99912566
+688,7529455644099148,6891738899431738,4085785217347803,0.9990532
+689,7269970899704492,6891738899431738,4085785217347803,0.9995461
+690,7287563085749353,6891738899431738,4085785217347803,0.9992888
+691,7296359178777830,6891738899431738,4085785217347803,0.99923146
+692,7529455644096593,6891738899431738,4085785217347803,0.9995759
+693,7366727923050323,6891738899431738,4085785217347803,0.99948263
+694,7256776760162705,6891738899431738,4085785217347803,0.9996488
+695,7507465411539527,6891738899431738,4085785217347803,0.9993793
+696,7388718155600585,6891738899431738,4085785217347803,0.99931824
+697,7177611922878957,6900534992449937,4085785217347807,0.9967775
+698,7265572853181962,6900534992449937,4085785217347807,0.9974312
+700,7454688853347469,6874146713381638,4085785217347814,0.99253076
+701,7507465411524449,6874146713381638,4085785217347814,0.98478436
+702,7507465411524446,6874146713381638,4085785217347814,0.9839491
+703,7353533783475537,6891738899425615,4085785217347814,0.9960383
+704,7190806062434216,6891738899425615,4085785217347814,0.99674606
+705,7278766992743951,6891738899425615,4085785217347814,0.9976447
+706,7375524016052576,6891738899425615,4085785217347814,0.9983694
+707,7305155271817362,6891738899425615,4085785217347814,0.9966612
+708,7375524016052556,6891738899425615,4085785217347814,0.99821424
+709,7520659551085634,6891738899425615,4085785217347814,0.995767
+710,7463484946386338,6891738899425615,4085785217347814,0.99801385
+711,7234786527563212,6891738899425615,4085785217347814,0.99668545
+712,7520659551085616,6891738899425615,4085785217347814,0.9961515
+713,7362329876517135,6891738899425615,4085785217347814,0.99570674
+714,7401912295148547,6891738899425615,4085785217347814,0.99474144
+715,7190806062409354,6891738899425615,4085785217347814,0.99586356
+716,7498669318483591,6891738899425615,4085785217347814,0.99706787
+717,7309553318321938,6891738899425615,4085785217347814,0.9975726
+718,7375524016055530,6891738899431634,4085785217347822,0.9997087
+719,7331543550920337,6891738899431634,4085785217347822,0.9995166
+720,7379922062581728,6891738899431634,4085785217347822,0.99902177
+721,7204000201969341,6891738899431634,4085785217347822,0.9995578
+722,7182009969406487,6891738899431634,4085785217347822,0.99982363
+723,7516261504568405,6891738899431634,4085785217347822,0.9995154
+724,7498669318509730,6891738899431634,4085785217347822,0.9998215
+725,7371125969551575,6891738899431634,4085785217347822,0.99990356
+726,7318349411365227,6891738899431634,4085785217347822,0.9999021
+727,7362329876532135,6891738899431634,4085785217347822,0.9998988
+728,7256776760162502,6891738899431634,4085785217347822,0.9987425
+729,7476679085910791,6891738899431634,4085785217347822,0.99988854
+730,7529455644099298,6891738899431712,4085785217347822,0.99776936
+731,7503067365024255,6891738899431712,4085785217347822,0.996887
+732,7520659551074188,6891738899431712,4085785217347822,0.9818295
+733,7503067365024185,6891738899431712,4085785217347822,0.9968861
+734,7489873225479737,6874146713381327,4085785217347822,0.9942983
+735,7459086899853535,6874146713381327,4085785217347822,0.99438924
+736,7459086899853540,6874146713381327,4085785217347822,0.9943982
+737,7393116202113734,6874146713381327,4085785217347822,0.9962986
+743,7274368946214346,6891738899425472,4090183263858182,0.90031844
+744,7401912295150956,6891738899431639,4090183263858208,0.9985461
+745,7397514248645164,6891738899431639,4090183263858208,0.9989334
+746,7459086899855444,6891738899431639,4090183263858208,0.99932456
+747,7362329876530865,6891738899431639,4090183263858208,0.99967194
+748,7503067365023591,6891738899431639,4090183263858208,0.99913603
+749,7327145504408994,6891738899431639,4090183263858208,0.9998387
+750,7349135736985112,6891738899431639,4090183263858208,0.99954045
+751,7318349411376941,6891738899431639,4090183263858208,0.9998599
+752,7379922062578956,6891738899431639,4090183263858208,0.9989334
+753,7234786527576269,6891738899431639,4090183263858208,0.9997588
+754,7397514248655911,6891738899431639,4090183263858208,0.9992285
+755,7406310341679802,6891738899431639,4090183263858208,0.99987483
+756,7234786527587791,6891738899431639,4090183263858208,0.99880564
+757,7547047830153242,6891738899431639,4090183263858208,0.9998041
+758,7204000201963871,6891738899431639,4090183263858208,0.99986804
+759,7560241969711898,6891738899431639,4090183263858208,0.99864584
+760,7498669318502663,6891738899431639,4090183263858208,0.99619836
+761,7538251737147873,6891738899431639,4090183263858208,0.99816114
+762,7564640016225732,6891738899431639,4090183263858208,0.9985726
+763,7481077132422746,6891738899431639,4090183263858208,0.9991147
+764,7406310341676806,6891738899431639,4090183263858208,0.9997428
+765,7269970899703823,6891738899431639,4090183263858208,0.9998547
+766,7212796294988395,6891738899431639,4090183263858208,0.9998963
+767,7234786527587835,6891738899431639,4090183263858208,0.9988475
+768,7472281039396748,6891738899431639,4090183263858208,0.9996276
+769,7331543550908810,6891738899431639,4090183263858208,0.9998417
+770,7529455644096590,6891738899431639,4090183263858208,0.9990526
+771,7423902527730996,6891738899431639,4090183263858208,0.99985504
+772,7573436109244069,6891738899431639,4090183263858208,0.9990526
+773,7397514248645170,6891738899431639,4090183263858208,0.9989334
+774,7366727923050317,6891738899431639,4090183263858208,0.9991253
+775,7362329876513673,6891738899431639,4090183263858208,0.99857664
+776,7397514248650721,6891738899431639,4090183263858208,0.9998005
+777,7375524016081203,6891738899431639,4090183263858208,0.9983051
+778,7384320109096427,6891738899431639,4090183263858208,0.9997129
+779,7375524016071373,6891738899431639,4090183263858208,0.9993268
+780,7406310341679867,6891738899431639,4090183263858208,0.9998734
+781,7538251737147907,6891738899431639,4090183263858208,0.99896145
+782,7256776760137998,6891738899431639,4090183263858208,0.99784374
+783,7256776760137948,6891738899431639,4090183263858208,0.9991167
+784,7529455644096543,6891738899431639,4090183263858208,0.99859494
+785,7357931830010669,6891738899431639,4090183263858208,0.9998149
+786,7357931830012236,6891738899431639,4090183263858208,0.9997894
+787,7357931830004909,6891738899431639,4090183263858208,0.99857664
+788,7375524016081132,6891738899431639,4090183263858208,0.9985933
+789,7186408015914373,6891738899431639,4090183263858208,0.99973994
+790,7401912295159175,6891738899431639,4090183263858208,0.99989045
+791,7393116202119612,6891738899431639,4090183263858208,0.9998548
+792,7375524016070816,6891738899431639,4090183263858208,0.9994198
+793,7182009969404942,6891738899431639,4090183263858208,0.9997758
+794,7384320109091436,6891738899431639,4090183263858208,0.9989334
+795,7393116202117221,6891738899431639,4090183263858208,0.99914944
+796,7397514248655896,6891738899431639,4090183263858208,0.99960726
+797,7375524016073789,6891738899431639,4090183263858208,0.9991027
+798,7234786527574933,6891738899431639,4090183263858208,0.9985227
+799,7375524016071407,6891738899431639,4090183263858208,0.99985456
+800,7366727923044254,6891738899431639,4090183263858208,0.9980453
+801,7445892760315015,6891738899431639,4090183263858208,0.99834466
+802,7406310341680400,6891738899431639,4090183263858208,0.99984527
+803,7168815829844139,6891738899431639,4090183263858208,0.99964046
+804,7278766992728614,6891738899431639,4090183263858208,0.999363
+805,7547047830177157,6891738899431639,4090183263858208,0.99859613
+806,7516261504555932,6900534992448855,4090183263858267,0.9956151
+807,7494271271986650,6900534992448855,4090183263858267,0.99785006
+808,7498669318494521,6900534992448855,4090183263858267,0.9953387
+809,7349135736987548,6900534992448957,4090183263858267,0.99868196
+810,7393116202134973,6874146713381741,4090183263858279,0.9989755
+813,7393116202134927,6891738899431717,4090183263858279,0.99781966
+814,7419504481229841,6874146713382681,4090183263858279,0.99722725
+816,7287563085771947,6891738899432128,4090183263858299,0.9883128
+817,7287563085745509,6891738899431771,4090183263858543,0.9938273
+818,7349135736965501,6891738899431492,4090183263858543,0.94982874
+819,7349135736965577,6891738899431492,4090183263858543,0.9498285
+820,7349135736965454,6891738899431492,4090183263858543,0.94982743
+821,7322747457890515,6891738899431492,4090183263858543,0.9500488
+822,7401912295166319,6891738899431492,4090183263858543,0.99570566
+823,7261174806672633,6891738899431492,4090183263858543,0.95073795
+824,7349135736965448,6891738899431492,4090183263858543,0.94982743
+825,7393116202139118,6891738899431492,4090183263858543,0.9969903
+826,7349135736985070,6891738899431492,4090183263858543,0.99201804
+827,7371125969555679,6891738899431492,4090183263858543,0.99503064
+828,7349135736965508,6891738899431492,4090183263858543,0.94982874
+829,7410708388194102,6891738899431492,4090183263858543,0.9959209
+830,7322747457890565,6891738899431492,4090183263858543,0.9498313
+831,7349135736965591,6891738899431492,4090183263858543,0.9499222
+832,7419504481214746,6891738899431492,4090183263858543,0.9977463
+833,7560241969699635,6891738899431492,4090183263858543,0.975662
+834,7459086899850840,6891738899431492,4090183263858543,0.9956246
+835,7393116202126651,6891738899431492,4090183263858543,0.95923096
+836,7401912295163131,6891738899431492,4090183263858543,0.99717134
+837,7349135736965473,6891738899431492,4090183263858543,0.9499102
+838,7349135736965549,6891738899431492,4090183263858543,0.94994843
+839,7322747457890487,6891738899431492,4090183263858543,0.9498587
+840,7401912295171089,6891738899431492,4090183263858543,0.99550503
+841,7393116202141623,6891738899431492,4090183263858543,0.99722314
+842,7529455644107170,6891738899431256,4090183263858547,0.99692506
+843,7247980667136065,6891738899431256,4090183263858547,0.9966677
+844,7538251737120417,6891738899431256,4090183263858547,0.9970771
+845,7247980667136062,6891738899431256,4090183263858547,0.9966678
+846,7511863458053674,6891738899431256,4090183263858547,0.9970772
+847,7419504481222345,6891738899431256,4090183263858547,0.9992107
+848,7511863458053687,6891738899431256,4090183263858547,0.9970772
+849,7529455644107182,6891738899431256,4090183263858547,0.99692506
+850,7247980667136057,6891738899431256,4090183263858547,0.9966677
+851,7529455644107175,6891738899431256,4090183263858547,0.9969252
+852,7182009969405492,6891738899431256,4090183263858547,0.9990509
+853,7450290806836835,6891738899427041,4090183263858567,0.911374
+855,7274368946202260,6891738899427041,4090183263858567,0.8624367
+856,7498669318483729,6891738899427041,4090183263858567,0.8409075
+857,7327145504409006,6891738899427041,4090183263858567,0.873714
+859,7230388481069973,6891738899431679,4090183263858567,0.9991301
+860,7503067365011972,6891738899431679,4090183263858567,0.9992347
+862,7274368946212499,6891738899431679,4090183263858567,0.90539
+863,7327145504409095,6891738899431679,4090183263858567,0.99913555
+864,7560241969717552,6891738899430818,4090183263858567,0.99969876
+865,7419504481222877,6896136945937024,4090183263858572,0.9682711
+868,7296359178781896,6874146713381684,4090183263858578,0.90113986
+874,7296359178781973,6874146713381684,4090183263858578,0.9010842
+875,7393116202132334,6874146713381684,4090183263858578,0.81961995
+877,7300757225298715,6874146713381684,4090183263858578,0.88944024
+878,7168815829857595,6891738899425607,4090183263858578,0.9886022
+879,7287563085745452,6891738899425607,4090183263858578,0.9878285
+880,7564640016232846,6891738899425607,4090183263858578,0.9902644
+881,7498669318495733,6891738899431844,4090183263858583,0.99343723
+882,7498669318495740,6891738899431844,4090183263858583,0.99343747
+883,7498669318495755,6891738899431844,4090183263858583,0.99343747
+884,7507465411517106,6891738899431844,4090183263858583,0.99343747
+885,7507465411517101,6891738899431844,4090183263858583,0.99343723
+886,7507465411517098,6891738899431844,4090183263858583,0.99343723
+887,7498669318495726,6891738899431844,4090183263858583,0.99343723
+888,7498669318495713,6891738899431844,4090183263858583,0.99343747
+889,7498669318495746,6891738899431844,4090183263858583,0.99343723
+890,7498669318495722,6891738899431844,4090183263858583,0.99343747
+891,7507465411517096,6891738899431844,4090183263858583,0.99343723
+892,7498669318495748,6891738899431844,4090183263858583,0.99343747
+893,7318349411376983,6882942806404175,4090183263858592,0.9923793
+894,7230388481064681,6882942806404175,4090183263858592,0.99817836
+895,7291961132261638,6882942806404175,4090183263858592,0.9963103
+896,7529455644110579,6882942806404175,4090183263858592,0.99822265
+897,7379922062576760,6882942806404175,4090183263858592,0.96268445
+898,7503067365006088,6882942806404175,4090183263858592,0.97991884
+899,7247980667108722,6882942806404175,4090183263858592,0.9994148
+900,7186408015914356,6882942806404175,4090183263858592,0.9944147
+901,7529455644099478,6882942806404175,4090183263858592,0.9830912
+902,7300757225309610,6882942806404175,4090183263858592,0.9954678
+903,7547047830177277,6882942806404175,4090183263858592,0.9976555
+904,7362329876534312,6882942806404175,4090183263858592,0.82263166
+905,7371125969554970,6882942806404175,4090183263858592,0.9995529
+906,7239184574099299,6882942806404175,4090183263858592,0.9971738
+907,7243582620606592,6882942806404175,4090183263858592,0.9995338
+908,7410708388176270,6882942806404175,4090183263858592,0.9993749
+909,7393116202126634,6882942806404175,4090183263858592,0.9950789
+910,7256776760138027,6882942806404175,4090183263858592,0.9925269
+911,7371125969545116,6882942806404175,4090183263858592,0.9908982
+912,7375524016070848,6882942806404175,4090183263858592,0.99908686
+913,7353533783500472,6882942806404175,4090183263858592,0.96907246
+914,7401912295159139,6882942806404175,4090183263858592,0.992496
+915,7507465411539474,6882942806404175,4090183263858592,0.9979572
+916,7384320109100664,6882942806404175,4090183263858592,0.97055286
+917,7190806062434196,6882942806404175,4090183263858592,0.9986272
+918,7406310341661112,6882942806404175,4090183263858592,0.99878293
+919,7401912295166426,6882942806404175,4090183263858592,0.9989255
+920,7454688853339399,6882942806404175,4090183263858592,0.9914232
+921,7542649783634671,6882942806404175,4090183263858592,0.99594045
+922,7406310341682421,6882942806404175,4090183263858592,0.9964694
+923,7529455644113503,6882942806404175,4090183263858592,0.9877806
+925,7195204108937377,6882942806404175,4090183263858592,0.97557133
+926,7547047830177271,6882942806404175,4090183263858592,0.9989286
+927,7481077132432406,6882942806404175,4090183263858592,0.95871407
+928,7265572853193067,6882942806404175,4090183263858592,0.99922264
+929,7511863458044390,6882942806404175,4090183263858592,0.9944149
+930,7432698620769785,6882942806404175,4090183263858592,0.99042726
+931,7204000201956740,6882942806404175,4090183263858592,0.99588335
+932,7454688853339360,6882942806404175,4090183263858592,0.9853022
+933,7252378713636422,6882942806404175,4090183263858592,0.9633218
+934,7573436109243981,6882942806404175,4090183263858592,0.9968742
+935,7410708388188401,6882942806404175,4090183263858592,0.99686384
+936,7300757225306791,6882942806404175,4090183263858592,0.985783
+937,7256776760162494,6882942806404175,4090183263858592,0.9992053
+938,7261174806681922,6882942806404175,4090183263858592,0.9990362
+939,7309553318338038,6882942806404175,4090183263858592,0.9286939
+940,7247980667108795,6882942806404175,4090183263858592,0.99952245
+941,7247980667108827,6882942806404175,4090183263858592,0.9994142
+942,7199602155446116,6882942806404175,4090183263858592,0.9949549
+943,7542649783634663,6882942806404175,4090183263858592,0.9960504
+944,7410708388176292,6882942806404175,4090183263858592,0.999508
+945,7393116202132453,6882942806404175,4090183263858592,0.99882096
+946,7243582620606581,6882942806404175,4090183263858592,0.99691355
+947,7309553318332684,6882942806404175,4090183263858592,0.9990388
+948,7406310341682490,6882942806404175,4090183263858592,0.995874
+949,7300757225314449,6882942806404175,4090183263858592,0.9982327
+950,7256776760162556,6882942806404175,4090183263858592,0.9957295
+951,7182009969390807,6882942806404175,4090183263858592,0.9964928
+952,7234786527574900,6882942806404175,4090183263858592,0.9964445
+953,7243582620602190,6882942806404175,4090183263858592,0.99946433
+954,7415106434698437,6882942806404175,4090183263858592,0.9990633
+955,7322747457873570,6882942806404175,4090183263858592,0.9861601
+957,7551445876687220,6882942806404175,4090183263858592,0.9964557
+958,7507465411539472,6882942806404175,4090183263858592,0.99843246
+959,7375524016070796,6882942806404175,4090183263858592,0.99673694
+960,7327145504412164,6882942806404175,4090183263858592,0.9963018
+961,7388718155600289,6882942806404175,4090183263858592,0.9984869
+962,7406310341679893,6882942806404175,4090183263858592,0.9935881
+963,7498669318495630,6882942806404175,4090183263858592,0.96844876
+964,7507465411539469,6882942806404175,4090183263858592,0.9972933
+965,7353533783499816,6882942806404175,4090183263858592,0.9467096
+966,7182009969390842,6882942806404175,4090183263858592,0.9980147
+967,7243582620606710,6882942806404175,4090183263858592,0.9989104
+968,7247980667108746,6882942806404175,4090183263858592,0.99958354
+969,7459086899850374,6882942806404175,4090183263858592,0.98473006
+970,7419504481208316,6882942806404175,4090183263858592,0.9810198
+971,7410708388194276,6882942806404175,4090183263858592,0.9963761
+972,7186408015914211,6882942806404175,4090183263858592,0.9913694
+973,7573436109244134,6882942806404175,4090183263858592,0.99863845
+974,7393116202113934,6882942806404175,4090183263858592,0.99878913
+975,7327145504412218,6882942806404175,4090183263858592,0.9972817
+976,7349135736989760,6882942806404175,4090183263858592,0.99144894
+977,7261174806653920,6882942806404175,4090183263858592,0.9969887
+978,7564640016220198,6882942806404175,4090183263858592,0.99399614
+979,7533853690611236,6882942806404175,4090183263858592,0.99239665
+980,7511863458044227,6882942806404175,4090183263858592,0.9958973
+981,7379922062581691,6882942806404175,4090183263858592,0.999212
+982,7199602155446171,6882942806404175,4090183263858592,0.99770606
+983,7173213876371387,6882942806404175,4090183263858592,0.9969591
+984,7309553318324274,6882942806404175,4090183263858592,0.99776185
+985,7419504481207148,6882942806404175,4090183263858592,0.99340713
+986,7397514248655832,6882942806404175,4090183263858592,0.9992865
+987,7379922062581760,6882942806404175,4090183263858592,0.9967283
+988,7397514248655892,6882942806404175,4090183263858592,0.9992238
+989,7410708388178674,6882942806404175,4090183263858592,0.9989285
+990,7564640016220232,6882942806404175,4090183263858592,0.9980063
+991,7366727923050374,6882942806404175,4090183263858592,0.99740523
+992,7234786527574924,6882942806404175,4090183263858592,0.99950385
+993,7445892760297542,6882942806404175,4090183263858592,0.99594057
+994,7397514248655790,6882942806404175,4090183263858592,0.9987753
+995,7371125969554977,6882942806404175,4090183263858592,0.99944216
+996,7542649783634631,6882942806404175,4090183263858592,0.99696594
+997,7256776760137865,6882942806404175,4090183263858592,0.9989446
+998,7261174806678037,6882942806404175,4090183263858592,0.99898976
+999,7564640016220221,6882942806404175,4090183263858592,0.9987684
+1000,7283165039250341,6882942806404175,4090183263858592,0.982864
+1001,7511863458044352,6882942806404175,4090183263858592,0.99319273
+1002,7410708388188376,6882942806404175,4090183263858592,0.9968702
+1003,7503067365025746,6882942806404175,4090183263858592,0.9935616
+1005,7261174806672630,6882942806404175,4090183263858592,0.9953241
+1006,7459086899861486,6882942806404175,4090183263858592,0.9980198
+1007,7261174806678086,6882942806404175,4090183263858592,0.9990088
+1008,7318349411369418,6882942806404175,4090183263858592,0.99209595
+1009,7182009969390802,6882942806404175,4090183263858592,0.99737656
+1010,7287563085773245,6882942806404175,4090183263858592,0.9917093
+1011,7507465411539431,6882942806404175,4090183263858592,0.9966798
+1012,7459086899855542,6882942806404175,4090183263858592,0.99082935
+1013,7357931830015411,6882942806404175,4090183263858592,0.9833022
+1014,7247980667108806,6882942806404175,4090183263858592,0.9994624
+1015,7410708388176228,6882942806404175,4090183263858592,0.99946934
+1016,7371125969557128,6882942806404175,4090183263858592,0.99815565
+1017,7393116202118739,6882942806404175,4090183263858592,0.99944717
+1018,7520659551067716,6882942806404175,4090183263858592,0.9957775
+1019,7190806062412083,6882942806404175,4090183263858592,0.9789499
+1020,7406310341661060,6882942806404175,4090183263858592,0.9995524
+1021,7393116202117274,6882942806404175,4090183263858592,0.9833241
+1022,7256776760137981,6882942806404175,4090183263858592,0.99643916
+1023,7173213876371340,6882942806404175,4090183263858592,0.99743253
+1024,7525057597589577,6882942806404175,4090183263858592,0.9960718
+1025,7265572853181963,6882942806404175,4090183263858592,0.9912134
+1026,7401912295170794,6882942806404175,4090183263858592,0.9910678
+1027,7573436109242809,6882942806404175,4090183263858592,0.99144894
+1028,7230388481073953,6882942806404175,4090183263858592,0.9960775
+1029,7406310341682456,6882942806404175,4090183263858592,0.99598783
+1030,7256776760140812,6882942806404175,4090183263858592,0.99602145
+1031,7393116202135026,6882942806404175,4090183263858592,0.9914908
+1032,7529455644096558,6882942806404175,4090183263858592,0.99765223
+1033,7278766992739022,6882942806404175,4090183263858592,0.993669
+1034,7529455644096555,6882942806404175,4090183263858592,0.99863607
+1035,7516261504545915,6882942806404175,4090183263858592,0.99395627
+1036,7393116202132318,6882942806404175,4090183263858592,0.99933076
+1037,7287563085747263,6882942806404175,4090183263858592,0.9989298
+1038,7327145504412172,6882942806404175,4090183263858592,0.9691131
+1039,7190806062433621,6882942806404175,4090183263858592,0.99779344
+1040,7410708388188349,6882942806404175,4090183263858592,0.9973283
+1041,7401912295166476,6882942806404175,4090183263858592,0.99926716
+1042,7300757225307964,6882942806404175,4090183263858592,0.997563
+1043,7190806062433580,6882942806404175,4090183263858592,0.99826163
+1044,7190806062434239,6882942806404175,4090183263858592,0.9986326
+1046,7318349411369465,6882942806404175,4090183263858592,0.98324955
+1047,7410708388188319,6882942806404175,4090183263858592,0.99796706
+1048,7366727923050294,6882942806404175,4090183263858592,0.9994998
+1049,7322747457890587,6882942806404175,4090183263858592,0.9958405
+1050,7256776760137891,6882942806404175,4090183263858592,0.99950325
+1051,7256776760137926,6882942806404175,4090183263858592,0.99957675
+1052,7529455644096599,6882942806404175,4090183263858592,0.9933826
+1053,7177611922880022,6882942806404175,4090183263858592,0.9976198
+1054,7239184574099340,6882942806404175,4090183263858592,0.9993494
+1055,7459086899850353,6882942806404175,4090183263858592,0.9938445
+1056,7353533783478145,6882942806404175,4090183263858592,0.97209203
+1057,7265572853193101,6882942806404175,4090183263858592,0.9987765
+1058,7384320109110841,6882942806404175,4090183263858592,0.9992895
+1060,7450290806825966,6882942806404175,4090183263858592,0.9980178
+1061,7247980667108832,6882942806404175,4090183263858592,0.99915016
+1062,7366727923050264,6882942806404175,4090183263858592,0.99928707
+1063,7353533783495280,6882942806404175,4090183263858592,0.99379057
+1064,7401912295156838,6882942806404175,4090183263858592,0.99573743
+1065,7511863458045291,6882942806404175,4090183263858592,0.9952638
+1066,7507465411520379,6882942806404175,4090183263858592,0.96479523
+1067,7230388481074508,6882942806404175,4090183263858592,0.998061
+1068,7547047830154082,6882942806404175,4090183263858592,0.9959561
+1069,7234786527576327,6882942806404175,4090183263858592,0.9906365
+1071,7195204108948136,6882942806404175,4090183263858592,0.9944623
+1072,7401912295170806,6882942806404175,4090183263858592,0.99311936
+1073,7177611922878898,6882942806404175,4090183263858592,0.9821891
+1074,7243582620606625,6882942806404175,4090183263858592,0.99947387
+1076,7397514248655850,6882942806404175,4090183263858592,0.99877673
+1077,7564640016220311,6882942806404175,4090183263858592,0.9963761
+1078,7393116202126663,6882942806404175,4090183263858592,0.99952626
+1079,7401912295164986,6882942806404175,4090183263858592,0.9917412
+1080,7463484946359859,6882942806404175,4090183263858592,0.99148375
+1081,7225990434559192,6882942806404175,4090183263858592,0.9592846
+1082,7265572853193072,6882942806404175,4090183263858592,0.9987753
+1083,7287563085745500,6882942806404175,4090183263858592,0.97117907
+1084,7239184574099413,6882942806404175,4090183263858592,0.9989312
+1085,7388718155620425,6882942806404175,4090183263858592,0.9994943
+1086,7287563085774283,6882942806404175,4090183263858592,0.99364907
+1087,7529455644110591,6882942806404175,4090183263858592,0.9983688
+1088,7507465411539470,6882942806404175,4090183263858592,0.99735874
+1089,7247980667108801,6882942806404175,4090183263858592,0.99824417
+1090,7278766992742757,6882942806404175,4090183263858592,0.9927556
+1091,7353533783495285,6882942806404175,4090183263858592,0.9870907
+1092,7186408015907331,6882942806404175,4090183263858592,0.9982407
+1093,7547047830154089,6882942806404175,4090183263858592,0.9951566
+1095,7243582620606657,6882942806404175,4090183263858592,0.9995043
+1096,7503067365010510,6882942806404175,4090183263858592,0.99313897
+1097,7384320109110872,6882942806404175,4090183263858592,0.99914134
+1098,7190806062434244,6882942806404175,4090183263858592,0.9967608
+1099,7278766992720777,6882942806404175,4090183263858592,0.9949527
+1101,7199602155446454,6882942806404175,4090183263858592,0.990341
+1102,7379922062581641,6882942806404175,4090183263858592,0.9990281
+1103,7349135736989784,6882942806404175,4090183263858592,0.9937723
+1104,7331543550920369,6882942806404175,4090183263858592,0.95537186
+1105,7379922062576768,6882942806404175,4090183263858592,0.96268445
+1106,7256776760138037,6882942806404175,4090183263858592,0.9991492
+1107,7410708388194297,6882942806404175,4090183263858592,0.99771297
+1108,7503067365025704,6882942806404175,4090183263858592,0.994772
+1109,7410708388194285,6882942806404175,4090183263858592,0.99690104
+1110,7353533783478118,6882942806404175,4090183263858592,0.94185513
+1111,7190806062433626,6882942806404175,4090183263858592,0.90341574
+1112,7239184574099278,6882942806404175,4090183263858592,0.99928147
+1113,7247980667108797,6882942806404175,4090183263858592,0.99892443
+1114,7551445876687218,6882942806404175,4090183263858592,0.99408215
+1115,7463484946386176,6882942806404175,4090183263858592,0.9976261
+1116,7318349411365234,6882942806404175,4090183263858592,0.9979602
+1117,7547047830153282,6882942806404175,4090183263858592,0.97778314
+1118,7256776760137901,6882942806404175,4090183263858592,0.99958307
+1119,7252378713632889,6882942806404175,4090183263858592,0.9995241
+1120,7327145504412212,6882942806404175,4090183263858592,0.9946682
+1121,7393116202134993,6882942806404175,4090183263858592,0.9914909
+1122,7243582620606586,6882942806404175,4090183263858592,0.99587375
+1124,7243582620606595,6882942806404175,4090183263858592,0.99644595
+1125,7261174806658434,6882942806404175,4090183263858592,0.9987245
+1126,7410708388188384,6882942806404175,4090183263858592,0.9964444
+1127,7410708388188377,6882942806404175,4090183263858592,0.99797016
+1128,7393116202118723,6882942806404175,4090183263858592,0.9991912
+1129,7261174806681940,6882942806404175,4090183263858592,0.99935585
+1130,7472281039417500,6882942806404175,4090183263858592,0.81857145
+1131,7397514248655877,6882942806404175,4090183263858592,0.9990362
+1132,7195204108937237,6882942806404175,4090183263858592,0.9897508
+1133,7393116202135007,6882942806404175,4090183263858592,0.989507
+1134,7322747457890547,6882942806404175,4090183263858592,0.99534047
+1135,7397514248655923,6882942806404175,4090183263858592,0.99922264
+1136,7274368946215848,6882942806404175,4090183263858592,0.998626
+1137,7261174806678018,6882942806404175,4090183263858592,0.9988005
+1138,7511863458053088,6882942806404175,4090183263858592,0.9870812
+1139,7274368946215816,6882942806404175,4090183263858592,0.9987684
+1140,7247980667108790,6882942806404175,4090183263858592,0.99892443
+1141,7406310341661106,6882942806404175,4090183263858592,0.99878293
+1142,7278766992728617,6882942806404175,4090183263858592,0.99819225
+1143,7177611922880480,6882942806404175,4090183263858592,0.99412054
+1144,7261174806678022,6882942806404175,4090183263858592,0.99859625
+1145,7366727923050287,6882942806404175,4090183263858592,0.99928623
+1146,7415106434708455,6882942806404175,4090183263858592,0.9850898
+1147,7283165039231452,6882942806404175,4090183263858592,0.9951761
+1148,7406310341661100,6882942806404175,4090183263858592,0.99867094
+1149,7182009969390832,6882942806404175,4090183263858592,0.99649954
+1150,7261174806681914,6882942806404175,4090183263858592,0.99840754
+1151,7230388481069077,6882942806404175,4090183263858592,0.9992962
+1152,7393116202127071,6882942806404175,4090183263858592,0.9968732
+1153,7388718155624502,6882942806404175,4090183263858592,0.9965005
+1154,7560241969700020,6882942806404175,4090183263858592,0.9937133
+1155,7234786527576316,6882942806404175,4090183263858592,0.9793594
+1156,7269970899690681,6882942806404175,4090183263858592,0.9937627
+1157,7388718155600728,6882942806404175,4090183263858592,0.998102
+1158,7481077132422596,6882942806404175,4090183263858592,0.98301333
+1159,7247980667127319,6882942806404175,4090183263858592,0.97187763
+1161,7195204108947648,6882942806404175,4090183263858592,0.9985274
+1162,7168815829857596,6882942806404175,4090183263858592,0.9984767
+1165,7401912295148660,6882942806404175,4090183263858592,0.99510694
+1167,7256776760138046,6882942806404175,4090183263858592,0.9995604
+1168,7388718155625411,6882942806404175,4090183263858592,0.99893075
+1169,7393116202126587,6882942806404175,4090183263858592,0.9961804
+1170,7234786527577293,6882942806404175,4090183263858592,0.99384177
+1171,7349135736965449,6882942806404175,4090183263858592,0.9950695
+1172,7212796294989845,6882942806404175,4090183263858592,0.9985305
+1173,7472281039417475,6882942806404175,4090183263858592,0.8180098
+1174,7397514248655901,6882942806404175,4090183263858592,0.99928844
+1175,7208398248478502,6882942806404175,4090183263858592,0.9779739
+1176,7230388481069085,6882942806404175,4090183263858592,0.9991887
+1177,7322747457890604,6882942806404175,4090183263858592,0.9947465
+1178,7564640016220250,6882942806404175,4090183263858592,0.9988004
+1179,7419504481221956,6882942806404175,4090183263858592,0.99795735
+1180,7529455644096562,6882942806404175,4090183263858592,0.9976555
+1181,7393116202132433,6882942806404175,4090183263858592,0.99582064
+1182,7247980667108711,6882942806404175,4090183263858592,0.99928445
+1183,7384320109091382,6882942806404175,4090183263858592,0.9977671
+1184,7234786527574910,6882942806404175,4090183263858592,0.9993673
+1185,7186408015893907,6882942806404175,4090183263858592,0.9795284
+1186,7243582620598759,6882942806404175,4090183263858592,0.99797016
+1187,7393116202126641,6882942806404175,4090183263858592,0.9990056
+1188,7243582620606688,6882942806404175,4090183263858592,0.99944216
+1189,7384320109095458,6882942806404175,4090183263858592,0.996837
+1190,7243582620606549,6882942806404175,4090183263858592,0.9991436
+1191,7366727923050300,6882942806404175,4090183263858592,0.9994135
+1192,7384320109095276,6882942806404175,4090183263858592,0.997607
+1193,7230388481069838,6882942806404175,4090183263858592,0.9990434
+1194,7186408015909602,6882942806404175,4090183263858592,0.9808435
+1195,7560241969710848,6882942806404175,4090183263858592,0.99726725
+1197,7278766992743770,6882942806404175,4090183263858592,0.80674964
+1198,7261174806681959,6882942806404175,4090183263858592,0.9984119
+1199,7256776760137860,6882942806404175,4090183263858592,0.99865556
+1200,7459086899855609,6882942806404175,4090183263858592,0.99717253
+1201,7313951364848931,6882942806404175,4090183263858592,0.99707866
+1202,7182009969390779,6882942806404175,4090183263858592,0.99767464
+1203,7204000201967864,6882942806404175,4090183263858592,0.989646
+1204,7551445876687210,6882942806404175,4090183263858592,0.9981706
+1205,7261174806653891,6882942806404175,4090183263858592,0.9969009
+1206,7287563085745585,6882942806404175,4090183263858592,0.99440324
+1207,7415106434698416,6882942806404175,4090183263858592,0.9986658
+1208,7256776760138033,6882942806404175,4090183263858592,0.99904054
+1209,7296359178777843,6882942806404175,4090183263858592,0.9977182
+1210,7300757225311411,6882942806404175,4090183263858592,0.9917087
+1211,7256776760141356,6882942806404175,4090183263858592,0.9702342
+1212,7327145504412118,6882942806404175,4090183263858592,0.9862331
+1213,7256776760137886,6882942806404175,4090183263858592,0.9992323
+1214,7520659551076112,6882942806404175,4090183263858592,0.9837546
+1215,7397514248638770,6882942806404175,4090183263858592,0.996646
+1216,7520659551076497,6882942806404175,4090183263858592,0.9837134
+1217,7199602155446162,6882942806404175,4090183263858592,0.99400276
+1218,7428300574265512,6882942806404175,4090183263858592,0.9961867
+1219,7305155271832698,6882942806404175,4090183263858592,0.99796104
+1220,7261174806678144,6882942806404175,4090183263858592,0.99928397
+1221,7318349411369331,6882942806404175,4090183263858592,0.9956541
+1222,7401912295165025,6882942806404175,4090183263858592,0.9784182
+1223,7384320109087270,6882942806404175,4090183263858592,0.9994992
+1224,7182009969390884,6882942806404175,4090183263858592,0.9984748
+1225,7230388481069173,6882942806404175,4090183263858592,0.9971956
+1226,7520659551074295,6882942806404175,4090183263858592,0.99863845
+1227,7459086899859670,6882942806404175,4090183263858592,0.975573
+1228,7494271271986601,6882942806404175,4090183263858592,0.991104
+1230,7459086899855449,6882942806404175,4090183263858592,0.9977431
+1231,7393116202126664,6882942806404175,4090183263858592,0.99864215
+1232,7230388481069053,6882942806404175,4090183263858592,0.99903166
+1233,7278766992738889,6882942806404175,4090183263858592,0.99389786
+1234,7274368946207452,6882942806404175,4090183263858592,0.98929197
+1235,7406310341661020,6882942806404175,4090183263858592,0.9994999
+1236,7393116202138292,6882942806404175,4090183263858592,0.9718829
+1237,7564640016220143,6882942806404175,4090183263858592,0.99843246
+1239,7463484946380128,6882942806404175,4090183263858592,0.99237293
+1240,7401912295148431,6882942806404175,4090183263858592,0.972313
+1241,7388718155624513,6882942806404175,4090183263858592,0.9972156
+1242,7511863458044347,6882942806404175,4090183263858592,0.9931988
+1243,7204000201967982,6882942806404175,4090183263858592,0.99795234
+1244,7287563085747366,6882942806404175,4090183263858592,0.99876875
+1245,7230388481069220,6882942806404175,4090183263858592,0.99920243
+1246,7353533783478127,6882942806404175,4090183263858592,0.9553711
+1247,7410708388176281,6882942806404175,4090183263858592,0.9968141
+1248,7357931830005061,6882942806404175,4090183263858592,0.97741264
+1249,7274368946215860,6882942806404175,4090183263858592,0.9992673
+1250,7204000201967936,6882942806404175,4090183263858592,0.99499196
+1251,7300757225309501,6882942806404175,4090183263858592,0.98308474
+1252,7265572853193109,6882942806404175,4090183263858592,0.99541557
+1253,7243582620606615,6882942806404175,4090183263858592,0.99933857
+1254,7507465411539455,6882942806404175,4090183263858592,0.9764282
+1255,7507465411539471,6882942806404175,4090183263858592,0.9984701
+1256,7300757225306743,6882942806404175,4090183263858592,0.9832313
+1257,7393116202126660,6882942806404175,4090183263858592,0.9995529
+1258,7261174806678030,6882942806404175,4090183263858592,0.9989255
+1259,7511863458044281,6882942806404175,4090183263858592,0.9943715
+1260,7204000201957870,6882942806404175,4090183263858592,0.9917528
+1261,7247980667108718,6882942806404175,4090183263858592,0.99894613
+1263,7168815829855656,6882942806404175,4090183263858592,0.9990275
+1264,7182009969390836,6882942806404175,4090183263858592,0.9980117
+1265,7472281039392903,6882942806404175,4090183263858592,0.94741684
+1266,7305155271832711,6882942806404175,4090183263858592,0.9965031
+1267,7243582620602173,6882942806404175,4090183263858592,0.9964616
+1268,7547047830177124,6882942806404175,4090183263858592,0.99840766
+1269,7256776760137870,6882942806404175,4090183263858592,0.9938355
+1270,7208398248478429,6882942806404175,4090183263858592,0.985261
+1271,7472281039392862,6882942806404175,4090183263858592,0.8187587
+1272,7393116202113802,6882942806404175,4090183263858592,0.99332994
+1273,7503067365010541,6882942806404175,4090183263858592,0.9928306
+1274,7415106434698406,6882942806404175,4090183263858592,0.9982931
+1275,7318349411352562,6882942806404175,4090183263858592,0.9863897
+1276,7335941597434734,6882942806404175,4090183263858592,0.9659257
+1277,7547047830177185,6882942806404175,4090183263858592,0.9984119
+1278,7401912295166420,6882942806404175,4090183263858592,0.99933463
+1279,7287563085745413,6882942806404175,4090183263858592,0.99312097
+1280,7547047830177226,6882942806404175,4090183263858592,0.9982243
+1281,7212796294989983,6882942806404175,4090183263858592,0.99795145
+1282,7261174806681953,6882942806404175,4090183263858592,0.99903786
+1283,7388718155600364,6882942806404175,4090183263858592,0.9966978
+1284,7419504481212748,6882942806404175,4090183263858592,0.9947989
+1285,7291961132288717,6882942806404175,4090183263858592,0.99019605
+1286,7287563085760953,6882942806404175,4090183263858592,0.9955382
+1287,7410708388176265,6882942806404175,4090183263858592,0.99947864
+1288,7353533783476069,6882942806404175,4090183263858592,0.9966587
+1289,7243582620606559,6882942806404175,4090183263858592,0.9995285
+1290,7168815829855631,6882942806404175,4090183263858592,0.8700235
+1291,7454688853347421,6882942806404175,4090183263858592,0.9957605
+1292,7366727923050276,6882942806404175,4090183263858592,0.9995524
+1293,7331543550924002,6882942806404175,4090183263858592,0.9196226
+1294,7274368946215832,6882942806404175,4090183263858592,0.99890447
+1295,7261174806678065,6882942806404175,4090183263858592,0.9958028
+1297,7199602155446108,6882942806404175,4090183263858592,0.99502325
+1298,7357931830014324,6882942806404175,4090183263858592,0.93096435
+1299,7503067365024229,6882942806404175,4090183263858592,0.9952362
+1300,7247980667118790,6882942806404175,4090183263858592,0.9944317
+1301,7375524016073995,6882942806404175,4090183263858592,0.9993849
+1302,7291961132280353,6882942806404175,4090183263858592,0.99814427
+1303,7375524016074061,6882942806404175,4090183263858592,0.9994943
+1304,7564640016220329,6882942806404175,4090183263858592,0.9979572
+1305,7401912295171567,6882942806404175,4090183263858592,0.96937144
+1306,7573436109243972,6882942806404175,4090183263858592,0.97366333
+1307,7459086899865488,6882942806404175,4090183263858592,0.9983889
+1308,7256776760141320,6882942806404175,4090183263858592,0.979362
+1309,7564640016232827,6882942806404175,4090183263858592,0.9640571
+1310,7472281039417467,6882942806404175,4090183263858592,0.8189706
+1311,7190806062425187,6882942806404175,4090183263858592,0.9989396
+1312,7520659551076439,6882942806404175,4090183263858592,0.98327154
+1313,7384320109087109,6882942806404175,4090183263858592,0.9904358
+1314,7393116202141250,6882942806404175,4090183263858592,0.995708
+1315,7230388481069157,6882942806404175,4090183263858592,0.9993905
+1316,7252378713632948,6882942806404175,4090183263858592,0.99945265
+1317,7573436109244007,6882942806404175,4090183263858592,0.9989266
+1318,7463484946380139,6882942806404175,4090183263858592,0.99245983
+1319,7234786527574919,6882942806404175,4090183263858592,0.9989178
+1320,7507465411539489,6882942806404175,4090183263858592,0.9980064
+1321,7375524016074003,6882942806404175,4090183263858592,0.9993749
+1322,7278766992717785,6882942806404175,4090183263858592,0.9951337
+1323,7243582620598776,6882942806404175,4090183263858592,0.99732435
+1324,7300757225306754,6882942806404175,4090183263858592,0.9966364
+1325,7362329876535625,6882942806404175,4090183263858592,0.98296124
+1326,7432698620769808,6882942806404175,4090183263858592,0.99623847
+1327,7401912295166377,6882942806404175,4090183263858592,0.9986259
+1328,7199602155459100,6882942806404175,4090183263858592,0.9869178
+1329,7397514248655838,6882942806404175,4090183263858592,0.999356
+1330,7397514248655879,6882942806404175,4090183263858592,0.99903786
+1331,7564640016220243,6882942806404175,4090183263858592,0.99402446
+1332,7467882992890549,6882942806404175,4090183263858592,0.959962
+1334,7551445876687165,6882942806404175,4090183263858592,0.99049616
+1335,7406310341679859,6882942806404175,4090183263858592,0.98188525
+1336,7296359178799657,6882942806404175,4090183263858592,0.99625444
+1337,7335941597441580,6882942806404175,4090183263858592,0.99235606
+1338,7410708388176190,6882942806404175,4090183263858592,0.99944717
+1339,7186408015909140,6882942806404175,4090183263858592,0.9708902
+1340,7511863458044270,6882942806404175,4090183263858592,0.9944149
+1341,7410708388178720,6882942806404175,4090183263858592,0.9956533
+1342,7573436109242785,6882942806404175,4090183263858592,0.9932051
+1343,7410708388188345,6882942806404175,4090183263858592,0.99643916
+1344,7459086899859808,6882942806404175,4090183263858592,0.9111218
+1345,7247980667108769,6882942806404175,4090183263858592,0.99881065
+1346,7357931830015319,6882942806404175,4090183263858592,0.90693283
+1347,7243582620598756,6882942806404175,4090183263858592,0.9973284
+1348,7243582620602248,6882942806404175,4090183263858592,0.9994048
+1349,7516261504558077,6882942806404175,4090183263858592,0.88317734
+1351,7511863458044103,6882942806404175,4090183263858592,0.9934261
+1352,7415106434698525,6882942806404175,4090183263858592,0.9992244
+1353,7410708388188403,6882942806404175,4090183263858592,0.99732435
+1354,7564640016220186,6882942806404175,4090183263858592,0.99821186
+1355,7177611922879157,6882942806404175,4090183263858592,0.9944482
+1356,7573436109244106,6882942806404175,4090183263858592,0.99863607
+1357,7388718155624467,6882942806404175,4090183263858592,0.9967801
+1358,7313951364844429,6882942806404175,4090183263858592,0.9869278
+1359,7335941597433396,6882942806404175,4090183263858592,0.99571806
+1360,7393116202126668,6882942806404175,4090183263858592,0.9987826
+1361,7467882992891436,6882942806404175,4090183263858592,0.9683072
+1362,7208398248478456,6882942806404175,4090183263858592,0.9878014
+1363,7507465411539515,6882942806404175,4090183263858592,0.9985915
+1366,7511863458040115,6882942806404175,4090183263858592,0.9935865
+1367,7551445876686549,6882942806404175,4090183263858592,0.97648865
+1368,7415106434697909,6882942806404175,4090183263858592,0.9911413
+1369,7252378713624959,6882942806404175,4090183263858592,0.99660957
+1370,7199602155458908,6882942806404175,4090183263858592,0.9894581
+1371,7247980667108846,6882942806404175,4090183263858592,0.9993666
+1372,7261174806681958,6882942806404175,4090183263858592,0.9992238
+1373,7481077132433334,6882942806404175,4090183263858592,0.99893993
+1374,7344737690452538,6882942806404175,4090183263858592,0.9729637
+1375,7300757225306789,6882942806404175,4090183263858592,0.9970372
+1376,7432698620780962,6882942806404175,4090183263858592,0.9985267
+1377,7243582620598761,6882942806404175,4090183263858592,0.99796706
+1378,7472281039392949,6882942806404175,4090183263858592,0.81770307
+1379,7401912295166382,6882942806404175,4090183263858592,0.9985965
+1380,7177611922878854,6882942806404175,4090183263858592,0.9822031
+1381,7384320109091391,6882942806404175,4090183263858592,0.99450266
+1382,7393116202126670,6882942806404175,4090183263858592,0.9961796
+1383,7419504481207960,6882942806404175,4090183263858592,0.98923534
+1384,7199602155446157,6882942806404175,4090183263858592,0.99403423
+1385,7287563085745436,6882942806404175,4090183263858592,0.98800105
+1386,7393116202126654,6882942806404175,4090183263858592,0.9987581
+1387,7560241969708982,6882942806404175,4090183263858592,0.99213177
+1388,7401912295166395,6882942806404175,4090183263858592,0.99890447
+1389,7247980667108820,6882942806404175,4090183263858592,0.9989505
+1390,7401912295156795,6882942806404175,4090183263858592,0.9967096
+1391,7190806062434257,6882942806404175,4090183263858592,0.9967643
+1392,7239184574099387,6882942806404175,4090183263858592,0.9995161
+1393,7353533783504670,6882942806404175,4090183263858592,0.99149734
+1394,7476679085912961,6882942806404175,4090183263858592,0.99260336
+1395,7498669318503963,6882942806404175,4090183263858592,0.9807351
+1397,7401912295166453,6882942806404175,4090183263858592,0.99913484
+1398,7300757225306777,6882942806404175,4090183263858592,0.99628204
+1399,7573436109244128,6882942806404175,4090183263858592,0.9968702
+1400,7406310341682448,6882942806404175,4090183263858592,0.9969886
+1401,7529455644096546,6882942806404175,4090183263858592,0.9982243
+1402,7243582620599881,6882942806404175,4090183263858592,0.9423365
+1403,7459086899865492,6882942806404175,4090183263858592,0.99839765
+1404,7529455644096537,6882942806404175,4090183263858592,0.9982272
+1405,7190806062434215,6882942806404175,4090183263858592,0.9986325
+1406,7287563085772746,6882942806404175,4090183263858592,0.99881727
+1407,7410708388176243,6882942806404175,4090183263858592,0.9993849
+1408,7384320109096452,6882942806404175,4090183263858592,0.999335
+1409,7230388481064642,6882942806404175,4090183263858592,0.99775416
+1410,7393116202118706,6882942806404175,4090183263858592,0.99934727
+1411,7476679085906251,6882942806404175,4090183263858592,0.99880135
+1412,7182009969397112,6882942806404175,4090183263858592,0.9607907
+1413,7230388481064691,6882942806404175,4090183263858592,0.9960686
+1414,7388718155624476,6882942806404175,4090183263858592,0.99678
+1415,7190806062434114,6882942806404175,4090183263858592,0.9980641
+1416,7428300574238769,6882942806404175,4090183263858592,0.9945075
+1417,7393116202126672,6882942806404175,4090183263858592,0.9994992
+1418,7573436109244075,6882942806404175,4090183263858592,0.99822706
+1419,7300757225306799,6882942806404175,4090183263858592,0.99028337
+1421,7450290806816403,6882942806404175,4090183263858592,0.99827754
+1422,7393116202139793,6882942806404175,4090183263858592,0.9592872
+1423,7507465411539339,6882942806404175,4090183263858592,0.99443024
+1424,7305155271832624,6882942806404175,4090183263858592,0.9965011
+1425,7190806062433642,6882942806404175,4090183263858592,0.992761
+1426,7243582620606573,6882942806404175,4090183263858592,0.99716055
+1427,7300757225308097,6882942806404175,4090183263858592,0.9947826
+1428,7476679085912859,6882942806404175,4090183263858592,0.99262625
+1429,7445892760297554,6882942806404175,4090183263858592,0.9962463
+1430,7261174806655442,6882942806404175,4090183263858592,0.9986469
+1431,7406310341661010,6882942806404175,4090183263858592,0.9994438
+1432,7256776760138022,6882942806404175,4090183263858592,0.9992824
+1433,7410708388176208,6882942806404175,4090183263858592,0.999435
+1434,7516261504570287,6882942806404175,4090183263858592,0.9906819
+1435,7375524016071065,6882942806404175,4090183263858592,0.99643373
+1436,7234786527562272,6882942806404175,4090183263858592,0.98535943
+1437,7507465411521407,6882942806404175,4090183263858592,0.97251546
+1438,7401912295166389,6882942806404175,4090183263858592,0.99919134
+1439,7366727923050382,6882942806404175,4090183263858592,0.99941254
+1440,7406310341679870,6882942806404175,4090183263858592,0.9821775
+1441,7261174806681929,6882942806404175,4090183263858592,0.9993548
+1442,7327145504412302,6882942806404175,4090183263858592,0.99586344
+1443,7195204108948041,6882942806404175,4090183263858592,0.9983012
+1444,7472281039392860,6882942806404175,4090183263858592,0.8184947
+1445,7243582620606610,6882942806404175,4090183263858592,0.9991277
+1446,7190806062434190,6882942806404175,4090183263858592,0.9963013
+1447,7547047830177241,6882942806404175,4090183263858592,0.99686384
+1448,7362329876531335,6882942806404175,4090183263858592,0.9962612
+1449,7261174806672752,6882942806404175,4090183263858592,0.9934541
+1450,7375524016063687,6882942806404175,4090183263858592,0.99573
+1451,7173213876375240,6882942806404175,4090183263858592,0.99180084
+1452,7322747457870071,6882942806404175,4090183263858592,0.98239994
+1453,7335941597433390,6882942806404175,4090183263858592,0.994584
+1454,7256776760138050,6882942806404175,4090183263858592,0.9995771
+1455,7261174806653910,6882942806404175,4090183263858592,0.99771297
+1456,7485475178942196,6882942806404175,4090183263858592,0.9988662
+1457,7406310341661104,6882942806404175,4090183263858592,0.99944216
+1458,7393116202118694,6882942806404175,4090183263858592,0.9992048
+1459,7256776760137990,6882942806404175,4090183263858592,0.9995208
+1460,7261174806678012,6882942806404175,4090183263858592,0.9991172
+1461,7247980667108738,6882942806404175,4090183263858592,0.9995609
+1462,7261174806677974,6882942806404175,4090183263858592,0.9981706
+1463,7388718155600343,6882942806404175,4090183263858592,0.9947126
+1464,7459086899847371,6882942806404175,4090183263858592,0.95768064
+1465,7182009969390746,6882942806404175,4090183263858592,0.9976705
+1466,7419504481208414,6882942806404175,4090183263858592,0.98272645
+1467,7168815829855627,6882942806404175,4090183263858592,0.86879003
+1468,7564640016220183,6882942806404175,4090183263858592,0.99847025
+1469,7393116202132317,6882942806404175,4090183263858592,0.99354726
+1470,7186408015907385,6882942806404175,4090183263858592,0.9977672
+1471,7296359178796166,6882942806404175,4090183263858592,0.9832313
+1472,7234786527577318,6882942806404175,4090183263858592,0.98988265
+1473,7463484946386258,6882942806404175,4090183263858592,0.99756086
+1474,7415106434700102,6882942806404175,4090183263858592,0.99941254
+1475,7410708388184576,6882942806404175,4090183263858592,0.99006826
+1476,7450290806825933,6882942806404175,4090183263858592,0.99795425
+1477,7243582620602234,6882942806404175,4090183263858592,0.99598783
+1478,7208398248478513,6882942806404175,4090183263858592,0.99629694
+1479,7547047830177233,6882942806404175,4090183263858592,0.99765235
+1480,7261174806678097,6882942806404175,4090183263858592,0.9991347
+1481,7472281039396687,6882942806404175,4090183263858592,0.9245484
+1482,7401912295166387,6882942806404175,4090183263858592,0.99934727
+1483,7265572853193077,6882942806404175,4090183263858592,0.9991116
+1484,7239184574099252,6882942806404175,4090183263858592,0.9995432
+1485,7225990434559241,6882942806404175,4090183263858592,0.9692091
+1486,7397514248655870,6882942806404175,4090183263858592,0.9993548
+1487,7261174806681907,6882942806404175,4090183263858592,0.99910873
+1488,7212796294988308,6882942806404175,4090183263858592,0.9974032
+1489,7388718155625531,6882942806404175,4090183263858592,0.9942983
+1490,7401912295166460,6882942806404175,4090183263858592,0.99920636
+1491,7401912295166468,6882942806404175,4090183263858592,0.9991173
+1492,7419504481208314,6882942806404175,4090183263858592,0.9693611
+1493,7243582620599836,6882942806404175,4090183263858592,0.9946238
+1494,7410708388178812,6882942806404175,4090183263858592,0.9915138
+1495,7529455644113160,6882942806404175,4090183263858592,0.998844
+1496,7230388481064648,6882942806404175,4090183263858592,0.999074
+1497,7186408015907366,6882942806404175,4090183263858592,0.9982888
+1498,7564640016232994,6882942806404175,4090183263858592,0.966499
+1499,7410708388188450,6882942806404175,4090183263858592,0.98034614
+1501,7476679085906169,6882942806404175,4090183263858592,0.99880683
+1502,7375524016077450,6882942806404175,4090183263858592,0.9903376
+1503,7564640016220138,6882942806404175,4090183263858592,0.99266124
+1504,7401912295170767,6882942806404175,4090183263858592,0.99327856
+1505,7393116202126605,6882942806404175,4090183263858592,0.9961798
+1506,7432698620772250,6882942806404175,4090183263858592,0.9946038
+1507,7388718155620880,6882942806404175,4090183263858592,0.9915138
+1508,7195204108948061,6882942806404175,4090183263858592,0.9954372
+1509,7463484946380137,6882942806404175,4090183263858592,0.9926197
+1510,7375524016070832,6882942806404175,4090183263858592,0.9968725
+1511,7419504481209847,6882942806404175,4090183263858592,0.994368
+1512,7401912295166441,6882942806404175,4090183263858592,0.99928385
+1513,7190806062434119,6882942806404175,4090183263858592,0.9926892
+1514,7322747457870173,6882942806404175,4090183263858592,0.99762946
+1515,7243582620606725,6882942806404175,4090183263858592,0.9990526
+1516,7182009969390750,6882942806404175,4090183263858592,0.9973732
+1517,7507465411520214,6882942806404175,4090183263858592,0.99048764
+1518,7384320109110710,6882942806404175,4090183263858592,0.9785064
+1519,7564640016220193,6882942806404175,4090183263858592,0.9964695
+1520,7256776760137934,6882942806404175,4090183263858592,0.9987943
+1521,7247980667119556,6882942806404175,4090183263858592,0.9963683
+1522,7247980667108777,6882942806404175,4090183263858592,0.99824667
+1523,7313951364850817,6882942806404175,4090183263858592,0.99811447
+1524,7397514248657844,6882942806404175,4090183263858592,0.9977695
+1525,7190806062435082,6882942806404175,4090183263858592,0.9975535
+1526,7256776760137985,6882942806404175,4090183263858592,0.9994617
+1527,7274368946213654,6882942806404175,4090183263858592,0.9951415
+1528,7375524016073976,6882942806404175,4090183263858592,0.999435
+1529,7283165039233194,6882942806404175,4090183263858592,0.99852645
+1530,7349135736965568,6882942806404175,4090183263858592,0.99632037
+1531,7357931830005065,6882942806404175,4090183263858592,0.97792953
+1532,7415106434691264,6882942806404175,4090183263858592,0.997024
+1533,7476679085912971,6882942806404175,4090183263858592,0.9924724
+1534,7182009969405113,6882942806404175,4090183263858592,0.9974993
+1535,7234786527586088,6882942806404175,4090183263858592,0.99661547
+1536,7256776760162558,6882942806404175,4090183263858592,0.99857056
+1537,7190806062433657,6882942806404175,4090183263858592,0.9960782
+1538,7186408015893914,6882942806404175,4090183263858592,0.9809441
+1539,7247980667108841,6882942806404175,4090183263858592,0.99888664
+1540,7410708388193494,6882942806404175,4090183263858592,0.99368805
+1542,7401912295156734,6882942806404175,4090183263858592,0.9989266
+1543,7547047830157993,6882942806404175,4090183263858592,0.99723524
+1544,7247980667108786,6882942806404175,4090183263858592,0.99865353
+1546,7243582620599822,6882942806404175,4090183263858592,0.9800608
+1548,7357931830005076,6882942806404175,4090183263858592,0.97648877
+1549,7406310341661030,6882942806404175,4090183263858592,0.9995258
+1550,7182009969390874,6882942806404175,4090183263858592,0.9565266
+1551,7186408015914333,6882942806404175,4090183263858592,0.98419464
+1552,7322747457894114,6882942806404175,4090183263858592,0.9946344
+1553,7256776760137958,6882942806404175,4090183263858592,0.9992312
+1554,7454688853339363,6882942806404175,4090183263858592,0.98012984
+1555,7256776760137904,6882942806404175,4090183263858592,0.99905795
+1556,7507465411530642,6882942806404175,4090183263858592,0.9951444
+1558,7437096667283276,6882942806404175,4090183263858592,0.98808634
+1559,7371125969554962,6882942806404175,4090183263858592,0.9994438
+1560,7454688853347415,6882942806404175,4090183263858592,0.9957652
+1561,7261174806653917,6882942806404175,4090183263858592,0.99764615
+1562,7542649783634679,6882942806404175,4090183263858592,0.997044
+1563,7375524016073954,6882942806404175,4090183263858592,0.999508
+1564,7388718155619688,6882942806404175,4090183263858592,0.99773645
+1565,7397514248655819,6882942806404175,4090183263858592,0.9994135
+1566,7406310341682479,6882942806404175,4090183263858592,0.99764615
+1567,7296359178777904,6874146713382665,4090183263858592,0.9820857
+1568,7186408015914354,6874146713382665,4090183263858592,0.976823
+1569,7204000201979335,6891738899432775,4090183263858599,0.9989893
+1570,7384320109100659,6891738899432775,4090183263858599,0.99865544
+1572,7388718155609362,6891738899432720,4090183263858619,0.994087
+1575,7186408015906779,6891738899432720,4090183263858619,0.841166
+1577,7366727923050314,6882942806404146,4090183263858619,0.9901337
+1578,7406310341674090,6891738899431728,4090183263858621,0.97164303
+1579,7371125969549286,6891738899431728,4090183263858621,0.97640264
+1580,7349135736984824,6891738899431728,4090183263858621,0.97532654
+1581,7349135736984757,6891738899431728,4090183263858621,0.9753287
+1582,7353533783504134,6891738899431728,4090183263858621,0.9764
+1583,7406310341674142,6891738899431728,4090183263858621,0.9716448
+1590,7230388481068727,6891738899432071,4090183263858628,0.9985967
+1594,7388718155601792,6891738899432071,4090183263858628,0.9968934
+1595,7393116202119567,6891738899432071,4090183263858628,0.9950139
+1596,7525057597594435,6891738899432071,4090183263858628,0.99941623
+1598,7454688853339479,6891738899432071,4090183263858628,0.9833409
+1600,7397514248650609,6891738899432071,4090183263858628,0.99914265
+1603,7204000201960973,6891738899432071,4090183263858628,0.9284748
+1604,7204000201961007,6891738899432071,4090183263858628,0.999567
+1605,7379922062574650,6891738899431956,4090183263858628,0.952374
+1606,7397514248650736,6891738899431797,4090183263858628,0.99906904
+1607,7230388481068738,6891738899431797,4090183263858628,0.99931216
+1608,7459086899850734,6891738899431642,4090183263858687,0.997678
+1609,7296359178796106,6891738899431642,4090183263858687,0.9980704
+1610,7296359178796084,6891738899431642,4090183263858687,0.9980703
+1611,7445892760317693,6891738899431642,4090183263858687,0.9983103
+1612,7489873225479650,6891738899431642,4090183263858687,0.99664956
+1613,7503067365006093,6891738899431642,4090183263858687,0.9978314
+1614,7362329876513581,6891738899431642,4090183263858687,0.9979963
+1615,7415106434695980,6891738899431642,4090183263858687,0.9941519
+1616,7371125969555594,6891738899431642,4090183263858687,0.9976883
+1617,7520659551068995,6891738899431642,4090183263858687,0.9985331
+1618,7450290806816275,6891738899431642,4090183263858687,0.99795246
+1619,7459086899850323,6891738899431642,4090183263858687,0.9959817
+1620,7445892760317667,6891738899431642,4090183263858687,0.9983095
+1621,7371125969555042,6891738899431642,4090183263858687,0.99817884
+1622,7371125969555641,6891738899431642,4090183263858687,0.99768806
+1623,7459086899850721,6891738899431642,4090183263858687,0.99801815
+1624,7393116202117389,6891738899431642,4090183263858687,0.9981592
+1625,7384320109104960,6891738899431642,4090183263858687,0.99883837
+1626,7445892760317704,6891738899431642,4090183263858687,0.998309
+1627,7498669318509622,6891738899431642,4090183263858687,0.9979361
+1628,7371125969555025,6891738899431642,4090183263858687,0.9973508
+1629,7379922062578883,6891738899431642,4090183263858687,0.99768853
+1630,7357931830020264,6891738899431642,4090183263858687,0.9979965
+1631,7450290806816269,6891738899431642,4090183263858687,0.9979539
+1632,7459086899850344,6891738899431642,4090183263858687,0.995981
+1633,7287563085772760,6891738899431642,4090183263858687,0.99807173
+1634,7520659551076256,6891738899431642,4090183263858687,0.9955232
+1635,7269970899702608,6891738899431642,4090183263858687,0.9969374
+1636,7371125969555102,6891738899431642,4090183263858687,0.99817884
+1637,7366727923047753,6891738899431642,4090183263858687,0.9981785
+1638,7371125969555092,6891738899431642,4090183263858687,0.99817836
+1639,7401912295166325,6891738899431642,4090183263858687,0.99483216
+1640,7379922062574580,6891738899431642,4090183263858687,0.9983242
+1641,7287563085772767,6891738899431642,4090183263858687,0.9980716
+1642,7287563085772741,6891738899431642,4090183263858687,0.99807173
+1643,7195204108942527,6891738899431642,4090183263858687,0.99847716
+1644,7362329876531229,6891738899431642,4090183263858687,0.99785787
+1645,7489873225479646,6891738899431642,4090183263858687,0.9985006
+1646,7379922062574591,6891738899431642,4090183263858687,0.99832517
+1647,7265572853193163,6891738899431642,4090183263858687,0.9983525
+1648,7459086899850328,6891738899431642,4090183263858687,0.9959818
+1649,7287563085772734,6891738899431642,4090183263858687,0.9980718
+1650,7520659551069003,6891738899431642,4090183263858687,0.99853384
+1651,7445892760315962,6891738899431642,4090183263858687,0.9972191
+1652,7401912295163137,6891738899431642,4090183263858687,0.9941527
+1653,7256776760146845,6891738899431642,4090183263858687,0.99834716
+1654,7463484946359883,6891738899431642,4090183263858687,0.99801815
+1655,7503067365006095,6891738899431642,4090183263858687,0.997832
+1656,7445892760315990,6891738899431642,4090183263858687,0.9972178
+1657,7388718155605662,6891738899431642,4090183263858687,0.99817836
+1658,7503067365006103,6891738899431642,4090183263858687,0.99287146
+1659,7362329876513582,6891738899431642,4090183263858687,0.99786466
+1660,7379922062572260,6891738899431642,4090183263858687,0.99832636
+1661,7327145504406432,6891738899431642,4090183263858687,0.9953055
+1662,7327145504406356,6891738899431642,4090183263858687,0.99648535
+1663,7445892760315999,6891738899431642,4090183263858687,0.9963742
+1664,7450290806816268,6891738899431642,4090183263858687,0.99795365
+1665,7498669318509625,6891738899431642,4090183263858687,0.99793637
+1666,7384320109104958,6891738899431642,4090183263858687,0.99847203
+1667,7393116202117406,6891738899431642,4090183263858687,0.99800617
+1668,7520659551068945,6891738899431642,4090183263858687,0.99626774
+1669,7511863458044432,6891738899431642,4090183263858687,0.998218
+1670,7371125969555062,6891738899431642,4090183263858687,0.99817896
+1671,7459086899850725,6891738899431642,4090183263858687,0.99615806
+1672,7459086899850303,6891738899431642,4090183263858687,0.9959799
+1673,7520659551069001,6891738899431642,4090183263858687,0.99853396
+1674,7503067365006090,6891738899431642,4090183263858687,0.99783164
+1675,7239184574102048,6891738899431642,4090183263858687,0.9985732
+1676,7371125969555029,6891738899431642,4090183263858687,0.99817884
+1677,7371125969555686,6891738899431642,4090183263858687,0.9976883
+1678,7366727923031790,6891738899431642,4090183263858687,0.9981407
+1679,7379922062578897,6891738899431642,4090183263858687,0.99768853
+1680,7296359178796099,6891738899431642,4090183263858687,0.99807173
+1681,7357931830020270,6891738899431642,4090183263858687,0.9979995
+1682,7459086899850788,6891738899431642,4090183263858687,0.99636406
+1683,7445892760317698,6891738899431642,4090183263858687,0.99555296
+1684,7362329876513579,6891738899431642,4090183263858687,0.9978642
+1685,7445892760317679,6891738899431642,4090183263858687,0.9983103
+1686,7366727923031785,6891738899431642,4090183263858687,0.9934794
+1687,7459086899850423,6891738899431642,4090183263858687,0.995981
+1688,7498669318509629,6891738899431642,4090183263858687,0.99793506
+1689,7397514248645152,6874146713380997,4090183263858687,0.9996561
+1690,7564640016225726,6874146713380997,4090183263858687,0.9996636
+1691,7388718155600229,6874146713380997,4090183263858687,0.9996561
+1692,7340339643943651,6874146713380997,4090183263858687,0.9996669
+1693,7349135736966268,6874146713380997,4090183263858687,0.9996685
+1694,7406310341679881,6874146713380997,4090183263858687,0.99979
+1695,7520659551076441,6874146713380997,4090183263858687,0.9996635
+1696,7423902527730985,6874146713380997,4090183263858687,0.9997094
+1697,7393116202138438,6874146713380997,4090183263858687,0.99958974
+1698,7247980667127379,6874146713380997,4090183263858687,0.9995931
+1699,7393116202138456,6874146713380997,4090183263858687,0.9996413
+1700,7560241969711838,6874146713380997,4090183263858687,0.9996569
+1701,7379922062578967,6874146713380997,4090183263858687,0.99967194
+1702,7410708388178560,6874146713380997,4090183263858687,0.99963355
+1703,7164417783344886,6874146713380997,4090183263858687,0.999648
+1704,7252378713636375,6874146713380997,4090183263858687,0.9995931
+1705,7384320109091359,6874146713380997,4090183263858687,0.9996309
+1706,7397514248645135,6874146713380997,4090183263858687,0.99967337
+1707,7230388481074507,6874146713380997,4090183263858687,0.99958974
+1708,7406310341679813,6874146713380997,4090183263858687,0.9997968
+1709,7384320109091305,6874146713380997,4090183263858687,0.9996687
+1710,7401912295150994,6874146713380997,4090183263858687,0.99958783
+1711,7256776760140800,6874146713380997,4090183263858687,0.9996419
+1712,7230388481074565,6874146713380997,4090183263858687,0.99958974
+1713,7388718155600223,6874146713380997,4090183263858687,0.9995877
+1714,7234786527587799,6874146713380997,4090183263858687,0.9996562
+1715,7261174806676777,6874146713380997,4090183263858687,0.99967337
+1716,7384320109091450,6874146713380997,4090183263858687,0.999655
+1717,7261174806676787,6874146713380997,4090183263858687,0.99967337
+1718,7560241969711871,6874146713380997,4090183263858687,0.9996532
+1719,7340339643943773,6874146713380997,4090183263858687,0.9996112
+1720,7401912295151074,6874146713380997,4090183263858687,0.9996309
+1721,7362329876534168,6874146713380997,4090183263858687,0.9996561
+1722,7256776760140728,6874146713380997,4090183263858687,0.99958974
+1723,7393116202138398,6874146713380997,4090183263858687,0.99958974
+1724,7349135736966254,6874146713380997,4090183263858687,0.99965954
+1725,7234786527587895,6874146713380997,4090183263858687,0.9995931
+1726,7234786527587771,6874146713380997,4090183263858687,0.9996562
+1727,7331543550920406,6874146713380997,4090183263858687,0.9996426
+1728,7261174806676770,6874146713380997,4090183263858687,0.99967337
+1729,7393116202138692,6874146713380997,4090183263858687,0.99958974
+1730,7388718155600226,6874146713380997,4090183263858687,0.9996309
+1731,7379922062578951,6874146713380997,4090183263858687,0.9996561
+1732,7234786527587830,6874146713380997,4090183263858687,0.9995931
+1733,7340339643943796,6874146713380997,4090183263858687,0.99955755
+1734,7388718155600193,6874146713380997,4090183263858687,0.9996309
+1735,7269970899705087,6874146713380997,4090183263858687,0.9996569
+1736,7520659551076390,6874146713380997,4090183263858687,0.9996562
+1737,7520659551076460,6874146713380997,4090183263858687,0.9996636
+1738,7397514248645179,6874146713380997,4090183263858687,0.9996561
+1739,7560241969711950,6874146713380997,4090183263858687,0.9996636
+1740,7397514248645173,6874146713380997,4090183263858687,0.9996561
+1741,7234786527587937,6874146713380997,4090183263858687,0.9996562
+1742,7340339643943742,6874146713380997,4090183263858687,0.9996669
+1743,7287563085749224,6874146713380997,4090183263858687,0.9996718
+1744,7177611922878076,6874146713380997,4090183263858687,0.99967265
+1745,7261174806676802,6874146713380997,4090183263858687,0.99967194
+1746,7520659551076475,6874146713380997,4090183263858687,0.9996562
+1747,7379922062578964,6874146713380997,4090183263858687,0.9995877
+1748,7287563085749239,6874146713380997,4090183263858687,0.99967337
+1749,7340339643943801,6874146713380997,4090183263858687,0.9996669
+1750,7234786527587783,6874146713380997,4090183263858687,0.9996301
+1751,7204000201960951,6874146713380997,4090183263858687,0.99900407
+1752,7401912295151025,6874146713380997,4090183263858687,0.9995877
+1753,7177611922878098,6874146713380997,4090183263858687,0.99967265
+1754,7388718155600190,6874146713380997,4090183263858687,0.9996561
+1755,7401912295150988,6874146713380997,4090183263858687,0.9995877
+1756,7410708388178540,6874146713380997,4090183263858687,0.9996687
+1757,7256776760140818,6874146713380997,4090183263858687,0.99958974
+1758,7362329876513646,6874146713380997,4090183263858687,0.9996532
+1759,7247980667127399,6874146713380997,4090183263858687,0.9996301
+1760,7177611922878116,6874146713380997,4090183263858687,0.99967253
+1761,7520659551076395,6874146713380997,4090183263858687,0.9996301
+1762,7560241969711965,6874146713380997,4090183263858687,0.9996568
+1763,7406310341679901,6874146713380997,4090183263858687,0.99973506
+1764,7269970899705022,6874146713380997,4090183263858687,0.9996569
+1765,7393116202138715,6874146713380997,4090183263858687,0.99958974
+1766,7393116202138426,6874146713380997,4090183263858687,0.99958974
+1767,7177611922878175,6874146713380997,4090183263858687,0.99967265
+1768,7393116202141105,6874146713380997,4090183263858687,0.9996295
+1769,7256776760140820,6874146713380997,4090183263858687,0.9996419
+1770,7274368946212576,6891738899432746,4090183263858687,0.9995192
+1771,7230388481069130,6891738899432746,4090183263858687,0.9996
+1772,7331543550908294,6891738899432746,4090183263858687,0.99938655
+1773,7410708388176235,6891738899432746,4090183263858687,0.9995351
+1774,7560241969711200,6891738899432746,4090183263858687,0.9991566
+1775,7265572853193105,6891738899432746,4090183263858687,0.9995503
+1776,7419504481209713,6891738899432746,4090183263858687,0.999671
+1777,7410708388188316,6891738899432746,4090183263858687,0.99946254
+1778,7375524016073999,6891738899432746,4090183263858687,0.99957234
+1779,7379922062581673,6891738899432746,4090183263858687,0.99965036
+1780,7265572853192648,6891738899432746,4090183263858687,0.99907935
+1781,7296359178804271,6891738899432746,4090183263858687,0.9991441
+1782,7529455644106227,6891738899432746,4090183263858687,0.9993531
+1783,7379922062581721,6891738899432746,4090183263858687,0.99965465
+1784,7217194341502040,6891738899432746,4090183263858687,0.999577
+1785,7410708388176232,6891738899432746,4090183263858687,0.9995499
+1786,7349135736986052,6891738899432746,4090183263858687,0.9995303
+1787,7230388481069844,6891738899432746,4090183263858687,0.9995459
+1788,7186408015909694,6891738899432746,4090183263858687,0.9991566
+1789,7357931830010812,6891738899432746,4090183263858687,0.9994789
+1790,7401912295165065,6891738899432746,4090183263858687,0.999627
+1791,7322747457869800,6891738899432746,4090183263858687,0.99921834
+1792,7503067365010513,6891738899432746,4090183263858687,0.9996395
+1793,7401912295164957,6891738899432746,4090183263858687,0.9996489
+1794,7529455644099354,6891738899432746,4090183263858687,0.9994184
+1795,7357931830012230,6891738899432746,4090183263858687,0.9995277
+1796,7296359178804228,6891738899432746,4090183263858687,0.9994281
+1797,7388718155600737,6891738899432746,4090183263858687,0.9996779
+1798,7520659551076212,6891738899432746,4090183263858687,0.9995803
+1799,7300757225298871,6891738899432746,4090183263858687,0.99927694
+1800,7366727923049263,6891738899432746,4090183263858687,0.99913955
+1801,7357931830010815,6891738899432746,4090183263858687,0.99957734
+1802,7186408015909735,6891738899432746,4090183263858687,0.99935323
+1803,7379922062581666,6891738899432746,4090183263858687,0.99965036
+1804,7190806062425796,6891738899432746,4090183263858687,0.99930394
+1805,7410708388176238,6891738899432746,4090183263858687,0.9994336
+1806,7547047830177189,6891738899432746,4090183263858687,0.99968565
+1807,7388718155627489,6891738899432746,4090183263858687,0.99914885
+1808,7529455644099336,6891738899432746,4090183263858687,0.99941754
+1809,7393116202126636,6891738899432746,4090183263858687,0.99948573
+1810,7529455644099537,6891738899432746,4090183263858687,0.99925894
+1811,7401912295156723,6891738899432746,4090183263858687,0.99953914
+1812,7296359178804217,6891738899432746,4090183263858687,0.9989262
+1813,7529455644099509,6891738899432746,4090183263858687,0.99941826
+1814,7538251737120485,6891738899432746,4090183263858687,0.9995803
+1815,7520659551068937,6891738899432746,4090183263858687,0.99970216
+1816,7415106434695571,6891738899432746,4090183263858687,0.9992879
+1817,7379922062581687,6891738899432746,4090183263858687,0.99964726
+1818,7573436109244031,6891738899432746,4090183263858687,0.99943215
+1819,7529455644099416,6891738899432746,4090183263858687,0.99925977
+1820,7243582620606737,6891738899432746,4090183263858687,0.9995246
+1821,7463484946386302,6891738899432746,4090183263858687,0.9991098
+1822,7547047830177197,6891738899432746,4090183263858687,0.99953914
+1823,7291961132265183,6891738899432746,4090183263858687,0.99964964
+1824,7454688853351525,6891738899432746,4090183263858687,0.9993481
+1825,7393116202141673,6891738899432746,4090183263858687,0.9987029
+1826,7274368946212505,6891738899432746,4090183263858687,0.99959856
+1827,7190806062434885,6891738899432746,4090183263858687,0.9995468
+1828,7278766992727972,6891738899432746,4090183263858687,0.999134
+1829,7560241969711196,6891738899432746,4090183263858687,0.9991565
+1830,7357931830014411,6891738899432746,4090183263858687,0.99958915
+1831,7366727923049267,6891738899432746,4090183263858687,0.9991394
+1832,7371125969542408,6891738899432746,4090183263858687,0.99913955
+1833,7406310341676768,6891738899432746,4090183263858687,0.9997056
+1834,7357931830012214,6891738899432746,4090183263858687,0.99955493
+1835,7357931830015305,6891738899432746,4090183263858687,0.99960405
+1836,7269970899703789,6891738899432746,4090183263858687,0.9991346
+1837,7379922062581627,6891738899432746,4090183263858687,0.99965453
+1838,7520659551074162,6891738899432746,4090183263858687,0.9986268
+1839,7256776760138014,6891738899432746,4090183263858687,0.999548
+1840,7357931830012226,6891738899432746,4090183263858687,0.9995364
+1841,7366727923050320,6891738899432746,4090183263858687,0.9995111
+1842,7401912295164950,6891738899432746,4090183263858687,0.998307
+1843,7393116202118718,6891738899432746,4090183263858687,0.9994873
+1844,7406310341674002,6891738899432746,4090183263858687,0.9990152
+1845,7379922062581578,6891738899432746,4090183263858687,0.9996474
+1846,7322747457869806,6891738899432746,4090183263858687,0.99941325
+1847,7393116202141545,6891738899432746,4090183263858687,0.998703
+1848,7463484946386308,6891738899432746,4090183263858687,0.9991098
+1849,7379922062581680,6891738899432746,4090183263858687,0.9996474
+1850,7533853690611374,6891738899432746,4090183263858687,0.9992599
+1851,7252378713632833,6891738899432746,4090183263858687,0.9995716
+1852,7269970899703779,6891738899432746,4090183263858687,0.99913424
+1853,7388718155620433,6891738899432746,4090183263858687,0.9995499
+1854,7296359178804238,6891738899432746,4090183263858687,0.9993325
+1855,7296359178804240,6891738899432746,4090183263858687,0.999366
+1856,7247980667108762,6891738899432746,4090183263858687,0.9995278
+1857,7186408015909729,6891738899432746,4090183263858687,0.9993536
+1858,7269970899703814,6891738899432746,4090183263858687,0.99928766
+1859,7538251737120490,6891738899432746,4090183263858687,0.99960035
+1860,7353533783504039,6891738899431237,4090183263858687,0.99592716
+1861,7349135736984747,6891738899431237,4090183263858687,0.9961641
+1862,7349135736985064,6891738899431237,4090183263858687,0.9961606
+1863,7327145504409084,6891738899431237,4090183263858687,0.9951794
+1864,7353533783504121,6891738899431237,4090183263858687,0.99592173
+1865,7428300574265504,6891738899432954,4090183263858687,0.9982457
+1866,7287563085745538,6891738899430886,4090183263858687,0.99099296
+1867,7247980667127301,6891738899432912,4090183263858693,0.8345376
+1868,7182009969406471,6891738899432912,4090183263858693,0.977576
+1869,7432698620769656,6891738899432912,4090183263858693,0.9953713
+1870,7313951364851558,6891738899432912,4090183263858693,0.9938093
+1871,7204000201982675,6891738899432912,4090183263858693,0.9867749
+1872,7459086899847349,6891738899432912,4090183263858693,0.97108704
+1873,7331543550908465,6891738899432912,4090183263858693,0.99464285
+1874,7388718155601222,6891738899432845,4090183263858693,0.9972173
+1875,7204000201969329,6891738899432845,4090183263858693,0.9969669
+1876,7340339643957338,6891738899425633,4090183263858693,0.970699
+1877,7489873225479660,6891738899425633,4090183263858693,0.9806851
+1878,7313951364851571,6891738899430554,4090183263858693,0.98779106
+1879,7401912295164698,6891738899431702,4090183263858707,0.9204756
+1880,7384320109103844,6891738899430457,4103377403391695,0.9361284
+1881,7393116202119647,6891738899430457,4103377403391695,0.9932615
+1882,7393116202139236,6896136945937747,4103377403391695,0.9835174
+1883,7371125969559339,6896136945937747,4103377403391695,0.928002
+1884,7234786527561046,6896136945937747,4103377403391695,0.99389535
+1885,7401912295171636,6896136945937747,4103377403391695,0.9687418
+1886,7393116202117447,6896136945937747,4103377403391695,0.9938725
+1887,7393116202141155,6896136945937747,4103377403391695,0.9954659
+1888,7401912295163117,6896136945937747,4103377403391695,0.99431616
+1889,7393116202138479,6896136945937747,4103377403391695,0.99521506
+1890,7353533783487926,6896136945937747,4103377403391695,0.9692336
+1891,7410708388184602,6896136945937747,4103377403391695,0.9811489
+1892,7362329876513626,6896136945937747,4103377403391695,0.99306595
+1893,7256776760158758,6891738899431240,4103377403391698,0.99848396
+1894,7195204108937241,6891738899431240,4103377403391698,0.9969261
+1895,7533853690611213,6891738899431240,4103377403391698,0.9972065
+1896,7564640016221342,6891738899431240,4103377403391698,0.99657685
+1897,7177611922879020,6891738899431240,4103377403391698,0.9883731
+1898,7388718155601342,6891738899431240,4103377403391698,0.99382496
+1899,7349135736986081,6891738899431240,4103377403391698,0.99350065
+1900,7349135736986043,6891738899431240,4103377403391698,0.99496704
+1901,7278766992742712,6891738899431240,4103377403391698,0.9952749
+1902,7401912295171626,6891738899431240,4103377403391698,0.9937495
+1903,7485475178942134,6891738899431240,4103377403391698,0.9888735
+1904,7379922062572310,6891738899431556,4103377403391713,0.9985934
+1905,7384320109097162,6891738899431556,4103377403391713,0.9991447
+1906,7459086899850304,6891738899431556,4103377403391713,0.9989427
+1907,7415106434695574,6891738899431556,4103377403391713,0.985247
+1908,7371125969555742,6891738899431556,4103377403391713,0.99904114
+1909,7388718155627429,6891738899431556,4103377403391713,0.9988117
+1910,7525057597591933,6891738899431556,4103377403391713,0.9985644
+1911,7432698620780942,6891738899431556,4103377403391713,0.9982784
+1912,7393116202138334,6891738899431556,4103377403391713,0.9993339
+1913,7463484946359912,6891738899431556,4103377403391713,0.99932015
+1914,7349135736984688,6882942806404166,4103377403391721,0.992357
+1915,7498669318483662,6891738899432009,4103377403391721,0.98970723
+1916,7573436109249661,6891738899432009,4103377403391721,0.99259067
+1917,7547047830177253,6891738899432009,4103377403391721,0.9817285
+1918,7274368946202172,6891738899432009,4103377403391721,0.9776159
+1919,7340339643939147,6891738899432009,4103377403391721,0.9870107
+1920,7173213876375159,6891738899432009,4103377403391721,0.9747575
+1921,7388718155600634,6891738899432009,4103377403391721,0.98759276
+1922,7278766992743798,6891738899432009,4103377403391721,0.9920797
+1923,7489873225461663,6891738899432009,4103377403391721,0.9917762
+1924,7278766992743795,6891738899432009,4103377403391721,0.99098927
+1925,7274368946202168,6891738899432009,4103377403391721,0.97718674
+1926,7173213876375162,6891738899432009,4103377403391721,0.97851884
+1927,7388718155600626,6891738899432009,4103377403391721,0.9896953
+1928,7472281039392040,6891738899432009,4103377403391721,0.99074835
+1929,7278766992743782,6891738899432009,4103377403391721,0.9892721
+1930,7498669318483656,6891738899432009,4103377403391721,0.99097997
+1931,7459086899855577,6891738899432009,4103377403391721,0.9696322
+1932,7406310341679861,6891738899432009,4103377403391721,0.9848573
+1933,7177611922888144,6891738899432009,4103377403391721,0.9933302
+1934,7547047830177285,6891738899432009,4103377403391721,0.9871422
+1935,7327145504412185,6891738899432009,4103377403391721,0.98875904
+1936,7190806062434116,6891738899432009,4103377403391721,0.9847882
+1937,7173213876375166,6891738899432009,4103377403391721,0.9797894
+1941,7459086899850741,6891738899431434,4103377403391721,0.84888613
+1943,7353533783475417,6891738899431434,4103377403391721,0.93801177
+1945,7261174806657262,6891738899431434,4103377403391721,0.90367794
+1946,7529455644109708,6891738899431434,4103377403391721,0.97575706
+1947,7327145504406420,6891738899431434,4103377403391721,0.92068434
+1948,7516261504563588,6891738899431434,4103377403391721,0.94282013
+1949,7182009969406484,6891738899431434,4103377403391721,0.9539472
+1950,7459086899850329,6891738899431434,4103377403391721,0.96451366
+1951,7467882992876074,6891738899431434,4103377403391721,0.9197058
+1952,7353533783497438,6874146713382797,4103377403391721,0.9767045
+1953,7349135736989809,6874146713382797,4103377403391721,0.94378865
+1954,7278766992739145,6874146713382797,4103377403391721,0.98152566
+1955,7503067365011927,6874146713382797,4103377403391721,0.9920859
+1963,7410708388194278,6891738899430710,4103377403391721,0.9958631
+1964,7419504481214899,6891738899430710,4103377403391721,0.99688196
+1965,7406310341674121,6891738899430710,4103377403391721,0.9969168
+1967,7212796294985040,6891738899432942,4103377403391721,0.96538657
+1968,7252378713625140,6891738899432942,4103377403391721,0.9713936
+1969,7243582620598790,6891738899432942,4103377403391721,0.97678137
+1970,7252378713625135,6891738899432942,4103377403391721,0.9713936
+1971,7459086899850651,6891738899432942,4103377403391721,0.98398376
+1972,7252378713625133,6891738899432942,4103377403391721,0.9713936
+1973,7243582620598785,6891738899432942,4103377403391721,0.97678137
+1974,7397514248650015,6891738899431521,4103377403391721,0.9828152
+1975,7406310341674021,6891738899431521,4103377403391721,0.95071226
+1976,7415106434695403,6891738899431521,4103377403391721,0.9464041
+1977,7410708388194178,6891738899431521,4103377403391721,0.9330464
+1978,7204000201982723,6891738899431918,4103377403391721,0.9975229
+1979,7432698620769986,6891738899431918,4103377403391721,0.99603844
+1980,7432698620780895,6891738899431918,4103377403391721,0.988628
+1981,7168815829843996,6891738899431918,4103377403391721,0.9703864
+1983,7507465411521477,6874146713382780,4103377403391721,0.8305039
+1988,7401912295164847,6891738899430480,4103377403391721,0.9907855
+1989,7212796294985033,6891738899430480,4103377403391721,0.9920316
+1990,7401912295164805,6891738899430480,4103377403391721,0.97734135
+1991,7274368946207470,6891738899430480,4103377403391721,0.9917998
+1992,7212796294985036,6891738899430480,4103377403391721,0.9920089
+1993,7467882992890546,6891738899430480,4103377403391721,0.8673959
+1994,7375524016070834,6891738899430480,4103377403391721,0.9934695
+1996,7375524016071007,6874146713382686,4103377403391721,0.91406566
+1998,7388718155625393,6891738899433152,4103377403391721,0.9991648
+1999,7190806062427949,6891738899433152,4103377403391721,0.9996377
+2005,7498669318503793,6874146713382674,4103377403391722,0.8273905
+2006,7177611922878848,6874146713382674,4103377403391722,0.84956753
+2007,7463484946386169,6874146713382674,4103377403391722,0.84956753
+2008,7375524016055537,6891738899431554,4103377403391725,0.99778146
+2009,7283165039231471,6891738899432875,4103377403391728,0.8092789
+2012,7182009969405589,6891738899431685,4103377403391728,0.9498883
+2013,7274368946200947,6891738899431685,4103377403391728,0.99981004
+2014,7569038062740859,6882942806404175,4103377403391733,0.93068075
+2015,7274368946212661,6882942806404175,4103377403391733,0.88709515
+2016,7243582620606627,6882942806404175,4103377403391733,0.88734275
diff --git a/data/solr/data/log4j2.xml b/data/solr/data/log4j2.xml
old mode 100644
new mode 100755
diff --git a/data/solr/log4j2.xml b/data/solr/log4j2.xml
old mode 100644
new mode 100755
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
index 0c8a7d74..ec03fb4d 100644
--- a/docker-compose.dev.yml
+++ b/docker-compose.dev.yml
@@ -1,31 +1,31 @@
-version: '3'
+version: '3.8'
services:
- nginx-proxy:
- restart: "always"
- ports:
- - "80:80"
- - "443:443"
- labels:
- - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
- volumes:
- # - ./data/var/run/docker.sock:/tmp/docker.sock:ro
- - ./data/opt/integreat/dev/usr/share/nginx/html:/usr/share/nginx/html
- database:
- restart: "always"
- ports:
- - "5432:5432"
- datomic-transactor:
- restart: "always"
- environment:
- - DATOMIC_PORT=4334
- - XMS=-Xms3g
- - XMX=-Xmx6g
- ulimits:
- nofile:
- soft: 65536
- hard: 65536
- ports:
- - 4334:4334
+# nginx-proxy:
+# restart: "always"
+# ports:
+# - "80:80"
+# - "443:443"
+# labels:
+# - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
+# volumes:
+# # - ./data/var/run/docker.sock:/tmp/docker.sock:ro
+# - ./data/opt/integreat/dev/usr/share/nginx/html:/usr/share/nginx/html
+# database:
+# restart: "always"
+# ports:
+# - "5432:5432"
+# datomic-transactor:
+# restart: "always"
+# environment:
+# - DATOMIC_PORT=4334
+# - XMS=-Xms3g
+# - XMX=-Xmx6g
+# ulimits:
+# nofile:
+# soft: 65536
+# hard: 65536
+# ports:
+# - 4334:4334
solr:
volumes:
- ./data/solr:/var/solr
diff --git a/docker-compose.yml b/docker-compose.yml
index 4bac2800..d8413888 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,55 +1,70 @@
-version: '3'
+version: '3.8'
services:
- nginx-proxy:
- image: jwilder/nginx-proxy:alpine
- labels:
- - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
- volumes:
- - /var/run/docker.sock:/tmp/docker.sock:ro
- - ./data/certs/:/etc/nginx/certs:ro
- - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d
- - ./data/usr/share/nginx/html:/usr/share/nginx/html
- - ./data/etc/nginx/conf.d:/etc/nginx/conf.d
- letsencrypt:
- image: jrcs/letsencrypt-nginx-proxy-companion:stable
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock:ro
- - ./data/certs/:/etc/nginx/certs
- - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d
- - ./data/usr/share/nginx/html:/usr/share/nginx/html
- app:
- build: .
- expose:
- - 3000
- depends_on:
- - database
- - datomic-transactor
- environment:
- config: /usr/local/config/local.edn
- VIRTUAL_HOST: local.app.integreatconsult.com
- VIRTUAL_PORT: 3000
- database:
- image: postgres:9-alpine
- environment:
- POSTGRES_USER: ap
- POSTGRES_PASSWORD: fifteen-invoices-imported!
- POSTGRES_DB: autoap
- volumes:
- - ./data/var/lib/postgresql/data:/var/lib/postgresql/data
+ # nginx-proxy:
+ # image: jwilder/nginx-proxy:alpine
+ # labels:
+ # - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
+ # volumes:
+ # - /var/run/docker.sock:/tmp/docker.sock:ro
+ # - ./data/certs/:/etc/nginx/certs:ro
+ # - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d
+ # - ./data/usr/share/nginx/html:/usr/share/nginx/html
+ # - ./data/etc/nginx/conf.d:/etc/nginx/conf.d
+ # letsencrypt:
+ # image: jrcs/letsencrypt-nginx-proxy-companion:stable
+ # volumes:
+ # - /var/run/docker.sock:/var/run/docker.sock:ro
+ # - ./data/certs/:/etc/nginx/certs
+ # - ./data/etc/nginx/vhost.d:/etc/nginx/vhost.d
+ # - ./data/usr/share/nginx/html:/usr/share/nginx/html
+ # app:
+ # build: .
+ # expose:
+ # - 3000
+ # depends_on:
+ # - database
+ # - datomic-transactor
+ # environment:
+ # config: /usr/local/config/local.edn
+ # VIRTUAL_HOST: local.app.integreatconsult.com
+ # VIRTUAL_PORT: 3000
+ # database:
+ # image: postgres:9-alpine
+ # environment:
+ # POSTGRES_USER: ap
+ # POSTGRES_PASSWORD: fifteen-invoices-imported!
+ # POSTGRES_DB: autoap
+ # volumes:
+ # - ./data/var/lib/postgresql/data:/var/lib/postgresql/data
solr:
image: solr
+ user: solr
+ # network_mode: bridge
ports:
- - "8983:8983"
- datomic-transactor:
- depends_on:
- - database
- image: 679918342773.dkr.ecr.us-east-1.amazonaws.com/datomic:latest
- environment:
- - DATOMIC_HOST=datomic-transactor
- - DATOMIC_PORT=4334
- - DATOMIC_SQL_HOST=database
- ports:
- - 4334:4334
- restart: on-failure
-
-
+ - 8983:8983
+ ulimits:
+ nofile:
+ soft: "65536"
+ hard: "65536"
+ # datomic-transactor:
+ # depends_on:
+ # - database
+ # image: 679918342773.dkr.ecr.us-east-1.amazonaws.com/datomic:latest
+ # environment:
+ # - DATOMIC_HOST=datomic-transactor
+ # - DATOMIC_PORT=4334
+ # - DATOMIC_SQL_HOST=database
+ # ports:
+ # - 4334:4334
+ # restart: on-failure
+networks:
+ default:
+ driver: bridge
+ attachable: false
+ driver_opts:
+ com.docker.network.bridge.default_bridge: "true"
+ com.docker.network.bridge.enable_icc: "true"
+ com.docker.network.bridge.enable_ip_masquerade: "true"
+ com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
+ com.docker.network.bridge.name: "docker0"
+ com.docker.network.driver.mtu: "1500"
diff --git a/notes.txt b/notes.txt
index 9604ab2b..af5c7d31 100644
--- a/notes.txt
+++ b/notes.txt
@@ -1,25 +1 @@
-1) Aligning checks
-2) popup blocker -- disable X
-3) Splitting accounts
-4) Permissions per location
-5) List of payments
-6) add payment
-7) add invoice - X
-
-
-
---
-Rules priority:
-Match check
-Match debit
-Match rule (assign vendor and account)
- + Memo
- + Wild card matches
- + Match memo and amount
- + Match for specificclient
- + Match for specifo
-
-Transfers
-Splits
-
-
+4. Maybe make dark mode persist
diff --git a/package-lock.json b/package-lock.json
index 4db21d7e..f0367b9e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,6 +12,7 @@
"@popperjs/core": "^2.11.5",
"downshift": "^6.1.3",
"dropzone": "^4.3.0",
+ "flowbite": "^1.6.5",
"minisearch": "^3.0.2",
"prop-types": "^15.7.2",
"react": "^17.0.1",
@@ -19,16 +20,29 @@
"react-plaid-link": "^3.3.2",
"react-popper": "^2.3.0",
"react-prop-types": "^0.4.0",
- "react-signature-canvas": "^1.0.3",
- "react-signature-pad": "0.0.6",
+ "react-signature-canvas": "^1.0.6",
"react-transition-group": "^4.4.2",
- "recharts": "^1.4.2"
+ "recharts": "^2.5.0"
},
"devDependencies": {
+ "@tailwindcss/forms": "^0.5.3",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1"
}
},
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@babel/runtime": {
"version": "7.14.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz",
@@ -104,6 +118,44 @@
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/@popperjs/core": {
"version": "2.11.5",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz",
@@ -113,6 +165,72 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@tailwindcss/forms": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz",
+ "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==",
+ "dev": true,
+ "dependencies": {
+ "mini-svg-data-uri": "^1.2.3"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1"
+ }
+ },
+ "node_modules/@types/d3-array": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz",
+ "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ=="
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA=="
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz",
+ "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA=="
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz",
+ "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg=="
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz",
+ "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz",
+ "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz",
+ "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz",
+ "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g=="
+ },
"node_modules/@types/eslint": {
"version": "8.4.10",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz",
@@ -399,10 +517,74 @@
"ajv": "^6.9.1"
}
},
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true,
+ "peer": true
+ },
"node_modules/balanced-match": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
- "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
"node_modules/browserslist": {
"version": "4.16.0",
@@ -433,12 +615,63 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
+ "node_modules/camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001170",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz",
"integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==",
"dev": true
},
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/chrome-trace-event": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
@@ -487,12 +720,12 @@
"resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz",
"integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg=="
},
- "node_modules/core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
- "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
- "hasInstallScript": true
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "peer": true
},
"node_modules/cross-spawn": {
"version": "7.0.3",
@@ -508,76 +741,137 @@
"node": ">= 8"
}
},
+ "node_modules/css-unit-converter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
+ "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA=="
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/csstype": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
"integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
},
"node_modules/d3-array": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
- "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
- },
- "node_modules/d3-collection": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
- "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz",
+ "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
},
"node_modules/d3-color": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
- "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "engines": {
+ "node": ">=12"
+ }
},
"node_modules/d3-format": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
- "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "engines": {
+ "node": ">=12"
+ }
},
"node_modules/d3-interpolate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
- "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"dependencies": {
- "d3-color": "1"
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/d3-path": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
- "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "engines": {
+ "node": ">=12"
+ }
},
"node_modules/d3-scale": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
- "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
"dependencies": {
- "d3-array": "^1.2.0",
- "d3-collection": "1",
- "d3-format": "1",
- "d3-interpolate": "1",
- "d3-time": "1",
- "d3-time-format": "2"
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/d3-shape": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
- "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"dependencies": {
- "d3-path": "1"
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/d3-time": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
- "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
},
"node_modules/d3-time-format": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
- "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
"dependencies": {
- "d3-time": "1"
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "engines": {
+ "node": ">=12"
}
},
"node_modules/decimal.js-light": {
@@ -585,6 +879,20 @@
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="
},
+ "node_modules/didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true,
+ "peer": true
+ },
"node_modules/dom-helpers": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
@@ -707,6 +1015,11 @@
"node": ">=4.0"
}
},
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ },
"node_modules/events": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
@@ -722,6 +1035,44 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
+ "node_modules/fast-equals": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
+ "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -737,12 +1088,100 @@
"node": ">= 4.9.1"
}
},
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flowbite": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.6.5.tgz",
+ "integrity": "sha512-eI4h3pIRI9d7grlYq14r0A01KUtw7189sPLLx/O2i7JyPEWpbleScfYuEc48XTeNjk1xxm/JHgZkD9kjyOWAlA==",
+ "dependencies": {
+ "@popperjs/core": "^2.9.3",
+ "mini-svg-data-uri": "^1.4.3"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
@@ -856,6 +1295,32 @@
"node": ">=8"
}
},
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/interpret": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
@@ -865,6 +1330,19 @@
"node": ">=10.13.0"
}
},
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
@@ -877,6 +1355,39 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
"node_modules/is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -918,6 +1429,16 @@
"node": ">= 10.13.0"
}
},
+ "node_modules/jiti": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
+ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -944,6 +1465,23 @@
"node": ">=0.10.0"
}
},
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "peer": true
+ },
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -954,19 +1492,9 @@
}
},
"node_modules/lodash": {
- "version": "4.17.20",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
- "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
- },
- "node_modules/lodash.throttle": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
@@ -979,17 +1507,36 @@
"loose-envify": "cli.js"
}
},
- "node_modules/math-expression-evaluator": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.3.7.tgz",
- "integrity": "sha512-nrbaifCl42w37hYd6oRLvoymFK42tWB+WQTMFtksDGQMi5GvlJwnz/CsS30FFAISFLtX+A0csJ0xLiuuyyec7w=="
- },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
"node_modules/mime-db": {
"version": "1.44.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
@@ -1011,11 +1558,63 @@
"node": ">= 0.6"
}
},
+ "node_modules/mini-svg-data-uri": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
+ "bin": {
+ "mini-svg-data-uri": "cli.js"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/minisearch": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/minisearch/-/minisearch-3.0.2.tgz",
"integrity": "sha512-7rTrJEzovKNi5LSwiIr5aCfJNNo6Lk4O9HTVzjFTMdp+dSr6UisUnEqdwj4rBgNcAcaWW5ClpXnpgTurv8PGqA=="
},
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "peer": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -1028,6 +1627,16 @@
"integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
"dev": true
},
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -1036,6 +1645,26 @@
"node": ">=0.10.0"
}
},
+ "node_modules/object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
"node_modules/p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -1054,6 +1683,16 @@
"node": ">=8"
}
},
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -1069,10 +1708,188 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz",
+ "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-import/node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "camelcase-css": "^2.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || >= 16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11"
+ },
+ "engines": {
+ "node": ">=12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
},
"node_modules/prop-types": {
"version": "15.7.2",
@@ -1093,13 +1910,26 @@
"node": ">=6"
}
},
- "node_modules/raf": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
- "dependencies": {
- "performance-now": "^2.1.0"
- }
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "peer": true
},
"node_modules/randombytes": {
"version": "2.1.0",
@@ -1197,17 +2027,15 @@
}
},
"node_modules/react-resize-detector": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-2.3.0.tgz",
- "integrity": "sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz",
+ "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==",
"dependencies": {
- "lodash.debounce": "^4.0.8",
- "lodash.throttle": "^4.1.1",
- "prop-types": "^15.6.0",
- "resize-observer-polyfill": "^1.5.0"
+ "lodash": "^4.17.21"
},
"peerDependencies": {
- "react": "^0.14.7 || ^15.0.0 || ^16.0.0"
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-script-hook": {
@@ -1220,41 +2048,31 @@
}
},
"node_modules/react-signature-canvas": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.3.tgz",
- "integrity": "sha512-6KBZFWLgjbnV80hh0sYW4ZKLJkojktP+de+xrnBGjB6HBK2dOoYH3rVxjtCvpMhjM/e4cqgAoQVz3lYdKCgWxw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.6.tgz",
+ "integrity": "sha512-NoMHomYu9HxFeLjUGbIeV9abPdWSROfFxFNDekGdwmmaIx+w5ziOEiU2C34X0Ao4GxFnwqyUy/BpYlA4lCD1CA==",
"dependencies": {
"signature_pad": "^2.3.2",
"trim-canvas": "^0.1.0"
},
"peerDependencies": {
"prop-types": "^15.5.8",
- "react": "0.14 - 16",
- "react-dom": "0.14 - 16"
- }
- },
- "node_modules/react-signature-pad": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/react-signature-pad/-/react-signature-pad-0.0.6.tgz",
- "integrity": "sha1-M1VHwfUjo2uDluU2Xi9JUh5Wuc8=",
- "peerDependencies": {
- "react": "^0.14.0 || ^15.0.0",
- "react-dom": "^0.14.0 || ^15.0.0"
+ "react": "0.14 - 18",
+ "react-dom": "0.14 - 18"
}
},
"node_modules/react-smooth": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.5.tgz",
- "integrity": "sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz",
+ "integrity": "sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==",
"dependencies": {
- "lodash": "~4.17.4",
- "prop-types": "^15.6.0",
- "raf": "^3.4.0",
- "react-transition-group": "^2.5.0"
+ "fast-equals": "^5.0.0",
+ "react-transition-group": "2.9.0"
},
"peerDependencies": {
- "react": "^15.0.0 || ^16.0.0",
- "react-dom": "^15.0.0 || ^16.0.0"
+ "prop-types": "^15.6.0",
+ "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-smooth/node_modules/dom-helpers": {
@@ -1295,32 +2113,57 @@
"react-dom": ">=16.6.0"
}
},
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
"node_modules/recharts": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/recharts/-/recharts-1.8.5.tgz",
- "integrity": "sha512-tM9mprJbXVEBxjM7zHsIy6Cc41oO/pVYqyAsOHLxlJrbNBuLs0PHB3iys2M+RqCF0//k8nJtZF6X6swSkWY3tg==",
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.6.2.tgz",
+ "integrity": "sha512-dVhNfgI21LlF+4AesO3mj+i+9YdAAjoGaDWIctUgH/G2iy14YVtb/DSUeic77xr19rbKCiq+pQGfeg2kJQDHig==",
"dependencies": {
"classnames": "^2.2.5",
- "core-js": "^2.6.10",
- "d3-interpolate": "^1.3.0",
- "d3-scale": "^2.1.0",
- "d3-shape": "^1.2.0",
- "lodash": "^4.17.5",
- "prop-types": "^15.6.0",
- "react-resize-detector": "^2.3.0",
- "react-smooth": "^1.0.5",
- "recharts-scale": "^0.4.2",
- "reduce-css-calc": "^1.3.0"
+ "eventemitter3": "^4.0.1",
+ "lodash": "^4.17.19",
+ "react-is": "^16.10.2",
+ "react-resize-detector": "^8.0.4",
+ "react-smooth": "^2.0.2",
+ "recharts-scale": "^0.4.4",
+ "reduce-css-calc": "^2.1.8",
+ "victory-vendor": "^36.6.8"
+ },
+ "engines": {
+ "node": ">=12"
},
"peerDependencies": {
- "react": "^15.0.0 || ^16.0.0",
- "react-dom": "^15.0.0 || ^16.0.0"
+ "prop-types": "^15.6.0",
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/recharts-scale": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.3.tgz",
- "integrity": "sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA==",
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
+ "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
"dependencies": {
"decimal.js-light": "^2.4.1"
}
@@ -1338,45 +2181,26 @@
}
},
"node_modules/reduce-css-calc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
- "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz",
+ "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==",
"dependencies": {
- "balanced-match": "^0.4.2",
- "math-expression-evaluator": "^1.2.14",
- "reduce-function-call": "^1.0.1"
+ "css-unit-converter": "^1.1.1",
+ "postcss-value-parser": "^3.3.0"
}
},
- "node_modules/reduce-function-call": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz",
- "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/reduce-function-call/node_modules/balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
"node_modules/regenerator-runtime": {
"version": "0.13.7",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
},
- "node_modules/resize-observer-polyfill": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
- "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
- },
"node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
"dev": true,
"dependencies": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.11.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -1408,6 +2232,41 @@
"node": ">=8"
}
},
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "peer": true,
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -1511,6 +2370,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
@@ -1521,6 +2390,39 @@
"source-map": "^0.6.0"
}
},
+ "node_modules/sucrase": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz",
+ "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -1548,6 +2450,52 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/tailwindcss": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
+ "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "bin": {
+ "tailwind": "lib/cli.js",
+ "tailwindcss": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tailwindcss/node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "peer": true
+ },
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -1609,11 +2557,54 @@
}
}
},
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/trim-canvas": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz",
"integrity": "sha1-YgRX9f7PVktSHTXF/NTaWDBNbkU="
},
+ "node_modules/ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true,
+ "peer": true
+ },
"node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
@@ -1629,6 +2620,34 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/victory-vendor": {
+ "version": "36.6.10",
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.10.tgz",
+ "integrity": "sha512-7YqYGtsA4mByokBhCjk+ewwPhUfzhR1I3Da6/ZsZUv/31ceT77RKoaqrxRq5Ki+9we4uzf7+A+7aG2sfYhm7nA==",
+ "dependencies": {
+ "@types/d3-array": "^3.0.3",
+ "@types/d3-ease": "^3.0.0",
+ "@types/d3-interpolate": "^3.0.1",
+ "@types/d3-scale": "^4.0.2",
+ "@types/d3-shape": "^3.1.0",
+ "@types/d3-time": "^3.0.0",
+ "@types/d3-timer": "^3.0.0",
+ "d3-array": "^3.1.6",
+ "d3-ease": "^3.0.1",
+ "d3-interpolate": "^3.0.1",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.1.0",
+ "d3-time": "^3.0.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
"node_modules/warning": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
@@ -1799,9 +2818,33 @@
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/yaml": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
+ "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 14"
+ }
}
},
"dependencies": {
+ "@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "peer": true
+ },
"@babel/runtime": {
"version": "7.14.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz",
@@ -1865,11 +2908,103 @@
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "peer": true
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
"@popperjs/core": {
"version": "2.11.5",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz",
"integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw=="
},
+ "@tailwindcss/forms": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz",
+ "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==",
+ "dev": true,
+ "requires": {
+ "mini-svg-data-uri": "^1.2.3"
+ }
+ },
+ "@types/d3-array": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz",
+ "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ=="
+ },
+ "@types/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA=="
+ },
+ "@types/d3-ease": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz",
+ "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA=="
+ },
+ "@types/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==",
+ "requires": {
+ "@types/d3-color": "*"
+ }
+ },
+ "@types/d3-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz",
+ "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg=="
+ },
+ "@types/d3-scale": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz",
+ "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==",
+ "requires": {
+ "@types/d3-time": "*"
+ }
+ },
+ "@types/d3-shape": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz",
+ "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==",
+ "requires": {
+ "@types/d3-path": "*"
+ }
+ },
+ "@types/d3-time": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz",
+ "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg=="
+ },
+ "@types/d3-timer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz",
+ "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g=="
+ },
"@types/eslint": {
"version": "8.4.10",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz",
@@ -2119,10 +3254,65 @@
"dev": true,
"requires": {}
},
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "peer": true
+ },
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arg": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
+ "dev": true,
+ "peer": true
+ },
"balanced-match": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
- "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "peer": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "peer": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
},
"browserslist": {
"version": "4.16.0",
@@ -2143,12 +3333,48 @@
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
+ "camelcase-css": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+ "dev": true,
+ "peer": true
+ },
"caniuse-lite": {
"version": "1.0.30001170",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz",
"integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==",
"dev": true
},
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
"chrome-trace-event": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
@@ -2191,10 +3417,12 @@
"resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz",
"integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg=="
},
- "core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "peer": true
},
"cross-spawn": {
"version": "7.0.3",
@@ -2207,83 +3435,119 @@
"which": "^2.0.1"
}
},
+ "css-unit-converter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
+ "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA=="
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "peer": true
+ },
"csstype": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
"integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
},
"d3-array": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
- "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
- },
- "d3-collection": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
- "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz",
+ "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==",
+ "requires": {
+ "internmap": "1 - 2"
+ }
},
"d3-color": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
- "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
+ },
+ "d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
},
"d3-format": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
- "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
},
"d3-interpolate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
- "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"requires": {
- "d3-color": "1"
+ "d3-color": "1 - 3"
}
},
"d3-path": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
- "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="
},
"d3-scale": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
- "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
"requires": {
- "d3-array": "^1.2.0",
- "d3-collection": "1",
- "d3-format": "1",
- "d3-interpolate": "1",
- "d3-time": "1",
- "d3-time-format": "2"
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
}
},
"d3-shape": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
- "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
"requires": {
- "d3-path": "1"
+ "d3-path": "^3.1.0"
}
},
"d3-time": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
- "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "requires": {
+ "d3-array": "2 - 3"
+ }
},
"d3-time-format": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
- "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
"requires": {
- "d3-time": "1"
+ "d3-time": "1 - 3"
}
},
+ "d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
+ },
"decimal.js-light": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
"integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="
},
+ "didyoumean": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
+ "dev": true,
+ "peer": true
+ },
+ "dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true,
+ "peer": true
+ },
"dom-helpers": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
@@ -2383,6 +3647,11 @@
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true
},
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ },
"events": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
@@ -2395,6 +3664,37 @@
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
+ "fast-equals": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
+ "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ=="
+ },
+ "fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -2407,12 +3707,81 @@
"integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
"dev": true
},
+ "fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "flowbite": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-1.6.5.tgz",
+ "integrity": "sha512-eI4h3pIRI9d7grlYq14r0A01KUtw7189sPLLx/O2i7JyPEWpbleScfYuEc48XTeNjk1xxm/JHgZkD9kjyOWAlA==",
+ "requires": {
+ "@popperjs/core": "^2.9.3",
+ "mini-svg-data-uri": "^1.4.3"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "peer": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
"glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
@@ -2498,12 +3867,45 @@
}
}
},
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "peer": true
+ },
+ "internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
+ },
"interpret": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
"integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
"dev": true
},
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
"is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
@@ -2513,6 +3915,30 @@
"has": "^1.0.3"
}
},
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "peer": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "peer": true
+ },
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
@@ -2545,6 +3971,13 @@
"supports-color": "^8.0.0"
}
},
+ "jiti": {
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz",
+ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==",
+ "dev": true,
+ "peer": true
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -2568,6 +4001,20 @@
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
"dev": true
},
+ "lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "dev": true,
+ "peer": true
+ },
+ "lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "peer": true
+ },
"loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -2575,19 +4022,9 @@
"dev": true
},
"lodash": {
- "version": "4.17.20",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
- "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
- },
- "lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
- },
- "lodash.throttle": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"loose-envify": {
"version": "1.4.0",
@@ -2597,17 +4034,30 @@
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
- "math-expression-evaluator": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.3.7.tgz",
- "integrity": "sha512-nrbaifCl42w37hYd6oRLvoymFK42tWB+WQTMFtksDGQMi5GvlJwnz/CsS30FFAISFLtX+A0csJ0xLiuuyyec7w=="
- },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "peer": true
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
"mime-db": {
"version": "1.44.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
@@ -2623,11 +4073,45 @@
"mime-db": "1.44.0"
}
},
+ "mini-svg-data-uri": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+ "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg=="
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
"minisearch": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/minisearch/-/minisearch-3.0.2.tgz",
"integrity": "sha512-7rTrJEzovKNi5LSwiIr5aCfJNNo6Lk4O9HTVzjFTMdp+dSr6UisUnEqdwj4rBgNcAcaWW5ClpXnpgTurv8PGqA=="
},
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "dev": true,
+ "peer": true
+ },
"neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
@@ -2640,11 +4124,35 @@
"integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==",
"dev": true
},
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "peer": true
+ },
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
+ "object-hash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
+ "dev": true,
+ "peer": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -2657,6 +4165,13 @@
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "peer": true
+ },
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -2669,10 +4184,113 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true,
+ "peer": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "peer": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "peer": true
+ },
+ "pirates": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "dev": true,
+ "peer": true
+ },
+ "postcss": {
+ "version": "8.4.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz",
+ "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "postcss-import": {
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "peer": true
+ }
+ }
+ },
+ "postcss-js": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "camelcase-css": "^2.0.1"
+ }
+ },
+ "postcss-load-config": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
+ "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^2.1.1"
+ }
+ },
+ "postcss-nested": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
+ "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.11"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.13",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+ "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
},
"prop-types": {
"version": "15.7.2",
@@ -2690,13 +4308,12 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
- "raf": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
- "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
- "requires": {
- "performance-now": "^2.1.0"
- }
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "peer": true
},
"randombytes": {
"version": "2.1.0",
@@ -2778,14 +4395,11 @@
}
},
"react-resize-detector": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-2.3.0.tgz",
- "integrity": "sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz",
+ "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==",
"requires": {
- "lodash.debounce": "^4.0.8",
- "lodash.throttle": "^4.1.1",
- "prop-types": "^15.6.0",
- "resize-observer-polyfill": "^1.5.0"
+ "lodash": "^4.17.21"
}
},
"react-script-hook": {
@@ -2795,29 +4409,21 @@
"requires": {}
},
"react-signature-canvas": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.3.tgz",
- "integrity": "sha512-6KBZFWLgjbnV80hh0sYW4ZKLJkojktP+de+xrnBGjB6HBK2dOoYH3rVxjtCvpMhjM/e4cqgAoQVz3lYdKCgWxw==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.6.tgz",
+ "integrity": "sha512-NoMHomYu9HxFeLjUGbIeV9abPdWSROfFxFNDekGdwmmaIx+w5ziOEiU2C34X0Ao4GxFnwqyUy/BpYlA4lCD1CA==",
"requires": {
"signature_pad": "^2.3.2",
"trim-canvas": "^0.1.0"
}
},
- "react-signature-pad": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/react-signature-pad/-/react-signature-pad-0.0.6.tgz",
- "integrity": "sha1-M1VHwfUjo2uDluU2Xi9JUh5Wuc8=",
- "requires": {}
- },
"react-smooth": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.5.tgz",
- "integrity": "sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz",
+ "integrity": "sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==",
"requires": {
- "lodash": "~4.17.4",
- "prop-types": "^15.6.0",
- "raf": "^3.4.0",
- "react-transition-group": "^2.5.0"
+ "fast-equals": "^5.0.0",
+ "react-transition-group": "2.9.0"
},
"dependencies": {
"dom-helpers": {
@@ -2852,28 +4458,46 @@
"prop-types": "^15.6.2"
}
},
+ "read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "pify": "^2.3.0"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
"recharts": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/recharts/-/recharts-1.8.5.tgz",
- "integrity": "sha512-tM9mprJbXVEBxjM7zHsIy6Cc41oO/pVYqyAsOHLxlJrbNBuLs0PHB3iys2M+RqCF0//k8nJtZF6X6swSkWY3tg==",
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.6.2.tgz",
+ "integrity": "sha512-dVhNfgI21LlF+4AesO3mj+i+9YdAAjoGaDWIctUgH/G2iy14YVtb/DSUeic77xr19rbKCiq+pQGfeg2kJQDHig==",
"requires": {
"classnames": "^2.2.5",
- "core-js": "^2.6.10",
- "d3-interpolate": "^1.3.0",
- "d3-scale": "^2.1.0",
- "d3-shape": "^1.2.0",
- "lodash": "^4.17.5",
- "prop-types": "^15.6.0",
- "react-resize-detector": "^2.3.0",
- "react-smooth": "^1.0.5",
- "recharts-scale": "^0.4.2",
- "reduce-css-calc": "^1.3.0"
+ "eventemitter3": "^4.0.1",
+ "lodash": "^4.17.19",
+ "react-is": "^16.10.2",
+ "react-resize-detector": "^8.0.4",
+ "react-smooth": "^2.0.2",
+ "recharts-scale": "^0.4.4",
+ "reduce-css-calc": "^2.1.8",
+ "victory-vendor": "^36.6.8"
}
},
"recharts-scale": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.3.tgz",
- "integrity": "sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA==",
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz",
+ "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==",
"requires": {
"decimal.js-light": "^2.4.1"
}
@@ -2888,28 +4512,12 @@
}
},
"reduce-css-calc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
- "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz",
+ "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==",
"requires": {
- "balanced-match": "^0.4.2",
- "math-expression-evaluator": "^1.2.14",
- "reduce-function-call": "^1.0.1"
- }
- },
- "reduce-function-call": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz",
- "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==",
- "requires": {
- "balanced-match": "^1.0.0"
- },
- "dependencies": {
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- }
+ "css-unit-converter": "^1.1.1",
+ "postcss-value-parser": "^3.3.0"
}
},
"regenerator-runtime": {
@@ -2917,18 +4525,13 @@
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
},
- "resize-observer-polyfill": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
- "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
- },
"resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "1.22.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+ "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
"dev": true,
"requires": {
- "is-core-module": "^2.9.0",
+ "is-core-module": "^2.11.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
@@ -2948,6 +4551,23 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "peer": true
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -3018,6 +4638,13 @@
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "dev": true,
+ "peer": true
+ },
"source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
@@ -3028,6 +4655,31 @@
"source-map": "^0.6.0"
}
},
+ "sucrase": {
+ "version": "3.32.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz",
+ "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "7.1.6",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "peer": true
+ }
+ }
+ },
"supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -3043,6 +4695,47 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
+ "tailwindcss": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
+ "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@alloc/quick-lru": "^5.2.0",
+ "arg": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "didyoumean": "^1.2.2",
+ "dlv": "^1.1.3",
+ "fast-glob": "^3.2.12",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "jiti": "^1.18.2",
+ "lilconfig": "^2.1.0",
+ "micromatch": "^4.0.5",
+ "normalize-path": "^3.0.0",
+ "object-hash": "^3.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.23",
+ "postcss-import": "^15.1.0",
+ "postcss-js": "^4.0.1",
+ "postcss-load-config": "^4.0.1",
+ "postcss-nested": "^6.0.1",
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0",
+ "resolve": "^1.22.2",
+ "sucrase": "^3.32.0"
+ },
+ "dependencies": {
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "peer": true
+ }
+ }
+ },
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -3074,11 +4767,48 @@
"terser": "^5.14.1"
}
},
+ "thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "thenify": ">= 3.1.0 < 4"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
"trim-canvas": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz",
"integrity": "sha1-YgRX9f7PVktSHTXF/NTaWDBNbkU="
},
+ "ts-interface-checker": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "dev": true,
+ "peer": true
+ },
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
@@ -3094,6 +4824,34 @@
"punycode": "^2.1.0"
}
},
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "peer": true
+ },
+ "victory-vendor": {
+ "version": "36.6.10",
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.10.tgz",
+ "integrity": "sha512-7YqYGtsA4mByokBhCjk+ewwPhUfzhR1I3Da6/ZsZUv/31ceT77RKoaqrxRq5Ki+9we4uzf7+A+7aG2sfYhm7nA==",
+ "requires": {
+ "@types/d3-array": "^3.0.3",
+ "@types/d3-ease": "^3.0.0",
+ "@types/d3-interpolate": "^3.0.1",
+ "@types/d3-scale": "^4.0.2",
+ "@types/d3-shape": "^3.1.0",
+ "@types/d3-time": "^3.0.0",
+ "@types/d3-timer": "^3.0.0",
+ "d3-array": "^3.1.6",
+ "d3-ease": "^3.0.1",
+ "d3-interpolate": "^3.0.1",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.1.0",
+ "d3-time": "^3.0.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
"warning": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
@@ -3209,6 +4967,20 @@
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "peer": true
+ },
+ "yaml": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz",
+ "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==",
+ "dev": true,
+ "peer": true
}
}
}
diff --git a/package.json b/package.json
index 5b8cd708..8c4c0249 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"@popperjs/core": "^2.11.5",
"downshift": "^6.1.3",
"dropzone": "^4.3.0",
+ "flowbite": "^1.6.5",
"minisearch": "^3.0.2",
"prop-types": "^15.7.2",
"react": "^17.0.1",
@@ -17,12 +18,12 @@
"react-plaid-link": "^3.3.2",
"react-popper": "^2.3.0",
"react-prop-types": "^0.4.0",
- "react-signature-canvas": "^1.0.3",
- "react-signature-pad": "0.0.6",
+ "react-signature-canvas": "^1.0.6",
"react-transition-group": "^4.4.2",
- "recharts": "^1.4.2"
+ "recharts": "^2.5.0"
},
"devDependencies": {
+ "@tailwindcss/forms": "^0.5.3",
"webpack": "^5.75.0",
"webpack-cli": "^5.0.1"
},
diff --git a/project.clj b/project.clj
index 39dbe9cb..a2926425 100644
--- a/project.clj
+++ b/project.clj
@@ -145,7 +145,6 @@
[javax.servlet/servlet-api "2.5"]]
:plugins [[lein-pdo "0.1.1"]]
:jvm-opts ["-Dconfig=config/dev.edn" "-Dlogback.configurationFile=logback.xml" "-Xms4G" "-Xmx20G" ]}
-
:uberjar
{:java-cmd "/usr/lib/jvm/java-11-openjdk/bin/java"
diff --git a/resources/input.css b/resources/input.css
new file mode 100644
index 00000000..8653d69d
--- /dev/null
+++ b/resources/input.css
@@ -0,0 +1,78 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+.htmx-added .fade-in {
+ opacity: 0.0 !important;
+}
+
+.htmx-added.fade-in {
+ opacity: 0.0 !important;
+}
+.fade-in {
+ opacity: 1.0;
+}
+
+.htmx-added .slide-up {
+ @apply translate-y-5 !important;
+}
+.hidden .slide-up {
+ @apply translate-y-5 !important;
+}
+.slide-up {
+ @apply translate-y-0;
+}
+
+.live-added {
+ animation: pulse-green 300ms 2;
+ animation-direction: alternate;
+ animation-timing-function: ease-in-out;
+}
+
+.dark .live-added {
+ animation: pulse-dark-green 300ms 2 !important;
+ animation-direction: alternate;
+ animation-timing-function: ease-in-out;
+}
+/*
+.live-added {
+ @apply bg-white;
+}
+*/
+
+@keyframes pulse-green {
+ 0% { @apply bg-white; }
+ 100% { @apply bg-green-300 dark:bg-red-700;}
+}
+
+@keyframes pulse-dark-green {
+ 0% { @apply dark:bg-gray-700; }
+ 100% { @apply bg-green-700;}
+}
+
+
+.htmx-request .htmx-indicator, .htmx-request.htmx-indicator {
+ display: inherit !important;
+}
+.htmx-indicator {
+ display: none;
+}
+
+.htmx-request .htmx-indicator-hidden {
+ display: none !important;
+}
+
+.htmx-indicator-hidden {
+ display: inherit;
+}
+
+.htmx-swapping .fade-out {
+ opacity: 0.0 !important;
+}
+.fade-out {
+ opacity: 1.0;
+}
+
+.min-h-content {
+ min-height: calc(100vh - 4em);
+}
diff --git a/resources/public/favicon.png b/resources/public/favicon.png
new file mode 100644
index 00000000..ebd29da8
Binary files /dev/null and b/resources/public/favicon.png differ
diff --git a/resources/public/img/accounting-invoice-mail.svg b/resources/public/img/accounting-invoice-mail.svg
new file mode 100644
index 00000000..dd87da97
--- /dev/null
+++ b/resources/public/img/accounting-invoice-mail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/public/img/cas b/resources/public/img/cas
new file mode 100644
index 00000000..310d5c04
--- /dev/null
+++ b/resources/public/img/cas
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/public/img/cash-payment-sign-2.svg b/resources/public/img/cash-payment-sign-2.svg
new file mode 100644
index 00000000..310d5c04
--- /dev/null
+++ b/resources/public/img/cash-payment-sign-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/public/img/loading-circle.svg b/resources/public/img/loading-circle.svg
new file mode 100755
index 00000000..ec87a9bb
--- /dev/null
+++ b/resources/public/img/loading-circle.svg
@@ -0,0 +1 @@
+
diff --git a/resources/public/img/logo-big2.png b/resources/public/img/logo-big2.png
new file mode 100644
index 00000000..8f1aa592
Binary files /dev/null and b/resources/public/img/logo-big2.png differ
diff --git a/resources/public/js/flowbite.min.js b/resources/public/js/flowbite.min.js
new file mode 100644
index 00000000..1151790d
--- /dev/null
+++ b/resources/public/js/flowbite.min.js
@@ -0,0 +1,2 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("Flowbite",[],e):"object"==typeof exports?exports.Flowbite=e():t.Flowbite=e()}(self,(function(){return function(){"use strict";var t={647:function(t,e,i){i.r(e)},853:function(t,e,i){i.r(e),i.d(e,{afterMain:function(){return E},afterRead:function(){return _},afterWrite:function(){return x},applyStyles:function(){return S},arrow:function(){return Z},auto:function(){return a},basePlacements:function(){return c},beforeMain:function(){return b},beforeRead:function(){return m},beforeWrite:function(){return L},bottom:function(){return o},clippingParents:function(){return u},computeStyles:function(){return it},createPopper:function(){return St},createPopperBase:function(){return Ct},createPopperLite:function(){return It},detectOverflow:function(){return yt},end:function(){return d},eventListeners:function(){return ot},flip:function(){return _t},hide:function(){return Et},left:function(){return s},main:function(){return w},modifierPhases:function(){return k},offset:function(){return Lt},placements:function(){return v},popper:function(){return f},popperGenerator:function(){return Pt},popperOffsets:function(){return Ot},preventOverflow:function(){return xt},read:function(){return y},reference:function(){return h},right:function(){return r},start:function(){return l},top:function(){return n},variationPlacements:function(){return g},viewport:function(){return p},write:function(){return O}});var n="top",o="bottom",r="right",s="left",a="auto",c=[n,o,r,s],l="start",d="end",u="clippingParents",p="viewport",f="popper",h="reference",g=c.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+d])}),[]),v=[].concat(c,[a]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+d])}),[]),m="beforeRead",y="read",_="afterRead",b="beforeMain",w="main",E="afterMain",L="beforeWrite",O="write",x="afterWrite",k=[m,y,_,b,w,E,L,O,x];function A(t){return t?(t.nodeName||"").toLowerCase():null}function T(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function j(t){return t instanceof T(t).Element||t instanceof Element}function P(t){return t instanceof T(t).HTMLElement||t instanceof HTMLElement}function C(t){return"undefined"!=typeof ShadowRoot&&(t instanceof T(t).ShadowRoot||t instanceof ShadowRoot)}var S={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},o=e.elements[t];P(o)&&A(o)&&(Object.assign(o.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?o.removeAttribute(t):o.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],o=e.attributes[t]||{},r=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});P(n)&&A(n)&&(Object.assign(n.style,r),Object.keys(o).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var D=Math.max,M=Math.min,q=Math.round;function H(){var t=navigator.userAgentData;return null!=t&&t.brands?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function B(){return!/^((?!chrome|android).)*safari/i.test(H())}function V(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),o=1,r=1;e&&P(t)&&(o=t.offsetWidth>0&&q(n.width)/t.offsetWidth||1,r=t.offsetHeight>0&&q(n.height)/t.offsetHeight||1);var s=(j(t)?T(t):window).visualViewport,a=!B()&&i,c=(n.left+(a&&s?s.offsetLeft:0))/o,l=(n.top+(a&&s?s.offsetTop:0))/r,d=n.width/o,u=n.height/r;return{width:d,height:u,top:l,right:c+d,bottom:l+u,left:c,x:c,y:l}}function W(t){var e=V(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function z(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&C(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function R(t){return T(t).getComputedStyle(t)}function F(t){return["table","td","th"].indexOf(A(t))>=0}function N(t){return((j(t)?t.ownerDocument:t.document)||window.document).documentElement}function K(t){return"html"===A(t)?t:t.assignedSlot||t.parentNode||(C(t)?t.host:null)||N(t)}function U(t){return P(t)&&"fixed"!==R(t).position?t.offsetParent:null}function X(t){for(var e=T(t),i=U(t);i&&F(i)&&"static"===R(i).position;)i=U(i);return i&&("html"===A(i)||"body"===A(i)&&"static"===R(i).position)?e:i||function(t){var e=/firefox/i.test(H());if(/Trident/i.test(H())&&P(t)&&"fixed"===R(t).position)return null;var i=K(t);for(C(i)&&(i=i.host);P(i)&&["html","body"].indexOf(A(i))<0;){var n=R(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Y(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function G(t,e,i){return D(t,M(e,i))}function J(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Q(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}var Z={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,l=t.options,d=i.elements.arrow,u=i.modifiersData.popperOffsets,p=I(i.placement),f=Y(p),h=[s,r].indexOf(p)>=0?"height":"width";if(d&&u){var g=function(t,e){return J("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Q(t,c))}(l.padding,i),v=W(d),m="y"===f?n:s,y="y"===f?o:r,_=i.rects.reference[h]+i.rects.reference[f]-u[f]-i.rects.popper[h],b=u[f]-i.rects.reference[f],w=X(d),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,L=_/2-b/2,O=g[m],x=E-v[h]-g[y],k=E/2-v[h]/2+L,A=G(O,k,x),T=f;i.modifiersData[a]=((e={})[T]=A,e.centerOffset=A-k,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&z(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function $(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,c=t.placement,l=t.variation,u=t.offsets,p=t.position,f=t.gpuAcceleration,h=t.adaptive,g=t.roundOffsets,v=t.isFixed,m=u.x,y=void 0===m?0:m,_=u.y,b=void 0===_?0:_,w="function"==typeof g?g({x:y,y:b}):{x:y,y:b};y=w.x,b=w.y;var E=u.hasOwnProperty("x"),L=u.hasOwnProperty("y"),O=s,x=n,k=window;if(h){var A=X(i),j="clientHeight",P="clientWidth";if(A===T(i)&&"static"!==R(A=N(i)).position&&"absolute"===p&&(j="scrollHeight",P="scrollWidth"),c===n||(c===s||c===r)&&l===d)x=o,b-=(v&&A===k&&k.visualViewport?k.visualViewport.height:A[j])-a.height,b*=f?1:-1;if(c===s||(c===n||c===o)&&l===d)O=r,y-=(v&&A===k&&k.visualViewport?k.visualViewport.width:A[P])-a.width,y*=f?1:-1}var C,S=Object.assign({position:p},h&&tt),I=!0===g?function(t){var e=t.x,i=t.y,n=window.devicePixelRatio||1;return{x:q(e*n)/n||0,y:q(i*n)/n||0}}({x:y,y:b}):{x:y,y:b};return y=I.x,b=I.y,f?Object.assign({},S,((C={})[x]=L?"0":"",C[O]=E?"0":"",C.transform=(k.devicePixelRatio||1)<=1?"translate("+y+"px, "+b+"px)":"translate3d("+y+"px, "+b+"px, 0)",C)):Object.assign({},S,((e={})[x]=L?b+"px":"",e[O]=E?y+"px":"",e.transform="",e))}var it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,o=void 0===n||n,r=i.adaptive,s=void 0===r||r,a=i.roundOffsets,c=void 0===a||a,l={placement:I(e.placement),variation:$(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},l,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s,roundOffsets:c})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},l,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:c})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}},nt={passive:!0};var ot={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,o=n.scroll,r=void 0===o||o,s=n.resize,a=void 0===s||s,c=T(e.elements.popper),l=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&l.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&c.addEventListener("resize",i.update,nt),function(){r&&l.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&c.removeEventListener("resize",i.update,nt)}},data:{}},rt={left:"right",right:"left",bottom:"top",top:"bottom"};function st(t){return t.replace(/left|right|bottom|top/g,(function(t){return rt[t]}))}var at={start:"end",end:"start"};function ct(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function lt(t){var e=T(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function dt(t){return V(N(t)).left+lt(t).scrollLeft}function ut(t){var e=R(t),i=e.overflow,n=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+o+n)}function pt(t){return["html","body","#document"].indexOf(A(t))>=0?t.ownerDocument.body:P(t)&&ut(t)?t:pt(K(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=pt(t),o=n===(null==(i=t.ownerDocument)?void 0:i.body),r=T(n),s=o?[r].concat(r.visualViewport||[],ut(n)?n:[]):n,a=e.concat(s);return o?a:a.concat(ft(K(s)))}function ht(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function gt(t,e,i){return e===p?ht(function(t,e){var i=T(t),n=N(t),o=i.visualViewport,r=n.clientWidth,s=n.clientHeight,a=0,c=0;if(o){r=o.width,s=o.height;var l=B();(l||!l&&"fixed"===e)&&(a=o.offsetLeft,c=o.offsetTop)}return{width:r,height:s,x:a+dt(t),y:c}}(t,i)):j(e)?function(t,e){var i=V(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ht(function(t){var e,i=N(t),n=lt(t),o=null==(e=t.ownerDocument)?void 0:e.body,r=D(i.scrollWidth,i.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=D(i.scrollHeight,i.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-n.scrollLeft+dt(t),c=-n.scrollTop;return"rtl"===R(o||i).direction&&(a+=D(i.clientWidth,o?o.clientWidth:0)-r),{width:r,height:s,x:a,y:c}}(N(t)))}function vt(t,e,i,n){var o="clippingParents"===e?function(t){var e=ft(K(t)),i=["absolute","fixed"].indexOf(R(t).position)>=0&&P(t)?X(t):t;return j(i)?e.filter((function(t){return j(t)&&z(t,i)&&"body"!==A(t)})):[]}(t):[].concat(e),r=[].concat(o,[i]),s=r[0],a=r.reduce((function(e,i){var o=gt(t,i,n);return e.top=D(o.top,e.top),e.right=M(o.right,e.right),e.bottom=M(o.bottom,e.bottom),e.left=D(o.left,e.left),e}),gt(t,s,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function mt(t){var e,i=t.reference,a=t.element,c=t.placement,u=c?I(c):null,p=c?$(c):null,f=i.x+i.width/2-a.width/2,h=i.y+i.height/2-a.height/2;switch(u){case n:e={x:f,y:i.y-a.height};break;case o:e={x:f,y:i.y+i.height};break;case r:e={x:i.x+i.width,y:h};break;case s:e={x:i.x-a.width,y:h};break;default:e={x:i.x,y:i.y}}var g=u?Y(u):null;if(null!=g){var v="y"===g?"height":"width";switch(p){case l:e[g]=e[g]-(i[v]/2-a[v]/2);break;case d:e[g]=e[g]+(i[v]/2-a[v]/2)}}return e}function yt(t,e){void 0===e&&(e={});var i=e,s=i.placement,a=void 0===s?t.placement:s,l=i.strategy,d=void 0===l?t.strategy:l,g=i.boundary,v=void 0===g?u:g,m=i.rootBoundary,y=void 0===m?p:m,_=i.elementContext,b=void 0===_?f:_,w=i.altBoundary,E=void 0!==w&&w,L=i.padding,O=void 0===L?0:L,x=J("number"!=typeof O?O:Q(O,c)),k=b===f?h:f,A=t.rects.popper,T=t.elements[E?k:b],P=vt(j(T)?T:T.contextElement||N(t.elements.popper),v,y,d),C=V(t.elements.reference),S=mt({reference:C,element:A,strategy:"absolute",placement:a}),I=ht(Object.assign({},A,S)),D=b===f?I:C,M={top:P.top-D.top+x.top,bottom:D.bottom-P.bottom+x.bottom,left:P.left-D.left+x.left,right:D.right-P.right+x.right},q=t.modifiersData.offset;if(b===f&&q){var H=q[a];Object.keys(M).forEach((function(t){var e=[r,o].indexOf(t)>=0?1:-1,i=[n,o].indexOf(t)>=0?"y":"x";M[t]+=H[i]*e}))}return M}var _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,d=t.name;if(!e.modifiersData[d]._skip){for(var u=i.mainAxis,p=void 0===u||u,f=i.altAxis,h=void 0===f||f,m=i.fallbackPlacements,y=i.padding,_=i.boundary,b=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,L=void 0===E||E,O=i.allowedAutoPlacements,x=e.options.placement,k=I(x),A=m||(k===x||!L?[st(x)]:function(t){if(I(t)===a)return[];var e=st(t);return[ct(t),e,ct(e)]}(x)),T=[x].concat(A).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,o=i.boundary,r=i.rootBoundary,s=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,d=void 0===l?v:l,u=$(n),p=u?a?g:g.filter((function(t){return $(t)===u})):c,f=p.filter((function(t){return d.indexOf(t)>=0}));0===f.length&&(f=p);var h=f.reduce((function(e,i){return e[i]=yt(t,{placement:i,boundary:o,rootBoundary:r,padding:s})[I(i)],e}),{});return Object.keys(h).sort((function(t,e){return h[t]-h[e]}))}(e,{placement:i,boundary:_,rootBoundary:b,padding:y,flipVariations:L,allowedAutoPlacements:O}):i)}),[]),j=e.rects.reference,P=e.rects.popper,C=new Map,S=!0,D=T[0],M=0;M=0,W=V?"width":"height",z=yt(e,{placement:q,boundary:_,rootBoundary:b,altBoundary:w,padding:y}),R=V?B?r:s:B?o:n;j[W]>P[W]&&(R=st(R));var F=st(R),N=[];if(p&&N.push(z[H]<=0),h&&N.push(z[R]<=0,z[F]<=0),N.every((function(t){return t}))){D=q,S=!1;break}C.set(q,N)}if(S)for(var K=function(t){var e=T.find((function(e){var i=C.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return D=e,"break"},U=L?3:1;U>0;U--){if("break"===K(U))break}e.placement!==D&&(e.modifiersData[d]._skip=!0,e.placement=D,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function wt(t){return[n,r,o,s].some((function(e){return t[e]>=0}))}var Et={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=yt(e,{elementContext:"reference"}),a=yt(e,{altBoundary:!0}),c=bt(s,n),l=bt(a,o,r),d=wt(c),u=wt(l);e.modifiersData[i]={referenceClippingOffsets:c,popperEscapeOffsets:l,isReferenceHidden:d,hasPopperEscaped:u},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":d,"data-popper-escaped":u})}};var Lt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,o=t.name,a=i.offset,c=void 0===a?[0,0]:a,l=v.reduce((function(t,i){return t[i]=function(t,e,i){var o=I(t),a=[s,n].indexOf(o)>=0?-1:1,c="function"==typeof i?i(Object.assign({},e,{placement:t})):i,l=c[0],d=c[1];return l=l||0,d=(d||0)*a,[s,r].indexOf(o)>=0?{x:d,y:l}:{x:l,y:d}}(i,e.rects,c),t}),{}),d=l[e.placement],u=d.x,p=d.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=p),e.modifiersData[o]=l}};var Ot={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=mt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}};var xt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,c=i.mainAxis,d=void 0===c||c,u=i.altAxis,p=void 0!==u&&u,f=i.boundary,h=i.rootBoundary,g=i.altBoundary,v=i.padding,m=i.tether,y=void 0===m||m,_=i.tetherOffset,b=void 0===_?0:_,w=yt(e,{boundary:f,rootBoundary:h,padding:v,altBoundary:g}),E=I(e.placement),L=$(e.placement),O=!L,x=Y(E),k="x"===x?"y":"x",A=e.modifiersData.popperOffsets,T=e.rects.reference,j=e.rects.popper,P="function"==typeof b?b(Object.assign({},e.rects,{placement:e.placement})):b,C="number"==typeof P?{mainAxis:P,altAxis:P}:Object.assign({mainAxis:0,altAxis:0},P),S=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,q={x:0,y:0};if(A){if(d){var H,B="y"===x?n:s,V="y"===x?o:r,z="y"===x?"height":"width",R=A[x],F=R+w[B],N=R-w[V],K=y?-j[z]/2:0,U=L===l?T[z]:j[z],J=L===l?-j[z]:-T[z],Q=e.elements.arrow,Z=y&&Q?W(Q):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[B],it=tt[V],nt=G(0,T[z],Z[z]),ot=O?T[z]/2-K-nt-et-C.mainAxis:U-nt-et-C.mainAxis,rt=O?-T[z]/2+K+nt+it+C.mainAxis:J+nt+it+C.mainAxis,st=e.elements.arrow&&X(e.elements.arrow),at=st?"y"===x?st.clientTop||0:st.clientLeft||0:0,ct=null!=(H=null==S?void 0:S[x])?H:0,lt=R+rt-ct,dt=G(y?M(F,R+ot-ct-at):F,R,y?D(N,lt):N);A[x]=dt,q[x]=dt-R}if(p){var ut,pt="x"===x?n:s,ft="x"===x?o:r,ht=A[k],gt="y"===k?"height":"width",vt=ht+w[pt],mt=ht-w[ft],_t=-1!==[n,s].indexOf(E),bt=null!=(ut=null==S?void 0:S[k])?ut:0,wt=_t?vt:ht-T[gt]-j[gt]-bt+C.altAxis,Et=_t?ht+T[gt]+j[gt]-bt-C.altAxis:mt,Lt=y&&_t?function(t,e,i){var n=G(t,e,i);return n>i?i:n}(wt,ht,Et):G(y?wt:vt,ht,y?Et:mt);A[k]=Lt,q[k]=Lt-ht}e.modifiersData[a]=q}},requiresIfExists:["offset"]};function kt(t,e,i){void 0===i&&(i=!1);var n,o,r=P(e),s=P(e)&&function(t){var e=t.getBoundingClientRect(),i=q(e.width)/t.offsetWidth||1,n=q(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=N(e),c=V(t,s,i),l={scrollLeft:0,scrollTop:0},d={x:0,y:0};return(r||!r&&!i)&&(("body"!==A(e)||ut(a))&&(l=(n=e)!==T(n)&&P(n)?{scrollLeft:(o=n).scrollLeft,scrollTop:o.scrollTop}:lt(n)),P(e)?((d=V(e,!0)).x+=e.clientLeft,d.y+=e.clientTop):a&&(d.x=dt(a))),{x:c.left+l.scrollLeft-d.x,y:c.top+l.scrollTop-d.y,width:c.width,height:c.height}}function At(t){var e=new Map,i=new Set,n=[];function o(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&o(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||o(t)})),n}var Tt={placement:"bottom",modifiers:[],strategy:"absolute"};function jt(){for(var t=arguments.length,e=new Array(t),i=0;i element.disabled = true);
+ if (elt.classList.contains('hx-disable')) {
+ elt.disabled = true;}
+
+ } else if(name == 'htmx:afterRequest') {
+ result.forEach(element => element.disabled = false);
+ if (elt.classList.contains('hx-disable')) elt.disabled = false;
+ }
+ */
+ }
+})
diff --git a/resources/public/output.css b/resources/public/output.css
new file mode 100644
index 00000000..251d5b1f
--- /dev/null
+++ b/resources/public/output.css
@@ -0,0 +1,2953 @@
+/*
+! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+ /* 1 */
+ border-width: 0;
+ /* 2 */
+ border-style: solid;
+ /* 2 */
+ border-color: #E5E7EB;
+ /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings by default.
+*/
+
+html {
+ line-height: 1.5;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+ -moz-tab-size: 4;
+ /* 3 */
+ -o-tab-size: 4;
+ tab-size: 4;
+ /* 3 */
+ font-family: Calibri, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
+ /* 4 */
+ font-feature-settings: normal;
+ /* 5 */
+ font-variation-settings: normal;
+ /* 6 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0;
+ /* 1 */
+ line-height: inherit;
+ /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ border-top-width: 1px;
+ /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font family by default.
+2. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ /* 1 */
+ font-size: 1em;
+ /* 2 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0;
+ /* 1 */
+ border-color: inherit;
+ /* 2 */
+ border-collapse: collapse;
+ /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ font-weight: inherit;
+ /* 1 */
+ line-height: inherit;
+ /* 1 */
+ color: inherit;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+ padding: 0;
+ /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+ -webkit-appearance: button;
+ /* 1 */
+ background-color: transparent;
+ /* 2 */
+ background-image: none;
+ /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9CA3AF;
+ /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9CA3AF;
+ /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ /* 1 */
+ vertical-align: middle;
+ /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+
+[hidden] {
+ display: none;
+}
+
+[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #6B7280;
+ border-width: 1px;
+ border-radius: 0px;
+ padding-top: 0.5rem;
+ padding-right: 0.75rem;
+ padding-bottom: 0.5rem;
+ padding-left: 0.75rem;
+ font-size: 1rem;
+ line-height: 1.5rem;
+ --tw-shadow: 0 0 #0000;
+}
+
+[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: #007dbb;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+ border-color: #007dbb;
+}
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ color: #6B7280;
+ opacity: 1;
+}
+
+input::placeholder,textarea::placeholder {
+ color: #6B7280;
+ opacity: 1;
+}
+
+::-webkit-datetime-edit-fields-wrapper {
+ padding: 0;
+}
+
+::-webkit-date-and-time-value {
+ min-height: 1.5em;
+}
+
+select:not([size]) {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
+ background-position: right 0.5rem center;
+ background-repeat: no-repeat;
+ background-size: 1.5em 1.5em;
+ padding-right: 2.5rem;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+}
+
+[multiple] {
+ background-image: initial;
+ background-position: initial;
+ background-repeat: unset;
+ background-size: initial;
+ padding-right: 0.75rem;
+ -webkit-print-color-adjust: unset;
+ print-color-adjust: unset;
+}
+
+[type='checkbox'],[type='radio'] {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ padding: 0;
+ -webkit-print-color-adjust: exact;
+ print-color-adjust: exact;
+ display: inline-block;
+ vertical-align: middle;
+ background-origin: border-box;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ flex-shrink: 0;
+ height: 1rem;
+ width: 1rem;
+ color: #007dbb;
+ background-color: #fff;
+ border-color: #6B7280;
+ border-width: 1px;
+ --tw-shadow: 0 0 #0000;
+}
+
+[type='checkbox'] {
+ border-radius: 0px;
+}
+
+[type='radio'] {
+ border-radius: 100%;
+}
+
+[type='checkbox']:focus,[type='radio']:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
+ --tw-ring-offset-width: 2px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: #007dbb;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
+}
+
+[type='checkbox']:checked,[type='radio']:checked,.dark [type='checkbox']:checked,.dark [type='radio']:checked {
+ border-color: transparent;
+ background-color: currentColor;
+ background-size: 100% 100%;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+[type='checkbox']:checked {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
+}
+
+[type='radio']:checked {
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
+}
+
+[type='checkbox']:indeterminate {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
+ border-color: transparent;
+ background-color: currentColor;
+ background-size: 100% 100%;
+ background-position: center;
+ background-repeat: no-repeat;
+}
+
+[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
+ border-color: transparent;
+ background-color: currentColor;
+}
+
+[type='file'] {
+ background: unset;
+ border-color: inherit;
+ border-width: 0;
+ border-radius: 0;
+ padding: 0;
+ font-size: unset;
+ line-height: inherit;
+}
+
+[type='file']:focus {
+ outline: 1px auto inherit;
+}
+
+input[type=file]::file-selector-button {
+ color: white;
+ background: #1F2937;
+ border: 0;
+ font-weight: 500;
+ font-size: 0.875rem;
+ cursor: pointer;
+ padding-top: 0.625rem;
+ padding-bottom: 0.625rem;
+ padding-left: 2rem;
+ padding-right: 1rem;
+ -webkit-margin-start: -1rem;
+ margin-inline-start: -1rem;
+ -webkit-margin-end: 1rem;
+ margin-inline-end: 1rem;
+}
+
+input[type=file]::file-selector-button:hover {
+ background: #374151;
+}
+
+.dark input[type=file]::file-selector-button {
+ color: white;
+ background: #4B5563;
+}
+
+.dark input[type=file]::file-selector-button:hover {
+ background: #6B7280;
+}
+
+input[type="range"]::-webkit-slider-thumb {
+ height: 1.25rem;
+ width: 1.25rem;
+ background: #007dbb;
+ border-radius: 9999px;
+ border: 0;
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ cursor: pointer;
+}
+
+input[type="range"]:disabled::-webkit-slider-thumb {
+ background: #9CA3AF;
+}
+
+.dark input[type="range"]:disabled::-webkit-slider-thumb {
+ background: #6B7280;
+}
+
+input[type="range"]:focus::-webkit-slider-thumb {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+ --tw-ring-opacity: 1px;
+ --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity));
+}
+
+input[type="range"]::-moz-range-thumb {
+ height: 1.25rem;
+ width: 1.25rem;
+ background: #007dbb;
+ border-radius: 9999px;
+ border: 0;
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ cursor: pointer;
+}
+
+input[type="range"]:disabled::-moz-range-thumb {
+ background: #9CA3AF;
+}
+
+.dark input[type="range"]:disabled::-moz-range-thumb {
+ background: #6B7280;
+}
+
+input[type="range"]::-moz-range-progress {
+ background: #009cea;
+}
+
+input[type="range"]::-ms-fill-lower {
+ background: #009cea;
+}
+
+.toggle-bg:after {
+ content: "";
+ position: absolute;
+ top: 0.125rem;
+ left: 0.125rem;
+ background: white;
+ border-color: #D1D5DB;
+ border-width: 1px;
+ border-radius: 9999px;
+ height: 1.25rem;
+ width: 1.25rem;
+ transition-property: background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;
+ transition-duration: .15s;
+ box-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+}
+
+input:checked + .toggle-bg:after {
+ transform: translateX(100%);;
+ border-color: white;
+}
+
+input:checked + .toggle-bg {
+ background: #007dbb;
+ border-color: #007dbb;
+}
+
+.tooltip-arrow,.tooltip-arrow:before {
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ background: inherit;
+}
+
+.tooltip-arrow {
+ visibility: hidden;
+}
+
+.tooltip-arrow:before {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+}
+
+[data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+.tooltip[data-popper-placement^='top'] > .tooltip-arrow {
+ bottom: -4px;
+}
+
+.tooltip[data-popper-placement^='bottom'] > .tooltip-arrow {
+ top: -4px;
+}
+
+.tooltip[data-popper-placement^='left'] > .tooltip-arrow {
+ right: -4px;
+}
+
+.tooltip[data-popper-placement^='right'] > .tooltip-arrow {
+ left: -4px;
+}
+
+.tooltip.invisible > .tooltip-arrow:before {
+ visibility: hidden;
+}
+
+[data-popper-arrow],[data-popper-arrow]:before {
+ position: absolute;
+ width: 8px;
+ height: 8px;
+ background: inherit;
+}
+
+[data-popper-arrow] {
+ visibility: hidden;
+}
+
+[data-popper-arrow]:before {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+}
+
+[data-popper-arrow]:after {
+ content: "";
+ visibility: visible;
+ transform: rotate(45deg);
+ position: absolute;
+ width: 9px;
+ height: 9px;
+ background: inherit;
+}
+
+[role="tooltip"] > [data-popper-arrow]:before {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+.dark [role="tooltip"] > [data-popper-arrow]:before {
+ border-style: solid;
+ border-color: #4b5563;
+}
+
+[role="tooltip"] > [data-popper-arrow]:after {
+ border-style: solid;
+ border-color: #e5e7eb;
+}
+
+.dark [role="tooltip"] > [data-popper-arrow]:after {
+ border-style: solid;
+ border-color: #4b5563;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after {
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after {
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after {
+ border-top-width: 1px;
+ border-left-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after {
+ border-top-width: 1px;
+ border-right-width: 1px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] {
+ bottom: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] {
+ top: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] {
+ right: -5px;
+}
+
+[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] {
+ left: -5px;
+}
+
+[role="tooltip"].invisible > [data-popper-arrow]:before {
+ visibility: hidden;
+}
+
+[role="tooltip"].invisible > [data-popper-arrow]:after {
+ visibility: hidden;
+}
+
+*, ::before, ::after {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(0 156 234 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+::backdrop {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(0 156 234 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+.container {
+ width: 100%;
+}
+
+@media (min-width: 640px) {
+ .container {
+ max-width: 640px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 768px;
+ }
+}
+
+@media (min-width: 1024px) {
+ .container {
+ max-width: 1024px;
+ }
+}
+
+@media (min-width: 1280px) {
+ .container {
+ max-width: 1280px;
+ }
+}
+
+@media (min-width: 1536px) {
+ .container {
+ max-width: 1536px;
+ }
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0;
+}
+
+.pointer-events-none {
+ pointer-events: none;
+}
+
+.visible {
+ visibility: visible;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.collapse {
+ visibility: collapse;
+}
+
+.static {
+ position: static;
+}
+
+.fixed {
+ position: fixed;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.relative {
+ position: relative;
+}
+
+.sticky {
+ position: sticky;
+}
+
+.inset-0 {
+ inset: 0px;
+}
+
+.inset-y-0 {
+ top: 0px;
+ bottom: 0px;
+}
+
+.-right-2 {
+ right: -0.5rem;
+}
+
+.-top-2 {
+ top: -0.5rem;
+}
+
+.bottom-0 {
+ bottom: 0px;
+}
+
+.bottom-\[60px\] {
+ bottom: 60px;
+}
+
+.left-0 {
+ left: 0px;
+}
+
+.right-0 {
+ right: 0px;
+}
+
+.right-2 {
+ right: 0.5rem;
+}
+
+.top-0 {
+ top: 0px;
+}
+
+.top-2 {
+ top: 0.5rem;
+}
+
+.top-5 {
+ top: 1.25rem;
+}
+
+.z-10 {
+ z-index: 10;
+}
+
+.z-20 {
+ z-index: 20;
+}
+
+.z-30 {
+ z-index: 30;
+}
+
+.z-40 {
+ z-index: 40;
+}
+
+.z-50 {
+ z-index: 50;
+}
+
+.col-span-1 {
+ grid-column: span 1 / span 1;
+}
+
+.col-span-2 {
+ grid-column: span 2 / span 2;
+}
+
+.col-span-3 {
+ grid-column: span 3 / span 3;
+}
+
+.col-span-6 {
+ grid-column: span 6 / span 6;
+}
+
+.m-4 {
+ margin: 1rem;
+}
+
+.mx-2 {
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+}
+
+.mx-4 {
+ margin-left: 1rem;
+ margin-right: 1rem;
+}
+
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.my-0 {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.my-4 {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+}
+
+.-mb-1 {
+ margin-bottom: -0.25rem;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem;
+}
+
+.mb-3 {
+ margin-bottom: 0.75rem;
+}
+
+.mb-4 {
+ margin-bottom: 1rem;
+}
+
+.ml-1 {
+ margin-left: 0.25rem;
+}
+
+.ml-2 {
+ margin-left: 0.5rem;
+}
+
+.ml-3 {
+ margin-left: 0.75rem;
+}
+
+.mr-10 {
+ margin-right: 2.5rem;
+}
+
+.mr-16 {
+ margin-right: 4rem;
+}
+
+.mr-2 {
+ margin-right: 0.5rem;
+}
+
+.mr-3 {
+ margin-right: 0.75rem;
+}
+
+.mt-0 {
+ margin-top: 0px;
+}
+
+.mt-0\.5 {
+ margin-top: 0.125rem;
+}
+
+.mt-1 {
+ margin-top: 0.25rem;
+}
+
+.mt-2 {
+ margin-top: 0.5rem;
+}
+
+.mt-4 {
+ margin-top: 1rem;
+}
+
+.mt-5 {
+ margin-top: 1.25rem;
+}
+
+.block {
+ display: block;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+.inline {
+ display: inline;
+}
+
+.flex {
+ display: flex;
+}
+
+.inline-flex {
+ display: inline-flex;
+}
+
+.table {
+ display: table;
+}
+
+.grid {
+ display: grid;
+}
+
+.contents {
+ display: contents;
+}
+
+.hidden {
+ display: none;
+}
+
+.h-10 {
+ height: 2.5rem;
+}
+
+.h-3 {
+ height: 0.75rem;
+}
+
+.h-3\.5 {
+ height: 0.875rem;
+}
+
+.h-4 {
+ height: 1rem;
+}
+
+.h-48 {
+ height: 12rem;
+}
+
+.h-5 {
+ height: 1.25rem;
+}
+
+.h-6 {
+ height: 1.5rem;
+}
+
+.h-8 {
+ height: 2rem;
+}
+
+.h-96 {
+ height: 24rem;
+}
+
+.h-\[calc\(100\%-1rem\)\] {
+ height: calc(100% - 1rem);
+}
+
+.h-full {
+ height: 100%;
+}
+
+.h-screen {
+ height: 100vh;
+}
+
+.max-h-96 {
+ max-height: 24rem;
+}
+
+.max-h-full {
+ max-height: 100%;
+}
+
+.w-1\/2 {
+ width: 50%;
+}
+
+.w-3 {
+ width: 0.75rem;
+}
+
+.w-3\.5 {
+ width: 0.875rem;
+}
+
+.w-4 {
+ width: 1rem;
+}
+
+.w-5 {
+ width: 1.25rem;
+}
+
+.w-6 {
+ width: 1.5rem;
+}
+
+.w-64 {
+ width: 16rem;
+}
+
+.w-8 {
+ width: 2rem;
+}
+
+.w-full {
+ width: 100%;
+}
+
+.max-w-2xl {
+ max-width: 42rem;
+}
+
+.max-w-lg {
+ max-width: 32rem;
+}
+
+.max-w-screen-2xl {
+ max-width: 1536px;
+}
+
+.max-w-screen-lg {
+ max-width: 1024px;
+}
+
+.flex-1 {
+ flex: 1 1 0%;
+}
+
+.flex-none {
+ flex: none;
+}
+
+.flex-shrink {
+ flex-shrink: 1;
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0;
+}
+
+.-translate-x-full {
+ --tw-translate-x: -100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.-translate-y-full {
+ --tw-translate-y: -100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-x-0 {
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-x-full {
+ --tw-translate-x: 100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-y-full {
+ --tw-translate-y: 100%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.rotate-180 {
+ --tw-rotate: 180deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.transform {
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.transform-none {
+ transform: none;
+}
+
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+.animate-spin {
+ animation: spin 1s linear infinite;
+}
+
+.cursor-default {
+ cursor: default;
+}
+
+.cursor-not-allowed {
+ cursor: not-allowed;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+.resize {
+ resize: both;
+}
+
+.list-none {
+ list-style-type: none;
+}
+
+.grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+}
+
+.grid-cols-6 {
+ grid-template-columns: repeat(6, minmax(0, 1fr));
+}
+
+.grid-cols-7 {
+ grid-template-columns: repeat(7, minmax(0, 1fr));
+}
+
+.flex-row-reverse {
+ flex-direction: row-reverse;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.content-start {
+ align-content: flex-start;
+}
+
+.items-start {
+ align-items: flex-start;
+}
+
+.items-end {
+ align-items: flex-end;
+}
+
+.items-center {
+ align-items: center;
+}
+
+.items-stretch {
+ align-items: stretch;
+}
+
+.justify-start {
+ justify-content: flex-start;
+}
+
+.justify-end {
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.justify-items-start {
+ justify-items: start;
+}
+
+.gap-1 {
+ gap: 0.25rem;
+}
+
+.gap-2 {
+ gap: 0.5rem;
+}
+
+.gap-4 {
+ gap: 1rem;
+}
+
+.gap-8 {
+ gap: 2rem;
+}
+
+.-space-x-px > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(-1px * var(--tw-space-x-reverse));
+ margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
+}
+
+.space-y-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
+}
+
+.space-y-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
+}
+
+.space-y-6 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
+}
+
+.divide-y > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-y-reverse: 0;
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
+}
+
+.divide-gray-100 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(243 244 246 / var(--tw-divide-opacity));
+}
+
+.justify-self-start {
+ justify-self: start;
+}
+
+.overflow-auto {
+ overflow: auto;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.overflow-x-auto {
+ overflow-x: auto;
+}
+
+.overflow-y-auto {
+ overflow-y: auto;
+}
+
+.overflow-x-hidden {
+ overflow-x: hidden;
+}
+
+.truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.whitespace-nowrap {
+ white-space: nowrap;
+}
+
+.rounded {
+ border-radius: 0.25rem;
+}
+
+.rounded-full {
+ border-radius: 9999px;
+}
+
+.rounded-lg {
+ border-radius: 0.5rem;
+}
+
+.rounded-l-lg {
+ border-top-left-radius: 0.5rem;
+ border-bottom-left-radius: 0.5rem;
+}
+
+.rounded-r-lg {
+ border-top-right-radius: 0.5rem;
+ border-bottom-right-radius: 0.5rem;
+}
+
+.rounded-t {
+ border-top-left-radius: 0.25rem;
+ border-top-right-radius: 0.25rem;
+}
+
+.border {
+ border-width: 1px;
+}
+
+.border-0 {
+ border-width: 0px;
+}
+
+.border-2 {
+ border-width: 2px;
+}
+
+.border-b {
+ border-bottom-width: 1px;
+}
+
+.border-r {
+ border-right-width: 1px;
+}
+
+.border-t {
+ border-top-width: 1px;
+}
+
+.border-blue-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 125 187 / var(--tw-border-opacity));
+}
+
+.border-blue-700 {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 94 140 / var(--tw-border-opacity));
+}
+
+.border-gray-100 {
+ --tw-border-opacity: 1;
+ border-color: rgb(243 244 246 / var(--tw-border-opacity));
+}
+
+.border-gray-200 {
+ --tw-border-opacity: 1;
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
+}
+
+.border-gray-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
+}
+
+.border-primary-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(175 211 130 / var(--tw-border-opacity));
+}
+
+.border-red-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(255 104 104 / var(--tw-border-opacity));
+}
+
+.border-white {
+ --tw-border-opacity: 1;
+ border-color: rgb(255 255 255 / var(--tw-border-opacity));
+}
+
+.bg-blue-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(204 235 251 / var(--tw-bg-opacity));
+}
+
+.bg-blue-300 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(102 196 242 / var(--tw-bg-opacity));
+}
+
+.bg-blue-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 156 234 / var(--tw-bg-opacity));
+}
+
+.bg-blue-700 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 94 140 / var(--tw-bg-opacity));
+}
+
+.bg-gray-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.bg-gray-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
+.bg-gray-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(156 163 175 / var(--tw-bg-opacity));
+}
+
+.bg-gray-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
+}
+
+.bg-gray-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+.bg-gray-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
+}
+
+.bg-green-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(228 240 213 / var(--tw-bg-opacity));
+}
+
+.bg-green-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(121 181 46 / var(--tw-bg-opacity));
+}
+
+.bg-primary-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(242 248 234 / var(--tw-bg-opacity));
+}
+
+.bg-red-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 205 205 / var(--tw-bg-opacity));
+}
+
+.bg-red-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 230 230 / var(--tw-bg-opacity));
+}
+
+.bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+}
+
+.bg-white\/50 {
+ background-color: rgb(255 255 255 / 0.5);
+}
+
+.bg-yellow-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(253 246 178 / var(--tw-bg-opacity));
+}
+
+.bg-green-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(201 225 171 / var(--tw-bg-opacity));
+}
+
+.bg-blue-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(153 215 247 / var(--tw-bg-opacity));
+}
+
+.bg-red-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 154 154 / var(--tw-bg-opacity));
+}
+
+.bg-opacity-50 {
+ --tw-bg-opacity: 0.5;
+}
+
+.p-1 {
+ padding: 0.25rem;
+}
+
+.p-2 {
+ padding: 0.5rem;
+}
+
+.p-2\.5 {
+ padding: 0.625rem;
+}
+
+.p-3 {
+ padding: 0.75rem;
+}
+
+.p-4 {
+ padding: 1rem;
+}
+
+.p-6 {
+ padding: 1.5rem;
+}
+
+.px-2 {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.px-4 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.px-5 {
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+}
+
+.py-0 {
+ padding-top: 0px;
+ padding-bottom: 0px;
+}
+
+.py-0\.5 {
+ padding-top: 0.125rem;
+ padding-bottom: 0.125rem;
+}
+
+.py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.py-2\.5 {
+ padding-top: 0.625rem;
+ padding-bottom: 0.625rem;
+}
+
+.py-3 {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.py-4 {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.py-5 {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.pb-2 {
+ padding-bottom: 0.5rem;
+}
+
+.pb-3 {
+ padding-bottom: 0.75rem;
+}
+
+.pl-10 {
+ padding-left: 2.5rem;
+}
+
+.pl-11 {
+ padding-left: 2.75rem;
+}
+
+.pl-2 {
+ padding-left: 0.5rem;
+}
+
+.pl-3 {
+ padding-left: 0.75rem;
+}
+
+.pr-2 {
+ padding-right: 0.5rem;
+}
+
+.pr-2\.5 {
+ padding-right: 0.625rem;
+}
+
+.pt-16 {
+ padding-top: 4rem;
+}
+
+.pt-2 {
+ padding-top: 0.5rem;
+}
+
+.pt-5 {
+ padding-top: 1.25rem;
+}
+
+.pt-8 {
+ padding-top: 2rem;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+}
+
+.text-base {
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+
+.text-lg {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}
+
+.text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.text-xl {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+.text-xs {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.font-medium {
+ font-weight: 500;
+}
+
+.font-normal {
+ font-weight: 400;
+}
+
+.font-semibold {
+ font-weight: 600;
+}
+
+.uppercase {
+ text-transform: uppercase;
+}
+
+.italic {
+ font-style: italic;
+}
+
+.leading-6 {
+ line-height: 1.5rem;
+}
+
+.leading-9 {
+ line-height: 2.25rem;
+}
+
+.leading-tight {
+ line-height: 1.25;
+}
+
+.text-blue-600 {
+ --tw-text-opacity: 1;
+ color: rgb(0 125 187 / var(--tw-text-opacity));
+}
+
+.text-blue-800 {
+ --tw-text-opacity: 1;
+ color: rgb(0 62 94 / var(--tw-text-opacity));
+}
+
+.text-gray-400 {
+ --tw-text-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-text-opacity));
+}
+
+.text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.text-gray-600 {
+ --tw-text-opacity: 1;
+ color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
+.text-gray-700 {
+ --tw-text-opacity: 1;
+ color: rgb(55 65 81 / var(--tw-text-opacity));
+}
+
+.text-gray-800 {
+ --tw-text-opacity: 1;
+ color: rgb(31 41 55 / var(--tw-text-opacity));
+}
+
+.text-gray-900 {
+ --tw-text-opacity: 1;
+ color: rgb(17 24 39 / var(--tw-text-opacity));
+}
+
+.text-green-800 {
+ --tw-text-opacity: 1;
+ color: rgb(48 72 18 / var(--tw-text-opacity));
+}
+
+.text-primary-600 {
+ --tw-text-opacity: 1;
+ color: rgb(97 145 37 / var(--tw-text-opacity));
+}
+
+.text-red-600 {
+ --tw-text-opacity: 1;
+ color: rgb(204 2 2 / var(--tw-text-opacity));
+}
+
+.text-red-800 {
+ --tw-text-opacity: 1;
+ color: rgb(102 1 1 / var(--tw-text-opacity));
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.text-yellow-800 {
+ --tw-text-opacity: 1;
+ color: rgb(114 59 19 / var(--tw-text-opacity));
+}
+
+.underline {
+ text-decoration-line: underline;
+}
+
+.opacity-0 {
+ opacity: 0;
+}
+
+.opacity-100 {
+ opacity: 1;
+}
+
+.shadow {
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-md {
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-sm {
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.outline {
+ outline-style: solid;
+}
+
+.ring {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.blur {
+ --tw-blur: blur(8px);
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+}
+
+.filter {
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+}
+
+.transition {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-all {
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-opacity {
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-transform {
+ transition-property: transform;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.duration-100 {
+ transition-duration: 100ms;
+}
+
+.duration-300 {
+ transition-duration: 300ms;
+}
+
+.duration-500 {
+ transition-duration: 500ms;
+}
+
+.duration-75 {
+ transition-duration: 75ms;
+}
+
+.ease-in-out {
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.ease-out {
+ transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
+}
+
+.htmx-added .fade-in {
+ opacity: 0.0 !important;
+}
+
+.htmx-added.fade-in {
+ opacity: 0.0 !important;
+}
+
+.fade-in {
+ opacity: 1.0;
+}
+
+.htmx-added .slide-up {
+ --tw-translate-y: 1.25rem !important;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
+}
+
+.hidden .slide-up {
+ --tw-translate-y: 1.25rem !important;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
+}
+
+.slide-up {
+ --tw-translate-y: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.live-added {
+ animation: pulse-green 300ms 2;
+ animation-direction: alternate;
+ animation-timing-function: ease-in-out;
+}
+
+.dark .live-added {
+ animation: pulse-dark-green 300ms 2 !important;
+ animation-direction: alternate;
+ animation-timing-function: ease-in-out;
+}
+
+/*
+.live-added {
+ @apply bg-white;
+}
+*/
+
+@keyframes pulse-green {
+ 0% {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+ }
+
+ 100% {
+ --tw-bg-opacity: 1;
+ background-color: rgb(175 211 130 / var(--tw-bg-opacity));
+ }
+
+ :is(.dark 100%) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(153 2 2 / var(--tw-bg-opacity));
+ }
+}
+
+@keyframes pulse-dark-green {
+ :is(.dark 0%) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
+ }
+
+ 100% {
+ --tw-bg-opacity: 1;
+ background-color: rgb(73 109 28 / var(--tw-bg-opacity));
+ }
+}
+
+.htmx-request .htmx-indicator, .htmx-request.htmx-indicator {
+ display: inherit !important;
+}
+
+.htmx-indicator {
+ display: none;
+}
+
+.htmx-request .htmx-indicator-hidden {
+ display: none !important;
+}
+
+.htmx-indicator-hidden {
+ display: inherit;
+}
+
+.htmx-swapping .fade-out {
+ opacity: 0.0 !important;
+}
+
+.fade-out {
+ opacity: 1.0;
+}
+
+.min-h-content {
+ min-height: calc(100vh - 4em);
+}
+
+.hover\:scale-105:hover {
+ --tw-scale-x: 1.05;
+ --tw-scale-y: 1.05;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.hover\:scale-110:hover {
+ --tw-scale-x: 1.1;
+ --tw-scale-y: 1.1;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.hover\:border-gray-300:hover {
+ --tw-border-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
+}
+
+.hover\:bg-blue-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 125 187 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-blue-800:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 62 94 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-200:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-green-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(228 240 213 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-green-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(97 145 37 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-green-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(73 109 28 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-primary-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(228 240 213 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-white:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-green-300:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(175 211 130 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-blue-300:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(102 196 242 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-red-300:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 104 104 / var(--tw-bg-opacity));
+}
+
+.hover\:text-blue-600:hover {
+ --tw-text-opacity: 1;
+ color: rgb(0 125 187 / var(--tw-text-opacity));
+}
+
+.hover\:text-gray-600:hover {
+ --tw-text-opacity: 1;
+ color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
+.hover\:text-gray-700:hover {
+ --tw-text-opacity: 1;
+ color: rgb(55 65 81 / var(--tw-text-opacity));
+}
+
+.hover\:text-gray-800:hover {
+ --tw-text-opacity: 1;
+ color: rgb(31 41 55 / var(--tw-text-opacity));
+}
+
+.hover\:text-gray-900:hover {
+ --tw-text-opacity: 1;
+ color: rgb(17 24 39 / var(--tw-text-opacity));
+}
+
+.hover\:text-primary-700:hover {
+ --tw-text-opacity: 1;
+ color: rgb(73 109 28 / var(--tw-text-opacity));
+}
+
+.hover\:underline:hover {
+ text-decoration-line: underline;
+}
+
+.focus\:border-blue-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 156 234 / var(--tw-border-opacity));
+}
+
+.focus\:border-primary-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(121 181 46 / var(--tw-border-opacity));
+}
+
+.focus\:outline-none:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus\:ring-2:focus {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus\:ring-4:focus {
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus\:ring-blue-300:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(102 196 242 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-blue-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(0 156 234 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-gray-200:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-gray-300:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-green-300:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(175 211 130 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-primary-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(121 181 46 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-green-200:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(201 225 171 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-blue-200:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(153 215 247 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-red-200:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(255 154 154 / var(--tw-ring-opacity));
+}
+
+.group:hover .group-hover\:scale-110 {
+ --tw-scale-x: 1.1;
+ --tw-scale-y: 1.1;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.group:hover .group-hover\:text-blue-500 {
+ --tw-text-opacity: 1;
+ color: rgb(0 156 234 / var(--tw-text-opacity));
+}
+
+.group:hover .group-hover\:text-gray-900 {
+ --tw-text-opacity: 1;
+ color: rgb(17 24 39 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:block) {
+ display: block;
+}
+
+:is(.dark .dark\:hidden) {
+ display: none;
+}
+
+:is(.dark .dark\:divide-gray-600) > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(75 85 99 / var(--tw-divide-opacity));
+}
+
+:is(.dark .dark\:border-blue-500) {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 156 234 / var(--tw-border-opacity));
+}
+
+:is(.dark .dark\:border-gray-500) {
+ --tw-border-opacity: 1;
+ border-color: rgb(107 114 128 / var(--tw-border-opacity));
+}
+
+:is(.dark .dark\:border-gray-600) {
+ --tw-border-opacity: 1;
+ border-color: rgb(75 85 99 / var(--tw-border-opacity));
+}
+
+:is(.dark .dark\:border-gray-700) {
+ --tw-border-opacity: 1;
+ border-color: rgb(55 65 81 / var(--tw-border-opacity));
+}
+
+:is(.dark .dark\:border-gray-900) {
+ --tw-border-opacity: 1;
+ border-color: rgb(17 24 39 / var(--tw-border-opacity));
+}
+
+:is(.dark .dark\:border-transparent) {
+ border-color: transparent;
+}
+
+:is(.dark .dark\:bg-blue-600) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 125 187 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-blue-900) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 31 47 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-gray-600) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-gray-700) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-gray-800) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-gray-800\/50) {
+ background-color: rgb(31 41 55 / 0.5);
+}
+
+:is(.dark .dark\:bg-gray-900) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-green-600) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(97 145 37 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-green-900) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(24 36 9 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-red-900) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(51 1 1 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-yellow-900) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(99 49 18 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-green-500) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(121 181 46 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-green-700) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(73 109 28 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-blue-700) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 94 140 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-red-700) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(153 2 2 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:bg-opacity-80) {
+ --tw-bg-opacity: 0.8;
+}
+
+:is(.dark .dark\:text-blue-300) {
+ --tw-text-opacity: 1;
+ color: rgb(102 196 242 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-blue-500) {
+ --tw-text-opacity: 1;
+ color: rgb(0 156 234 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-gray-100) {
+ --tw-text-opacity: 1;
+ color: rgb(243 244 246 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-gray-200) {
+ --tw-text-opacity: 1;
+ color: rgb(229 231 235 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-gray-300) {
+ --tw-text-opacity: 1;
+ color: rgb(209 213 219 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-gray-400) {
+ --tw-text-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-gray-50) {
+ --tw-text-opacity: 1;
+ color: rgb(249 250 251 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-gray-500) {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-green-300) {
+ --tw-text-opacity: 1;
+ color: rgb(175 211 130 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-red-300) {
+ --tw-text-opacity: 1;
+ color: rgb(255 104 104 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-red-400) {
+ --tw-text-opacity: 1;
+ color: rgb(255 53 53 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-white) {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:text-yellow-300) {
+ --tw-text-opacity: 1;
+ color: rgb(250 202 21 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:placeholder-gray-400)::-moz-placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+:is(.dark .dark\:placeholder-gray-400)::placeholder {
+ --tw-placeholder-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-placeholder-opacity));
+}
+
+:is(.dark .dark\:ring-offset-gray-800) {
+ --tw-ring-offset-color: #1F2937;
+}
+
+:is(.dark .dark\:hover\:bg-blue-700:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 94 140 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:bg-gray-600:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(75 85 99 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:bg-gray-700:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(55 65 81 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:bg-gray-800:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:bg-green-600:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(97 145 37 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:bg-green-700:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(73 109 28 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:bg-blue-600:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 125 187 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:bg-red-600:hover) {
+ --tw-bg-opacity: 1;
+ background-color: rgb(204 2 2 / var(--tw-bg-opacity));
+}
+
+:is(.dark .dark\:hover\:text-blue-500:hover) {
+ --tw-text-opacity: 1;
+ color: rgb(0 156 234 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:hover\:text-gray-100:hover) {
+ --tw-text-opacity: 1;
+ color: rgb(243 244 246 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:hover\:text-gray-300:hover) {
+ --tw-text-opacity: 1;
+ color: rgb(209 213 219 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:hover\:text-white:hover) {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+:is(.dark .dark\:focus\:border-blue-500:focus) {
+ --tw-border-opacity: 1;
+ border-color: rgb(0 156 234 / var(--tw-border-opacity));
+}
+
+:is(.dark .dark\:focus\:border-primary-500:focus) {
+ --tw-border-opacity: 1;
+ border-color: rgb(121 181 46 / var(--tw-border-opacity));
+}
+
+:is(.dark .dark\:focus\:ring-blue-500:focus) {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(0 156 234 / var(--tw-ring-opacity));
+}
+
+:is(.dark .dark\:focus\:ring-blue-800:focus) {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(0 62 94 / var(--tw-ring-opacity));
+}
+
+:is(.dark .dark\:focus\:ring-gray-600:focus) {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity));
+}
+
+:is(.dark .dark\:focus\:ring-green-800:focus) {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(48 72 18 / var(--tw-ring-opacity));
+}
+
+:is(.dark .dark\:focus\:ring-primary-500:focus) {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(121 181 46 / var(--tw-ring-opacity));
+}
+
+:is(.dark .dark\:focus\:ring-primary-600:focus) {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(97 145 37 / var(--tw-ring-opacity));
+}
+
+:is(.dark .group:hover .dark\:group-hover\:text-white) {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+@media (min-width: 640px) {
+ .sm\:block {
+ display: block;
+ }
+
+ .sm\:rounded-lg {
+ border-radius: 0.5rem;
+ }
+
+ .sm\:p-6 {
+ padding: 1.5rem;
+ }
+
+ .sm\:py-5 {
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+ }
+
+ .sm\:text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ }
+}
+
+@media (min-width: 768px) {
+ .md\:inset-0 {
+ inset: 0px;
+ }
+
+ .md\:ml-2 {
+ margin-left: 0.5rem;
+ }
+
+ .md\:mr-24 {
+ margin-right: 6rem;
+ }
+
+ .md\:table-cell {
+ display: table-cell;
+ }
+
+ .md\:flex-row {
+ flex-direction: row;
+ }
+
+ .md\:items-center {
+ align-items: center;
+ }
+
+ .md\:space-x-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.75rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .md\:space-y-0 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0px * var(--tw-space-y-reverse));
+ }
+}
+
+@media (min-width: 1024px) {
+ .lg\:block {
+ display: block;
+ }
+
+ .lg\:flex {
+ display: flex;
+ }
+
+ .lg\:table-cell {
+ display: table-cell;
+ }
+
+ .lg\:hidden {
+ display: none;
+ }
+
+ .lg\:w-96 {
+ width: 24rem;
+ }
+
+ .lg\:translate-x-0 {
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+ }
+
+ .lg\:flex-row {
+ flex-direction: row;
+ }
+
+ .lg\:items-center {
+ align-items: center;
+ }
+
+ .lg\:justify-end {
+ justify-content: flex-end;
+ }
+
+ .lg\:justify-between {
+ justify-content: space-between;
+ }
+
+ .lg\:space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .lg\:space-y-0 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0px * var(--tw-space-y-reverse));
+ }
+
+ .lg\:px-5 {
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+ }
+
+ .lg\:pl-3 {
+ padding-left: 0.75rem;
+ }
+
+ .lg\:pl-64 {
+ padding-left: 16rem;
+ }
+}
diff --git a/scratch-sessions/build_ml.clj b/scratch-sessions/build_ml.clj
index e74fdc1e..ad27fbc2 100644
--- a/scratch-sessions/build_ml.clj
+++ b/scratch-sessions/build_ml.clj
@@ -5,7 +5,7 @@
;; You can also press C-u C-j to evaluate the expression and pretty-print its result.
(ns build-ml
- (:require [datomic.client.api :as dc]
+ (:require [datomic.api :as dc]
[clojure.java.io :as io]
[clojure.data.csv :as csv]
[auto-ap.datomic :refer [conn]]))
diff --git a/scratch-sessions/ingest_ml.clj b/scratch-sessions/ingest_ml.clj
index 07001b8a..126d228b 100644
--- a/scratch-sessions/ingest_ml.clj
+++ b/scratch-sessions/ingest_ml.clj
@@ -41,7 +41,7 @@
(drop 1)
(map (fn [[a n]]
[(Long/parseLong a) (numeric-code->account (Long/parseLong n))])))
- (slurp-csv "/home/notid/dev/transaction-training/input/accounts.csv"))
+ (slurp-csv "/mnt/data/dev2/ml-test/input/accounts.csv"))
vendor-name->vendor (into {} (dc/q '[:find ?vn ?v
:in $
:where [?v :vendor/name ?vn]]
@@ -51,18 +51,18 @@
(drop 1)
(map (fn [[a n]]
[(Long/parseLong a) (vendor-name->vendor (Long/parseLong n))])))
- (slurp-csv "/home/notid/dev/transaction-training/input/vendors.csv"))]
- inference-vendor->vendor
- #_(with-open [reader (io/reader "/home/notid/dev/transaction-training/inference-outcome.csv")]
+ (slurp-csv "/mnt/data/dev2/ml-test/input/vendors.csv"))]
+ #_inference-vendor->vendor
+ (with-open [reader (io/reader "/mnt/data/dev2/ml-test/inference-outcome.csv")]
(->> (csv/read-csv reader)
(into []
(comp
(drop 1)
(map (fn [[_ transaction best-vendor best-account account-confidence]]
{:db/id (Long/parseLong transaction)
- :transaction/recommended-account (Long/parseLong best-account)
+ :transaction/recommended-account (inference-account->account best-account)
:transaction/account-confidence (Double/parseDouble account-confidence)
- :transaction/recommended-vendor (Long/parseLong best-vendor)}))))))))
+ :transaction/recommended-vendor (inference-vendor->vendor best-vendor)}))))))))
(defn apply-inference [inference]
(doseq [p (->> inference (partition-all 100))]
diff --git a/scratch-sessions/pnl-export.repl b/scratch-sessions/pnl-export.repl
new file mode 100644
index 00000000..ca27b7a8
--- /dev/null
+++ b/scratch-sessions/pnl-export.repl
@@ -0,0 +1,83 @@
+;; This buffer is for Clojure experiments and evaluation.
+
+;; Press C-j to evaluate the last expression.
+
+;; You can also press C-u C-j to evaluate the expression and pretty-print its result.
+(dc/pull (dc/db conn) [:db/id] [:client/code "NGAK"])
+
+(user/init-repl)
+
+(require '[auto-ap.datomic :refer [pull-attr pull-many]])
+
+(csv/write-csv *out*
+ (let [clients (pull-many (dc/db conn) '[:db/id :client/code :client/locations] [[:client/code "NGAK"] [:client/code "NGOP"] #_#_[:client/code "NGRV"] [:client/code "NGE1"]])
+ account->numeric-code (into {} (seq (dc/q '[:find ?i ?n
+ :in $ [?a ...]
+ :where [?i ?a ?n]]
+ (dc/db conn) [:account/numeric-code :bank-account/numeric-code])))
+ account->name (let [lookup (into {} (seq (dc/q '[:find ?i ?n
+ :in $
+ :where [?i :account/name ?n]]
+ (dc/db conn))))]
+ (fn [x]
+ (or (lookup x) "Bank Account")))
+ account->location (into {} (seq (dc/q '[:find ?i ?l
+ :in $
+ :where [?i :account/location ?l]]
+ (dc/db conn))))
+ used-accounts (into #{} (for [c clients
+ d (dc/index-range (dc/db conn)
+ :journal-entry-line/client+account+location+date
+ [(:db/id c)]
+ [(inc (:db/id c))])
+ :let [[_ account] (:v d)]]
+ account))]
+ (for [client clients
+ :let [all-entries (->> (dc/index-pull (dc/db conn)
+ {:index :avet
+ :selector [:db/id :journal-entry-line/running-balance :journal-entry-line/client+account+location+date]
+ :start [:journal-entry-line/client+account+location+date [(:db/id client)]]
+ :reverse false
+ :limit 1})
+ (take-while (fn [curr]
+ (= (first (:journal-entry-line/client+account+location+date curr))
+ (:db/id client)))))
+ account-lookup (->> all-entries
+ (reduce
+ (fn [acc curr]
+ (let [[client account location date] (:journal-entry-line/client+account+location+date curr)
+ numeric-code (account->numeric-code account)]
+ (assoc acc (format "%d-%d-%s-%s" client numeric-code location (atime/unparse-local (clj-time.coerce/to-date-time date) atime/iso-date)) (:journal-entry-line/running-balance curr))))
+ (sorted-map)))]
+ a (sort-by account->numeric-code used-accounts)
+ :let [numeric-code (account->numeric-code a)]
+ l (or (account->location a) (:client/locations client))
+ delta (range -60 0)
+ :let [date (t/plus (c/to-date-time #inst "2023-06-12T08:00:00") (t/days delta))
+ date-str (atime/unparse-local date atime/iso-date)]
+ :when (and numeric-code (>= numeric-code 40000))]
+ (conj [(:client/code client) l numeric-code (account->name a) date-str] (with-precision 2
+ (double (.setScale (bigdec (or
+ (some->> (subseq account-lookup >= (format "%d-%d-%s-%s" (:db/id client) numeric-code l "2000-01-01") <= (format "%d-%d-%s-%s" (:db/id client) numeric-code l date-str))
+ last
+ last)
+ 0.0))
+ 2 java.math.RoundingMode/HALF_UP))))))
+ )
+
+(dc/q '[:find (count ?x)
+ :where [?x :journal-entry-line/dirty true]]
+ (dc/db conn))
+
+(let [clients (map first
+ (dc/q '[:find (pull ?c [:client/code :db/id])
+ :where [?c :client/code]]
+ (dc/db conn)))]
+ (doseq [[c i] (map vector clients (range))]
+ (let [db (dc/db conn)
+ accounts-needing-rebuild (auto-ap.ledger/accounts-needing-rebuild db (:db/id c))]
+ (when (seq accounts-needing-rebuild)
+ (println "C" c "needs" (count accounts-needing-rebuild) "built")
+ #_(refresh-running-balance-accounts accounts-needing-rebuild clients c i db)
+ #_(mu/log ::client-completed)))))
+,
diff --git a/src/clj/auto_ap/datomic.clj b/src/clj/auto_ap/datomic.clj
index 71c585b6..f2a18fa5 100644
--- a/src/clj/auto_ap/datomic.clj
+++ b/src/clj/auto_ap/datomic.clj
@@ -578,12 +578,14 @@
(defn add-sorter-fields [q sort-map args]
(reduce
- (fn [q {:keys [sort-key]}]
+ (fn [q {:keys [sort-key] :as z}]
+ (prn z)
+ (println (class sort-key))
(merge-query q
{:query {:find [(symbol (str "?sort-" sort-key))]
:where (sort-map
sort-key
- (println "Warning, trying to sort by unsupported field" sort-key))}}))
+ (println "Warning, trying to sort by unsupported field" sort-key, "sort map" (pr-str sort-map)))}}))
q
(:sort args)))
@@ -620,9 +622,13 @@
(range length)))]
(sort comparator results )))
-(defn apply-pagination [args results]
- (log/info (take 4 results))
+(defn apply-pagination-raw [args results]
+ {:entries (->> results
+ (drop (:start args 0))
+ (take (:count args (or (:per-page args) default-pagination-size))))
+ :count (count results)})
+(defn apply-pagination [args results]
{:ids (->> results
(drop (:start args 0))
(take (:count args (or (:per-page args) default-pagination-size)))
diff --git a/src/clj/auto_ap/datomic/reports.clj b/src/clj/auto_ap/datomic/reports.clj
index 843e2026..66ce0cf2 100644
--- a/src/clj/auto_ap/datomic/reports.clj
+++ b/src/clj/auto_ap/datomic/reports.clj
@@ -12,6 +12,8 @@
[clj-time.coerce :as c]
[datomic.api :as dc]))
+(def default-read '[:db/id :report/client :report/created :report/url :report/name :report/creator])
+
(defn raw-graphql-ids [db args]
(let [query (cond-> {:query {:find []
:in ['$ ]
@@ -43,8 +45,7 @@
(apply-pagination args))))
(defn graphql-results [ids db args]
- (let [results (->> (pull-many db '[:db/id :report/client :report/created :report/url :report/name :report/creator]
- ids)
+ (let [results (->> (pull-many db default-read ids)
(map #(update % :report/created c/from-date))
(group-by :db/id))]
(->> ids
@@ -63,8 +64,3 @@
[(->> (graphql-results ids-to-retrieve db args))
matching-count]))
-
-
-
-
-
diff --git a/src/clj/auto_ap/handler.clj b/src/clj/auto_ap/handler.clj
index 54643aa9..da43b0df 100644
--- a/src/clj/auto_ap/handler.clj
+++ b/src/clj/auto_ap/handler.clj
@@ -30,7 +30,8 @@
[ring.util.response :as response]
[unilog.context :as lc]
[clj-time.coerce :as coerce]
- [clj-time.core :as time]))
+ [clj-time.core :as time]
+ [cemerick.url :as url]))
(when (:aws-access-key-id env)
(defcredential (:aws-access-key-id env) (:aws-secret-access-key env) (:aws-region env)))
@@ -161,9 +162,17 @@
(let [end-time (time/plus (time/now) (time/days 14))]
(assoc response :session (assoc session ::idle-timeout (coerce/to-date end-time)))))))))))
+(defn wrap-hx-current-url-params
+ [handler ]
+ (fn [request]
+ (let [query-params (some-> (get-in request [:headers "hx-current-url"]) (url/url ) :query)
+ request (assoc request :hx-query-params query-params)]
+ (handler request))))
+
#_{:clj-kondo/ignore [:clojure-lsp/unused-public-var]}
(def app
(-> route-handler
+ (wrap-hx-current-url-params)
(wrap-guess-route)
(wrap-authorization auth-backend
)
diff --git a/src/clj/auto_ap/parse/excel.clj b/src/clj/auto_ap/parse/excel.clj
index 1f3b21f7..c296ccc2 100644
--- a/src/clj/auto_ap/parse/excel.clj
+++ b/src/clj/auto_ap/parse/excel.clj
@@ -44,12 +44,14 @@
extract)]))
(defn extract-sheet-details [bucket object]
- (-> (lambda/invoke {:function-name "xls-extractor" :payload
- (json/write-str
+ (doto
+ (-> (lambda/invoke {:function-name "xls-extractor" :payload
+ (json/write-str
{"s3_url" object "s3_bucket" bucket})})
- :payload
- slurp
- json/read-str))
+ :payload
+ slurp
+ json/read-str)
+ println))
(defn parse-file
[file _]
diff --git a/src/clj/auto_ap/routes/auth.clj b/src/clj/auto_ap/routes/auth.clj
index 45f07582..d6e4e2b9 100644
--- a/src/clj/auto_ap/routes/auth.clj
+++ b/src/clj/auto_ap/routes/auth.clj
@@ -20,18 +20,18 @@
(:jwt-secret env)
{:alg :hs512}))
-(defn oauth [{{:strs [code]} :query-params {:strs [host]} :headers}]
+(defn oauth [{{:strs [code state]} :query-params {:strs [host]} :headers :as request}]
(try
(let [auth (-> "https://accounts.google.com/o/oauth2/token"
- (http/post
- {:form-params {"client_id" google-client-id
- "client_secret" google-client-secret
- "code" code
- "redirect_uri" (str (:scheme env) "://" host "/api/oauth")
- "grant_type" "authorization_code"}
- :as :json})
+ (http/post
+ {:form-params {"client_id" google-client-id
+ "client_secret" google-client-secret
+ "code" code
+ "redirect_uri" (str (:scheme env) "://" host "/api/oauth")
+ "grant_type" "authorization_code"}
+ :as :json})
:body)
-
+
token (:access_token auth)
profile (-> (http/get "https://www.googleapis.com/oauth2/v1/userinfo"
{:headers {"Authorization" (str "Bearer " token)} :as :json})
@@ -45,6 +45,7 @@
:user/name (:name profile)})
auth {:user (:name profile)
:exp (time/plus (time/now) (time/days 30))
+ :db/id (:db/id user)
:user/clients (map (fn [c]
(select-keys c [:client/code :db/id :client/locations]))
(:user/clients user))
@@ -53,19 +54,18 @@
_ (mu/log ::logged-in-as
:auth auth)]
;; TODO - these namespaces are not being transmitted/deserialized properly
-
+
(if (and token user)
(let [jwt (jwt/sign auth
(:jwt-secret env)
{:alg :hs512})]
-
{:status 301
- :headers {"Location" (str "/?jwt=" jwt)}
+ :headers {"Location" (str (or (not-empty state) "/") "?jwt=" jwt)}
:session {:identity (dissoc auth :exp)}})
{:status 401
:body "Couldn't authenticate"}))
(catch Exception e
- (log/warn e )
+ (log/warn e)
{:status 401
:body (str "Couldn't authenticate " (.toString e))})))
diff --git a/src/clj/auto_ap/routes/exports.clj b/src/clj/auto_ap/routes/exports.clj
index 441f2e2a..994bbe4a 100644
--- a/src/clj/auto_ap/routes/exports.clj
+++ b/src/clj/auto_ap/routes/exports.clj
@@ -267,8 +267,9 @@
))
(into [["Vendor Name" "Address" "City" "State" "Zip" "Terms" "Account" "Account Code"]]))]
{:body
- (into (list)
- data)})))
+ (into []
+ data)
+ :headers {"content-disposition" "attachment; filename=\"vendors.csv\""}})))
(defn export-ledger [{:keys [identity query-params]}]
(let [start-date (or (some-> (query-params "start-date")
@@ -426,7 +427,7 @@
"expected-deposit/" {#"export/?" {:get :export-expected-deposits}}
"clients/" {#"export/?" {:get :export-clients}}
"vendors/" {#"export/?" {:get :export-vendors}
- "/company" {#"export/?" {:get :export-company-vendors}}}
+ "company/" {#"export" {:get :export-company-vendors}}}
"ledger/" {#"export/?" {:get :export-ledger}}
"accounts/" {#"export/?" {:get :export-accounts}}
"transactions/" {#"export/?" {:get :export-transactions}
diff --git a/src/clj/auto_ap/routes/ezcater_xls.clj b/src/clj/auto_ap/routes/ezcater_xls.clj
index 41052f6d..a9fdb31a 100644
--- a/src/clj/auto_ap/routes/ezcater_xls.clj
+++ b/src/clj/auto_ap/routes/ezcater_xls.clj
@@ -18,7 +18,8 @@
[com.brunobonacci.mulog :as mu]
[datomic.api :as dc]
[hiccup2.core :as hiccup]
- [amazonica.aws.s3 :as s3]))
+ [amazonica.aws.s3 :as s3]
+ [auto-ap.ssr.components :as com]))
(defn fmt-amount [a]
(with-precision 2
@@ -27,19 +28,14 @@
(.setScale 2 java.math.RoundingMode/HALF_UP)
(double))))
-
-
-
(defn rows->maps [rows]
(let [[headers & rows] rows]
(for [r rows]
(into {}
(map vector headers r)))))
-
-
-
(defn map->sales-order [r clients]
+ (println r)
(let [order-number (get r "Order Number")
event-date (get r "Event Date")
store-name (get r "Store Name")
@@ -135,30 +131,29 @@
(stream->sales-orders s)))
(defn page* []
- [:div
- [:h1.title "EZCater XLS Import"]
- [:div.card.block {:style {:width "500px"}}
- [:div.card-content
- "Please go to "
- [:a {:href "https://www.ezcater.com/ez_manage/reports/new" :target "_blank"} "EZCater's report page"]
- " to generate a new report. Then drop it below."]]
- [:div#page-notification.notification.block {:style {:display "none"}}]
- [:div.card.block
- [:div.card-content
- [:form {:action (bidi/path-for ssr-routes/only-routes
- :admin-ezcater-xls)
- :method "POST"
- :class "dropzone"
- :id "ezcater"}]]]
- [:script
- (hiccup/raw
- "
+ [:div.mt-4
+ (com/card {}
+ [:div.px-4.py-3.space-y-4.flex.flex-col
+ [:h1.text-2xl.mb-3.font-bold "EZCater XLS Import"]
+ [:p.text-sm.italic
+ "Please go to "
+ (com/link {:href "https://www.ezcater.com/ez_manage/reports/new" :target "_blank"} "EZCater's report page")
+ " to generate a new report. Then drop it below."]
+ [:div#page-notification.notification.block {:style {:display "none"}}]
+ [:form.bg-blue-300 {:action (bidi/path-for ssr-routes/only-routes
+ :admin-ezcater-xls)
+ :method "POST"
+ :class "dropzone"
+ :id "ezcater"}]
+ [:script
+ (hiccup/raw
+ "
Dropzone.options.ezcater = {
success: function (file, response) {
document.getElementById(\"page-notification\").innerHTML = response;
document.getElementById(\"page-notification\").style[\"display\"] = \"block\";
}
- }")]])
+ }")]])])
(defn upload-xls [{:keys [identity] :as request}]
@@ -194,8 +189,23 @@
(if (= :post request-method)
(upload-xls request)
(base-page
- request
- (page*)
-
- (admin-side-bar matched-route))))
+ request
+ (com/page {:nav (com/admin-aside-nav)
+ :active-client (:client (:session request))
+ :identity (:identity request)
+ :app-params {:hx-get (bidi/path-for ssr-routes/only-routes
+ :admin-ezcater-xls)
+ :hx-trigger "clientSelected from:body"
+ :hx-select "#app-contents"
+ :hx-swap "outerHTML swap:300ms"}}
+ (com/breadcrumbs {}
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :admin)}
+ "Admin"]
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :admin-ezcater-xls)}
+ "EZCater XLS Import"])
+ (page*))
+
+ "EZCater upload")))
diff --git a/src/clj/auto_ap/routes/utils.clj b/src/clj/auto_ap/routes/utils.clj
index ee803775..f8747c9d 100644
--- a/src/clj/auto_ap/routes/utils.clj
+++ b/src/clj/auto_ap/routes/utils.clj
@@ -8,30 +8,33 @@
(defn wrap-secure [handler]
(fn [request]
(cond (authenticated? request)
- (handler request)
+ (handler request)
+ (get (:headers request) "hx-request")
+ {:status 401
+ :headers {"hx-redirect" (str "/login?"
+ (url/map->query {"redirect-to" (:uri request)}))}}
- (get (:headers request) "hx-request")
- {:status 401
- :headers {"hx-redirect" "/login"}}
-
- :else
- {:status 302
- :headers {"Location" "/login" }})))
+ :else
+ {:status 302
+ :headers {"Location" (str "/login?"
+ (url/map->query {"redirect-to" (:uri request)}))}})))
(defn wrap-admin [handler]
(fn [request]
(if (is-admin? (:identity request))
(handler request)
- (do
+ (do
(alog/warn ::unauthenticated)
{:status 302
- :headers {"Location" "/login"}}))))
+ :headers {"Location" (str "/login?"
+ (url/map->query {"redirect-to" (:uri request)}))}}))))
(defn wrap-client-redirect-unauthenticated [handler]
(fn [request]
(let [response (handler request)]
(if (= 401 (get response :status))
- (-> response
- (assoc-in [:headers "hx-redirect"] "/login/"))
+ (-> response
+ (assoc-in [:headers "hx-redirect"] (str "/login?"
+ (url/map->query {"redirect-to" (:uri request)}))))
response))))
diff --git a/src/clj/auto_ap/solr.clj b/src/clj/auto_ap/solr.clj
index b1d3dcc8..18b535f2 100644
--- a/src/clj/auto_ap/solr.clj
+++ b/src/clj/auto_ap/solr.clj
@@ -206,3 +206,34 @@
(index-documents impl index [i])))
+(defrecord InMemSolrClient [data-set-atom]
+ SolrClient
+ (index-documents [this index xs]
+ (swap! data-set-atom
+ (fn [data-set]
+ (reduce
+ (fn [data-set x]
+ (let [thing (datomic->solr x)]
+ (update data-set index conj [(str/join " " (vals x)) thing])))
+ data-set
+ xs)))
+ nil)
+
+ (index-documents-raw [this index xs]
+ (swap! data-set-atom
+ (fn [data-set]
+ (reduce
+ (fn [data-set x]
+ (update data-set index conj [(str/join " " (vals x)) x]))
+ data-set
+ xs))))
+
+ (query [this index q]
+ (filter
+ (fn [[x e]]
+ (str/includes? x (get q "query")))
+ (get @data-set-atom index)))
+ (delete [this index]
+ (swap! data-set-atom dissoc index)))
+
+
diff --git a/src/clj/auto_ap/ssr/admin.clj b/src/clj/auto_ap/ssr/admin.clj
deleted file mode 100644
index 0aad7c9d..00000000
--- a/src/clj/auto_ap/ssr/admin.clj
+++ /dev/null
@@ -1,200 +0,0 @@
-(ns auto-ap.ssr.admin
- (:require
- [auto-ap.datomic :refer [conn]]
- [auto-ap.logging :as alog]
- [auto-ap.shared-views.admin.side-bar :refer [admin-side-bar]]
- [auto-ap.ssr.ui :refer [base-page]]
- [auto-ap.ssr.utils :refer [html-response]]
- [auto-ap.time :as atime]
- [clj-time.coerce :as coerce]
- [clojure.string :as str]
- [datomic.api :as dc]
- [hiccup2.core :as hiccup]))
-
-(defn tx-rows->changes [history]
- (->> history
- (group-by (fn [[a _ t]]
- [a t]))
- (map (fn [[[a t] changes]]
- (let [changes (-> (reduce
- (fn [acc [_ v _ added]]
- (if added
- (assoc acc :added v)
- (assoc acc :removed v)))
- {}
- changes))]
- [t a changes])))))
-
-(def error-script
- (hiccup/raw "on htmx:responseError from me set event.detail.target's innerHTML to event.detail.xhr.responseText end"))
-
-(defn format-value [v]
- (cond (inst? v)
- (-> v
- coerce/to-date-time
- atime/localize
- (atime/unparse atime/normal-date))
-
- (nil? v)
- [:em "(none)"]
-
- (and (integer? v)
- (> v 1000000))
- [:span
- [:a {:hx-get (str "/admin/history/" v)
- :hx-swap "innerHTML"
- :hx-push-url "true"
- :hx-target "#history-table"}
- v]
- " [" [:a
- {:hx-get (str "/admin/history/inspect/" v)
- :hx-swap "innerHTML"
- :hx-target "#inspector"
- :hx-trigger "click"
- "_" error-script}
- "snapshot"] "]"]
-
-
- :else
- (pr-str v)))
-
-(defn page-template [& {:keys [table entity-id]}]
- [:div
- [:div.columns
- [:div.column.is-4
- [:form {"hx-target" "#history-table"
- "hx-post" "/admin/history/search"
- "hx-swap" "innerHTML"
- "_" (hiccup/raw "on htmx:beforeRequest toggle @disabled on me then toggle .is-loading on <#dig/> end
- on htmx:afterRequest toggle @disabled on me then toggle .is-loading on <#dig /> end")
- }
- [:div.field.is-grouped
- [:p.control {}
- [:input.input {:type "text" :name "entity-id" :placeholder "Entity id" :value entity-id}]]
- [:p.control
- [:button#dig.button.is-primary {}
- "Dig"]]]]]]
- [:div#history-table
- table]])
-
-(defn table [entity-id best-guess-entity history]
- [:div [:h1.title "History for "
- (str/capitalize best-guess-entity)
- " "
- entity-id]
- [:div.columns
- [:div.column.is-9
- [:table.table.compact.grid {:style "width: 100%"}
- [:thead
- [:tr
- [:td {:style "width: 14em"} "Date"]
- [:td {:style "width: 14em"} "User"]
- [:td {:style "width: 18em"} "Field"]
- [:td "From"]
- [:td "To"]]]
- [:tbody
- (for [[tx a c] history]
- [:tr
- [:td [:div [:div (some-> (:db/txInstant tx)
- coerce/to-date-time
- atime/localize
- (atime/unparse atime/standard-time))
- ]
- [:div.tag (:db/id tx)]]]
- [:td (str (:audit/user tx))]
- [:td (namespace a) ": " (name a)]
-
- [:td
- [:div.tag.is-danger.is-light
- [:span
- (format-value (:removed c))]]]
- [:td
- [:div.tag.is-primary.is-light
- [:span
- (format-value (:added c))]]]])]
- ]]
- [:div.column.is-3
- [:div#inspector]]]])
-
-(defn history-search [{:keys [form-params params] :as request}]
- (try
- (let [entity-id (Long/parseLong (or (some-> (:entity-id form-params) not-empty)
- (:entity-id params)
- (get params "entity-id")
- (get form-params "entity-id")))
- history (->>
- (dc/q '[:find ?a2 ?v (pull ?tx [:db/txInstant :audit/user :db/id]) ?ad
- :in $ $$ ?i
- :where
- [$$ ?i ?a ?v ?tx ?ad]
- [$ ?a :db/ident ?a2]]
- (dc/db conn)
- (dc/history (dc/db conn))
- entity-id )
- tx-rows->changes
- (sort-by (comp :db/id first))
- vec)
- best-guess-entity (or (->> history
- (group-by
- (comp
- namespace
- second)
- )
- (map (fn [[k v]]
- [k v]))
- (sort-by second)
- last
- first)
- "?")]
-
- (if (get (:headers request) "hx-request")
- (html-response
- (table entity-id best-guess-entity history))
- (base-page request (page-template :table (table entity-id best-guess-entity history)
- :entity-id entity-id)
- (admin-side-bar :admin-history))))
- (catch NumberFormatException _
- (html-response
- [:div.notification.is-danger.is-light
- "Cannot parse the entity-id " (or (:entity-id form-params)
- (:entity-id params))
-
- ". It should be a number."]))))
-
-(defn inspect [{{:keys [entity-id]} :params :as request}]
- (alog/info ::inspect
- :request request)
- (try
- (let [entity-id (Long/parseLong entity-id)
- data (dc/pull (dc/db conn)
- '[*]
- entity-id)]
-
- (html-response
- [:div.box {:style {:position "sticky"
- :display "inline-block"
- :vertical-align "top"
- :overflow-y "auto"
- :max-height "100vh"
- :top "0px"
- :bottom "0px"}}
- [:div {:style {:display "inline-block"}}
- [:h1.title "Snapshot of "
- entity-id]
- [:ul
- (for [[k v] data]
- [:li [:strong k] ":" (format-value v)]
- )]]]))
- (catch NumberFormatException _
- (html-response
- [:div.notification.is-danger.is-light
- "Cannot parse the entity-id " entity-id ". It should be a number."]))))
-
-(defn history [{:keys [matched-route] :as request}]
- (base-page request
- (page-template )
- (admin-side-bar matched-route)))
-
-
-
-
diff --git a/src/clj/auto_ap/ssr/admin/history.clj b/src/clj/auto_ap/ssr/admin/history.clj
new file mode 100644
index 00000000..f1796a6f
--- /dev/null
+++ b/src/clj/auto_ap/ssr/admin/history.clj
@@ -0,0 +1,190 @@
+(ns auto-ap.ssr.admin.history
+ (:require
+ [auto-ap.datomic :refer [conn]]
+ [auto-ap.logging :as alog]
+ [auto-ap.ssr.ui :refer [base-page]]
+ [auto-ap.ssr.utils :refer [html-response]]
+ [auto-ap.time :as atime]
+ [clj-time.coerce :as coerce]
+ [clojure.string :as str]
+ [datomic.api :as dc]
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [bidi.bidi :as bidi]))
+
+(defn tx-rows->changes [history]
+ (->> history
+ (group-by (fn [[a _ t]]
+ [a t]))
+ (map (fn [[[a t] changes]]
+ (let [changes (-> (reduce
+ (fn [acc [_ v _ added]]
+ (if added
+ (assoc acc :added v)
+ (assoc acc :removed v)))
+ {}
+ changes))]
+ [t a changes])))))
+
+(defn format-value [v]
+ (cond (inst? v)
+ (-> v
+ coerce/to-date-time
+ atime/localize
+ (atime/unparse atime/normal-date))
+
+ (nil? v)
+ [:em "(none)"]
+
+ (and (integer? v)
+ (> v 1000000))
+ [:span
+ (com/link
+ {:href "#"
+ :hx-get (str "/admin/history/" v)
+ :hx-swap "innerHTML"
+ :hx-push-url "true"
+ :hx-select "#history-table"
+ :hx-target "#history-table"}
+ v)
+ " ["
+ (com/link
+ {:href "#"
+ :hx-get (str "/admin/history/inspect/" v)
+ :hx-swap "innerHTML"
+ :hx-target "#inspector"
+ :hx-trigger "click"}
+ "snapshot") "]"]
+
+ :else
+ (pr-str v)))
+
+
+(defn inspect [{{:keys [entity-id]} :params :as request}]
+ (alog/info ::inspect
+ :request request)
+ (try
+ (let [entity-id (Long/parseLong entity-id)
+ data (dc/pull (dc/db conn)
+ '[*]
+ entity-id)]
+
+ (html-response
+ [:section.py-3.sm:py-5.max-w-lg
+ (com/card {:class "p-2"}
+ [:div {:style {:display "inline-block"}}
+ [:h1.title "Snapshot of "
+ entity-id]
+ [:ul
+ (for [[k v] data]
+ [:li [:strong k] ":" (format-value v)])]])]))
+ (catch NumberFormatException _
+ (html-response
+ [:div.notification.is-danger.is-light
+ "Cannot parse the entity-id " entity-id ". It should be a number."]))))
+
+(defn result-table [{:keys [entity-id]}]
+ (try
+ (let [history (->>
+ (dc/q '[:find ?a2 ?v (pull ?tx [:db/txInstant :audit/user :db/id]) ?ad
+ :in $ $$ ?i
+ :where
+ [$$ ?i ?a ?v ?tx ?ad]
+ [$ ?a :db/ident ?a2]]
+ (dc/db conn)
+ (dc/history (dc/db conn))
+ entity-id)
+ tx-rows->changes
+ (sort-by (comp :db/id first))
+ vec)
+ best-guess-entity (or (->> history
+ (group-by
+ (comp
+ namespace
+ second))
+ (map (fn [[k v]]
+ [k v]))
+ (sort-by second)
+ last
+ first)
+ "?")]
+ (com/data-grid-card {:id "history-table"
+ :title (format "History for %s: %d" (str/capitalize best-guess-entity) entity-id)
+ :route :history-table
+ :paginate? false
+ :total (count history)
+ :subtitle nil
+ :action-buttons nil
+ :rows (for [[tx a c] history]
+ (com/data-grid-row
+ {}
+ (com/data-grid-cell {} [:div [:div (some-> (:db/txInstant tx)
+ coerce/to-date-time
+ atime/localize
+ (atime/unparse atime/standard-time))]
+ [:div.tag (:db/id tx)]])
+ (com/data-grid-cell {} (str (:audit/user tx)))
+ (com/data-grid-cell {} (namespace a) ": " (name a))
+
+ (com/data-grid-cell {}
+ (com/pill {:color :red}
+ (format-value (:removed c))))
+ (com/data-grid-cell {}
+ [:div.tag.is-primary.is-light
+ [:span
+ (format-value (:added c))]])))
+ :headers
+ [(com/data-grid-header {}
+ "Date")
+ (com/data-grid-header {}
+ "User")
+ (com/data-grid-header {}
+ "Field")
+ (com/data-grid-header {}
+ "From")
+ (com/data-grid-header {}
+ "To")]}))
+ (catch NumberFormatException e
+ (throw e))))
+
+(defn search-box [{:keys [entity-id]}]
+ [:div.mt-4
+ [:form.flex.gap-2 {"hx-target" "#history-table"
+ "hx-get" (bidi/path-for ssr-routes/only-routes
+ :admin-history)
+ "hx-select" "#history-table"
+ "hx-swap" "innerHTML"
+ "hx-ext" "debug"
+ "hx-push-url" "true"}
+ (com/text-input {:name "entity-id" :placeholder "Entity Id" :value entity-id
+ :style {:width "300px"}})
+ (com/button {:color :primary}
+ "DIG")]])
+
+(defn page [{:keys [matched-route route-params query-params] :as request}]
+ (let [entity-id (or (some-> query-params (get "entity-id") Long/parseLong)
+ (some-> route-params (get :entity-id) Long/parseLong))]
+ (base-page request
+ (com/page {:nav (com/admin-aside-nav)
+ :active-client (:client (:session request))
+ :identity (:identity request)
+ :app-params {:hx-get (bidi/path-for ssr-routes/only-routes
+ :admin-history)
+ :hx-trigger "clientSelected from:body"
+ :hx-select "#app-contents"
+ :hx-swap "outerHTML swap:300ms"}}
+ (com/breadcrumbs {}
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :admin)}
+ "Admin"]
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :admin-history)}
+ "History"])
+ (search-box {:entity-id entity-id})
+ [:div.flex.gap-4.flex-col.lg:flex-row
+ (if entity-id
+ (result-table {:entity-id entity-id})
+ [:div#history-table])
+ [:div#inspector]
+ ])
+ "History")))
diff --git a/src/clj/auto_ap/ssr/company.clj b/src/clj/auto_ap/ssr/company.clj
new file mode 100644
index 00000000..d3b657ab
--- /dev/null
+++ b/src/clj/auto_ap/ssr/company.clj
@@ -0,0 +1,67 @@
+(ns auto-ap.ssr.company
+ (:require
+ [auto-ap.datomic :refer [conn]]
+ [auto-ap.datomic.clients :refer [full-read]]
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr.svg :as svg]
+ [auto-ap.ssr.ui :refer [base-page]]
+ [cemerick.url :as url]
+ [config.core :refer [env]]
+ [datomic.api :as dc]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [bidi.bidi :as bidi]))
+
+(defn please-select-client-screen* []
+ [:div.grid.grid-cols-3
+ (com/content-card {}
+ [:div.col-span-1.p-4 {:class "p-4 sm:p-6"}
+ [:h3 {:class "mb-4 text-xl font-semibold dark:text-white"}
+ "Please select a company"]
+ ])])
+
+(defn main-content* [{:keys [client]}]
+ (if-not client
+ (please-select-client-screen*)
+ (let [client (dc/pull (dc/db conn) full-read (:db/id client))]
+ [:div.grid.grid-cols-3.gap-4
+ (com/content-card {}
+ [:div.col-span-1.p-4 {:class "p-4 sm:p-6"}
+ [:h3 {:class "mb-4 text-xl font-semibold dark:text-white"}
+ (:client/name client)]
+ (when-let [address (-> client :client/address)]
+ [:div.flex.flex-col.gap-1.text-lg.dark:text-white.text-gray-700
+ [:p (-> address :address/street1)]
+ [:p (-> address :address/street2)]
+ [:p (-> address :address/city) " "
+ (-> address :address/state) ", "
+ (-> address :address/zip)]])]
+ )
+ (com/content-card {}
+ [:div.col-span-1.p-4 {:class "p-4 sm:p-6"}
+ [:h3 {:class "mb-4 text-xl font-semibold dark:text-white"}
+ "Downloads"]
+ [:a {:href (str (assoc (url/url (str (:base-url env) "/api/vendors/company/export"))
+ :query {"client" (:client/code client)}))}
+ (com/button {:color :primary}
+ "Download vendor list"
+ (com/button-icon {} svg/download))]])])))
+
+(defn page [{:keys [identity matched-route] :as request}]
+ (base-page
+ request
+ (com/page {:nav (com/company-aside-nav)
+ :active-client (:client (:session request))
+ :identity (:identity request)
+ :app-params {
+ :hx-get (bidi/path-for ssr-routes/only-routes
+ :company)
+ :hx-trigger "clientSelected from:body"
+ :hx-select "#app-contents"
+ :hx-swap "outerHTML swap:300ms"}}
+ (com/breadcrumbs {}
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :company)}
+ "My Company"])
+ (main-content* {:client (:client (:session request))}))
+ "My Company"))
+
diff --git a/src/clj/auto_ap/ssr/company/company_1099.clj b/src/clj/auto_ap/ssr/company/company_1099.clj
index 85ba0041..f254666d 100644
--- a/src/clj/auto_ap/ssr/company/company_1099.clj
+++ b/src/clj/auto_ap/ssr/company/company_1099.clj
@@ -1,367 +1,325 @@
(ns auto-ap.ssr.company.company-1099
(:require
- [auto-ap.datomic :refer [conn remove-nils]]
- [auto-ap.graphql.utils :refer [is-admin?]]
- [iol-ion.query :refer [can-see-client?]]
- [auto-ap.shared-views.company.sidebar :refer [company-side-bar]]
+ [auto-ap.datomic :refer [apply-pagination-raw conn remove-nils]]
+ [auto-ap.graphql.utils :refer [assert-can-see-client is-admin?]]
[auto-ap.ssr-routes :as ssr-routes]
- [auto-ap.ssr.ui :refer [base-page]]
- [auto-ap.ssr.utils :refer [html-response]]
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr.grid-page-helper :as helper]
+ [auto-ap.ssr.svg :as svg]
+ [auto-ap.ssr.utils :refer [form-data->map html-response path->name]]
[bidi.bidi :as bidi]
+ [cemerick.url :as url]
[clojure.string :as str]
[datomic.api :as dc]
- [hiccup2.core :as hiccup]))
+ [iol-ion.query :refer [can-see-client?]]))
+(def vendor-read '[:db/id
+ :vendor/name
+ {:vendor/legal-entity-1099-type [:db/ident]}
+ {:vendor/legal-entity-tin-type [:db/ident]}
+ {:vendor/address [:address/street1
+ :address/city
+ :address/state
+ :address/zip]}
+ :vendor/legal-entity-tin
+ :vendor/legal-entity-name
+ :vendor/legal-entity-first-name
+ :vendor/legal-entity-middle-name
+ :vendor/legal-entity-last-name])
+(defn sum-for-client-vendor [client-id vendor-id]
+ (ffirst (dc/q '[:find
+ (sum ?a)
+ :with ?d
+ :in $ ?c ?v
+ :where
+ [?p :payment/client ?c]
+ [?p :payment/date ?d ]
+ [(>= ?d #inst "2022-01-01T08:00")]
+ [(< ?d #inst "2023-01-01T08:00")]
+ [?p :payment/type :payment-type/check]
+ [?p :payment/amount ?a]
+ [?p :payment/vendor ?v]]
+ (dc/db conn)
+ client-id
+ vendor-id)))
-(defn get-1099-companies [user session]
+(defn get-1099-companies [user {:keys [client-id] :as args}]
(let [clients (->> (dc/q '[:find ?c
- :in $ ?user
- :where [?c :client/code]
- [(iol-ion.query/can-see-client? ?user ?c)]]
- (dc/db conn) user)
+ :in $ ?user
+ :where [?c :client/code]
+ [(iol-ion.query/can-see-client? ?user ?c)]]
+ (dc/db conn) user)
(map first)
set)
results (cond
- (and (some-> session :client :db/id)
- (can-see-client? user
- (some-> session :client :db/id)))
+ (and client-id
+ (can-see-client? user client-id))
(dc/q '[:find
- (pull ?c [:client/code :db/id])
- (pull ?v [:db/id
- :vendor/name
- {:vendor/legal-entity-1099-type [:db/ident]}
- {:vendor/legal-entity-tin-type [:db/ident]}
- {:vendor/address [:address/street1
- :address/city
- :address/state
- :address/zip]}
- :vendor/legal-entity-tin
- :vendor/legal-entity-name
- :vendor/legal-entity-first-name
- :vendor/legal-entity-middle-name
- :vendor/legal-entity-last-name])
- (sum ?a)
- :with ?d
- :in $ ?c
- :where
- [?p :payment/client ?c]
- [?p :payment/date ?d ]
- [(>= ?d #inst "2022-01-01T08:00")]
- [(< ?d #inst "2023-01-01T08:00")]
- [?p :payment/type :payment-type/check]
-
- [?p :payment/amount ?a]
- [?p :payment/vendor ?v]]
- (dc/db conn)
- (some-> session :client :db/id))
+ (pull ?c [:client/code :db/id])
+ (pull ?v vendor-read)
+ (sum ?a)
+ :with ?d
+ :in $ ?c vendor-read
+ :where
+ [?p :payment/client ?c]
+ [?p :payment/date ?d ]
+ [(>= ?d #inst "2022-01-01T08:00")]
+ [(< ?d #inst "2023-01-01T08:00")]
+ [?p :payment/type :payment-type/check]
+ [?p :payment/amount ?a]
+ [?p :payment/vendor ?v]]
+ (dc/db conn)
+ client-id
+ vendor-read)
(is-admin? user)
(dc/q '[:find
- (pull ?c [:client/code :db/id])
- (pull ?v [:db/id
- :vendor/name
- {:vendor/legal-entity-1099-type [:db/ident]}
- {:vendor/legal-entity-tin-type [:db/ident]}
- {:vendor/address [:address/street1
- :address/city
- :address/state
- :address/zip]}
- :vendor/legal-entity-tin
- :vendor/legal-entity-name
- :vendor/legal-entity-first-name
- :vendor/legal-entity-middle-name
- :vendor/legal-entity-last-name])
- (sum ?a)
- :with ?d
- :in $
- :where
- [?p :payment/date ?d ]
- [(>= ?d #inst "2022-01-01T08:00")]
- [(< ?d #inst "2023-01-01T08:00")]
- [?p :payment/type :payment-type/check]
- [?p :payment/client ?c]
- [?p :payment/amount ?a]
- [?p :payment/vendor ?v]]
- (dc/db conn))
+ (pull ?c [:client/code :db/id])
+ (pull ?v vendor-read)
+ (sum ?a)
+ :with ?d
+ :in $ vendor-read
+ :where
+ [?p :payment/date ?d ]
+ [(>= ?d #inst "2022-01-01T08:00")]
+ [(< ?d #inst "2023-01-01T08:00")]
+ [?p :payment/type :payment-type/check]
+ [?p :payment/client ?c]
+ [?p :payment/amount ?a]
+ [?p :payment/vendor ?v]]
+ (dc/db conn)
+ vendor-read)
:else
(dc/q '[:find
- (pull ?c [:client/code :db/id])
- (pull ?v [:db/id
- :vendor/name
- {:vendor/legal-entity-1099-type [:db/ident]}
- {:vendor/legal-entity-tin-type [:db/ident]}
- {:vendor/address [:address/street1
- :address/city
- :address/state
- :address/zip]}
- :vendor/legal-entity-tin
- :vendor/legal-entity-name
- :vendor/legal-entity-first-name
- :vendor/legal-entity-middle-name
- :vendor/legal-entity-last-name])
- (sum ?a)
- :with ?d
- :in $ [?c ...]
- :where
- [?p :payment/client ?c]
- [?p :payment/date ?d ]
- [(>= ?d #inst "2022-01-01T08:00")]
- [(< ?d #inst "2023-01-01T08:00")]
- [?p :payment/type :payment-type/check]
-
- [?p :payment/amount ?a]
- [?p :payment/vendor ?v]]
- (dc/db conn)
- clients))]
- (->> results
- (filter (fn [[_ _ a]]
- (>= (or a 0.0) 600.0)))
- (take 200)
- (sort-by (fn [[client _ amount]]
- [(:client/code client ) amount])))))
+ (pull ?c [:client/code :db/id])
+ (pull ?v vendor-read)
+ (sum ?a)
+ :with ?d
+ :in $ [?c ...] vendor-read
+ :where
+ [?p :payment/client ?c]
+ [?p :payment/date ?d ]
+ [(>= ?d #inst "2022-01-01T08:00")]
+ [(< ?d #inst "2023-01-01T08:00")]
+ [?p :payment/type :payment-type/check]
+ [?p :payment/amount ?a]
+ [?p :payment/vendor ?v]]
+ (dc/db conn)
+ clients
+ vendor-read))
+ all (->> results
+ (filter (fn [[_ _ a]]
+ (>= (or a 0.0) 600.0)))
+ (sort-by (fn [[client _ amount]]
+ [(:client/code client ) amount]))
+ (into []))
+ paginated (apply-pagination-raw args all)]
+ [(:entries paginated) (:count paginated)]))
-(defn dialog [header content footer]
- [:div.modal.is-active
- [:div.modal-background {"_" (hiccup/raw "on click remove <#modal-holder div/>")}]
- [:div.modal-card
- [:div.modal-card-head
- header]
- [:div.modal-card-body
- content]
- [:div.modal-card-foot
- footer]]
- [:button.modal-close.is-large {"_" (hiccup/raw "on click remove <#modal-holder div/>")}]])
+(def grid-page {:id "vendor-table"
+ :nav (com/company-aside-nav)
+ :id-fn (comp :db/id second)
+ :fetch-page (fn [user args]
+ (get-1099-companies user args)
+ #_(r/get-graphql (into args {:id user})))
+ :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
+ :company)}
+ "My Company"]
-(defn table [{:keys [identity session]} & {:keys [flash-id]}]
- [:div#vendor-table {:hx-get (bidi/path-for ssr-routes/only-routes
- :company-1099-vendor-table
- :request-method :get)
- :hx-trigger "clientSelected from:body"
- "_" (hiccup/raw "on htmx:beforeRequest remove in me")
- :hx-swap "outerHTML swap:300ms"}
- [:table.table.grid.compact.is-fullwidth
- [:thead
- [:tr
- [:th {:style {:width "5em"}}"Client"]
- [:th "Vendor Name"]
- [:th "Name"]
- [:th {:style {:width "9em"}} "1099 Type"]
- [:th {:style {:width "8em"}} "TIN"]
- [:th "Address"]
- [:th "Amount Paid"]
- [:th {:style {:width "10em"}}]
- ]]
- [:tbody
- (for [[client vendor amount] (get-1099-companies identity session)]
- [:tr (when (= flash-id
- (:db/id vendor))
- {:class "live-added"})
- [:td (:client/code client)]
- [:td (:vendor/name vendor)]
- [:td (or (-> vendor :vendor/legal-entity-name not-empty)
- (str (-> vendor :vendor/legal-entity-first-name) " "
- (-> vendor :vendor/legal-entity-middle-name) " "
- (-> vendor :vendor/legal-entity-last-name)))]
- [:td (some-> vendor :vendor/legal-entity-1099-type :db/ident name)] " "
- [:td
- (some-> vendor :vendor/legal-entity-tin-type :db/ident name) " "
- (-> vendor :vendor/legal-entity-tin)]
- [:td
- (-> vendor :vendor/address :address/street1) " "
- (-> vendor :vendor/address :address/street2) " "
- (-> vendor :vendor/address :address/city) " "
- (-> vendor :vendor/address :address/state) " "
- (-> vendor :vendor/address :address/zip)
- [:td "$" (Math/round amount)]
- [:td
- [:button.button {:hx-get (bidi/path-for ssr-routes/only-routes
- :company-1099-vendor-dialog
- :vendor-id (:db/id vendor))
- :hx-target "#modal-holder"
- :hx-swap "innerHTML"}
- [:span.icon [:i.fa.fa-pencil ]]]]]])]]
- [:div.container.htmx-indicator
- [:div.column.is-4.is-offset-4.has-text-centered
- [:div.loader.is-loading.is-active.big.is-centered]]]])
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :company-1099)}
+ "1099 Vendor Info"]]
+ :title "1099 Vendors"
+ :entity-name "Vendors"
+ :route :company-1099-vendor-table
+ :action-buttons (fn [user]
+ nil)
+ :row-buttons (fn [user e]
+ [(com/icon-button {:hx-get (str (bidi/path-for ssr-routes/only-routes
+ :company-1099-vendor-dialog
+ :vendor-id (:db/id (second e)))
+ "?"
+ (url/map->query {:client-id (:db/id (first e))}))
+ :hx-ext "debug"
+ :hx-target "#modal-holder"
+ :hx-swap "outerHTML"}
+ svg/pencil)])
+ :headers [{:key "Client"
+ :name "Client"
+ :sort-key "client"
+ :render (comp :client/code first)}
+ {:key "vendor-name"
+ :name "Vendor Name"
+ :sort-key "vendor"
+ :render (fn [[_ vendor]]
+ [:div.flex.whitespace-nowrap.items-center.gap-4
+ [:div [:div (:vendor/name vendor)]
+ [:div.text-sm.text-gray-400
+ (or (-> vendor :vendor/legal-entity-name not-empty)
+ (str (-> vendor :vendor/legal-entity-first-name) " "
+ (-> vendor :vendor/legal-entity-middle-name) " "
+ (-> vendor :vendor/legal-entity-last-name)))]]
+ (when-let [t99-type (some-> vendor :vendor/legal-entity-1099-type :db/ident name)]
+ (com/pill
+ {:class "text-xs font-medium"
+ :color :primary}
+ (str/capitalize t99-type))
+ )])}
+ {:key "tin"
+ :name "TIN"
+ :sort-key "tin"
+ :show-starting "md"
+ :render (fn [[_ vendor]]
+ [:div.flex.gap-4
+ (when-let [tin (-> vendor :vendor/legal-entity-tin)]
+ [:span {:class "text-xs font-medium py-0.5 "}
+ tin])
+ (when-let [tin-type (some-> vendor :vendor/legal-entity-tin-type :db/ident name)]
+ (com/pill {:class "text-xs font-medium"
+ :color :yellow}
+ (name tin-type)))]
+ )}
+ {:key "address"
+ :name "Address"
+ :sort-key "address"
+ :show-starting "lg"
+ :render (fn [[_ vendor]]
+ (if (-> vendor :vendor/address :address/street1)
+ [:div
+ [:div (-> vendor :vendor/address :address/street1)] " "
+ [:div
+ (-> vendor :vendor/address :address/street2)] " "
+ [:div
+ (-> vendor :vendor/address :address/city) " "
+ (-> vendor :vendor/address :address/state) ","
+ (-> vendor :vendor/address :address/zip)]]
+ [:p.text-sm.italic.text-gray-400 "No address"]))}
+ {:key "paid"
+ :name "Paid"
+ :sort-key "paid"
+ :render (fn [[_ _ paid]]
+ (com/pill {:class "text-xs font-medium"
+ :color :primary}
+ "Paid $" (Math/round paid)))}]})
-(defn form-data->map [form-data]
- (reduce-kv
- (fn [acc k v]
- (cond (and (string? v)
- (empty? v))
- acc
- :else
- (assoc-in acc (->> (str/split k #"_")
- (mapv #(apply keyword (str/split % #"/"))))
- v)))
- {}
- form-data))
-(defn path->name [k]
- (cond (keyword? k)
- (str (namespace k) "/" (name k))
+(def table* (partial helper/table* grid-page))
+(def row* (partial helper/row* grid-page))
- (seq k)
- (str/join "_" (map path->name k))
- :else k))
-
-(defn vendor-save [{:keys [form-params identity route-params] :as request}]
- @(dc/transact conn [(remove-nils
- (-> (form-data->map form-params)
- (assoc :db/id (Long/parseLong (:vendor-id route-params)))
- (update :vendor/legal-entity-1099-type #(some->> % not-empty (keyword "legal-entity-1099-type")))
- (update :vendor/legal-entity-tin-type #(some->> % not-empty (keyword "legal-entity-tin-type")))))])
- (html-response
- (table request :flash-id (Long/parseLong (:vendor-id route-params)))))
+(defn vendor-save [{:keys [form-params identity route-params query-params] :as request}]
+ (let [client-id (Long/parseLong (get query-params "client-id"))
+ vendor-id (Long/parseLong (:vendor-id route-params))]
+ (assert-can-see-client identity client-id)
+ @(dc/transact conn [(remove-nils
+ (-> (form-data->map form-params)
+ (assoc :db/id (Long/parseLong (:vendor-id route-params)))
+ (update :vendor/legal-entity-1099-type #(some->> % not-empty (keyword "legal-entity-1099-type")))
+ (update :vendor/legal-entity-tin-type #(some->> % not-empty (keyword "legal-entity-tin-type")))))])
+ (html-response
+ (row* identity [(dc/pull (dc/db conn) [:db/id :client/code] client-id)
+ (dc/pull (dc/db conn) vendor-read vendor-id)
+ (sum-for-client-vendor client-id vendor-id)
+ ] {:flash? true})
+ :headers {"hx-trigger" "closeModal"})))
(defn vendor-dialog [request]
(let [vendor (dc/pull (dc/db conn) '[* {:vendor/legal-entity-1099-type [:db/ident]
- :vendor/legal-entity-tin-type [:db/ident]}] (Long/parseLong (:vendor-id (:params request))))] ;; TODO perms
+ :vendor/legal-entity-tin-type [:db/ident]}] (Long/parseLong (:vendor-id (:params request))))] ;; TODO perms
(html-response
- [:form {:hx-post (bidi/path-for ssr-routes/only-routes
- :company-1099-vendor-save
- :request-method :post
- :vendor-id (Long/parseLong (:vendor-id (:params request))))
- :hx-target "#vendor-table"
- :hx-swap "outerHTML swap:0.2s"
- "_" (hiccup/raw "on htmx:afterRequest transition <#modal-holder .modal-background, #modal-holder .modal-card />'s opacity from 1.0 to 0 over 100ms then remove <#modal-holder */> ")}
- (dialog
- [:h4.is-4.title "Vendor 1099 Info"]
- [:div
- [:h3.is-3.title (:vendor/name vendor)]
-
- [:h4.is-4.title "Address"]
- [:hr]
- [:div.field
- [:p.help "Street1"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :autofocus true
- :name (path->name [:vendor/address :address/street1])
- :placeholder "1700 Pennsylvania Ave"
- :value (-> vendor :vendor/address :address/street1)}]]]
- [:div.field
- [:p.help "Street 2"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :name (path->name [:vendor/address :address/street2])
- :placeholder "SUite 400"
- :value (-> vendor :vendor/address :address/street2)}]]]
- [:div.level
- [:div.level-left
- [:div.level-item
- [:div.field
- [:p.help "City"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :placeholder "Cupertino"
- :name (path->name [:vendor/address :address/city])
- :value (-> vendor :vendor/address :address/city)}]]]]
- [:div.level-item
- [:div.field
- [:p.help "State"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :style {:width "3em"}
- :placeholder "CA"
- :name (path->name [:vendor/address :address/state])
- :value (-> vendor :vendor/address :address/state)}]]]]
- [:div.level-item
- [:div.field
- [:p.help "Zip"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :placeholder "95014"
- :name (path->name [:vendor/address :address/zip])
- :value (-> vendor :vendor/address :address/zip)}]]]]]]
- [:h4.is-4.title "Legal Entity"]
- [:hr]
- [:div.field
- [:p.help "Legal Entity Name"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :placeholder "Good Restaurant LLC"
- :name (path->name [:vendor/legal-entity-name])
- :value (-> vendor :vendor/legal-entity-name)}]]]
- "OR"
- [:div.level
- [:div.level-left
- [:div.level-item
- [:div.field
- [:p.help "First Name"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :placeholder "Josh"
- :name (path->name [:vendor/legal-entity-first-name])
- :value (-> vendor :vendor/legal-entity-first-name)}]]]]
- [:div.level-item
- [:div.field
- [:p.help "Middle Name"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :placeholder "Caleb"
- :name (path->name [:vendor/legal-entity-middle-name])
- :value (-> vendor :vendor/legal-entity-middle-name)}]]]]
- [:div.level-item
- [:div.field
- [:p.help "Last Name"]
- [:div.control
- [:input.input.is-expanded {:type "text"
- :placeholder "Smith"
- :name (path->name [:vendor/legal-entity-last-name])
- :value (-> vendor :vendor/legal-entity-last-name)}]]]]]]
-
- [:div.level
- [:div.level-left
- [:div.level-item
- [:div.field
- [:p.help "TIN"]
- [:div.control
- [:input.input {:type "text"
- :name (path->name [:vendor/legal-entity-tin])
- :placeholder "SSN or EIN"
- :size "12"
- :value (-> vendor :vendor/legal-entity-tin)}]]]]
- [:div.level-item
- [:div.field
- [:p.help "TIN Type"]
- [:div.control
- [:div.select
- [:select {:name (path->name [:vendor/legal-entity-tin-type])}
- [:option {:value ""} ""]
- [:option {:value "ein" :selected (= (-> vendor :vendor/legal-entity-tin-type :db/ident) :legal-entity-tin-type/ein)} "EIN"]
- [:option {:value "ssn" :selected (= (-> vendor :vendor/legal-entity-tin-type :db/ident) :legal-entity-tin-type/ssn)} "SSN"]]]]]]
- [:div.level-item
- [:div.field
- [:p.help "1099 Type"]
- [:div.control
- [:div.select
- [:select {:name (path->name [:vendor/legal-entity-1099-type])}
- [:option {:value ""} ""]
- [:option {:value "none" :selected (= (-> vendor :vendor/legal-entity-1099-type :db/ident) :legal-entity-1099-type/none)} "None"]
- [:option {:value "misc" :selected (= (-> vendor :vendor/legal-entity-1099-type :db/ident) :legal-entity-1099-type/misc)} "Misc"]
- [:option {:value "landlord" :selected (= (-> vendor :vendor/legal-entity-1099-type :db/ident) :legal-entity-1099-type/landlord)} "Landlord"]]]]]]]]]
- [:button.button.is-primary.htmx-indicator "Save"])])))
-
-(defn vendor-table [request]
- (html-response (table request)))
-
-(defn page [{:keys [identity matched-route] :as request}]
- (base-page
- request
- [:div
- [:div#vendor-table {:hx-get (bidi/path-for ssr-routes/only-routes
- :company-1099-vendor-table
- :request-method :get)
- :hx-trigger "load, clientSelected from:body"
- :hx-swap "outerHTML swap:400ms"}
- [:div.container.htmx-indicator
- [:div.column.is-4.is-offset-4.has-text-centered
- [:div.loader.is-loading.is-active.big.is-centered]]]]]
- [:div
- (company-side-bar matched-route)]))
+ (com/modal
+ {}
+ [:form {:hx-post (str (bidi/path-for ssr-routes/only-routes
+ :company-1099-vendor-save
+ :request-method :post
+ :vendor-id (Long/parseLong (:vendor-id (:params request))))
+ "?"
+ (url/map->query {:client-id (:client-id (:params request))}))
+ :hx-target (format "#vendor-table tr[data-id=\"%d\"]" (:db/id vendor))
+ :hx-swap "outerHTML swap:300ms"}
+ [:fieldset {:class "hx-disable"}
+ (com/modal-card
+ {}
+ [:div.flex [:div.p-2 "Vendor 1099 Info"] [:p.ml-2.rounded.bg-gray-200.p-2.dark:bg-gray-600 (:vendor/name vendor)]]
+ [:div.space-y-6
+ [:div.grid.grid-cols-6.gap-4
+
+ [:h4.text-xl.border-b.col-span-6 "Address"]
+ [:div.col-span-6
+ (com/field {:label "Street 1"}
+ (com/text-input {:name (path->name [:vendor/address :address/street1])
+ :value (-> vendor :vendor/address :address/street1)
+ :placeholder "1700 Pennsylvania Ave"
+ :autofocus true}))]
+ [:div.col-span-6
+ (com/field {:label "Street 2"}
+ (com/text-input {:name (path->name [:vendor/address :address/street2])
+ :value (-> vendor :vendor/address :address/street2)
+ :placeholder "Suite 200"}))]
+ [:div.col-span-3
+ (com/field {:label "City"}
+ (com/text-input {:name (path->name [:vendor/address :address/city])
+ :value (-> vendor :vendor/address :address/city)
+ :placeholder "Cupertino"}))]
+ [:div.col-span-1
+ (com/field {:label "State"}
+ (com/text-input {:name (path->name [:vendor/address :address/state])
+ :value (-> vendor :vendor/address :address/state)
+ :placeholder "CA"}))]
+ [:div.col-span-2
+ (com/field {:label "Zip"}
+ (com/text-input {:name (path->name [:vendor/address :address/zip])
+ :value (-> vendor :vendor/address :address/zip)
+ :placeholder "98102"}))]
+ [:h4.text-xl.border-b.col-span-6 "Legal Entity"]
+ [:div.col-span-6
+ (com/field {:label "Legal Entity Name"}
+ (com/text-input {:name (path->name [:vendor/legal-entity-name])
+ :value (-> vendor :vendor/legal-entity-name)
+ :placeholder "Good Restaurant LLC"}))]
+ [:div.col-span-6.text-center " - OR -"]
+ [:div.col-span-2
+ (com/field {:label "First Name"}
+ (com/text-input {:name (path->name [:vendor/legal-entity-first-name])
+ :value (-> vendor :vendor/legal-entity-first-name)
+ :placeholder "John"}))]
+ [:div.col-span-2
+ (com/field {:label "Middle Name"}
+ (com/text-input {:name (path->name [:vendor/legal-entity-middle-name])
+ :value (-> vendor :vendor/legal-entity-middle-name)
+ :placeholder "C."}))]
+ [:div.col-span-2
+ (com/field {:label "Last Name"}
+ (com/text-input {:name (path->name [:vendor/legal-entity-last-name])
+ :value (-> vendor :vendor/legal-entity-last-name)
+ :placeholder "Riley"}))]
+ [:div.col-span-2
+ (com/field {:label "TIN"}
+ (com/text-input {:name (path->name [:vendor/legal-entity-tin])
+ :value (-> vendor :vendor/legal-entity-tin)
+ :placeholder "John"}))]
+ [:div.col-span-2
+ (com/field {:label "TIN Type"}
+ (com/select {:name (path->name [:vendor/legal-entity-tin-type])
+ :allow-blank? true
+ :value (some-> vendor :vendor/legal-entity-tin-type :db/ident name)
+ :options [["ein" "EIN"]
+ ["ssn" "SSN"]]}))]
+ [:div.col-span-2
+ (com/field {:label "1099 Type"}
+ (com/select {:name (path->name [:vendor/legal-entity-1099-type])
+ :allow-blank? true
+ :value (some-> vendor :vendor/legal-entity-1099-type :db/ident name)
+ :options [["none" "None"]
+ ["misc" "Misc"]
+ ["landlord" "Landlord"]]}))]
+ [:div.col-span-6
+ (com/button {:color :primary}
+ "Save")]]]
+ [:div])]]))))
+(def vendor-table (partial helper/table grid-page))
+(def page (partial helper/page grid-page))
diff --git a/src/clj/auto_ap/ssr/company/reports.clj b/src/clj/auto_ap/ssr/company/reports.clj
new file mode 100644
index 00000000..1562dfd9
--- /dev/null
+++ b/src/clj/auto_ap/ssr/company/reports.clj
@@ -0,0 +1,83 @@
+(ns auto-ap.ssr.company.reports
+ (:require
+ [amazonica.aws.s3 :as s3]
+ [auto-ap.datomic :refer [conn]]
+ [auto-ap.datomic.reports :as r]
+ [auto-ap.graphql.utils :refer [assert-can-see-client is-admin?]]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr.grid-page-helper :as helper]
+ [auto-ap.ssr.svg :as svg]
+ [auto-ap.ssr.utils :refer [html-response]]
+ [auto-ap.time :as atime]
+ [bidi.bidi :as bidi]
+ [config.core :refer [env]]
+ [datomic.api :as dc]))
+
+(def grid-page {:id "report-table"
+ :nav (com/company-aside-nav)
+ :id-fn :db/id
+ :fetch-page (fn [user args]
+ (r/get-graphql (into args {:id user})))
+ :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
+ :company)}
+ "My Company"]
+
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :company-reports)}
+ "Reports"]]
+ :title "Reports"
+ :entity-name "Reports"
+ :route :company-reports-table
+ :action-buttons (fn [user]
+ nil)
+ :row-buttons (fn [user e]
+ (com/a-icon-button {:href (:report/url e)}
+ svg/download)[
+ (when (is-admin? user)
+ (com/icon-button {:hx-delete (str (bidi/path-for ssr-routes/only-routes
+ :company-reports-delete
+ :request-method :delete))
+ :hx-target "closest tr"}
+ svg/trash))])
+ :headers [{:key "name"
+ :name "Name"
+ :sort-key "name"
+ :render :report/name}
+ {:key "created-by"
+ :name "Created by"
+ :sort-key "creator"
+ :render (fn [report]
+ (when (:report/creator report)
+ (com/pill {:color :primary }
+ (:report/creator report))))}
+ {:key "created"
+ :name "Created"
+ :sort-key "created"
+ :render #(atime/unparse-local (:report/created %)
+ atime/normal-date)}]})
+
+(def row* (partial helper/row* grid-page))
+(def table* (partial helper/table* grid-page))
+(def table (partial helper/table grid-page))
+(def page (partial helper/page grid-page))
+
+(defn delete-report [{:keys [form-params identity]}]
+
+ (let [[id-to-delete key] (first (dc/q '[:find ?i ?k
+ :in $ ?i
+ :where [?i :report/key ?k]]
+ (dc/db conn)
+ (some-> (get form-params "id") not-empty Long/parseLong)))
+ report (dc/pull (dc/db conn) r/default-read id-to-delete)]
+ (assert-can-see-client identity (:report/client report))
+ (when id-to-delete
+ (s3/delete-object :bucket-name (:data-bucket env)
+ :key key)
+ @(dc/transact conn [[:db/retractEntity id-to-delete]]))
+ (html-response
+ (row* identity
+ report
+ {:flash? true
+ :delete-after-settle? true}))))
+
diff --git a/src/clj/auto_ap/ssr/company/yodlee.clj b/src/clj/auto_ap/ssr/company/yodlee.clj
new file mode 100644
index 00000000..10cfb061
--- /dev/null
+++ b/src/clj/auto_ap/ssr/company/yodlee.clj
@@ -0,0 +1,123 @@
+(ns auto-ap.ssr.company.yodlee
+ (:require
+ [auto-ap.datomic :refer [conn]]
+ [auto-ap.datomic.yodlee2 :as yodlee2]
+ [auto-ap.graphql.utils :refer [is-admin?]]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr.svg :as svg]
+ [auto-ap.ssr.ui :refer [base-page]]
+ [auto-ap.ssr.grid-page-helper :as helper]
+ [auto-ap.ssr.utils :refer [html-response]]
+ [auto-ap.time :as atime]
+ [auto-ap.yodlee.core2 :as yodlee]
+ [bidi.bidi :as bidi]
+ [config.core :refer [env]]
+ [datomic.api :as dc]
+ [hiccup2.core :as hiccup]))
+
+(def default-read '[:db/id
+ :yodlee-provider-account/last-updated
+ :yodlee-provider-account/status
+ :yodlee-provider-account/id
+ :yodlee-provider-account/detailed-status
+ {:yodlee-provider-account/accounts [:yodlee-account/name :yodlee-account/number]
+ :yodlee-provider-account/client [:client/code]}])
+
+
+
+(defn fastlink-dialog [{:keys [session]}]
+ (html-response
+ (com/modal
+ {}
+ (com/modal-card
+ {}
+ [:div.flex [:div.p-2 "Yodlee Fastlink"] ]
+ [:div
+ [:div#fa-spot]
+ [:script {:lang "text/javascript"}
+ (hiccup/raw
+ (format "
+fastlink.open({fastLinkURL: '%s',
+ accessToken: '%s',
+ params: {'configName': 'Aggregation'}},
+ 'fa-spot');
+
+" (:yodlee2-fastlink env) (yodlee/get-access-token (:client/code (:client session)))))]
+ ]
+ [:div]))))
+
+(def grid-page {:id "yodlee-table"
+ :nav (com/company-aside-nav)
+ :id-fn :db/id
+ :fetch-page (fn [user args]
+ (yodlee2/get-graphql (assoc args :id user)))
+ :breadcrumbs [[:a {:href (bidi/path-for ssr-routes/only-routes
+ :company)}
+ "My Company"]
+
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :company-yodlee)}
+ "Yodlee"]]
+ :title "Yodlee Accounts"
+ :entity-name "Yodlee accounts"
+ :route :company-yodlee-table
+ :action-buttons (fn [user]
+ [(com/button {:color :primary
+ :on-click "openFastlink()"
+ :hx-get (bidi/path-for ssr-routes/only-routes
+ :company-yodlee-fastlink-dialog)
+ :hx-target "#modal-holder"}
+ (com/button-icon {} svg/refresh)
+ "Link new account")])
+ :row-buttons (fn [user e]
+ [(when (is-admin? user)
+ (com/icon-button {:hx-put (bidi/path-for ssr-routes/only-routes
+ :company-yodlee-provider-account-refresh)
+ :hx-target "closest tr"}
+ svg/refresh))])
+ :headers [{:key "provider-account"
+ :name "Provider Account"
+ :sort-key "provider-account"
+ :render :yodlee-provider-account/id}
+ {:key "status"
+ :name "Status"
+ :sort-key "status"
+ :render #(when-let [status (:yodlee-provider-account/status %)]
+ (com/pill {:color (if (not= status "SUCCESS")
+ :yellow
+ :primary) }
+ status))}
+ {:key "detailed-status"
+ :name "Detailed Status"
+ :sort-key "detailed-status"
+ :render #(when-let [status (:yodlee-provider-account/detailed-status %)]
+ status)}
+
+ {:key "last-updated"
+ :name "Last Updated"
+ :sort-key "last-updated"
+ :render #(atime/unparse-local (:yodlee-provider-account/last-updated %)
+ atime/normal-date)}
+ {:key "accounts"
+ :name "Accounts"
+ :show-starting "md"
+ :render (fn [e]
+ [:ul
+ (for [a (:yodlee-provider-account/accounts e)]
+ [:li (:yodlee-account/name a) " - " (:yodlee-account/number a)])])}]})
+
+(def page (partial helper/page grid-page))
+(def table (partial helper/table grid-page))
+
+;; TODO delete-after-settle
+(defn refresh-provider-account [{:keys [form-params identity]}]
+ (let [provider-account (dc/pull (dc/db conn) default-read (some-> (get form-params "id") not-empty Long/parseLong))]
+ (yodlee/refresh-provider-account (:client/code (:yodlee-provider-account/client provider-account))
+ (:yodlee-provider-account/id provider-account))
+ (html-response
+ (helper/row*
+ grid-page
+ identity
+ provider-account
+ {:flash? true}))))
diff --git a/src/clj/auto_ap/ssr/company_dropdown.clj b/src/clj/auto_ap/ssr/company_dropdown.clj
index 4f73a8ea..5b3a31a7 100644
--- a/src/clj/auto_ap/ssr/company_dropdown.clj
+++ b/src/clj/auto_ap/ssr/company_dropdown.clj
@@ -1,116 +1,142 @@
(ns auto-ap.ssr.company-dropdown
(:require
- [auto-ap.datomic :refer [conn]]
- [auto-ap.graphql.utils :refer [assert-can-see-client]]
- [iol-ion.query :refer [can-see-client?]]
+ [auto-ap.datomic :refer [conn pull-many]]
+ [auto-ap.graphql.utils :refer [assert-can-see-client cleanse-query]]
+ [auto-ap.solr :as solr]
[auto-ap.ssr-routes :as ssr-routes]
- [auto-ap.ssr.components.navbar-dropdown :refer [navbar-dropdown]]
+ [auto-ap.ssr.svg :as svg]
[auto-ap.ssr.utils :refer [html-response]]
[bidi.bidi :as bidi]
[datomic.api :as dc]
- [hiccup2.core :as hiccup]))
+ [hiccup2.core :as hiccup]
+ [iol-ion.query :refer [can-see-client?]]))
-(defn dropdown-contents [{:keys [identity]}]
- (let [options (->> (dc/q '[:find ?c ?n
- :in $ ?user
- :where [?c :client/name ?n]
- [(iol-ion.query/can-see-client? ?user ?c)]]
- (dc/db conn)
- identity)
- (map (fn [[k v]]
- {"key" k
- "value" v})))]
- (html-response
- [:div.navbar-dropdown {:style {:width "20em"}}
- [:a.navbar-item {:hx-put (bidi/path-for ssr-routes/only-routes
- :active-client
- :request-method :put)
- :hx-target "#company-dropdown"
- :hx-swap "outerHTML"
- :hx-trigger "click"}
- "All"]
- [:hr.navbar-divider]
- [:input#company-search.input.navbar-item {:placeholder "Company name"
- :name "search-text"
- :autoFocus true} ]
- [:input#company-search-value {:type "hidden"
- :autocomplete "off"
- :name "search-client"
- :hx-put (bidi/path-for ssr-routes/only-routes
- :active-client
- :request-method :put)
- :hx-target "#company-dropdown"
- :hx-swap "outerHTML"
- :hx-trigger "change"} ]
- [:script
- (hiccup/raw
- (str "
-var z = new autoComplete({
- selector:\"#company-search\",
- placeholder: \"Company Name....\",
- data: {
- keys: [\"value\"],
- src: " (cheshire.core/encode
- options)
+(defn dropdown-search-results* [{:keys [options]}]
+ [:ul
+ (for [{:keys [id name]} options]
+ [:li
+ [:div {:class "flex items-center pl-2 rounded hover:bg-green-100 dark:hover:bg-green-600"}
- "
- },
- resultItem: {
- highlight:true,
- class: \"autocomplete-suggestion\",
- selected: \"highlighted\"
+ [:a {:href "#" :class "w-full py-2 ml-2 text-sm font-medium text-gray-900 rounded dark:text-gray-300"
+ "_" (hiccup/raw "on click set value of <#company-search-value/> to @data-value then send selected to #company-dropdown")
+ :data-value id}
+ name]]])])
- },
- resultsList: {
- tabSelect: true
- },
- submit: true
-});
-z.input.addEventListener(\"selection\", function (event) {
- z.input.blur();
- z.input.value = event.detail.selection.value.value;
-document.getElementById(\"company-search-value\").value= event.detail.selection.value.key;
-document.getElementById(\"company-search-value\").dispatchEvent(new Event('change'));
-});
-"))]])))
+(defn get-clients [identity query]
+ (if-let [query (not-empty (cleanse-query query))]
+ (let [search-query (str "name:(" query ")")]
-(defn dropdown [request]
+ (for [n (pull-many (dc/db conn) [:client/name :db/id]
+ (for [{:keys [id name]} (solr/query solr/impl "clients" {"query" search-query
+ "fields" "id, name"})
+ :let [client-id (Long/parseLong id)]
+ :when (can-see-client? identity client-id)]
+ client-id))]
+ {:id (:db/id n)
+ :name (:client/name n)}))
+ []))
- (let [client (get-in request [:session :client])]
+(defn dropdown-search-results [{:keys [identity] :as request}]
+ (html-response
+ (dropdown-search-results* {:options (get-clients identity (get (:query-params request) "search-text"))
+ :client (:client (:session request))})))
- (navbar-dropdown
- "company-dropdown"
- [:span
- (if client
- (str "Company: " (:client/name client))
- "Company")
- [:script
- (hiccup/raw
- "localStorage.setItem(\"last-client-id\", \""(:db/id client)"\")")]]
- [:div {:hx-get
- (bidi/path-for ssr-routes/only-routes
- :company-dropdown-contents)
- :hx-swap "outerHTML"
- :hx-trigger "intersect delay:150ms"
- :hx-target "closest .navbar-dropdown"
- :style {:width "20em"
- :height "80px"}
- }
- [:div.loader.is-loading.is-active.is-centered]])))
+(defn dropdown [{:keys [client]}]
+ [:div#company-dropdown
+ {:hx-put (bidi/path-for ssr-routes/only-routes
+ :active-client
+ :request-method :put)
+ :hx-target "#company-dropdown"
+ :hx-include "#company-search-value"
+ :hx-swap "outerHTML"
+ :hx-trigger "selected"}
+ [:script
+ (hiccup/raw
+ "localStorage.setItem(\"last-client-id\", \""(:db/id client)"\")")]
+ [:div
+ [:button#company-dropdown-button { :class "text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-4 py-2.5 text-center inline-flex items-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
+ :type "button"}
+ (if client
+ (:client/name client)
+ "All Companies")
+ [:div.w-4.h-4.ml-2
+ svg/drop-down]]
+ [:div#company-dropdown-list.hidden {"_" (hiccup/raw "init call initCompanyDropdown()")
+ }
+ [:div {:class "z-10 bg-white rounded-lg shadow w-64 dark:bg-gray-700 slide-up duration-500 transition-all"}
+ [:div {:class "p-3"}
+ [:label {:for "input-group-search", :class "sr-only"} "Search"]
+ [:div {:class "relative"}
+ [:div {:class "absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none"}
+ [:div.w-5.h-5.text-gray-500.dark:text-gray-400
+ svg/search]]
+ [:input#company-search {:placeholder "Company name"
+ :name "search-text"
+ :class "block w-full p-2 pl-10 text-sm text-gray-900 border border-gray-300 rounded-lg bg-gray-50 focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
+ :autoFocus true
+ :tab-index -1
+ :hx-trigger "keyup changed delay:500ms, search"
+ :hx-get (bidi/path-for ssr-routes/only-routes
+ :company-dropdown-search-results)
+ :hx-target "#company-search-results"
+ :hx-swap "innerHTML"} ]]
+ [:input#company-search-value {:type "hidden"
+ :name "search-client"}]]
+ [:div.divide-y.divide-gray-100
+ [:div#company-search-results {:class "h-48 px-3 pb-3 overflow-y-auto text-sm text-gray-700 dark:text-gray-200"}]
+ [:div {:class "flex items-center pl-2 rounded hover:bg-green-100 dark:hover:bg-green-600"}
+
+ [:button {:class "w-full py-2 ml-2 text-sm font-medium text-gray-900 rounded dark:text-gray-300"
+ :hx-put (bidi/path-for ssr-routes/only-routes
+ :active-client
+ :request-method :put)
+ :hx-target "#company-dropdown"
+ :hx-swap "outerHTML"
+ :hx-trigger "click"}
+ "All"]]]
+ ]]
+ [:script {:lang "text/javascript"}
+ (hiccup/raw
+ "
+function initCompanyDropdown() {
+ var $dropdownTargetEl = document.getElementById('company-dropdown-list');
+
+ // set the element that trigger the dropdown menu on click
+ var $dropdownTriggerEl = document.getElementById('company-dropdown-button');
+
+ var dropdownOptions = {
+ placement: 'bottom',
+ triggerType: 'click',
+ offsetSkidding: 0,
+ offsetDistance: 10,
+ delay: 300,
+ onHide: () => {
+ },
+ onShow: () => {
+ document.getElementById('company-search').focus()
+ },
+ onToggle: () => {
+ }
+ };
+ var companyDrowdown = new Dropdown($dropdownTargetEl, $dropdownTriggerEl, dropdownOptions);
+}
+")]]])
(defn active-client [{:keys [identity params] :as request}]
(let [client-id (some-> (or (:search-client params) (get params "search-client")) not-empty Long/parseLong)]
+ (println (format "HERE CLIENT ID '%s'" client-id))
(when client-id
(assert-can-see-client identity client-id))
(let [new-session (assoc (:session request) :client
(when client-id
(dc/pull (dc/db conn) [:db/id :client/name :client/code] client-id)))]
- (assoc
- (html-response
- (dropdown (assoc request :session new-session)))
- :session
- new-session
- :headers
- {"hx-trigger" "clientSelected"}))))
+ (assoc
+ (html-response
+ (dropdown {:client (:client new-session)
+ :identity identity}))
+ :session
+ new-session
+ :headers
+ {"hx-trigger" "clientSelected"}))))
diff --git a/src/clj/auto_ap/ssr/components.clj b/src/clj/auto_ap/ssr/components.clj
new file mode 100644
index 00000000..0225dfe9
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components.clj
@@ -0,0 +1,56 @@
+(ns auto-ap.ssr.components
+ (:require [auto-ap.ssr.components.breadcrumbs :as breadcrumbs]
+ [auto-ap.ssr.components.buttons :as buttons]
+ [auto-ap.ssr.components.dialog :as dialog]
+ [auto-ap.ssr.components.inputs :as inputs]
+ [auto-ap.ssr.components.aside :as aside]
+ [auto-ap.ssr.components.card :as card]
+ [auto-ap.ssr.components.navbar :as navbar]
+ [auto-ap.ssr.components.page :as page]
+ [auto-ap.ssr.components.data-grid :as data-grid]
+ [auto-ap.ssr.components.tags :as tags]
+ [auto-ap.ssr.components.paginator :as paginator]))
+
+
+(def breadcrumbs breadcrumbs/breadcrumbs-)
+(def button buttons/button-)
+(def button-icon buttons/button-icon-)
+(def icon-button buttons/icon-button-)
+(def a-icon-button buttons/a-icon-button-)
+(def modal dialog/modal-)
+(def modal-card dialog/modal-card-)
+
+(def text-input inputs/text-input-)
+(def select inputs/select-)
+(def field inputs/field-)
+
+(def left-aside aside/left-aside-)
+(def company-aside-nav aside/company-aside-nav-)
+(def admin-aside-nav aside/admin-aside-nav-)
+(def main-aside-nav aside/main-aside-nav-)
+(def content-card card/content-card-)
+(def card card/card-)
+
+(def navbar navbar/navbar-)
+
+(def page page/page-)
+
+(def pill tags/pill-)
+
+(def data-grid data-grid/data-grid-)
+(def data-grid-header data-grid/header-)
+(def data-grid-sort-header data-grid/sort-header-)
+(def data-grid-row data-grid/row-)
+(def data-grid-cell data-grid/cell-)
+(def data-grid-right-stack-cell data-grid/right-stack-cell-)
+
+(defn link [params & children]
+ (into [:a (update params :class str " font-medium text-blue-600 dark:text-blue-500 hover:underline ")]
+ children))
+
+
+
+
+(def paginator paginator/paginator-)
+(def data-grid-card data-grid/data-grid-card-)
+
diff --git a/src/clj/auto_ap/ssr/components/aside.clj b/src/clj/auto_ap/ssr/components/aside.clj
new file mode 100644
index 00000000..5a885d99
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/aside.clj
@@ -0,0 +1,326 @@
+(ns auto-ap.ssr.components.aside
+ (:require [auto-ap.ssr.svg :as svg]
+ [hiccup2.core :as hiccup]
+ [bidi.bidi :as bidi]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [auto-ap.client-routes :as client-routes]))
+
+(defn menu-button- [params & children]
+ [:div
+ [:a (-> params
+ (dissoc :icon)
+ (assoc :type "button")
+ (update :class str " cursor-pointer flex items-center p-2 w-full text-sm text-gray-600 rounded-lg transition duration-75 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700")
+ (assoc :hx-indicator "find .htmx-indicator")
+ (assoc :hx-select "#app-contents")
+ (assoc :hx-target "#app-contents")
+ (assoc :hx-swap "outerHTML"))
+
+ (when (:icon params)
+ [:span {:class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 group-hover:text-blue-500 dark:text-gray-400 group-hover:scale-110 dark:group-hover:text-white mr-3"}
+ (:icon params)])
+
+ (into [:span {:class "flex-1 text-left whitespace-nowrap text-gray-600 dark:text-white"}] children)
+ (when (:data-collapse-toggle params)
+ [:svg {:aria-hidden "true", :class "w-6 h-6", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:fill-rule "evenodd", :d "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z", :clip-rule "evenodd"}]])
+ [:div.htmx-indicator.flex.items-center
+ (svg/spinner-primary {:class "inline w-4 h-4 text-white"})]]])
+
+(defn sub-menu- [params & children]
+ [:ul {:id (:id params) :class "hidden py-2 space-y-2"}
+ (for [c children]
+ [:li
+ (update-in c [1 1 :class ] str " flex items-center p-2 pl-11 w-full text-base font-normal text-gray-900 rounded-lg transition duration-75 group hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700")])])
+
+(defn left-aside- [{:keys [nav page-specific]} & children]
+ [:aside {:id "left-nav", :class "fixed top-0 left-0 pt-16 z-20 w-64 h-screen transition-transform -translate-x-full lg:translate-x-0", :aria-labelledby "left-nav" :aria-hidden "true"
+ "_" (hiccup/raw "init call initSidebarToggle()")}
+
+ [:div {:class "overflow-y-auto py-5 px-3 h-full bg-gray-50 border-r border-gray-200 dark:bg-gray-800 dark:border-gray-700"}
+ nav
+
+ [:ul {:class "pt-5 mt-5 space-y-2 border-t border-gray-200 dark:border-gray-700"}
+ #_[:li
+ [:a {:href "#", :class "flex items-center p-2 text-base font-normal text-gray-900 rounded-lg transition duration-75 hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white group"}
+ [:svg {:aria-hidden "true", :class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 dark:text-gray-400 group-hover:text-gray-900 dark:group-hover:text-white", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"}]
+ [:path {:fill-rule "evenodd", :d "M4 5a2 2 0 012-2 3 3 0 003 3h2a3 3 0 003-3 2 2 0 012 2v11a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm3 4a1 1 0 000 2h.01a1 1 0 100-2H7zm3 0a1 1 0 000 2h3a1 1 0 100-2h-3zm-3 4a1 1 0 100 2h.01a1 1 0 100-2H7zm3 0a1 1 0 100 2h3a1 1 0 100-2h-3z", :clip-rule "evenodd"}]]
+ [:span {:class "ml-3"} "Docs"]]]
+ #_[:li
+ [:a {:href "#", :class "flex items-center p-2 text-base font-normal text-gray-900 rounded-lg transition duration-75 hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white group"}
+ [:svg {:aria-hidden "true", :class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 dark:text-gray-400 group-hover:text-gray-900 dark:group-hover:text-white", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M7 3a1 1 0 000 2h6a1 1 0 100-2H7zM4 7a1 1 0 011-1h10a1 1 0 110 2H5a1 1 0 01-1-1zM2 11a2 2 0 012-2h12a2 2 0 012 2v4a2 2 0 01-2 2H4a2 2 0 01-2-2v-4z"}]]
+ [:span {:class "ml-3"} "Components"]]]
+ #_[:li
+ [:a {:href "#", :class "flex items-center p-2 text-base font-normal text-gray-900 rounded-lg transition duration-75 hover:bg-gray-100 dark:hover:bg-gray-700 dark:text-white group"}
+ [:svg {:aria-hidden "true", :class "flex-shrink-0 w-6 h-6 text-gray-400 transition duration-75 dark:text-gray-400 group-hover:text-gray-900 dark:group-hover:text-white", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:fill-rule "evenodd", :d "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-2 0c0 .993-.241 1.929-.668 2.754l-1.524-1.525a3.997 3.997 0 00.078-2.183l1.562-1.562C15.802 8.249 16 9.1 16 10zm-5.165 3.913l1.58 1.58A5.98 5.98 0 0110 16a5.976 5.976 0 01-2.516-.552l1.562-1.562a4.006 4.006 0 001.789.027zm-4.677-2.796a4.002 4.002 0 01-.041-2.08l-.08.08-1.53-1.533A5.98 5.98 0 004 10c0 .954.223 1.856.619 2.657l1.54-1.54zm1.088-6.45A5.974 5.974 0 0110 4c.954 0 1.856.223 2.657.619l-1.54 1.54a4.002 4.002 0 00-2.346.033L7.246 4.668zM12 10a2 2 0 11-4 0 2 2 0 014 0z", :clip-rule "evenodd"}]]
+ [:span {:class "ml-3"} "Help"]]]]
+ page-specific]
+ #_[:div {:class "hidden absolute bottom-0 left-0 justify-center p-4 space-x-4 w-full lg:flex bg-white dark:bg-gray-800 z-20 border-r border-gray-200 dark:border-gray-700"}
+ [:a {:href "#", :class "inline-flex justify-center p-2 text-gray-500 rounded cursor-pointer dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-600"}
+ [:svg {:aria-hidden "true", :class "w-6 h-6", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M5 4a1 1 0 00-2 0v7.268a2 2 0 000 3.464V16a1 1 0 102 0v-1.268a2 2 0 000-3.464V4zM11 4a1 1 0 10-2 0v1.268a2 2 0 000 3.464V16a1 1 0 102 0V8.732a2 2 0 000-3.464V4zM16 3a1 1 0 011 1v7.268a2 2 0 010 3.464V16a1 1 0 11-2 0v-1.268a2 2 0 010-3.464V4a1 1 0 011-1z"}]]]
+ [:a {:href "#", :data-tooltip-target "tooltip-settings", :class "inline-flex justify-center p-2 text-gray-500 rounded cursor-pointer dark:text-gray-400 dark:hover:text-white hover:text-gray-900 hover:bg-gray-100 dark:hover:bg-gray-600"}
+ [:svg {:aria-hidden "true", :class "w-6 h-6", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:fill-rule "evenodd", :d "M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z", :clip-rule "evenodd"}]]]
+ [:div {:id "tooltip-settings", :role "tooltip", :class "inline-block absolute invisible z-10 py-2 px-3 text-sm font-medium text-white bg-gray-900 rounded-lg shadow-sm opacity-0 transition-opacity duration-300 tooltip"} "Settings page"]
+ [:button {:type "button", :data-dropdown-toggle "language-dropdown", :class "inline-flex justify-center p-2 text-gray-500 rounded cursor-pointer dark:hover:text-white dark:text-gray-400 hover:text-gray-900 hover:bg-gray-100 dark:hover:bg-gray-600"}
+ [:svg {:aria-hidden "true", :class "h-5 w-5 rounded-full mt-0.5", :xmlns "http://www.w3.org/2000/svg", :xmlns:xlink "http://www.w3.org/1999/xlink", :viewbox "0 0 3900 3900"}
+ [:path {:fill "#b22234", :d "M0 0h7410v3900H0z"}]
+ [:path {:d "M0 450h7410m0 600H0m0 600h7410m0 600H0m0 600h7410m0 600H0", :stroke "#fff", :stroke-width "300"}]
+ [:path {:fill "#3c3b6e", :d "M0 0h2964v2100H0z"}]
+ [:g {:fill "#fff"}
+ [:g {:id "d"}
+ [:g {:id "c"}
+ [:g {:id "e"}
+ [:g {:id "b"}
+ [:path {:id "a", :d "M247 90l70.534 217.082-184.66-134.164h228.253L176.466 307.082z"}]
+ [:use {:xlink:href "#a", :y "420"}]
+ [:use {:xlink:href "#a", :y "840"}]
+ [:use {:xlink:href "#a", :y "1260"}]]
+ [:use {:xlink:href "#a", :y "1680"}]]
+ [:use {:xlink:href "#b", :x "247", :y "210"}]]
+ [:use {:xlink:href "#c", :x "494"}]]
+ [:use {:xlink:href "#d", :x "988"}]
+ [:use {:xlink:href "#c", :x "1976"}]
+ [:use {:xlink:href "#e", :x "2470"}]]]]
+ [:div {:class "hidden z-50 my-4 text-base list-none bg-white rounded divide-y divide-gray-100 shadow dark:bg-gray-700", :id "language-dropdown"}
+ [:ul {:class "py-1", :role "none"}
+ [:li
+ [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:text-white dark:text-gray-300 dark:hover:bg-gray-600", :role "menuitem"}
+ [:div {:class "inline-flex items-center"}
+ [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :id "flag-icon-css-us", :viewbox "0 0 512 512"}
+ [:g {:fill-rule "evenodd"}
+ [:g {:stroke-width "1pt"}
+ [:path {:fill "#bd3d44", :d "M0 0h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z", :transform "scale(3.9385)"}]
+ [:path {:fill "#fff", :d "M0 10h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0zm0 20h247v10H0z", :transform "scale(3.9385)"}]]
+ [:path {:fill "#192f5d", :d "M0 0h98.8v70H0z", :transform "scale(3.9385)"}]
+ [:path {:fill "#fff", :d "M8.2 3l1 2.8H12L9.7 7.5l.9 2.7-2.4-1.7L6 10.2l.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7L74 8.5l-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 7.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 24.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 21.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 38.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 35.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 52.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 49.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm-74.1 7l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7H65zm16.4 0l1 2.8H86l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm-74 7l.8 2.8h3l-2.4 1.7.9 2.7-2.4-1.7L6 66.2l.9-2.7-2.4-1.7h3zm16.4 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8H45l-2.4 1.7 1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9zm16.4 0l1 2.8h2.8l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h3zm16.5 0l.9 2.8h2.9l-2.3 1.7.9 2.7-2.4-1.7-2.3 1.7.9-2.7-2.4-1.7h2.9zm16.5 0l.9 2.8h2.9L92 63.5l1 2.7-2.4-1.7-2.4 1.7 1-2.7-2.4-1.7h2.9z", :transform "scale(3.9385)"}]]] " \n English (US)"]]]
+ [:li
+ [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:text-white dark:hover:bg-gray-600", :role "menuitem"}
+ [:div {:class "inline-flex items-center"}
+ [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :id "flag-icon-css-de", :viewbox "0 0 512 512"}
+ [:path {:fill "#ffce00", :d "M0 341.3h512V512H0z"}]
+ [:path {:d "M0 0h512v170.7H0z"}]
+ [:path {:fill "#d00", :d "M0 170.7h512v170.6H0z"}]]]]]
+ [:li
+ [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:text-white dark:hover:bg-gray-600", :role "menuitem"}
+ [:div {:class "inline-flex items-center"}
+ [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :id "flag-icon-css-it", :viewbox "0 0 512 512"}
+ [:g {:fill-rule "evenodd", :stroke-width "1pt"}
+ [:path {:fill "#fff", :d "M0 0h512v512H0z"}]
+ [:path {:fill "#009246", :d "M0 0h170.7v512H0z"}]
+ [:path {:fill "#ce2b37", :d "M341.3 0H512v512H341.3z"}]]]]]]
+ [:li
+ [:a {:href "#", :class "block py-2 px-4 text-sm text-gray-700 hover:bg-gray-100 dark:hover:text-white dark:text-gray-300 dark:hover:bg-gray-600", :role "menuitem"}
+ [:div {:class "inline-flex items-center"}
+ [:svg {:aria-hidden "true", :class "h-3.5 w-3.5 rounded-full mr-2", :xmlns "http://www.w3.org/2000/svg", :xmlns:xlink "http://www.w3.org/1999/xlink", :id "flag-icon-css-cn", :viewbox "0 0 512 512"}
+ [:defs
+ [:path {:id "a", :fill "#ffde00", :d "M1-.3L-.7.8 0-1 .6.8-1-.3z"}]]
+ [:path {:fill "#de2910", :d "M0 0h512v512H0z"}]
+ [:use {:width "30", :height "20", :transform "matrix(76.8 0 0 76.8 128 128)", :xlink:href "#a"}]
+ [:use {:width "30", :height "20", :transform "rotate(-121 142.6 -47) scale(25.5827)", :xlink:href "#a"}]
+ [:use {:width "30", :height "20", :transform "rotate(-98.1 198 -82) scale(25.6)", :xlink:href "#a"}]
+ [:use {:width "30", :height "20", :transform "rotate(-74 272.4 -114) scale(25.6137)", :xlink:href "#a"}]
+ [:use {:width "30", :height "20", :transform "matrix(16 -19.968 19.968 16 256 230.4)", :xlink:href "#a"}]] "中文 (繁體)"]]]]]]
+ [:script {:lang "text/javascript"}
+ (hiccup/raw "
+ function initSidebarToggle() {
+ var $targetEl = document.getElementById('left-nav');
+
+ var $triggerEl = document.getElementById('left-nav-toggle');
+
+ var options = {
+ onCollapse: () => {
+ document.getElementById('main-content').classList.remove('lg:pl-64')
+ },
+ onExpand: () => {
+ document.getElementById('main-content').classList.add('lg:pl-64')
+ },
+ onToggle: () => {
+ }
+ };
+
+ var collapse = new Collapse($targetEl, $triggerEl, options);
+ }
+")]])
+
+(defn main-aside-nav- []
+ [:ul {:class "space-y-2"}
+
+ [:li
+ (menu-button- {:icon svg/pie
+ :href "/"}
+ "Dashboard")]
+ [:li
+ (menu-button- {:aria-controls "dropdown-invoices",
+ :data-collapse-toggle "dropdown-invoices"
+ :icon svg/accounting-invoice-mail}
+ "Invoices")
+ (sub-menu- {:id "dropdown-invoices"}
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :invoices)}
+ "All")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :paid-invoices)}
+ "Paid")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :unpaid-invoices)}
+ "Unpaid")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :voided-invoices)}
+ "Voided"))]
+ [:li
+ (menu-button- {:aria-controls "dropdown-sales",
+ :data-collapse-toggle "dropdown-sales"
+ :icon svg/receipt-register-1}
+ "Sales")
+ (sub-menu- {:id "dropdown-sales"}
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :sales-orders)} "Sales")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :expected-deposits)} "Expected Deposits")
+ #_(menu-button- {:href "Sales"} "Cash Shifts")
+ #_(menu-button- {:href "Sales"} "Tenders"))]
+ [:li
+ (menu-button- {:aria-controls "dropdown-payments"
+ :data-collapse-toggle "dropdown-payments"
+ :icon svg/payments}
+ "Payments")
+ (sub-menu- {:id "dropdown-payments"}
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :payments)} "All")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :payments)} "Pending")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :payments)} "Cleared")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :payments)} "Voided"))]
+
+ [:li
+ (menu-button- {:aria-controls "dropdown-transactions"
+ :data-collapse-toggle "dropdown-transactions"
+ :icon svg/bank}
+ "Transactions")
+
+ (sub-menu- {:id "dropdown-transactions"}
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :transactions)} "All")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :unapproved-transactions)} "Unapproved")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :requires-feedback-transactions)} "Client Review")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :approved-transactions)} "Approved")
+ (menu-button- {:href (bidi/path-for ssr-routes/only-routes
+ :transaction-insights)} "Insights"))]
+ [:li
+ (menu-button- {:aria-controls "dropdown-ledger"
+ :data-collapse-toggle "dropdown-ledger"
+ :icon svg/receipt}
+ "Ledger")
+ (sub-menu- {:id "dropdown-ledger"}
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :ledger)} "Register")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :profit-and-loss)} "Profit & Loss")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :profit-and-loss-detail)} "Profit & Loss Detail")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :cash-flows)} "Cash Flows")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :balance-sheet)} "Balance Sheet")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :external-import-ledger)} "External Ledger Import"))]])
+
+
+(defn company-aside-nav- []
+ [:ul {:class "space-y-2" :hx-boost "true"}
+ [:li
+ (menu-button- {:icon svg/vendors
+ :href (bidi/path-for ssr-routes/only-routes
+ :company)}
+ "My Company")]
+
+ [:li
+ (menu-button- {:icon svg/report
+ :href (bidi/path-for ssr-routes/only-routes
+ :company-reports)}
+ "Reports")]
+ [:li
+ (menu-button- {:icon svg/bank
+ :href (bidi/path-for ssr-routes/only-routes
+ :company-yodlee)}
+ "Yodlee Link")]
+ [:li
+ (menu-button- {:icon svg/government-building
+ :href (bidi/path-for ssr-routes/only-routes
+ :company-1099)}
+ "1099 Vendor Info"
+ )]])
+
+(defn admin-aside-nav- []
+ [:ul {:class "space-y-2"}
+ [:li
+ (menu-button- {:icon svg/dashboard
+ :href (bidi/path-for client-routes/routes
+ :admin)}
+ "Dashboard")]
+
+ [:li
+ (menu-button- {:icon svg/restaurant
+ :href (bidi/path-for client-routes/routes
+ :admin-clients)}
+ "Clients")]
+ [:li
+ (menu-button- {:icon svg/vendors
+ :href (bidi/path-for client-routes/routes
+ :admin-vendors)}
+ "Vendors")]
+ [:li
+ (menu-button- {:icon svg/user
+ :href (bidi/path-for client-routes/routes
+ :admin-users)}
+ "Users")]
+ [:li
+ (menu-button- {:icon svg/accounts
+ :href (bidi/path-for client-routes/routes
+ :admin-accounts)}
+ "Accounts")]
+
+ [:li
+ (menu-button- {:icon svg/cog
+ :href (bidi/path-for client-routes/routes
+ :admin-rules)}
+ "Rules")]
+
+ [:li
+ (menu-button- {:icon svg/question
+ :href (bidi/path-for ssr-routes/only-routes
+ :admin-history)
+ :hx-boost "true"}
+ "History")]
+
+ [:li
+ (menu-button- {:icon svg/rabbit
+ :href (bidi/path-for client-routes/routes
+ :admin-jobs)}
+ "Background Jobs")]
+ [:li
+ (menu-button- {:aria-controls "dropdown-import"
+ :data-collapse-toggle "dropdown-import"
+ :icon svg/arrow-in}
+ "Import")
+
+ (sub-menu- {:id "dropdown-import"}
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :admin-excel-import)} "Excel Invoices")
+ (menu-button- {:href (bidi/path-for client-routes/routes
+ :admin-import-batches)} "Import Batches")
+ (menu-button- {:href (bidi/path-for ssr-routes/only-routes
+ :admin-ezcater-xls)
+ :hx-boost "true"} "EZCater XLS Import"))]])
+
+
diff --git a/src/clj/auto_ap/ssr/components/breadcrumbs.clj b/src/clj/auto_ap/ssr/components/breadcrumbs.clj
new file mode 100644
index 00000000..3cbaf6aa
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/breadcrumbs.clj
@@ -0,0 +1,22 @@
+(ns auto-ap.ssr.components.breadcrumbs
+ (:require [auto-ap.ssr.svg :as svg]))
+
+(defn breadcrumbs- [params & steps]
+ [:div {:class "inline-flex px-5 py-3 text-gray-700 border border-gray-200 rounded-lg bg-white dark:bg-gray-800 dark:border-gray-700"}
+ [:ul {:class "inline-flex items-center space-x-1 md:space-x-3"}
+ [:li {:class "inline-flex items-center"}
+ [:a {:href "#", :class "inline-flex w-4 h-4 mr-2 items-center text-sm font-medium text-gray-700 hover:text-blue-600 dark:text-gray-400 dark:hover:text-white"}
+ [:div.w-4.h-4 svg/home]]]
+ (for [p steps]
+ [:li
+ [:div {:class "flex items-center"}
+
+ [:div {:class "w-6 h-6 text-gray-400",}
+ svg/breadcrumb-component]
+
+ (update-in p [1 :class] str " ml-1 text-sm font-medium text-gray-700 hover:text-blue-600 md:ml-2 dark:text-gray-400 dark:hover:text-white")]])
+ #_[:li {:aria-current "page"}
+ [:div {:class "flex items-center"}
+ [:svg {:aria-hidden "true", :class "w-6 h-6 text-gray-400", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:fill-rule "evenodd", :d "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", :clip-rule "evenodd"}]]
+ [:span {:class "ml-1 text-sm font-medium text-gray-500 md:ml-2 dark:text-gray-400"} "Flowbite"]]]]])
diff --git a/src/clj/auto_ap/ssr/components/buttons.clj b/src/clj/auto_ap/ssr/components/buttons.clj
new file mode 100644
index 00000000..4a7f9762
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/buttons.clj
@@ -0,0 +1,46 @@
+(ns auto-ap.ssr.components.buttons
+ (:require [auto-ap.ssr.svg :as svg]))
+
+(defn button-icon- [_ i]
+ [:div.h-4.w-4 i])
+
+(defn button- [params & children]
+ [:button (update params
+ :class #(cond-> %
+ true (str " text-white focus:ring-4 font-bold rounded-lg text-sm px-5 py-2.5 text-center mr-2 inline-flex items-center hover:scale-105 transition duration-100 justify-center")
+ (= :secondary (:color params)) (str " bg-blue-500 hover:bg-blue-600 focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700")
+ (= :primary (:color params)) (str " bg-green-500 hover:bg-green-600 focus:ring-green-300 dark:bg-green-600 dark:hover:bg-green-700 ")))
+ [:div.htmx-indicator.flex.items-center
+ (svg/spinner {:class "inline w-4 h-4 text-white"})
+ [:div.ml-3 "Loading..."]]
+ (into [:div.htmx-indicator-hidden.inline-flex.gap-2.items-center.justify-center ] children)])
+
+(defn icon-button- [params & children]
+ (into
+ [:button
+
+ (update params :class
+ #(cond-> %
+ true (str " inline-flex items-center justify-center items-center p-3 text-sm font-medium border border-gray-300 dark:border-gray-700 text-center rounded-lg ")
+ (= :secondary (:color params)) (str " bg-blue-500 hover:bg-blue-600 focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700")
+ (= :primary (:color params)) (str " bg-green-500 hover:bg-green-600 focus:ring-green-300 dark:bg-green-600 dark:hover:bg-green-700 ")
+ (= :primary-light (:color params)) (str " bg-green-200 hover:bg-green-300 focus:ring-green-200 dark:bg-green-700 dark:hover:bg-green-600 text-gray-800 dark:text-gray-200")
+ (= :secondary-light (:color params)) (str " bg-blue-200 hover:bg-blue-300 focus:ring-blue-200 dark:bg-blue-700 dark:hover:bg-blue-600 text-gray-800 dark:text-gray-200")
+ (= :danger-light (:color params)) (str " bg-red-200 hover:bg-red-300 focus:ring-red-200 dark:bg-red-700 dark:hover:bg-red-600 text-gray-800 dark:text-gray-200")
+ (nil? (:color params))
+ (str " bg-white dark:bg-gray-600 border-gray-300 dark:border-gray-700 text-gray-500 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-100")))
+ [:div.htmx-indicator.flex.items-center
+ (svg/spinner {:class "inline w-4 h-4 text-white"})]
+ [:div.htmx-indicator-hidden.inline-flex.gap-2.items-center.justify-center (into [:div.h-4.w-4] children)]]))
+
+(defn a-icon-button- [params & children]
+ (into
+ [:a (update params :class str " inline-flex items-center justify-center bg-white dark:bg-gray-600 items-center p-3 text-sm font-medium border border-gray-300 dark:border-gray-700 text-center text-gray-500 hover:text-gray-800 rounded-lg dark:text-gray-400 dark:hover:text-gray-100")
+ [:div.h-4.w-4 children]]))
+
+(defn save-button- [params & children]
+ [:button { :class "text-white bg-green-500 hover:bg-green-700 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center mr-2 dark:bg-green-600 dark:hover:bg-green-700 dark:focus:ring-green-800 inline-flex items-center hover:scale-105 transition duration-300"}
+ [:div.htmx-indicator.flex.items-center
+ (svg/spinner {:class "inline w-4 h-4 text-white"})
+ [:div.ml-3 "Loading..."]]
+ (into [:div.htmx-indicator-hidden ] children)])
diff --git a/src/clj/auto_ap/ssr/components/card.clj b/src/clj/auto_ap/ssr/components/card.clj
new file mode 100644
index 00000000..b93838b4
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/card.clj
@@ -0,0 +1,12 @@
+(ns auto-ap.ssr.components.card)
+
+(defn card- [params & children]
+ (into [:div (update params :class str " shadow-md dark:bg-gray-800 sm:rounded-lg border-2 border-gray-200 dark:border-gray-900 bg-white overflow-hidden")]
+ children))
+
+(defn content-card- [params & children]
+ [:section {:class " py-3 sm:py-5"}
+ [:div {:class "max-w-screen-2xl"}
+ (into
+ [:div {:class "relative overflow-hidden shadow-md dark:bg-gray-800 sm:rounded-lg border-2 border-gray-200 dark:border-gray-900 bg-white"}]
+ children)]])
diff --git a/src/clj/auto_ap/ssr/components/data_grid.clj b/src/clj/auto_ap/ssr/components/data_grid.clj
new file mode 100644
index 00000000..5625818e
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/data_grid.clj
@@ -0,0 +1,100 @@
+(ns auto-ap.ssr.components.data-grid
+ (:require
+ [auto-ap.ssr-routes :as ssr-routes]
+ [auto-ap.ssr.components.card :refer [content-card-]]
+ [auto-ap.ssr.components.paginator :refer [paginator-]]
+ [bidi.bidi :as bidi]
+ [hiccup2.core :as hiccup]))
+
+(defn header- [params & rest]
+ (into [:th.px-4.py-3 {:scope "col" :class (:class params)
+ "_" (hiccup/raw (when (:sort-key params ) (format "on click trigger sorted(key:\"%s\")", (:sort-key params))))
+ :style (:style params)}]
+ (if (:sort-key params)
+ [(into [:a {:href "#"} ] rest)]
+ rest)))
+
+(defn sort-header- [params & rest]
+ [:th.px-4.py-3 {:scope "col" :class (:class params)
+ "_" (hiccup/raw (format "on click trigger sorted(key:\"%s\")", (:sort-key params)))}
+ (into [:a {:href "#"} ] rest)])
+
+(defn row- [params & rest]
+ (into [:tr (update params
+ :class str " border-b dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700")] rest))
+
+(defn cell- [params & rest]
+ (into [:td.px-4.py-2 params ] rest))
+
+(defn right-stack-cell- [params & rest]
+ (cell- params (into [:div.flex.flex-row-reverse.items-center.justify-between
+ rest]))
+ )
+
+(defn checkbox-header- [params & rest]
+ [:th {:scope "col", :class "p-4"}
+ [:div {:class "flex items-center"}
+ [:input {:id "checkbox-all", :type "checkbox", :class "w-4 h-4 bg-gray-100 border-gray-300 rounded text-primary-600 focus:ring-primary-500 dark:focus:ring-primary-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"}]
+ [:label {:for "checkbox-all", :class "sr-only"} "checkbox"]]])
+
+(defn data-grid- [{:keys [headers thead-params]} & rest]
+ [:table {:class "w-full text-sm text-left text-gray-500 dark:text-gray-400"}
+ [:thead (assoc thead-params :class "text-xs text-gray-800 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400")
+ (into
+ [:tr]
+ headers)]
+ (into
+ [:tbody]
+ rest)])
+
+;; needed for tailwind
+;; lg:table-cell md:table-cell
+
+(defn data-grid-card- [{:keys [id
+ route
+ title
+ paginate?
+ action-buttons
+ total
+ subtitle
+ thead-params
+ start
+ per-page
+ flash-id
+ headers
+ rows] :as params}]
+ [:div {:hx-get (bidi/path-for ssr-routes/only-routes
+ route
+ :request-method :get)
+ :hx-trigger "clientSelected from:body"
+ :hx-swap "outerHTML swap:300ms"
+ :id id}
+ (content-card-
+ {}
+ [:div {:class "flex flex-col px-4 py-3 space-y-3 lg:flex-row lg:items-center lg:justify-between lg:space-y-0 lg:space-x-4 text-gray-800 dark:text-gray-100"}
+ [:div
+ [:h1.text-2xl.mb-3.font-bold title]
+ [:div {:class "flex items-center flex-1 space-x-4"}
+ [:h5
+ (when subtitle
+ [:span subtitle])]]]
+ (into [:div {:class "flex flex-col flex-shrink-0 space-y-3 md:flex-row md:items-center lg:justify-end md:space-y-0 md:space-x-3"}]
+ action-buttons)]
+ [:div {:class "overflow-x-auto"}
+ (data-grid- {:headers headers
+ :thead-params thead-params}
+ rows)]
+
+ (when (or paginate?
+ (nil? paginate?))
+ (paginator- {:start start
+ :end (Math/min (+ start per-page) total)
+ :per-page per-page
+ :total total
+ :a-params (fn [page]
+ {:hx-get (str (bidi/path-for ssr-routes/only-routes
+ route
+ :request-method :get)
+ "?start=" (* page per-page))
+ :hx-target (str "#" id)
+ :hx-swap "outerHTML show:#app:top"})})))])
diff --git a/src/clj/auto_ap/ssr/components/dialog.clj b/src/clj/auto_ap/ssr/components/dialog.clj
new file mode 100644
index 00000000..6ce3b034
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/dialog.clj
@@ -0,0 +1,44 @@
+(ns auto-ap.ssr.components.dialog
+ (:require [hiccup2.core :as hiccup]))
+
+(defn modal- [params & children]
+ [:div
+ [:div#modal-holder { :tabindex "-1", :class "fixed top-0 left-0 right-0 z-50 w-full p-4 overflow-x-hidden overflow-y-auto md:inset-0 h-[calc(100%-1rem)] max-h-full flex justify-center hidden" :aria-hidden true
+ "_" (hiccup/raw "on closeModal transition <#modal-holder .modal-content /> opacity to 0.0 over 300ms then call hideModal() ")}
+ [:div {:class "relative w-full max-w-2xl max-h-full"}
+ (into [:div#modal-content]
+ children)]
+ ]
+ [:script {:lang "text/javascript"}
+ (hiccup/raw "
+ var modal_element = document.getElementById('modal-holder');
+ var modal_options = {
+ placement: 'center',
+ backdrop: 'dynamic',
+ backdropClasess: 'bg-gray-900 bg-opacity-50 dark:bg-opacity-80 fixed inset-0 z-40',
+ closable: true,
+ onOpen: function() {
+ modal_element.dispatchEvent('openModal');
+
+ },
+ onHide: function() {
+ modal_element.outerHTML='';
+ },
+ };
+ var curModal = new Modal(modal_element, modal_options);
+curModal.show();
+function hideModal() {
+curModal.hide();
+}
+")
+
+ ]])
+
+(defn modal-card- [params header content footer]
+ [:div#modal-card params
+ [:div {:class "relative bg-white rounded-lg shadow dark:bg-gray-700 dark:text-white fade-in slide-up duration-300 transition-all modal-content"}
+ [:div {:class "flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600"} header]
+ [:div {:class "p-6 space-y-6"}
+ content]
+ [:div footer]]
+ ])
diff --git a/src/clj/auto_ap/ssr/components/inputs.clj b/src/clj/auto_ap/ssr/components/inputs.clj
new file mode 100644
index 00000000..b66049f9
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/inputs.clj
@@ -0,0 +1,24 @@
+(ns auto-ap.ssr.components.inputs)
+
+(defn select- [params & children]
+ (into
+ [:select {:class "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
+ :name (:name params)}
+ (cond->>
+ (map (fn [[k v]]
+ [:option {:value k :selected (= v (:value params))} v])
+ (:options params))
+ (:allow-blank? params) (conj [:option {:value "" :selected (not (:value params))} ""]))]
+ children))
+
+(defn text-input- [params]
+ [:input
+ (update params
+ :class str " bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500")
+ ])
+
+(defn field- [params & rest]
+ (into
+ [:div
+ [:label {:class "block mb-2 text-sm font-medium text-gray-900 dark:text-white"} (:label params)]]
+ rest))
diff --git a/src/clj/auto_ap/ssr/components/navbar.clj b/src/clj/auto_ap/ssr/components/navbar.clj
new file mode 100644
index 00000000..692b4cc8
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/navbar.clj
@@ -0,0 +1,45 @@
+(ns auto-ap.ssr.components.navbar
+ (:require
+ [auto-ap.graphql.utils :refer [is-admin?]]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [auto-ap.ssr.company-dropdown :as cd]
+ [auto-ap.ssr.components.buttons :refer [icon-button-]]
+ [auto-ap.ssr.components.user-dropdown :as user-dropdown]
+ [auto-ap.ssr.svg :as svg]
+ [bidi.bidi :as bidi]))
+
+(defn navbar- [{:keys [client identity]}]
+ [:nav {:class "fixed z-30 w-full bg-white border-b border-gray-200 dark:bg-gray-800 dark:border-gray-700"}
+ [:div {:class "px-3 py-3 lg:px-5 lg:pl-3"}
+ [:div {:class "flex items-center justify-between"}
+ [:div {:class "flex items-center justify-start"}
+ [:button {:aria-controls "left-nav", :id "left-nav-toggle" :type "button", :class "inline-flex items-center p-2 mt-2 ml-2 mr-2 text-sm text-gray-500 rounded-lg hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-gray-200 dark:text-gray-400 dark:hover:bg-gray-700 dark:focus:ring-gray-600"}
+ [:span {:class "sr-only"} "Open sidebar"]
+ [:svg {:class "w-6 h-6", :aria-hidden "true", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:clip-rule "evenodd", :fill-rule "evenodd", :d "M2 4.75A.75.75 0 012.75 4h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 4.75zm0 10.5a.75.75 0 01.75-.75h7.5a.75.75 0 010 1.5h-7.5a.75.75 0 01-.75-.75zM2 10a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 10z"}]]]
+ [:a {:href "/" :class "flex ml-2 md:mr-24"}
+ [:img {:src "/img/logo-big2.png", :class "h-10 mr-16", :alt "Integreat logo"}]]]
+
+ [:div {:class "flex items-center gap-4"}
+
+ (when (is-admin? identity)
+ [:button.mt-1.lg:w-96.relative.hidden.lg:block {:class "bg-gray-50 hover:bg-gray-200 dark:hover:bg-gray-700 border border-gray-300 text-gray-900 sm:text-sm rounded-lg focus:ring-primary-500 focus:border-primary-500 w-full pl-10 py-4 pr-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500 gap-4 "
+ :hx-get (bidi/path-for ssr-routes/only-routes
+ :search)
+ :hx-target "#modal-holder"
+ :hx-swap "outerHTML"}
+ [:div {:class "absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none text-gray-500"}
+ [:div.w-4.h-4 svg/search]
+ [:span.ml-2 "Search"]]])
+ [:div {:class "hidden mr-3 -mb-1 sm:block"}
+ [:span]]
+ (icon-button-
+ {:id "toggleSidebarMobileSearch", :type "button", :class "p-2 text-gray-500 rounded-lg lg:hidden hover:text-gray-900 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white"
+ :hx-get (bidi/path-for ssr-routes/only-routes
+ :search)
+ :hx-target "#modal-holder"
+ :hx-swap "outerHTML"}
+ svg/search)
+ (cd/dropdown {:client client :identity identity})
+
+ (user-dropdown/dropdown {:identity identity})]]]])
diff --git a/src/clj/auto_ap/ssr/components/navbar_dropdown.clj b/src/clj/auto_ap/ssr/components/navbar_dropdown.clj
deleted file mode 100644
index b478b720..00000000
--- a/src/clj/auto_ap/ssr/components/navbar_dropdown.clj
+++ /dev/null
@@ -1,14 +0,0 @@
-(ns auto-ap.ssr.components.navbar-dropdown
- (:require [hiccup2.core :as hiccup]))
-
-(defn navbar-dropdown [id header children]
- [:div {
- :id id
- :class (str "navbar-item has-dropdown")
- "_" (hiccup/raw "on click elsewhere remove .is-active from me")
-
- }
- [:a {:class "navbar-link login"
- "_" (hiccup/raw "on click toggle .is-active on the parentElement of me then add .appear to next <.navbar-dropdown />")} header]
- (into [:div {:class "navbar-dropdown"}
- children])])
diff --git a/src/clj/auto_ap/ssr/components/page.clj b/src/clj/auto_ap/ssr/components/page.clj
new file mode 100644
index 00000000..a7f6f4bf
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/page.clj
@@ -0,0 +1,36 @@
+(ns auto-ap.ssr.components.page
+ (:require
+ [auto-ap.ssr.components.aside :refer [left-aside-]]
+ [auto-ap.ssr.components.navbar :refer [navbar-]]
+ [hiccup2.core :as hiccup]
+ [auto-ap.ssr.svg :as svg]))
+
+(defn page- [{:keys [nav page-specific active-client identity app-params] :or {app-params {}}} & children]
+ [:div#app
+ (navbar- {:client active-client
+ :identity identity})
+ [:div#app-contents.flex.pt-16.overflow-hidden (assoc app-params :hx-disinherit "*")
+ (left-aside- {:nav nav
+ :page-specific page-specific})
+ [:div#main-content {:class "relative w-full h-full lg:pl-64 overflow-y-auto px-4 bg-gray-100 dark:bg-gray-900 min-h-content "
+ "_" (hiccup/raw "on htmx:responseError put event.detail.xhr.response into #error-details then add .htmx-added to #error-holder then remove .hidden from #error-holder then wait 30ms then remove .htmx-added from #error-holder")}
+ [:div#error-holder.hidden
+ [:div.fixed.top-0.right-0.left-0.z-30.mx-auto.max-w-screen-lg.w-screen-lg.my-0.pt-8.rounded-lg
+ [:div.relative
+ [:button.absolute.right-2.top-2.w-6.h-6.z-50.text-red-600
+ {"_" (hiccup/raw "on click add .hidden to #error-holder")}
+ svg/filled-x]]
+
+ [:div.m-4.overflow-auto.z-30.flex.center-items.justify-center.text-red-800.bg-red-50.dark:bg-gray-800.dark:text-red-400.border-red-300.rounded-lg.border.transition-all.duration-500.fade-in.slide-up.max-h-96
+
+ [:div {:class "p-4 mb-4 text-lg w-full" :role "alert"}
+ [:div.inline-block.w-8.h-8.mr-2 svg/alert]
+ [:span.font-medium "Oh, drat! An unexpected error has occurred."]
+ [:div.text-sm
+ [:p "Integreat staff have been notified and are looking into it. "]
+ [:p "To see error details, " [:a.underline {:href "#" :data-collapse-toggle "error-details"} "click here"] "."]
+ [:pre#error-details.text-xs.hidden]]]]]]
+ (into
+ [:div.p-4]
+ children)]]
+ [:div#modal-holder]])
diff --git a/src/clj/auto_ap/ssr/components/paginator.clj b/src/clj/auto_ap/ssr/components/paginator.clj
new file mode 100644
index 00000000..c89caffb
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/paginator.clj
@@ -0,0 +1,61 @@
+(ns auto-ap.ssr.components.paginator)
+
+(defn bound [x y z]
+ (cond
+ (< z x)
+ x
+ (< y x)
+ x
+ (> y z)
+ z
+ :else
+ y))
+
+(def elipsis-button
+ [:p {:href "#", :class "flex items-center justify-center px-3 py-2 text-sm leading-tight text-gray-500 bg-white border border-gray-300 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400"} "..."])
+
+(defn paginator-internal- [{:keys [start per-page end total a-params]}]
+ (let [per-page (or per-page 20)
+ max-buttons 5
+ buttons-before (Math/floor (/ max-buttons 2))
+ total-pages (long (Math/max (long 1) (long (Math/ceil (/ total per-page)))))
+ current-page (long (Math/floor (/ start per-page)))
+ first-page-button (bound 0 (- current-page buttons-before) (- total-pages max-buttons))
+ all-buttons (into [] (for [x (range total-pages)]
+ [:li
+ [:a (-> (a-params x)
+ (update
+ :class #(cond-> %
+ true (str " flex items-center justify-center px-3 py-2 text-sm leading-tight border ")
+
+ (= current-page x)
+ (str " text-primary-600 bg-primary-50 border-primary-300 hover:bg-primary-100 hover:text-primary-700 dark:border-gray-700 dark:bg-gray-700 dark:text-white")
+
+ (not= current-page x)
+ (str " text-gray-500 bg-white border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white")))
+ (assoc :href "#"))
+ (inc x)]]))
+
+
+ last-page-button (Math/min (long total-pages) (long (+ max-buttons first-page-button)))
+
+ extended-last-page-button (when (not= last-page-button total-pages)
+ (list
+ elipsis-button
+ (last all-buttons)))
+
+ extended-first-page-button (when (not= first-page-button 0)
+ (list
+ (first all-buttons)
+ elipsis-button))]
+ [:nav
+ [:ul {:class "inline-flex items-stretch -space-x-px"}
+ extended-first-page-button
+ (apply list (subvec all-buttons first-page-button last-page-button))
+ extended-last-page-button]]))
+
+(defn paginator- [{:keys [start per-page end total a-params] :as params}]
+ [:nav {:class "flex flex-col items-start justify-between p-4 space-y-3 md:flex-row md:items-center md:space-y-0", :aria-label "Table navigation"}
+ [:span {:class "text-sm font-normal text-gray-500 dark:text-gray-400"}
+ [:span {:class "font-semibold text-gray-900 dark:text-white"} (str (inc start)) "-" (str end) " of " (str total)]]
+ (paginator-internal- params)])
diff --git a/src/clj/auto_ap/ssr/components/tags.clj b/src/clj/auto_ap/ssr/components/tags.clj
new file mode 100644
index 00000000..0a2ab9d5
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/tags.clj
@@ -0,0 +1,20 @@
+(ns auto-ap.ssr.components.tags)
+
+
+(defn pill- [params & children]
+ (into
+ [:span (cond-> params
+ true (update :class str " text-xs font-medium px-2 py-0.5 rounded whitespace-nowrap")
+
+ (= :primary (:color params))
+ (update :class str " bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300 ")
+
+ (= :secondary (:color params))
+ (update :class str " bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300 ")
+
+ (= :yellow (:color params))
+ (update :class str " bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300")
+
+ (= :red (:color params))
+ (update :class str " bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300"))]
+ children))
diff --git a/src/clj/auto_ap/ssr/components/user_dropdown.clj b/src/clj/auto_ap/ssr/components/user_dropdown.clj
new file mode 100644
index 00000000..485156c0
--- /dev/null
+++ b/src/clj/auto_ap/ssr/components/user_dropdown.clj
@@ -0,0 +1,61 @@
+(ns auto-ap.ssr.components.user-dropdown
+ (:require
+ [auto-ap.client-routes :as client-routes2]
+ [auto-ap.datomic :refer [conn pull-attr]]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [bidi.bidi :as bidi]
+ [datomic.api :as dc]
+ [hiccup2.core :as hiccup]))
+
+(defn dropdown [{:keys [identity]}]
+ [:div {:class "flex items-center ml-3 mr-10"}
+ [:div
+ [:button#user-menu-button {:type "button", :class "flex text-sm bg-gray-800 rounded-full focus:ring-4 focus:ring-gray-300 dark:focus:ring-gray-600", :aria-expanded "false"
+ "_" (hiccup/raw "init call initUserDropdown()")}
+ [:span {:class "sr-only"} "Open user menu"]
+ [:img {:class "w-8 h-8 rounded-full", :src (pull-attr (dc/db conn) :user/profile-image-url (:db/id identity)) :alt "user photo" :referrerpolicy "no-referrer"}]]]
+ [:div#user-menu {:class "z-50 hidden my-4 text-base list-none bg-white divide-y divide-gray-100 rounded shadow dark:bg-gray-700 dark:divide-gray-600 mr-10"}
+ [:div {:class "px-4 py-3", :role "none"}
+ [:p {:class "text-sm text-gray-900 dark:text-white", :role "none"} (:user/name identity)]
+ [:p {:class "text-sm font-medium text-gray-900 truncate dark:text-gray-300", :role "none"} (pull-attr (dc/db conn) :user/email (:db/id identity))]
+ #_(icon-button-
+ {"_" (hiccup/raw "on click toggle .dark on ")}
+ [:div.h-4.w-4
+ [:div.hidden.dark:block svg/sun]
+ [:div.dark:hidden svg/moon]])]
+ [:ul {:class "py-1", :role "none"}
+ [:li
+ [:a {:href (bidi/path-for ssr-routes/only-routes :company), :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "My Company"]]
+ (when (= "admin" (:user/role identity))
+ [:a {:href (bidi/path-for client-routes2/routes :admin), :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "Admin"])
+ [:li
+ [:a {:href "#", :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"
+ "_" (hiccup/raw "on click toggle .dark on ")}
+ "Night Mode"]]
+ [:li
+ [:a {:href "/logout", :class "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600 dark:hover:text-white", :role "menuitem"} "Sign out"]]]]
+
+ [:script {:lang "text/javascript"}
+ (hiccup/raw
+ "
+function initUserDropdown() {
+ var $dropdownTargetEl = document.getElementById('user-menu');
+
+ // set the element that trigger the dropdown menu on click
+ var $dropdownTriggerEl = document.getElementById('user-menu-button');
+
+ var userDrowdown = new Dropdown($dropdownTargetEl, $dropdownTriggerEl, {
+ placement: 'bottom',
+ triggerType: 'click',
+ offsetSkidding: 0,
+ offsetDistance: 10,
+ delay: 5000,
+ onHide: () => {
+ },
+ onShow: () => {
+ },
+ onToggle: () => {
+ }
+ });
+}
+")]])
diff --git a/src/clj/auto_ap/ssr/core.clj b/src/clj/auto_ap/ssr/core.clj
index e5d344d4..bb947cd0 100644
--- a/src/clj/auto_ap/ssr/core.clj
+++ b/src/clj/auto_ap/ssr/core.clj
@@ -2,32 +2,45 @@
(:require
[auto-ap.routes.utils
:refer [wrap-admin wrap-client-redirect-unauthenticated wrap-secure]]
- [auto-ap.ssr.admin :as admin]
+ [auto-ap.ssr.admin.history :as history]
[auto-ap.ssr.auth :as auth]
[auto-ap.ssr.transaction.insights :as insights]
[auto-ap.ssr.company.company-1099 :as company-1099]
+ [auto-ap.ssr.company.yodlee :as company-yodlee]
[auto-ap.ssr.search :as search]
[auto-ap.ssr.company-dropdown :as company-dropdown]
- [auto-ap.routes.ezcater-xls :as ezcater-xls]))
+ [auto-ap.ssr.company.reports :as company-reports]
+ [auto-ap.routes.ezcater-xls :as ezcater-xls]
+ [auto-ap.ssr.company :as company]))
;; from auto-ap.ssr-routes, because they're shared
(def key->handler {:logout auth/logout
- :admin-history (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin admin/history)))
- :admin-history-search (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin admin/history-search)))
- :admin-history-inspect (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin admin/inspect)))
- :active-client (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin company-dropdown/active-client)))
- :company-dropdown-contents (wrap-client-redirect-unauthenticated (wrap-secure company-dropdown/dropdown-contents))
+ :admin-history (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/page)))
+ :admin-history-search (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/page)))
+ :admin-history-inspect (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/inspect)))
+ :active-client (wrap-client-redirect-unauthenticated (wrap-secure (wrap-secure company-dropdown/active-client)))
+ :company-dropdown-search-results
+ (wrap-client-redirect-unauthenticated (wrap-secure company-dropdown/dropdown-search-results))
+ :company (wrap-client-redirect-unauthenticated (wrap-secure company/page))
:company-1099 (wrap-client-redirect-unauthenticated (wrap-secure company-1099/page))
:company-1099-vendor-table (wrap-client-redirect-unauthenticated (wrap-secure company-1099/vendor-table))
:company-1099-vendor-dialog (wrap-client-redirect-unauthenticated (wrap-secure company-1099/vendor-dialog))
:company-1099-vendor-save (wrap-client-redirect-unauthenticated (wrap-secure company-1099/vendor-save))
- :transaction-insights (wrap-client-redirect-unauthenticated (wrap-secure insights/page))
- :transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-secure insights/insight-table))
- :transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-secure insights/transaction-rows))
- :transaction-insight-approve (wrap-client-redirect-unauthenticated (wrap-secure insights/approve))
- :transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-secure insights/explain))
+ :company-yodlee (wrap-client-redirect-unauthenticated (wrap-secure company-yodlee/page))
+ :company-yodlee-table (wrap-client-redirect-unauthenticated (wrap-secure company-yodlee/table))
+ :company-yodlee-fastlink-dialog (wrap-client-redirect-unauthenticated (wrap-secure company-yodlee/fastlink-dialog))
+ :company-yodlee-provider-account-refresh (wrap-client-redirect-unauthenticated (wrap-admin company-yodlee/refresh-provider-account))
+ :company-reports (wrap-client-redirect-unauthenticated (wrap-secure company-reports/page))
+ :company-reports-table (wrap-client-redirect-unauthenticated (wrap-secure company-reports/table))
+ :company-reports-delete (wrap-client-redirect-unauthenticated (wrap-admin company-reports/delete-report))
+ :transaction-insights (wrap-client-redirect-unauthenticated (wrap-admin insights/page))
+ :transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-admin insights/insight-table))
+ :transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-admin insights/transaction-rows))
+ :transaction-insight-approve (wrap-client-redirect-unauthenticated (wrap-admin insights/approve))
+ :transaction-insight-disapprove (wrap-client-redirect-unauthenticated (wrap-admin insights/disapprove))
+ :transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-admin insights/explain))
:admin-ezcater-xls (wrap-client-redirect-unauthenticated (wrap-admin ezcater-xls/page))
:search (wrap-client-redirect-unauthenticated (wrap-secure search/dialog-contents))})
diff --git a/src/clj/auto_ap/ssr/grid_page_helper.clj b/src/clj/auto_ap/ssr/grid_page_helper.clj
new file mode 100644
index 00000000..ff557dcb
--- /dev/null
+++ b/src/clj/auto_ap/ssr/grid_page_helper.clj
@@ -0,0 +1,186 @@
+(ns auto-ap.ssr.grid-page-helper
+ (:require
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr.ui :refer [base-page]]
+ [auto-ap.ssr.utils :refer [html-response]]
+ [hiccup2.core :as hiccup]
+ [bidi.bidi :as bidi]
+ [auto-ap.ssr-routes :as ssr-routes]
+ [cemerick.url :as url]
+ [clojure.string :as str]
+ [auto-ap.ssr.svg :as svg]))
+
+(defn row* [gridspec user entity {:keys [flash? delete-after-settle?] :as options}]
+ (let [cells (mapv (fn [header]
+ (com/data-grid-cell {:class (if-let [show-starting (:show-starting header)]
+ (format "hidden %s:table-cell" show-starting)
+ (:class header))}
+ ((:render header) entity)))
+ (:headers gridspec))
+ cells (conj cells (com/data-grid-right-stack-cell {}
+ (into [:form
+ [:input {:type :hidden :name "id" :value ((:id-fn gridspec) entity)}]]
+ ((:row-buttons gridspec) user entity))))]
+ (apply com/data-grid-row
+ {:class (when flash?
+ "live-added")
+ "_" (hiccup/raw (when delete-after-settle?
+ " on htmx:afterSettle wait 400ms then remove me"))
+
+ :data-id ((:id-fn gridspec) entity)}
+ cells)))
+
+(defn sort-icon [sort key]
+ (->> sort
+ (filter (comp #(= key %) :sort-key))
+ first
+ :sort-icon))
+
+(defn sort-by-list [sort]
+ (if (seq sort)
+ (into
+ [:div.flex.gap-2.items-center
+ "sorted by"
+
+ ]
+ (for [{:keys [name sort-icon ]} sort]
+ [:div.py-1.px-3.text-sm.rounded.bg-gray-100.dark:bg-gray-600.flex.items-center.gap-2.relative name [:div.h-4.w-4.mr-3 sort-icon]
+ [:div {:class "absolute inline-flex items-center justify-center w-6 h-6 text-xs font-bold text-white hover:scale-110 transition-all duration-300 bg-gray-400 border-2 border-white rounded-full -top-2 -right-2 dark:border-gray-900"}
+ [:div.h-4.w-4 svg/x]
+ ]]
+ ))
+ "default sort"))
+
+(defn table* [grid-spec user {:keys [start per-page client flash-id sort request]}]
+ (let [start (or start 0)
+ per-page (or per-page 30)
+ [entities total] ((:fetch-page grid-spec)
+ user
+ {:start start
+ :per-page per-page
+ :client-id (:db/id client)
+ :sort sort
+ :request request})]
+ (com/data-grid-card {:id (:id grid-spec)
+ :title (:title grid-spec)
+ :route (:route grid-spec)
+ :start start
+ :per-page per-page
+ :total total
+ :subtitle [:div.flex.items-center.gap-2
+ [:span (format "Total %s: %d, " (:entity-name grid-spec) total)]
+ (sort-by-list sort)]
+ :action-buttons ((:action-buttons grid-spec) user)
+ :rows (for [entity entities]
+ (row* grid-spec user entity {:flash? (= flash-id ((:id-fn grid-spec) entity))}))
+ :thead-params {:hx-get (bidi/path-for ssr-routes/only-routes
+ (:route grid-spec))
+ :hx-target (str "#" (:id grid-spec))
+ :hx-trigger "sorted once"
+ :hx-vals "js:{\"toggle-sort\": event.detail.key || \"\"}"}
+ :headers
+ (conj
+ (mapv
+ (fn [h]
+ (if (:sort-key h)
+ (com/data-grid-sort-header {:class (if-let [show-starting (:show-starting h)]
+ (format "hidden %s:table-cell" show-starting)
+ (:class h))
+ :sort-key (:sort-key h)}
+
+ [:div.flex.gap-4.items-center
+ (:name h)
+ [:div.h-6.w-6.text-gray-400.dark:text-gray-500 (sort-icon sort (:sort-key h))]])
+ (com/data-grid-header {:class (if-let [show-starting (:show-starting h)]
+ (format "hidden %s:table-cell" show-starting)
+ (:class h))
+ :sort-key (:sort-key h)}
+ (:name h))
+
+ ))
+ (:headers grid-spec))
+ (com/data-grid-header {}))})))
+
+
+
+(defn parse-sort [grid-spec q]
+ (if (not-empty q)
+ (into []
+ (map (fn [k]
+ (let [[k v] (str/split k #":")]
+ {:sort-key (str k)
+ :asc (boolean (= "asc" v))
+ :name (:name (first (filter #(= (str k) (:sort-key %)) (:headers grid-spec))))
+ :sort-icon (if (= (boolean (= "asc" v)) true)
+ svg/sort-down
+ svg/sort-up)}))
+ (str/split q #",")))
+ []))
+
+(defn toggle-sort [grid-spec q k]
+ (if ((set (map :sort-key q)) k)
+ (mapv
+ (fn [s]
+ (if (= (:sort-key s)
+ k)
+ (-> s
+ (update :asc
+ #(boolean (not %)))
+ (update :sort-icon (fn [x]
+ (if (= x svg/sort-down)
+ svg/sort-up
+ svg/sort-down))))
+ s))
+ q)
+ (conj q {:sort-key k
+ :asc true
+ :name (:name (first (filter #(= (str k) (:sort-key %)) (:headers grid-spec))))
+ :sort-icon svg/sort-down})))
+
+(defn sort->query [s]
+ (str/join "," (map (fn [k] (format "%s:%s" (:sort-key k) (if (= true (:asc k))
+ "asc"
+ "desc")))
+ s)))
+
+(defn params->query-string [q]
+ (-> q
+ (dissoc :client :session)
+ (update :sort sort->query)
+ (url/map->query)))
+
+(defn extract-params [grid-spec {:keys [query-params hx-query-params identity session] :as request}]
+ (let [{hx-start "start" hx-per-page "per-page" hx-sort "sort" } hx-query-params
+ {q-start "start" q-per-page "per-page" q-sort "sort" q-toggle-sort "toggle-sort"} query-params]
+ (cond-> {}
+ hx-start (assoc :start (some-> hx-start not-empty (Long/parseLong )))
+ q-start (assoc :start (some-> q-start not-empty (Long/parseLong )))
+ hx-per-page (assoc :per-page (some-> hx-per-page not-empty (Long/parseLong )))
+ q-per-page (assoc :per-page (some-> q-per-page not-empty (Long/parseLong )))
+ hx-sort (assoc :sort (parse-sort grid-spec hx-sort))
+ q-sort (assoc :sort (parse-sort grid-spec q-sort))
+ (not-empty q-toggle-sort) (update :sort #(toggle-sort grid-spec % q-toggle-sort) )
+ (:session request) (assoc :session (:session request))
+ (:client (:session request)) (assoc :client (:client (:session request))))))
+
+(defn table [grid-spec {:keys [query-params hx-query-params identity session] :as request}]
+ (let [params (extract-params grid-spec request)
+ query-string (params->query-string params)]
+ (html-response (table*
+ grid-spec
+ identity
+ params
+ )
+ :headers {"hx-push-url" (str "?" query-string)})))
+
+(defn page [grid-spec {:keys [identity] :as request}]
+ (base-page
+ request
+ (com/page {:nav (:nav grid-spec)
+ :active-client (:client (:session request))
+ :identity (:identity request)}
+ (apply com/breadcrumbs {} (:breadcrumbs grid-spec))
+ (table* grid-spec
+ identity
+ (extract-params grid-spec request)))
+ (:title grid-spec)))
diff --git a/src/clj/auto_ap/ssr/login_dropdown.clj b/src/clj/auto_ap/ssr/login_dropdown.clj
deleted file mode 100644
index a0b4715f..00000000
--- a/src/clj/auto_ap/ssr/login_dropdown.clj
+++ /dev/null
@@ -1,26 +0,0 @@
-(ns auto-ap.ssr.login-dropdown
- (:require
- [auto-ap.client-routes :as client-routes]
- [auto-ap.ssr.components.navbar-dropdown :refer [navbar-dropdown]]
- [bidi.bidi :as bidi]
- [hiccup2.core :as hiccup]
- [auto-ap.ssr-routes :as ssr-routes]))
-
-(defn dropdown [{:keys [identity]}]
- (if identity
- (navbar-dropdown
- "login-dropdown"
- [:span [:span.icon [:i.fa.fa-user] ]
- [:span (:user/name identity)]]
- [:div
- [:a {:class "navbar-item"
- :href (bidi/path-for client-routes/routes :reports)} "My company"]
- #_[:a.dropdown-item {:on-click (dispatch-event-with-propagation [:vendor-dialog/started {}])} "New Vendor"] ;; double colorn
- #_[:a.dropdown-item {:on-click (dispatch-event-with-propagation [:vendor-dialog/edit {}])} "Edit Vendor"]
- (when (= "admin" (:user/role identity))
- [:a {:class "navbar-item" :href (bidi/path-for client-routes/routes :admin)} "Administration"])
- [:hr {:class "navbar-divider"}]
- [:a.navbar-item {"_" (hiccup/raw "on click call localStorage.removeItem(\"jwt\")")
- :href (bidi/path-for ssr-routes/only-routes :logout)}
- "Logout"]])
- [:a.navbar-item {:href (bidi/path-for client-routes/routes :login )} "Login"]))
diff --git a/src/clj/auto_ap/ssr/search.clj b/src/clj/auto_ap/ssr/search.clj
index d7340507..45cbee37 100644
--- a/src/clj/auto_ap/ssr/search.clj
+++ b/src/clj/auto_ap/ssr/search.clj
@@ -5,7 +5,9 @@
[auto-ap.ssr.utils :refer [html-response]]
[auto-ap.time :as atime]
[clojure.string :as str]
- [com.brunobonacci.mulog :as mu]))
+ [com.brunobonacci.mulog :as mu]
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr.svg :as svg]))
(defn try-cleanse-date [d]
(try
@@ -61,58 +63,65 @@
(let [results (search-results q id)]
[:div
(if (seq results)
- (for [doc results]
- [:div.block
- [:div.card
- [:div.card-header.has-background-info-light
- (cond (= "transaction" (:type doc))
- [:div.card-header-icon.icon-task-list-text-1]
+ [:div.flex.gap-8.flex-col
+ (for [doc results]
+ (com/card {}
+ [:div.flex.flex-col.gap-4
+ [:div.flex.items-center.p-2.gap-4.bg-gray-50.dark:bg-gray-800
+ [:div.h-8.w-8.p-2
+ (cond (= "transaction" (:type doc))
+ svg/bank
+
- (= "invoice" (:type doc))
- [:div.card-header-icon.icon-accounting-invoice-mail]
+ (= "invoice" (:type doc))
+ svg/accounting-invoice-mail
+
- (= "payment" (:type doc))
- [:div.card-header-icon.icon-check-payment-sign]
+ (= "payment" (:type doc))
+ svg/payments
- (= "journal-entry" (:type doc))
- [:div.card-header-icon.icon-receipt]
+ (= "journal-entry" (:type doc))
+ svg/receipt
- :else
- nil)
- [:div.card-header-title (clojure.string/capitalize (:type doc))
- " "
- " "
- [:span.tags.ml-3
- [:span.tag.is-warning "client: " (:client_code doc)]
- [:span.tag.is-info "amount: $" (first (:amount doc))]
+ :else
+ nil)]
+ (clojure.string/capitalize (:type doc))
+ (com/pill {:color :primary}
+ "client: " (:client_code doc))
+ (com/pill {:color :secondary}
+ "amount: $" (first (:amount doc)))
(when-let [vendor-name (first (:vendor_name doc))]
- [:span.tag.is-primary "vendor: " vendor-name])]]
- [:a.card-header-icon.fa.fa-external-link {:href (str "/" (cond (= "invoice"
- (:type doc))
- "invoices"
+ (com/pill {:color :yellow}
+ "vendor: " vendor-name))
+ [:div
+ (com/link {:href (str "/" (cond (= "invoice"
+ (:type doc))
+ "invoices"
- (= "transaction"
- (:type doc))
- "transactions"
+ (= "transaction"
+ (:type doc))
+ "transactions"
- (= "journal-entry"
- (:type doc))
- "ledger"
+ (= "journal-entry"
+ (:type doc))
+ "ledger"
- :else
- "payments") "/?exact-match-id=" (:id doc))
- :target "_blank"}]
- ]
-
-
- [:div.card-content
- [:span
+ :else
+ "payments") "/?exact-match-id=" (:id doc))
+ :target "_blank"}
+ [:div.h-8.w-8.p-2
+ svg/external-link])]
+ ]
- [:strong (atime/unparse (atime/parse (:date doc) atime/solr-date) atime/normal-date)]
- ": "
- (str (or (first (:description doc))
- (first (:number doc))))]]]]
- )
+
+ [:div.px-4.pb-2
+ [:span
+
+ [:strong (atime/unparse (atime/parse (:date doc) atime/solr-date) atime/normal-date)]
+ ": "
+ (str (or (first (:description doc))
+ (first (:number doc))))]]])
+ )]
[:div.block "No results found."])]))
(defn dialog-contents [request]
@@ -122,22 +131,26 @@
(if-let [q (get (:form-params request) "q")]
(html-response (search-results* q (:identity request)))
(html-response
- [:div#search {:style {:height "400px" :overflow "auto"}}
-
- [:div.block
- [:input#search-input.input {:type "search"
- :placeholder "5/5/2034 Magheritas"
- :name "q"
- :hx-post "/search"
- :hx-trigger "keyup changed delay:300ms, search"
- :hx-target "#search-results"
- :hx-indicator "#search"
- :value (:q (:params request))
- :autofocus true}]]
- [:i "Try dates, numbers, vendors. To filter to specific entity type, use 'invoice', 'transaction', 'journal-entry', 'payment'."]
- [:style
- ".htmx-request #search-results {display: none} .htmx-request .htmx-indicator { display: block !important; }"]
- [:div#search-results
- ]
- [:div.loader.is-loading.big.htmx-indicator {:style {:display "none"}}]])))
+ (com/modal {}
+ (com/modal-card {}
+ [:div.p-2 "Search"]
+ [:div#search.overflow-auto.space-y-6.p-2.h-96
+
+ (com/text-input {:id "search-input"
+ :type "search"
+ :placeholder "5/5/2034 Magheritas"
+ :name "q"
+ :hx-post "/search"
+ :hx-trigger "keyup changed delay:300ms, search"
+ :hx-target "#search-results"
+ :hx-indicator "#search"
+ :value (:q (:params request))
+ :autofocus true})
+ [:i.text-sm.text-gray-600.dark:text-gray-50 "Try dates, numbers, vendors. To filter to specific type, use 'invoice', 'transaction', 'journal-entry', 'payment'."]
+ #_[:style
+ ".htmx-request #search-results {display: none} .htmx-request .htmx-indicator { display: block !important; }"]
+ [:div#search-results
+ ]
+ [:div.loader.is-loading.big.htmx-indicator ]]
+ nil)))))
diff --git a/src/clj/auto_ap/ssr/svg.clj b/src/clj/auto_ap/ssr/svg.clj
new file mode 100644
index 00000000..385bbc1b
--- /dev/null
+++ b/src/clj/auto_ap/ssr/svg.clj
@@ -0,0 +1,433 @@
+(ns auto-ap.ssr.svg)
+
+(def pie
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "analytics-pie-2"]
+ [:path {:d "M13.5.75v9h9A9,9,0,0,0,13.5.75Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M10.5,14.25v-9a9,9,0,1,0,5.561,16.077Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M22.5,12.75h-9l5.561,7.077A8.986,8.986,0,0,0,22.5,12.75Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]])
+
+
+(def accounting-invoice-mail
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "accounting-document"]
+ [:path {:d "M21.75,21.75a1.5,1.5,0,0,1-1.5,1.5H3.75a1.5,1.5,0,0,1-1.5-1.5V2.25A1.5,1.5,0,0,1,3.75.75H14.379a1.5,1.5,0,0,1,1.06.439l5.872,5.872a1.5,1.5,0,0,1,.439,1.06Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M21.75,8.25h-6a1.5,1.5,0,0,1-1.5-1.5v-6", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M6.2,11.594a2.224,2.224,0,0,0,1.858.875c1.139,0,2.063-.693,2.063-1.547S9.2,9.376,8.062,9.376,6,8.683,6,7.828s.924-1.547,2.062-1.547a2.221,2.221,0,0,1,1.858.875", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "12.469", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.062", :y2 "13.5", :x2 "8.062"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "5.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.062", :y2 "6.281", :x2 "8.062"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "15", :stroke-linecap "round", :stroke-width "1.5px", :x1 "12", :y2 "15", :x2 "18"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "19.5", :stroke-linecap "round", :stroke-width "1.5px", :x1 "6.75", :y2 "19.5", :x2 "18"}]])
+
+(def receipt-register-1
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:g
+ [:path {:d "M17.63,18h3a1.5,1.5,0,0,1,1.5,1.5v2.25a1.5,1.5,0,0,1-1.5,1.5H3.38a1.5,1.5,0,0,1-1.5-1.5V18H7.13", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "17.03", :stroke-linecap "round", :stroke-width "1.5px", :x1 "11.45", :y2 "14.35", :x2 "8.71"}]
+ [:circle {:cx "12.48", :cy "18.11", :r "1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M1.88,4.5H8.63L9.81,3.31A1.5,1.5,0,0,0,8.75.75H3.38a1.5,1.5,0,0,0-1.5,1.5V18", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "6.1", :stroke-linecap "round", :stroke-width "1.5px", :x1 "13.22", :y2 "6.59", :x2 "14.2"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "8.54", :stroke-linecap "round", :stroke-width "1.5px", :x1 "17.13", :y2 "9.25", :x2 "17.97"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "12.09", :stroke-linecap "round", :stroke-width "1.5px", :x1 "19.9", :y2 "13.03", :x2 "20.46"}]
+ [:path {:d "M8.63,4.5V7.74A12.22,12.22,0,0,1,18.92,18", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:circle {:cx "7.13", :cy "12.75", :r "2.25", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]])
+
+(def payments
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "cash-payment-sign-2"]
+ [:path {:d "M8.212,15.637l-3.712.53.53-3.712,9.546-9.546a2.25,2.25,0,1,1,3.182,3.182Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M5.25,8.25h-3a1.5,1.5,0,0,0-1.5,1.5v10.5a1.5,1.5,0,0,0,1.5,1.5h19.5a1.5,1.5,0,0,0,1.5-1.5V9.75a1.5,1.5,0,0,0-1.5-1.5h-1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "18", :stroke-linecap "round", :stroke-width "1.5px", :x1 "20.25", :y2 "18", :x2 "12.75"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "14.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "20.25", :y2 "14.25", :x2 "15.75"}]])
+
+(def bank
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:g
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "23.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "0.75", :y2 "23.25", :x2 "23.25"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "19.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "0.75", :y2 "19.25", :x2 "23.25"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "2", :y2 "16.25", :x2 "2"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "5.5", :y2 "16.25", :x2 "5.5"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "10.25", :y2 "16.25", :x2 "10.25"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "13.75", :y2 "16.25", :x2 "13.75"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "18.5", :y2 "16.25", :x2 "18.5"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "10.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "22", :y2 "16.25", :x2 "22"}]
+ [:path {:d "M23.25,7.25H.75L11.19,1a1.49,1.49,0,0,1,1.62,0Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]])
+
+(def receipt
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:g
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "21.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "17.25", :y2 "21.75", :x2 "11.25"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "13.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.75", :y2 "13.25", :x2 "15.25"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "9.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.75", :y2 "9.75", :x2 "15.25"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "6.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "8.75", :y2 "6.25", :x2 "15.25"}]
+ [:path {:d "M20.25.75h-1.5v5.5h4.5V3.75A3,3,0,0,0,20.25.75Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M13.5,17.25H3.75a3,3,0,0,0-3,3v3h10.5V19.5a2.25,2.25,0,0,1,4.5,0v.75a1.5,1.5,0,0,0,1.5,1.5h0a1.5,1.5,0,0,0,1.5-1.5V.75H8.25a3,3,0,0,0-3,3v13.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]]])
+
+(defn spinner [{:keys [class]}]
+ [:svg {:aria-hidden "true", :role "status", :class (str "animate-spin " class) :viewbox "0 0 100 101", :fill "none", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z", :fill "#E5E7EB"}]
+ [:path {:d "M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z", :fill "currentColor"}]])
+
+(defn spinner-primary [{:keys [class]}]
+ [:svg {:aria-hidden "true", :role "status", :class (str "animate-spin " class) :viewbox "0 0 100 101", :fill "none", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z", :fill "#79b52e"}]
+ [:path {:d "M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z", :fill "currentColor"}]])
+
+(def search
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "search"]
+ [:circle {:r "9.063", :stroke "currentColor", :transform "translate(-3.056 4.62) rotate(-23.025)", :fill "none", :stroke-linejoin "round", :stroke-linecap "round", :stroke-width "1.5px", :cx "9.813", :cy "9.812"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "16.22", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.221", :y2 "23.25", :x2 "23.25"}]])
+
+(def moon
+ [:svg {:id "theme-toggle-dark-icon", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"}]])
+
+(def sun
+ [:svg {:id "theme-toggle-light-icon", :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z", :fill-rule "evenodd", :clip-rule "evenodd"}]])
+
+
+(def home
+ [:svg { :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:d "M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z"}]])
+
+(def breadcrumb-component
+ [:svg { :fill "currentColor", :viewbox "0 0 20 20", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:fill-rule "evenodd", :d "M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z", :clip-rule "evenodd"}]])
+
+(def refresh
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :aria-hidden "true", :fill "none", :viewbox "0 0 24 24", :stroke-width "1.5", :stroke "currentColor"}
+ [:path {:stroke-linecap "round", :stroke-linejoin "round", :d "M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"}]])
+
+
+(def upload
+ [:svg { :xmlns "http://www.w3.org/2000/svg", :fill "none", :viewbox "0 0 24 24", :stroke-width "2", :stroke "currentColor", :aria-hidden "true"}
+ [:path {:stroke-linecap "round", :stroke-linejoin "round", :d "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5"}]])
+
+(def vendors
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "messages-people-user-dollar"]
+ [:circle {:cx "4.5", :cy "6.75", :r "3", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M8.25,17.25V15a3.75,3.75,0,0,0-7.5,0v2.25h1.5l.75,6H6l.75-6Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M17.625,5.25H15a1.341,1.341,0,0,0-.5,2.587l2.654.826a1.341,1.341,0,0,1-.5,2.587H13.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "5.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "15.75", :y2 "3.75", :x2 "15.75"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "12.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "15.75", :y2 "11.25", :x2 "15.75"}]
+ [:path {:d "M11.251,15.748h3v4.5l4.5-4.5h3a1.5,1.5,0,0,0,1.5-1.5v-12a1.5,1.5,0,0,0-1.5-1.5h-12a1.5,1.5,0,0,0-1.5,1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]])
+
+(def report
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "app-window-pie-chart"]
+ [:rect {:y "2.253", :rx "1.5", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "21", :stroke-linecap "round", :stroke-width "1.5px", :x "1.51", :ry "1.5", :height "19.5"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "6.753", :stroke-linecap "round", :stroke-width "1.5px", :x1 "1.51", :y2 "6.753", :x2 "22.51"}]
+ [:circle {:cx "9.01", :cy "14.253", :r "4.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:polyline {:points "9.01 9.753 9.01 14.253 12.192 17.435", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "11.253", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.51", :y2 "11.253", :x2 "19.51"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "14.253", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.51", :y2 "14.253", :x2 "19.51"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "17.253", :stroke-linecap "round", :stroke-width "1.5px", :x1 "16.51", :y2 "17.253", :x2 "19.51"}]])
+
+(def government-building
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:g
+ [:rect {:y "14.25", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "3", :stroke-linecap "round", :stroke-width "1.5px", :x "3.5", :height "6"}]
+ [:rect {:y "14.25", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "3", :stroke-linecap "round", :stroke-width "1.5px", :x "10.5", :height "6"}]
+ [:rect {:y "14.25", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "3", :stroke-linecap "round", :stroke-width "1.5px", :x "17.5", :height "6"}]
+ [:path {:d "M21.75,13.39a.87.87,0,0,1-.86.86H3.11a.86.86,0,0,1-.25-1.69l8.85-2.72a1,1,0,0,1,.58,0l8.85,2.72A.87.87,0,0,1,21.75,13.39Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:polyline {:points "15.5 8.25 18 8.25 18 11.6", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:polyline {:points "6 11.6 6 8.25 8.5 8.25", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:path {:d "M6,8.25a6,6,0,0,1,12,0", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "0.75", :stroke-linecap "round", :stroke-width "1.5px", :x1 "12", :y2 "2.25", :x2 "12"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "23.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "0.75", :y2 "23.25", :x2 "23.25"}]
+ [:line {:stroke "currentColor", :fill "none", :stroke-linejoin "round", :y1 "20.25", :stroke-linecap "round", :stroke-width "1.5px", :x1 "2", :y2 "20.25", :x2 "22"}]]])
+
+(def external-link
+ [:svg
+ {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"}
+ [:defs]
+ [:title "navigation-next"]
+ [:path
+ {:d "M23,9.5H12.387a4,4,0,0,0-4,4v2",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:polyline
+ {:points "19 13.498 23 9.498 19 5.498",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:path
+ {:d
+ "M14.387,13v5.5a1,1,0,0,1-1,1h-12a1,1,0,0,1-1-1V6.5a1,1,0,0,1,1-1h12a1,1,0,0,1,1,1V7",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]])
+
+(def pencil
+ [:svg
+ {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"}
+ [:defs]
+ [:title "pencil"]
+ [:rect
+ {:y "1.09",
+ :stroke "currentColor",
+ :transform "translate(11.889 -5.238) rotate(45)",
+ :fill "none",
+ :stroke-linejoin "round",
+ :width "6",
+ :stroke-linecap "round",
+ :x "9.268",
+ :height "21.284"}]
+ [:polygon
+ {:points "2.621 17.136 0.5 23.5 6.864 21.379 2.621 17.136",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:path
+ {:d "M21.914,6.328,17.672,2.086l.707-.707a3,3,0,0,1,4.242,4.242Z",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]])
+
+(def drop-down
+ [:svg {:class "w-4 h-4 ml-2", :aria-hidden "true", :fill "none", :stroke "currentColor", :viewbox "0 0 24 24", :xmlns "http://www.w3.org/2000/svg"}
+ [:path {:stroke-linecap "round", :stroke-linejoin "round", :stroke-width "2", :d "M19 9l-7 7-7-7"}]])
+
+(def download
+ [:svg
+ {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"}
+ [:defs]
+ [:title "download-thick-bottom"]
+ [:path
+ {:d
+ "M5.5,11.5c-.275,0-.341.159-.146.354l6.292,6.293a.5.5,0,0,0,.709,0l6.311-6.275c.2-.193.13-.353-.145-.355L15.5,11.5V1.5a1,1,0,0,0-1-1h-5a1,1,0,0,0-1,1V11a.5.5,0,0,1-.5.5Z",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:path
+ {:d "M23.5,18.5v4a1,1,0,0,1-1,1H1.5a1,1,0,0,1-1-1v-4",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]])
+
+(def trash
+ [:svg
+ {:xmlns "http://www.w3.org/2000/svg", :viewBox "0 0 24 24"}
+ [:defs]
+ [:title "bin-1"]
+ [:path
+ {:d
+ "M21,4.5,19.188,21.709A2,2,0,0,1,17.2,23.5H6.8a2,2,0,0,1-1.989-1.791L3,4.5",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:line
+ {:x1 "0.5",
+ :y1 "4.5",
+ :x2 "23.5",
+ :y2 "4.5",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:path
+ {:d "M7.5,4.5v-3a1,1,0,0,1,1-1h7a1,1,0,0,1,1,1v3",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:line
+ {:x1 "12",
+ :y1 "9",
+ :x2 "12",
+ :y2 "19.5",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:line
+ {:x1 "16.5",
+ :y1 "9",
+ :x2 "16",
+ :y2 "19.5",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]
+ [:line
+ {:x1 "7.5",
+ :y1 "9",
+ :x2 "8",
+ :y2 "19.5",
+ :fill "none",
+ :stroke "currentColor",
+ :stroke-linecap "round",
+ :stroke-linejoin "round"}]])
+
+(def alert
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "alert-triangle"]
+ [:path {:d "M22.553,22.581a.569.569,0,0,1-.553.894H2a.569.569,0,0,1-.553-.894L11.553,2.37c.246-.492.648-.492.894,0Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "12", :y1 "16.979", :x2 "12", :y2 "9.979", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M11.991,18.979a.246.246,0,0,0-.241.255.255.255,0,0,0,.254.245h.005a.246.246,0,0,0,.241-.255A.255.255,0,0,0,12,18.979h-.005", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+(def x
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "delete-2"]
+ [:circle {:cx "12", :cy "12", :r "11.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "7", :y1 "7", :x2 "17", :y2 "17", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "17", :y1 "7", :x2 "7", :y2 "17", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+
+(def filled-x
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:circle {:cx "12", :cy "12", :r "11.5", :fill "#FFF", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M24,12A12,12,0,1,0,12,24,12,12,0,0,0,24,12Zm-7.29,3.28a1,1,0,0,1,0,1.41,1,1,0,0,1-1.42,0l-3.11-3.11a.26.26,0,0,0-.35,0L8.72,16.69a1,1,0,0,1-1.41-1.41l3.11-3.11a.26.26,0,0,0,0-.35L7.31,8.71a1,1,0,0,1,0-1.42,1,1,0,0,1,1.41,0l3.11,3.11a.24.24,0,0,0,.35,0l3.11-3.11a1,1,0,1,1,1.42,1.42L13.6,11.82a.24.24,0,0,0,0,.35Z", :fill "currentColor"}]])
+
+(def sort-down
+ [:svg {:id "Regular", :xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "arrow-thick-down-4"]
+ [:rect {:y "0.75", :rx "3", :stroke "currentColor", :transform "translate(0 24) rotate(-90)", :fill "none", :stroke-linejoin "round", :width "22.5", :stroke-linecap "round", :stroke-width "1.5px", :x "0.75", :ry "3", :height "22.5"}]
+ [:path {:d "M9.75,6v7.5L6.53,10.28a.75.75,0,0,0-1.28.531v2.068a1.5,1.5,0,0,0,.439,1.06L11.47,19.72a.749.749,0,0,0,1.06,0l5.781-5.781a1.5,1.5,0,0,0,.439-1.06V10.811a.75.75,0,0,0-1.28-.531L14.25,13.5V6a.75.75,0,0,0-.75-.75h-3A.75.75,0,0,0,9.75,6Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]])
+
+(def sort-up
+ [:svg {:id "Regular", :xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "arrow-thick-up-4"]
+ [:rect {:y "0.75", :rx "3", :stroke "currentColor", :transform "translate(24 0) rotate(90)", :fill "none", :stroke-linejoin "round", :width "22.5", :stroke-linecap "round", :stroke-width "1.5px", :x "0.75", :ry "3", :height "22.5"}]
+ [:path {:d "M14.25,18V10.5l3.22,3.22a.75.75,0,0,0,1.28-.531V11.121a1.5,1.5,0,0,0-.439-1.06L12.53,4.28a.749.749,0,0,0-1.06,0L5.689,10.061a1.5,1.5,0,0,0-.439,1.06v2.068a.75.75,0,0,0,1.28.531L9.75,10.5V18a.75.75,0,0,0,.75.75h3A.75.75,0,0,0,14.25,18Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :stroke-width "1.5px"}]])
+
+(def dashboard
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "gauge-dashboard"]
+ [:circle {:cx "12", :cy "14", :r "1.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "13.06", :y1 "12.939", :x2 "18.011", :y2 "7.99", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "2.5", :y1 "14.5", :x2 "4.5", :y2 "14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "21.5", :y1 "14.5", :x2 "19.5", :y2 "14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "20.776", :y1 "10.365", :x2 "18.929", :y2 "11.13", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "15.635", :y1 "5.223", :x2 "14.87", :y2 "7.071", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "12", :y1 "4.5", :x2 "12", :y2 "6.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "8.365", :y1 "5.223", :x2 "9.13", :y2 "7.071", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "5.283", :y1 "7.282", :x2 "6.695", :y2 "8.697", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "3.224", :y1 "10.365", :x2 "5.07", :y2 "11.13", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M12,2.5A11.5,11.5,0,0,0,.5,14v3.5a1,1,0,0,0,1,1h21a1,1,0,0,0,1-1V14A11.5,11.5,0,0,0,12,2.5Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+(def restaurant
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:g
+ [:line {:x1 "1", :y1 "14.5", :x2 "23", :y2 "14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "6", :y1 "17.5", :x2 "11", :y2 "17.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "7.5", :y1 "17.5", :x2 "6", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "9.5", :y1 "17.5", :x2 "11", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "6.25", :y1 "22.5", :x2 "10.75", :y2 "22.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "13", :y1 "17.5", :x2 "18", :y2 "17.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "14.5", :y1 "17.5", :x2 "13", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "16.5", :y1 "17.5", :x2 "18", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "13.25", :y1 "22.5", :x2 "17.75", :y2 "22.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "2.5", :y1 "23.5", :x2 "2.5", :y2 "7.33", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "21.5", :y1 "23.5", :x2 "21.5", :y2 "7.33", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M16,14.5V12a.5.5,0,0,1,.5-.5h1a.5.5,0,0,1,.5.5v2.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M7,14.5l-.64-1.28a.5.5,0,0,1,.45-.72h4.38a.5.5,0,0,1,.45.72L11,14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M6.5,4H.5V1.5a1,1,0,0,1,1-1h5Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:rect {:x "6.5", :y "0.5", :width "5.5", :height "3.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:rect {:x "12", :y "0.5", :width "5.5", :height "3.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M23.5,4h-6V.5h5a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M23.5,4v.5a3,3,0,0,1-6,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M6.5,4v.5a3,3,0,0,1-6,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M17.5,4v.75a2.75,2.75,0,0,1-5.5,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M12,4v.75a2.75,2.75,0,0,1-5.5,0V4", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]]])
+
+(def user
+ [:svg {:id "Light", :xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "single-man"]
+ [:path {:d "M3,22.75a9,9,0,0,1,18,0Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:circle {:cx "12", :cy "6.75", :r "5.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M7.261,3.958A9.124,9.124,0,0,0,13.833,6.75a9.138,9.138,0,0,0,3.617-.744", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+
+(def accounts
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "accounting-abacus"]
+ [:rect {:y "0.5", :rx "1", :stroke "currentColor", :fill "none", :stroke-linejoin "round", :width "21", :stroke-linecap "round", :x "1.504", :ry "1", :height "23"}]
+ [:line {:x1 "15.504", :y1 "20.5", :x2 "15.504", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "8.504", :y1 "17.5", :x2 "8.504", :y2 "23.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M10.5,4.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M10.5,6.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M17.5,13.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M17.5,19.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M10.5,16.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M17.5,4.5a1,1,0,0,1-1,1h-2a1,1,0,0,1-1-1h0a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "8.504", :y1 "7.5", :x2 "8.504", :y2 "15.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "8.504", :y1 "3.5", :x2 "8.504", :y2 "0.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "15.504", :y1 "14.5", :x2 "15.504", :y2 "18.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "15.504", :y1 "5.5", :x2 "15.504", :y2 "12.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "15.504", :y1 "0.5", :x2 "15.504", :y2 "3.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+
+(def cog
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "cash-toggle"]
+ [:path {:d "M19.923,7.212a1.874,1.874,0,0,0,1.065,2.571l1.265.45a1.875,1.875,0,0,1,0,3.534l-1.265.45a1.874,1.874,0,0,0-1.065,2.571L20.5,18A1.874,1.874,0,0,1,18,20.5l-1.213-.576a1.874,1.874,0,0,0-2.571,1.065l-.45,1.265a1.875,1.875,0,0,1-3.534,0l-.45-1.265a1.874,1.874,0,0,0-2.571-1.065L6,20.5A1.874,1.874,0,0,1,3.5,18l.576-1.213a1.874,1.874,0,0,0-1.065-2.571l-1.265-.45a1.875,1.875,0,0,1,0-3.534l1.265-.45A1.874,1.874,0,0,0,4.077,7.212L3.5,6A1.874,1.874,0,0,1,6,3.5l1.213.576A1.874,1.874,0,0,0,9.783,3.012l.45-1.265a1.875,1.875,0,0,1,3.534,0l.45,1.265a1.874,1.874,0,0,0,2.571,1.065L18,3.5A1.874,1.874,0,0,1,20.5,6Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M13.5,9H11.467a1.342,1.342,0,0,0-.5,2.587l2.064.826a1.342,1.342,0,0,1-.5,2.587H10.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "12", :y1 "16", :x2 "12", :y2 "15", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "12", :y1 "9", :x2 "12", :y2 "8", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:circle {:cx "12", :cy "12", :r "6.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+(def question
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :fill "none", :viewbox "0 0 24 24"}
+ [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M9.5116 9.51125C9.5116 8.92057 9.68675 8.34316 10.0149 7.85203C10.3431 7.3609 10.8095 6.97811 11.3552 6.75207C11.9009 6.52603 12.5014 6.46689 13.0807 6.58212C13.6601 6.69736 14.1922 6.98179 14.6099 7.39946C15.0276 7.81714 15.312 8.34928 15.4272 8.92861C15.5425 9.50794 15.4833 10.1084 15.2573 10.6541C15.0312 11.1999 14.6485 11.6663 14.1573 11.9944C13.6662 12.3226 13.0888 12.4978 12.4981 12.4978V15.4843"}]
+ [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M23.4486 12C23.4488 11.2025 23.2094 10.4233 22.7616 9.76338C22.3138 9.10345 21.6781 8.5932 20.937 8.29872C21.2535 7.56634 21.3428 6.75575 21.1931 5.97204C21.0435 5.18834 20.6619 4.46766 20.0977 3.90343C19.5336 3.3392 18.813 2.95744 18.0293 2.80766C17.2457 2.65787 16.4351 2.74695 15.7026 3.06336C15.4084 2.32189 14.8983 1.68587 14.2383 1.23773C13.5784 0.789596 12.799 0.550003 12.0013 0.550003C11.2036 0.550003 10.4243 0.789596 9.76434 1.23773C9.1044 1.68587 8.59426 2.32189 8.30005 3.06336C7.56756 2.74664 6.75681 2.65732 5.97294 2.80697C5.18907 2.95662 4.46825 3.33834 3.90396 3.90263C3.33967 4.46692 2.95794 5.18774 2.80829 5.97161C2.65864 6.75548 2.74797 7.56623 3.06469 8.29872C2.32321 8.59293 1.68719 9.10307 1.23906 9.76301C0.790923 10.423 0.551331 11.2023 0.551331 12C0.551331 12.7977 0.790923 13.577 1.23906 14.237C1.68719 14.8969 2.32321 15.4071 3.06469 15.7013C2.74814 16.4337 2.6589 17.2443 2.80854 18.028C2.95818 18.8117 3.3398 19.5324 3.90392 20.0966C4.46804 20.6608 5.18865 21.0426 5.97233 21.1924C6.75601 21.3421 7.56661 21.2531 8.29905 20.9366C8.59327 21.6781 9.1034 22.3141 9.76335 22.7623C10.4233 23.2104 11.2026 23.45 12.0003 23.45C12.7981 23.45 13.5774 23.2104 14.2373 22.7623C14.8973 22.3141 15.4074 21.6781 15.7016 20.9366C16.4341 21.2531 17.2447 21.3421 18.0283 21.1924C18.812 21.0426 19.5326 20.6608 20.0968 20.0966C20.6609 19.5324 21.0425 18.8117 21.1921 18.028C21.3418 17.2443 21.2525 16.4337 20.936 15.7013C21.6773 15.407 22.3132 14.8968 22.7612 14.2368C23.2092 13.5769 23.4487 12.7976 23.4486 12Z"}]
+ [:path {:stroke "currentColor", :d "M12.4981 17.973C12.3606 17.973 12.2492 17.8616 12.2492 17.7242C12.2492 17.5867 12.3606 17.4753 12.4981 17.4753"}]
+ [:path {:stroke "currentColor", :d "M12.4981 17.973C12.6356 17.973 12.747 17.8616 12.747 17.7242C12.747 17.5867 12.6356 17.4753 12.4981 17.4753"}]])
+
+(def rabbit
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :fill "none", :viewbox "0 0 24 24"}
+ [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M9 21.5H6.5"}]
+ [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M6.52169 19.4653H7.51807"}]
+ [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M6.52268 21.4561C6.25869 21.4561 6.00551 21.3512 5.81884 21.1646C5.63217 20.9779 5.5273 20.7247 5.5273 20.4607C5.5273 20.1967 5.63217 19.9435 5.81884 19.7569C6.00551 19.5702 6.25869 19.4653 6.52268 19.4653"}]
+ [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M7.51806 10.5069C9.50883 10.5069 11.3443 11.9999 12.495 15.4838C12.9927 16.9769 14.4857 21.4561 14.4857 21.4561H18.4673C18.7313 21.4561 18.9844 21.5609 19.1711 21.7476C19.3578 21.9343 19.4626 22.1875 19.4626 22.4515C19.4626 22.7154 19.3578 22.9686 19.1711 23.1553C18.9844 23.342 18.7313 23.4468 18.4673 23.4468H12.495C12.495 23.4468 10.979 20.9733 10.0483 19.4653C8.51345 16.9769 5.65172 15.5246 3.66096 14.1559C1.6702 12.7873 0.324441 9.73645 2.04346 7.52073C4.28208 4.63412 8.59606 5.77881 9.97367 7.37142L13.8049 11.2036C13.9426 11.3462 14.1074 11.46 14.2895 11.5382C14.4717 11.6165 14.6676 11.6577 14.8659 11.6594C15.0641 11.6611 15.2607 11.6233 15.4442 11.5483C15.6277 11.4732 15.7944 11.3623 15.9346 11.2221C16.0748 11.082 16.1857 10.9153 16.2607 10.7318C16.3358 10.5483 16.3736 10.3517 16.3719 10.1534C16.3701 9.95516 16.3289 9.75924 16.2507 9.57708C16.1724 9.39492 16.0587 9.23017 15.9161 9.09244L9.94381 3.10323C9.66371 2.823 9.50641 2.44298 9.5065 2.04677C9.5066 1.65057 9.66408 1.27062 9.94431 0.990528C10.2245 0.710433 10.6046 0.553129 11.0008 0.553223C11.397 0.553316 11.7769 0.710798 12.057 0.991026L22.2617 11.1957C22.6601 11.5395 22.974 11.9705 23.1791 12.4552C23.3841 12.9399 23.4748 13.4653 23.4442 13.9907C23.4442 15.4838 22.4488 16.4792 20.458 16.4792H17.9696L15.4751 18.2271"}]
+ [:path {:stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round", :d "M1.73291 7.98666C1.46709 7.9302 1.22172 7.80228 1.02324 7.61666C0.824763 7.43105 0.680706 7.19479 0.606596 6.93334C0.532486 6.6719 0.531133 6.39518 0.602684 6.13303C0.674235 5.87087 0.815976 5.63321 1.01263 5.44567C1.20928 5.25812 1.45339 5.1278 1.71864 5.06875C1.9839 5.00971 2.26024 5.02417 2.51788 5.11059C2.77551 5.197 3.00468 5.3521 3.18068 5.55915C3.35668 5.7662 3.47284 6.01735 3.51663 6.28555"}]
+ [:path {:stroke "currentColor", :d "M20.458 13.742C20.3206 13.742 20.2092 13.6305 20.2092 13.4931C20.2092 13.3557 20.3206 13.2443 20.458 13.2443"}]
+ [:path {:stroke "currentColor", :d "M20.458 13.742C20.5955 13.742 20.7069 13.6305 20.7069 13.4931C20.7069 13.3557 20.5955 13.2443 20.458 13.2443"}]])
+
+
+(def arrow-in
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "download-thick-box"]
+ [:polygon {:points "15.5 14.5 15.5 8.5 8.5 8.5 8.5 14.5 5.5 14.5 12 21 18.469 14.5 15.5 14.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:path {:d "M22.629,4.572A6.22,6.22,0,0,1,23,6.5v16a1,1,0,0,1-1,1H2a1,1,0,0,1-1-1V6.5a6.22,6.22,0,0,1,.371-1.928L2.629,1.428A1.6,1.6,0,0,1,4,.5H20a1.6,1.6,0,0,1,1.371.928Z", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "12", :y1 "6", :x2 "12", :y2 "0.5", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]
+ [:line {:x1 "1.034", :y1 "6", :x2 "22.966", :y2 "6", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+(def thumbs-up
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "like"]
+ [:path {:d "M19.5,16.065h0a1.5,1.5,0,0,1,0,3h-1a1.5,1.5,0,0,1,0,3H12c-4,0-3-2-11-2v-9H4a7.949,7.949,0,0,0,7.5-8c0-1.581,3-1.781,3,1.219a31.593,31.593,0,0,1-1,5.781h8a1.5,1.5,0,0,1,0,3h-1a1.5,1.5,0,0,1,0,3h-1", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
+
+(def thumbs-down
+ [:svg {:xmlns "http://www.w3.org/2000/svg", :viewbox "0 0 24 24"}
+ [:defs]
+ [:title "dislike"]
+ [:path {:d "M4.5,8h0a1.5,1.5,0,0,1,0-3h1a1.5,1.5,0,0,1,0-3H12c4,0,3,1.87,11,1.87V13H20a7.811,7.811,0,0,0-7.5,7.856c0,1.582-3,1.813-3-1.187A29.774,29.774,0,0,1,10.5,14h-8a1.5,1.5,0,0,1,0-3h1a1.5,1.5,0,0,1,0-3h1", :fill "none", :stroke "currentColor", :stroke-linecap "round", :stroke-linejoin "round"}]])
diff --git a/src/clj/auto_ap/ssr/transaction/insights.clj b/src/clj/auto_ap/ssr/transaction/insights.clj
index 9a15813e..77ee295b 100644
--- a/src/clj/auto_ap/ssr/transaction/insights.clj
+++ b/src/clj/auto_ap/ssr/transaction/insights.clj
@@ -1,16 +1,18 @@
(ns auto-ap.ssr.transaction.insights
(:require
+ [auto-ap.client-routes :as client-routes]
[auto-ap.datomic :refer [conn visible-clients]]
- [auto-ap.shared-views.company.sidebar :refer [company-side-bar]]
+ [auto-ap.rule-matching :refer [spread-cents]]
[auto-ap.ssr-routes :as ssr-routes]
+ [auto-ap.ssr.components :as com]
+ [auto-ap.ssr.svg :as svg]
[auto-ap.ssr.ui :refer [base-page]]
[auto-ap.ssr.utils :refer [html-response]]
[auto-ap.time :as atime]
[bidi.bidi :as bidi]
[clj-time.coerce :as coerce]
[datomic.api :as dc]
- [hiccup2.core :as hiccup]
- [clj-time.core :as time]))
+ [iol-ion.tx :refer [random-tempid]]))
(def pull-expr [:transaction/description-original
:db/id
@@ -25,98 +27,139 @@
(defn transaction-recommendations [identity selected-client & {:keys [after]}]
(let [visible-clients (visible-clients identity)]
- (->>
- (dc/q '[:find (pull ?t pull-expr)
- :in $ [?c ...] pull-expr
- :where [?t :transaction/recommended-account]
- [?t :transaction/client ?c]
- [?t :transaction/approval-status :transaction-approval-status/unapproved]
- (not [?t :transaction/vendor])]
- (dc/db conn)
- (if selected-client
- [selected-client]
- visible-clients)
- pull-expr)
- (map first)
- (sort-by :transaction/date)
- (reverse)
- (drop-while (fn [x]
- (if after
- (not= (Long/parseLong after) (:db/id x))
- false)))
- (#(if after
+ (->>
+ (dc/qseq {:query '[:find (pull ?t pull-expr)
+ :in $ [?c ...] pull-expr
+ :where [?t :transaction/recommended-account]
+ [?t :transaction/client ?c]
+ [?t :transaction/approval-status :transaction-approval-status/unapproved]
+ (not [?t :transaction/vendor])]
+ :args [(dc/db conn)
+ (if selected-client
+ [selected-client]
+ visible-clients)
+ pull-expr]})
+ (map first)
+ (sort-by :transaction/date)
+ (reverse)
+ (drop-while (fn [x]
+ (if after
+ (not= (Long/parseLong after) (:db/id x))
+ false)))
+ (#(if after
(drop 1 %)
%))
- (take 10)
- (into []))))
+ (take 10)
+ (into []))))
(defn transaction-row [r & {:keys [hide-actions? class last?]}]
- [:tr (cond-> {:class class}
- last? (assoc :hx-get (bidi/path-for ssr-routes/only-routes
- :transaction-insight-rows
- :after (:db/id r))
- :hx-trigger "intersect once"
- :hx-indicator "#insight-table"
- :hx-swap "afterend"))
- [:td {:style {:width "8em"}}(:client/code (:transaction/client r))]
- [:td {:style {:width "10em"}} (:bank-account/code (:transaction/bank-account r))]
- [:td {:style {:width "12em"}} (some-> (:transaction/date r) coerce/to-date-time (atime/unparse-local atime/normal-date))]
- [:td {:style {:width "30em" :max-width "30em"}} (str (:transaction/description-original r))]
- [:td {:style {:width "10em"}}
- (if (> (:transaction/amount r) 0.0 )
- [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))]
- [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))])]
- [:td {:style {:width "12em"}}
- [:div [:div.tag (:vendor/name (:transaction/recommended-vendor r))]]
- [:div [:div.tag (str (:account/numeric-code (:transaction/recommended-account r)) " - " (:account/name (:transaction/recommended-account r)))]]
- [:div [:div.tag
- {:class (cond
- (> (:transaction/account-confidence r) 0.90)
- "is-success is-light"
- (> (:transaction/account-confidence r) 0.80)
- "is-info is-light"
+ (com/data-grid-row
+ (cond-> {:class class}
+ last? (assoc :hx-get (bidi/path-for ssr-routes/only-routes
+ :transaction-insight-rows
+ :after (:db/id r))
+ :hx-trigger "intersect once"
+ :hx-indicator "#insight-table"
+ :hx-swap "afterend"))
+ (com/data-grid-cell {} (:client/code (:transaction/client r)))
+ (com/data-grid-cell {} (:bank-account/code (:transaction/bank-account r)))
+ (com/data-grid-cell {} (some-> (:transaction/date r) coerce/to-date-time (atime/unparse-local atime/normal-date)))
- :else
- "is-warning is-light")}
- (str "%" (Math/round (* 100.0 (:transaction/account-confidence r))))]]]
- [:td
- (when-not hide-actions?
- [:div.buttons
- [:button.button {:hx-post (bidi/path-for ssr-routes/only-routes
- :transaction-insight-approve
- :transaction-id (:db/id r))
- :hx-target "closest tr"}
- [:i.fa.fa-thumbs-up ]]
- [:button.button
- [:i.fa.fa-thumbs-down ]]
- [:a.button {:hx-get (bidi/path-for ssr-routes/only-routes
- :transaction-insight-explain
- :transaction-id (:db/id r))
- :hx-target "#modal-holder"
- :hx-swap "beforeend"}
- [:i.fa.fa-question ]]])]])
+ (com/data-grid-cell {} (str (:transaction/description-original r)))
+ (com/data-grid-cell {}
+ (if (> (:transaction/amount r) 0.0)
+ [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))]
+ [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))]))
+ (com/data-grid-cell {:style {:width "12em"}}
+ [:div.flex.gap-2.flex-wrap {:style {:width "12em"}}
+ (com/pill {:color :primary} (:vendor/name (:transaction/recommended-vendor r)))
+ (com/pill {:color :secondary} (str (:account/numeric-code (:transaction/recommended-account r)) " - " (:account/name (:transaction/recommended-account r))))
+ (com/pill {:class (cond
+ (> (:transaction/account-confidence r) 0.90)
+ "is-success is-light"
+ (> (:transaction/account-confidence r) 0.80)
+ "is-info is-light"
+
+ :else
+ "is-warning is-light")} (str "%" (Math/round (* 100.0 (:transaction/account-confidence r)))))])
+ (com/data-grid-right-stack-cell {}
+ (when-not hide-actions?
+ [:form.flex.gap-2
+ [:input {:type :hidden :name "id" :value (:db/id r)}]
+ (com/icon-button {:hx-post (bidi/path-for ssr-routes/only-routes
+ :transaction-insight-approve
+ :transaction-id (:db/id r))
+ :hx-target "closest tr"
+ :color :primary-light}
+ svg/thumbs-up)
+ (com/icon-button {:hx-delete (bidi/path-for ssr-routes/only-routes
+ :transaction-insight-disapprove
+ :transaction-id (:db/id r))
+ :hx-target "closest tr"
+ :color :danger-light}
+ svg/thumbs-down)
+ (com/icon-button {:hx-get (bidi/path-for ssr-routes/only-routes
+ :transaction-insight-explain
+ :transaction-id (:db/id r))
+ :hx-target "#modal-holder"
+ :hx-swap "outerHTML"}
+ svg/question)]))))
(defn approve [{:keys [identity session] {:keys [transaction-id]} :route-params}]
- (html-response (transaction-row
- (dc/pull (dc/db conn)
- pull-expr
- (Long/parseLong transaction-id))
- :auto-remove? true
- :hide-actions? true
- :class "live-added")))
+ (let [approval-details (dc/pull (dc/db conn) [{:transaction/recommended-account [:account/location :db/id]}
+ :transaction/recommended-vendor
+ :transaction/amount
+ :db/id
+ {:transaction/client [:client/locations]} ]
+ (cond-> transaction-id
+ string? (Long/parseLong)))
+ cents-to-distribute (int (Math/round (Math/abs (* (:transaction/amount approval-details) 100))))
+ valid-locations (or
+ (some-> approval-details :transaction/recommended-account :account/location vector)
+ (->> approval-details
+ :transaction/client
+ :client/locations))
+ updated-transaction [:upsert-transaction {:db/id (:db/id approval-details)
+ :transaction/approval-status :transaction-approval-status/approved
+ :transaction/vendor (:transaction/recommended-vendor approval-details)
+ :transaction/accounts (->> valid-locations
+ (map
+ (fn [cents location]
+ {:db/id (random-tempid)
+ :transaction-account/account (-> approval-details :transaction/recommended-account :db/id)
+ :transaction-account/amount (* 0.01 cents)
+ :transaction-account/location location})
+ (spread-cents cents-to-distribute (count valid-locations))))}]]
+ @(dc/transact conn [updated-transaction])
+ (html-response (transaction-row
+ (dc/pull (dc/db conn)
+ pull-expr
+ (Long/parseLong transaction-id))
+ :auto-remove? true
+ :hide-actions? true
+ :class "live-added"))))
+
+(defn disapprove [{:keys [identity session] {:keys [transaction-id]} :route-params}]
+ (let [transaction-id (cond-> transaction-id string? (Long/parseLong))]
+ @(dc/transact conn [[:upsert-transaction {:db/id transaction-id :transaction/recommended-account nil :transaction/recommended-vendor nil}]])
+ (html-response (transaction-row
+ (dc/pull (dc/db conn) pull-expr transaction-id)
+ :auto-remove? true
+ :hide-actions? true
+ :class "live-removed"))))
(defn explain [{:keys [identity session] {:keys [transaction-id]} :route-params}]
(let [r (dc/pull (dc/db conn)
- pull-expr
- (Long/parseLong transaction-id))
+ pull-expr
+ (Long/parseLong transaction-id))
similar (->> (dc/q '[:find ?date ?do ?amt
:in $ ?tr
:where
[(iol-ion.query/recent-date 180) ?start-date]
[?tr :transaction/client ?c]
- [?tr :transaction/recommended-account ?a ]
- [?tr :transaction/recommended-vendor ?v ]
+ [?tr :transaction/recommended-account ?a]
+ [?tr :transaction/recommended-vendor ?v]
[?t2 :transaction/client ?c]
[?t2 :transaction/date ?date]
[(>= ?date ?start-date)]
@@ -130,38 +173,31 @@
(take 5)
sort
reverse)]
- (html-response [:div.modal.is-active.wide
- [:div.modal-background {"_" (hiccup/raw "on click remove <#modal-holder div/>")}]
- [:div.modal-card
- [:div.modal-card-head
- [:h1.title "Similar transactions"]
- [:div.tags
- [:div.tag.is-large.is-info.is-light (:vendor/name (:transaction/recommended-vendor r))]
- [:div.tag.is-large.is-info.is-light (str (:account/numeric-code (:transaction/recommended-account r)) " - " (:account/name (:transaction/recommended-account r)))]]]
- [:div.modal-card-body
- [:table.table
- [:thead
- [:tr
- [:td "Date"]
- [:td "Description"]
- [:td "Amount"]]]
- [:tbody
- [:tr
- [:th (some-> r :transaction/date coerce/to-date-time (atime/unparse-local atime/normal-date))]
- [:th (-> r :transaction/description-original)]
- [:th (if (> (-> r :transaction/amount) 0.0 )
- [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))]
- [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))])]]
- (for [[date description amt] similar]
- [:tr
- [:td (some-> date coerce/to-date-time (atime/unparse-local atime/normal-date))]
- [:td description]
- [:td (if (> amt 0.0 )
- [:div.tag.is-success.is-light (str "$" (Math/round amt))]
- [:div.tag.is-danger.is-light (str "$" (Math/round amt))])]])]]
-
- ]]
- [:button.modal-close.is-large {"_" (hiccup/raw "on click remove <#modal-holder div/>")}]])))
+ (html-response
+ (com/modal {}
+ (com/modal-card {:style {:width "900px"}}
+ [:div.flex [:div.p-2 "Similar Transactions"]]
+ [:table.w-full
+ [:thead
+ [:tr
+ [:td "Date"]
+ [:td "Description"]
+ [:td "Amount"]]]
+ [:tbody
+ [:tr
+ [:th.text-left (some-> r :transaction/date coerce/to-date-time (atime/unparse-local atime/normal-date))]
+ [:th.text-left (-> r :transaction/description-original)]
+ [:th.text-left (if (> (-> r :transaction/amount) 0.0)
+ [:div.tag.is-success.is-light (str "$" (Math/round (:transaction/amount r)))]
+ [:div.tag.is-danger.is-light (str "$" (Math/round (:transaction/amount r)))])]]
+ (for [[date description amt] similar]
+ [:tr
+ [:td (some-> date coerce/to-date-time (atime/unparse-local atime/normal-date))]
+ [:td description]
+ [:td (if (> amt 0.0)
+ [:div.tag.is-success.is-light (str "$" (Math/round amt))]
+ [:div.tag.is-danger.is-light (str "$" (Math/round amt))])]])]]
+ [:div])))))
(defn transaction-rows* [{:keys [selected-client identity after]}]
(let [recommendations (transaction-recommendations identity selected-client :after after)]
@@ -178,28 +214,23 @@
:after (:after route-params)})))
(defn insight-table* [{:keys [selected-client identity]}]
- [:div#insight-table {:hx-get (bidi/path-for ssr-routes/only-routes
- :transaction-insight-table
- :request-method :get)
- :hx-trigger "clientSelected from:body"
- :hx-swap "outerHTML swap:100ms"}
-
- [:table.table
- [:thead
- [:tr
- [:td "Client"]
- [:td "Account"]
- [:td "Date"]
- [:td "Description"]
- [:td "Amount"]
- [:td "Vendor / Account"]
- [:td "action"]]]
- [:tbody
- (transaction-rows* {:selected-client selected-client
- :identity identity})]]
- [:div.container.htmx-indicator
- [:div.column.is-4.is-offset-4.has-text-centered
- [:div.loader.is-loading.is-active.big.is-centered]]]])
+ (let [recommendations (transaction-recommendations identity selected-client)]
+ (com/data-grid-card {:id "insight-table"
+ :title "Transaction Insights"
+ :route :transaction-insight-table
+ :paginate? false
+ :total (count recommendations)
+ :action-buttons nil
+ :rows (for [r recommendations
+ :let [last? (= r (last recommendations))]]
+ (transaction-row r :last? last?))
+ :headers [(com/data-grid-header {} "Client")
+ (com/data-grid-header {} "Account")
+ (com/data-grid-header {} "Date")
+ (com/data-grid-header {} "Description")
+ (com/data-grid-header {} "Amount")
+ (com/data-grid-header {:style {:width "4em"}} "Vendor / Account")
+ (com/data-grid-header {})]})))
(defn insight-table [{:keys [session identity]}]
(html-response (insight-table* {:selected-client
@@ -208,10 +239,24 @@
(defn page [{:keys [identity matched-route session] :as request}]
(base-page
- request
- [:div
- [:h1.title "Transaction Insights"]
- (insight-table* {:selected-client
- (-> session :client :db/id)
- :identity identity})]
- [:div (company-side-bar matched-route)]))
+ request
+ (com/page {:nav (com/main-aside-nav)
+ :active-client (:client (:session request))
+ :identity (:identity request)
+ :app-params {:hx-get (bidi/path-for ssr-routes/only-routes
+ :admin-history)
+ :hx-trigger "clientSelected from:body"
+ :hx-select "#app-contents"
+ :hx-swap "outerHTML swap:300ms"}}
+ (com/breadcrumbs {}
+ [:a {:href (bidi/path-for client-routes/routes
+ :transactions)}
+ "Transactions"]
+ [:a {:href (bidi/path-for ssr-routes/only-routes
+ :transaction-insights)}
+ "Insights"])
+ (insight-table* {:selected-client
+ (-> session :client :db/id)
+ :identity identity}))
+
+ "Transaction Insights"))
diff --git a/src/clj/auto_ap/ssr/ui.clj b/src/clj/auto_ap/ssr/ui.clj
index 98adeefb..39974204 100644
--- a/src/clj/auto_ap/ssr/ui.clj
+++ b/src/clj/auto_ap/ssr/ui.clj
@@ -1,9 +1,5 @@
(ns auto-ap.ssr.ui
(:require
- [auto-ap.client-routes :as client-routes]
- [auto-ap.ssr.company-dropdown :as company-dropdown]
- [auto-ap.ssr.login-dropdown :as login-dropdown]
- [bidi.bidi :as bidi]
[hiccup2.core :as hiccup]))
(defn html-page [hiccup]
@@ -15,69 +11,32 @@
{}
hiccup))})
-(defn base-page [request contents side-bar-contents]
- (html-page
- [:html.has-navbar-fixed-top
- [:head
- [:meta {:charset "utf-8"}]
- [:meta {:http-equiv "X-UA-Compatible", :content "IE=edge"}]
- [:meta {:name "viewport", :content "width=device-width, initial-scale=1"}]
- [:title "Integreat"]
- [:link {:rel "stylesheet", :href "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css", :integrity "sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=", :crossorigin "anonymous"}]
- [:link {:href "/css/font.min.css", :rel "stylesheet"}]
- [:link {:rel "stylesheet", :href "/css/bulma.min.css"}]
- [:link {:rel "stylesheet", :href "/css/bulma-calendar.min.css"}]
- [:link {:rel "stylesheet", :href "/css/bulma-badge.min.css"}]
- [:link {:rel "stylesheet", :href "/css/react-datepicker.min.inc.css"}]
- [:link {:rel "stylesheet", :href "/css/animate.css"}]
- [:link {:rel "stylesheet", :href "/finance-font/style.css"}]
- [:link {:rel "stylesheet", :href "/css/main.css"}]
- [:link {:rel "stylesheet", :href "https://unpkg.com/placeholder-loading/dist/css/placeholder-loading.min.css"}]
- #_[:link {:rel "stylesheet", :href "https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/css/autoComplete.min.css"}]
- [:script {:src "https://unpkg.com/hyperscript.org@0.9.7"}]
- [:script {:src "https://unpkg.com/@popperjs/core@2"}]
- #_[:script {:src "https://unpkg.com/htmx.org@1.8.4"
- :integrity "sha384-wg5Y/JwF7VxGk4zLsJEcAojRtlVp1FKKdGy1qN+OMtdq72WRvX/EdRdqg/LOhYeV"
- :crossorigin= "anonymous"}]
- [:script {:src "https://unpkg.com/htmx.org@1.9.0/dist/htmx.js"
- :crossorigin= "anonymous"}]
- [:script {:type "text/javascript", :src "https://cdn.yodlee.com/fastlink/v4/initialize.js", :async "async" }]]
- [:script {:type "text/javascript", :src "https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/autoComplete.min.js"}]
- [:script {:src "https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"}]
- [:link {:rel "stylesheet" :href "https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" :type "text/css"}]
- [:body
- [:div {:id "app"}
- [:div
- [:nav {:class "navbar has-shadow is-fixed-top is-grey"}
-
- [:div {:class "container"}
- [:div {:class "navbar-brand"}
- [:a {:class "navbar-item", :href "../"}
- [:img {:src "/img/logo.png"}]]]
- [:div.navbar-menu {:id "navMenu"}
- [:div.navbar-start
- [:a.navbar-item {:href "/"}
- "Home" ]
- [:a.navbar-item {:href (bidi/path-for client-routes/routes :unpaid-invoices)}
- "Invoices" ]
- [:a.navbar-item {:href (bidi/path-for client-routes/routes :payments)}
- "Payments" ]
- [:a.navbar-item {:href (bidi/path-for client-routes/routes :sales-orders)}
- "POS" ]
- [:a.navbar-item {:href (bidi/path-for client-routes/routes :transactions)}
- "Transactions" ]
- [:a.navbar-item {:href (bidi/path-for client-routes/routes :ledger)}
- "Ledger" ]]
- [:div.navbar-end
- (company-dropdown/dropdown request)
- (login-dropdown/dropdown request)]]]]
- [:div {:class "columns has-shadow", :id "mail-app", :style "margin-bottom: 0px; height: calc(100vh - 46px);"}
- [:aside {:class "column aside menu is-2 "}
- [:div {:class "main left-nav"}
- side-bar-contents]]
- [:div {:class "column messages hero ", :id "message-feed", :style "overflow: auto;"}
- [:div {:class "inbox-messages"}
- contents]]]
- [:div]
- [:div {:id "dz-hidden"}]]]
- [:div#modal-holder]]]))
+(defn base-page [request contents page-name]
+ (html-page
+ [:html.has-navbar-fixed-top
+ [:head
+ [:meta {:charset "utf-8"}]
+ [:meta {:http-equiv "X-UA-Compatible", :content "IE=edge"}]
+ [:meta {:name "viewport", :content "width=device-width, initial-scale=1"}]
+ [:title (str "Integreat | " page-name)]
+ [:link {:href "/css/font.min.css", :rel "stylesheet"}]
+ [:link {:rel "icon" :type "image/png" :href "/favicon.png"}]
+ [:link {:rel "stylesheet", :href "/css/react-datepicker.min.inc.css"}]
+ [:link {:rel "stylesheet", :href "/output.css"}]
+
+ [:script {:src "https://unpkg.com/hyperscript.org@0.9.7/dist/_hyperscript.min.js"}]
+ [:script {:src "https://unpkg.com/@popperjs/core@2.11.8/dist/umd/popper.min.js"}]
+ #_[:script {:src "https://unpkg.com/htmx.org@1.8.4"
+ :integrity "sha384-wg5Y/JwF7VxGk4zLsJEcAojRtlVp1FKKdGy1qN+OMtdq72WRvX/EdRdqg/LOhYeV"
+ :crossorigin= "anonymous"}]
+ [:script {:src "https://unpkg.com/htmx.org@1.9.0/dist/htmx.js"
+ :crossorigin= "anonymous"}]
+ [:script {:src "https://unpkg.com/htmx.org/dist/ext/debug.js"}]
+ [:script {:src "/js/htmx-disable.js"}]
+ [:script {:type "text/javascript", :src "https://cdn.yodlee.com/fastlink/v4/initialize.js", :async "async"}]]
+ [:script {:type "text/javascript", :src "https://cdn.jsdelivr.net/npm/@tarekraafat/autocomplete.js@10.2.7/dist/autoComplete.min.js"}]
+ [:script {:src "https://unpkg.com/dropzone@5.9.3/dist/min/dropzone.min.js"}]
+ [:link {:rel "stylesheet" :href "https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" :type "text/css"}]
+ [:body {:hx-ext "disable-submit"}
+ contents
+ [:script {:src "/js/flowbite.min.js"}]]]))
diff --git a/src/clj/auto_ap/ssr/utils.clj b/src/clj/auto_ap/ssr/utils.clj
index 189762b8..929d5d64 100644
--- a/src/clj/auto_ap/ssr/utils.clj
+++ b/src/clj/auto_ap/ssr/utils.clj
@@ -2,7 +2,8 @@
(:require
[auto-ap.logging :as alog]
[config.core :refer [env]]
- [hiccup2.core :as hiccup]))
+ [hiccup2.core :as hiccup]
+ [clojure.string :as str]))
(defn html-response [hiccup & {:keys [status headers] :or {status 200 headers {}}}]
{:status status
@@ -39,3 +40,24 @@
(ex-message e)]
:status 500)))))))
+(defn form-data->map [form-data]
+ (reduce-kv
+ (fn [acc k v]
+ (cond (and (string? v)
+ (empty? v))
+ acc
+
+ :else
+ (assoc-in acc (->> (str/split k #"_")
+ (mapv #(apply keyword (str/split % #"/"))))
+ v)))
+ {}
+ form-data))
+
+(defn path->name [k]
+ (cond (keyword? k)
+ (str (namespace k) "/" (name k))
+
+ (seq k)
+ (str/join "_" (map path->name k))
+ :else k))
diff --git a/src/clj/auto_ap/yodlee/core2.clj b/src/clj/auto_ap/yodlee/core2.clj
index 9437647c..04dd1ce5 100644
--- a/src/clj/auto_ap/yodlee/core2.clj
+++ b/src/clj/auto_ap/yodlee/core2.clj
@@ -13,7 +13,8 @@
[clj-time.coerce :as coerce]
[datomic.api :as dc]
[auto-ap.datomic :refer [conn]]
- [auto-ap.datomic.clients :as d-clients]))
+ [auto-ap.datomic.clients :as d-clients]
+ [clojure.string :as str]))
;; switch all of this to use tokens instead of passing around client codes, particularly because the codes
;; need to be tweaked for repeats
(defn client-code->login [client-code]
@@ -61,7 +62,7 @@
(client/post (merge {:headers (assoc base-headers
"loginName" (:yodlee2-admin-user env)
"Content-Type" "application/x-www-form-urlencoded")
- :body (str "clientId=" (:yodlee2-client-id env) " &secret=" (:yodlee2-client-secret env))
+ :body (str "clientId=" (:yodlee2-client-id env) "&secret=" (:yodlee2-client-secret env))
:as :json}
other-config)
)
@@ -75,11 +76,13 @@
(log/info "logging in as " client-code)
(-> (str (:yodlee2-base-url env) "/auth/token")
(client/post (merge {:headers (assoc base-headers
- "loginName" (if (<= (count client-code) 3)
- (str client-code client-code)
- client-code)
+ "loginName" (if (:yodlee2-test-user env)
+ (:yodlee2-test-user env)
+ (if (<= (count client-code) 3)
+ (str client-code client-code)
+ client-code))
"Content-Type" "application/x-www-form-urlencoded")
- :body (str "clientId=" (:yodlee2-client-id env) " &secret=" (:yodlee2-client-secret env))
+ :body (str "clientId=" (:yodlee2-client-id env) "&secret=" (:yodlee2-client-secret env))
:as :json}
other-config)
)
@@ -278,10 +281,6 @@
provider-accounts)
vals)))
-
-
-
-
(defn delete-provider-account [client-code id]
(let [cob-session (login-user (client-code->login client-code))]
diff --git a/src/cljc/auto_ap/ssr_routes.cljc b/src/cljc/auto_ap/ssr_routes.cljc
index 9f4cdfba..a741d8f9 100644
--- a/src/cljc/auto_ap/ssr_routes.cljc
+++ b/src/cljc/auto_ap/ssr_routes.cljc
@@ -5,20 +5,30 @@
"admin" {"/history" {"" :admin-history
"/" :admin-history
#"/search/?" :admin-history-search
- ["/" [#"\d+" :entity-id] #"/?"] :admin-history-search
+ ["/" [#"\d+" :entity-id] #"/?"] :admin-history
["/inspect/" [#"\d+" :entity-id] #"/?"] :admin-history-inspect}
"/ezcater-xls" :admin-ezcater-xls}
"transaction" {"/insights" {"" :transaction-insights
"/table" :transaction-insight-table
["/approve/" [#"\d+" :transaction-id]] {:post :transaction-insight-approve}
+ ["/disapprove/" [#"\d+" :transaction-id]] {:delete :transaction-insight-disapprove}
["/rows/" [#"\d+" :after]] {:get :transaction-insight-rows}
["/explain/" [#"\d+" :transaction-id]] {:get :transaction-insight-explain}}}
- "company" {"/dropdown" :company-dropdown-contents
- "/active" {:put :active-client}
- "/1099" :company-1099
- "/1099/table" {:get :company-1099-vendor-table}
- "/1099/vendor-dialog" {["/" [#"\d+" :vendor-id]] {:get :company-1099-vendor-dialog
- :post :company-1099-vendor-save}}}})
+ "company" {"" :company
+ "/dropdown" :company-dropdown-search-results
+ "/active" {:put :active-client}
+ "/1099" :company-1099
+ "/1099/table" {:get :company-1099-vendor-table}
+ "/1099/vendor-dialog" {["/" [#"\d+" :vendor-id]] {:get :company-1099-vendor-dialog
+ :post :company-1099-vendor-save}}
+ "/reports" {"" {:get :company-reports
+ :delete :company-reports-delete}
+ "/table" :company-reports-table}
+ "/yodlee" {"" {:get :company-yodlee}
+ "/table" {:get :company-yodlee-table}
+ "/fastlink" {:get :company-yodlee-fastlink-dialog}
+ "/refresh" {:put :company-yodlee-provider-account-refresh}}
+ }})
(def only-routes ["/" routes])
diff --git a/src/cljs/auto_ap/views/components/layouts.cljs b/src/cljs/auto_ap/views/components/layouts.cljs
index b67e0d39..e342fc32 100644
--- a/src/cljs/auto_ap/views/components/layouts.cljs
+++ b/src/cljs/auto_ap/views/components/layouts.cljs
@@ -1,23 +1,21 @@
(ns auto-ap.views.components.layouts
(:require
[auto-ap.events :as events]
+ [auto-ap.forms :as forms]
+ [auto-ap.forms.builder :as form-builder]
[auto-ap.routes :as routes]
+ [auto-ap.ssr-routes :as ssr-routes]
[auto-ap.subs :as subs]
[auto-ap.views.components.modal :as modal]
[auto-ap.views.components.search :as search]
[auto-ap.views.components.vendor-dialog :as vendor-dialog]
[auto-ap.views.utils
- :refer [active-when
- appearing
- dispatch-event-with-propagation
- login-url]]
+ :refer [active-when appearing dispatch-event-with-propagation login-url]]
[bidi.bidi :as bidi]
[clojure.string :as str]
[re-frame.core :as re-frame]
[reagent.core :as r]
- [auto-ap.forms.builder :as form-builder]
- [vimsical.re-frame.cofx.inject :as inject]
- [auto-ap.forms :as forms]))
+ [vimsical.re-frame.cofx.inject :as inject]))
(defn navbar-drop-down [{:keys [ class]} _]
(let [!child (r/atom nil)]
@@ -47,19 +45,19 @@
(defn login-dropdown []
(let [user (re-frame/subscribe [::subs/user])]
(if @user
- [navbar-drop-down {:header [:span [:span.icon [:i.fa.fa-user] ]
+ [navbar-drop-down {:header [:span [:span.icon [:i.fa.fa-user]]
[:span (:user/name @user)]]
:id ::account}
[:div
[:a {:class "navbar-item"
- :href (bidi/path-for routes/routes :reports)} "My company"]
+ :href (bidi/path-for auto-ap.ssr-routes/only-routes :company)} "My company"]
[:a.dropdown-item {:on-click (dispatch-event-with-propagation [::vendor-dialog/started {}])} "New Vendor"]
[:a.dropdown-item {:on-click (dispatch-event-with-propagation [::vendor-dialog/edit {}])} "Edit Vendor"]
(when (= "admin" (:user/role @user))
[:a {:class "navbar-item" :href (bidi/path-for routes/routes :admin)} "Administration"])
[:hr {:class "navbar-divider"}]
- [:a.navbar-item {:on-click (fn [e] (.preventDefault e) (re-frame/dispatch [::events/logout]))} "Logout"]]]
- [:a.navbar-item {:href login-url} "Login"])))
+ [:a.navbar-item {:on-click (fn [e] (.preventDefault e) (re-frame/dispatch [::events/logout]))} "Logout"]]]
+ [:a.navbar-item {:href (login-url)} "Login"])))
(re-frame/reg-sub
::client-search
diff --git a/src/cljs/auto_ap/views/pages/login.cljs b/src/cljs/auto_ap/views/pages/login.cljs
index abfb9547..76b63982 100644
--- a/src/cljs/auto_ap/views/pages/login.cljs
+++ b/src/cljs/auto_ap/views/pages/login.cljs
@@ -1,7 +1,8 @@
(ns auto-ap.views.pages.login
(:require
[auto-ap.views.utils :refer [login-url]]
- [re-frame.core :as re-frame]))
+ [re-frame.core :as re-frame]
+ [cemerick.url :as url]))
(re-frame/reg-sub
::logout-reason
@@ -17,9 +18,9 @@
[:div.notification.is-warning reason])
[:h1.title "Login"]
[:div.box.slideInFromBelow
-
+
[:img {:src "/img/logo-big.png"}]
[:div
- [:a.button.is-large.is-primary {:href login-url} "Login with Google"]]]
+ [:a.button.is-large.is-primary {:href (doto (login-url (get (:query (url/url (.-location js/window))) "redirect-to")) println)} "Login with Google"]]]
[:p.has-text-gray
"Copyright Integreat 2018"]]]]]])
diff --git a/src/cljs/auto_ap/views/pages/needs_activation.cljs b/src/cljs/auto_ap/views/pages/needs_activation.cljs
index ffead368..27bc2d9d 100644
--- a/src/cljs/auto_ap/views/pages/needs_activation.cljs
+++ b/src/cljs/auto_ap/views/pages/needs_activation.cljs
@@ -12,11 +12,11 @@
(defn needs-activation-page []
- [:div
+ [:div
[:h2 "Sorry, your user is not activated yet. Please have Ben Skinner enable your account. Click "
[:a {:on-click (fn []
(re-frame/dispatch-sync [::relogin])
true)
- :href login-url}
+ :href (login-url)}
"here"]
" to try again."]])
diff --git a/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs b/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs
index 36a7d887..8e993836 100644
--- a/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs
+++ b/src/cljs/auto_ap/views/pages/transactions/side_bar.cljs
@@ -21,56 +21,55 @@
user @(re-frame/subscribe [::subs/user])
client @(re-frame/subscribe [::subs/client])]
[:div
- [:div [:p.menu-label "Type"]
- [:ul.menu-list
- [:li.menu-item
- [:a.item {:href (bidi/path-for routes/routes :transactions)
- :class [(active-when ap = :transactions)]}
- [:span {:class "icon" :style {:font-size "25px"}}]
- [:span {:class "name"} "All"]]]
- [:li.menu-item
- [:a.item {:href (bidi/path-for routes/routes :unapproved-transactions)
- :class [(active-when ap = :unapproved-transactions)]}
- [:span {:class "icon icon-task-list-text-1" :style {:font-size "25px"}}]
- [:span {:class "name"} "Unapproved"]]]
- [:li.menu-item
- [:a.item {:href (bidi/path-for routes/routes :requires-feedback-transactions)
- :class [(active-when ap = :requires-feedback-transactions)]}
+ [:div [:p.menu-label "Type"]
+ [:ul.menu-list
+ [:li.menu-item
+ [:a.item {:href (bidi/path-for routes/routes :transactions)
+ :class [(active-when ap = :transactions)]}
+ [:span {:class "icon" :style {:font-size "25px"}}]
+ [:span {:class "name"} "All"]]]
+ [:li.menu-item
+ [:a.item {:href (bidi/path-for routes/routes :unapproved-transactions)
+ :class [(active-when ap = :unapproved-transactions)]}
+ [:span {:class "icon icon-task-list-text-1" :style {:font-size "25px"}}]
+ [:span {:class "name"} "Unapproved"]]]
+ [:li.menu-item
+ [:a.item {:href (bidi/path-for routes/routes :requires-feedback-transactions)
+ :class [(active-when ap = :requires-feedback-transactions)]}
- [:span {:class "icon icon-task-list-question" :style {:font-size "25px"}}]
-
- [:span {:class "name"} "Client Review"]]]
- [:li.menu-item
- [:a.item {:href (bidi/path-for routes/routes :approved-transactions)
- :class [(active-when ap = :approved-transactions)]}
+ [:span {:class "icon icon-task-list-question" :style {:font-size "25px"}}]
- [:span {:class "icon icon-task-list-check-1" :style {:font-size "25px"}}]
-
- [:span {:class "name"} "Approved"]]]
- [:li.menu-item
- [:a.item {:href (bidi/path-for routes/routes :excluded-transactions)
- :class [(active-when ap = :excluded-transactions)]}
+ [:span {:class "name"} "Client Review"]]]
+ [:li.menu-item
+ [:a.item {:href (bidi/path-for routes/routes :approved-transactions)
+ :class [(active-when ap = :approved-transactions)]}
- [:span {:class "icon icon-task-list-disable" :style {:font-size "25px"}}]
-
- [:span {:class "name"} "Excluded"]]]
+ [:span {:class "icon icon-task-list-check-1" :style {:font-size "25px"}}]
+
+ [:span {:class "name"} "Approved"]]]
+ [:li.menu-item
+ [:a.item {:href (bidi/path-for routes/routes :excluded-transactions)
+ :class [(active-when ap = :excluded-transactions)]}
+
+ [:span {:class "icon icon-task-list-disable" :style {:font-size "25px"}}]
+
+ [:span {:class "name"} "Excluded"]]]
+ (when @(re-frame/subscribe [::subs/is-admin?])
[:li.menu-item
[:a.item {:href (bidi/path-for ssr-routes/only-routes :transaction-insights)
:class [(active-when ap = :transaction-insights)]}
[:span {:class "icon icon-task-list-disable" :style {:font-size "25px"}}]
-
- [:span {:class "name"} "Insights"]]]
- ]]
- (when client
- [:<>
+
+ [:span {:class "name"} "Insights"]]])]]
+ (when client
+ [:<>
[:p.menu-label "Bank Account"]
- [:div
+ [:div
[bank-account-filter
{:on-change-event [::data-page/filter-changed data-page :bank-account]
:value @(re-frame/subscribe [::data-page/filter data-page :bank-account])
:bank-accounts @(re-frame/subscribe [::subs/bank-accounts])}]]])
-
[:p.menu-label "Financial Account"]
[:div
@@ -79,7 +78,7 @@
{:query i
:client-id (:id client)}
[:name :id]])
- :entity->text (fn [x ] (str (:numeric-code x) " - " (:name x)))
+ :entity->text (fn [x] (str (:numeric-code x) " - " (:name x)))
:type "typeahead-v3"
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :account (some-> % (select-keys [:name :id :numeric-code]))])
:value @(re-frame/subscribe [::data-page/filter data-page :account])}]]
@@ -94,13 +93,11 @@
:on-change #(re-frame/dispatch [::data-page/filter-changed data-page :vendor %])
:value @(re-frame/subscribe [::data-page/filter data-page :vendor])}]]
-
-
[:p.menu-label "Amount"]
- [:div
- [number-filter
- {:on-change-event [::data-page/filter-changed data-page :amount-range]
- :value @(re-frame/subscribe [::data-page/filter data-page :amount-range])}]]
+ [:div
+ [number-filter
+ {:on-change-event [::data-page/filter-changed data-page :amount-range]
+ :value @(re-frame/subscribe [::data-page/filter data-page :amount-range])}]]
[:p.menu-label "Date Range"]
[:div
@@ -108,33 +105,31 @@
{:on-change-event [::data-page/filter-changed data-page :date-range]
:value @(re-frame/subscribe [::data-page/filter data-page :date-range])}]]
-
[:p.menu-label "Location"]
[:div.field
[:div.control [:input.input {:placeholder "SC"
:style {:width "3em"}
:value @(re-frame/subscribe [::data-page/filter data-page :location])
- :on-change (dispatch-value-change [::data-page/filter-changed data-page :location ])} ]]]
+ :on-change (dispatch-value-change [::data-page/filter-changed data-page :location])}]]]
- [:p.menu-label "Description"]
- [:div
- [:div.field
- [:div.control [:input.input {:placeholder "CHECK 123 ABC"
- :value @(re-frame/subscribe [::data-page/filter data-page :description])
- :on-change (dispatch-value-change [::data-page/filter-changed data-page :description])} ]]]]
+ [:p.menu-label "Description"]
+ [:div
+ [:div.field
+ [:div.control [:input.input {:placeholder "CHECK 123 ABC"
+ :value @(re-frame/subscribe [::data-page/filter data-page :description])
+ :on-change (dispatch-value-change [::data-page/filter-changed data-page :description])}]]]]
(when-let [exact-match-id @(re-frame/subscribe [::data-page/filter data-page :exact-match-id])]
[:div
[:p.menu-label "Specific Transaction"]
[:span.tag.is-medium exact-match-id " "
[:button.delete.is-small {:on-click
(dispatch-event [::data-page/filter-changed data-page :exact-match-id nil])}]]])
-
(when (= "admin" (:user/role user))
[:<>
-
+
[:p.menu-label "Admin only"]
- [:div
+ [:div
[switch-field {:id "unresolved-only"
:checked (boolean @(re-frame/subscribe [::data-page/filter data-page :unresolved]))
:on-change (fn [e]
@@ -149,7 +144,7 @@
[:button.delete.is-small {:on-click
(dispatch-event [::data-page/filter-changed data-page :import-batch-id nil])}]]])
- [:div
+ [:div
[switch-field {:id "potentially-duplicate"
:checked (boolean @(re-frame/subscribe [::data-page/filter data-page :potential-duplicates]))
:on-change (fn [e]
diff --git a/src/cljs/auto_ap/views/utils.cljs b/src/cljs/auto_ap/views/utils.cljs
index 86d2bab0..0326e38f 100644
--- a/src/cljs/auto_ap/views/utils.cljs
+++ b/src/cljs/auto_ap/views/utils.cljs
@@ -57,10 +57,16 @@
(when (apply f (into [active-page] rest)) " is-active"))
-(def login-url
- (let [client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com"
- redirect-uri (js/encodeURI (str (.-origin (.-location js/window)) "/api/oauth"))]
- (str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&max_auth_age=0&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile")))
+(defn login-url
+ ([] (login-url nil))
+ ([next]
+
+ (let [client-id "264081895820-0nndcfo3pbtqf30sro82vgq5r27h8736.apps.googleusercontent.com"
+ redirect-uri (js/encodeURI (str (.-origin (.-location js/window)) "/api/oauth"
+ ))]
+ (str "https://accounts.google.com/o/oauth2/auth?access_type=online&client_id=" client-id "&redirect_uri=" redirect-uri "&response_type=code&max_auth_age=0&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile"
+ (when next
+ (str "&state=" (js/encodeURIComponent next)))))))
(defn dispatch-value-change [event]
(fn [e]
@@ -249,9 +255,9 @@
:user/role)))))))
(defn query-params []
- (reduce-kv
+ (reduce-kv
(fn [result k v]
- (assoc result (keyword k) (edn/read-string v)))
+ (assoc result (keyword k) (try (edn/read-string v) (catch js/Error e v))))
{}
(:query (cemerick.url/url (.-location js/window)))))
diff --git a/tailwind.config.js b/tailwind.config.js
new file mode 100644
index 00000000..b2056c91
--- /dev/null
+++ b/tailwind.config.js
@@ -0,0 +1,92 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ darkMode: "class",
+ content: ["./src/**/*.{cljs,clj,cljc}",
+ "./node_modules/flowbite/**/*.js"],
+ theme: {
+ extend: {
+ "fontFamily": {
+ "sans": ["Calibri", "ui-sans-serif", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "Roboto", "Helvetica Neue", "Arial", "Noto Sans", "sans-serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"]
+
+ },
+ "colors": {
+ "green": {
+ "50": "#f2f8ea",
+ "100": "#e4f0d5",
+ "200": "#c9e1ab",
+ "300": "#afd382",
+ "400": "#94c458",
+ "500": "#79b52e",
+ "600": "#619125",
+ "700": "#496d1c",
+ "800": "#304812",
+ "900": "#182409"
+ },
+ "primary": {
+ "50": "#f2f8ea",
+ "100": "#e4f0d5",
+ "200": "#c9e1ab",
+ "300": "#afd382",
+ "400": "#94c458",
+ "500": "#79b52e",
+ "600": "#619125",
+ "700": "#496d1c",
+ "800": "#304812",
+ "900": "#182409"
+ },
+ "blue": {
+ "50": "#e6f5fd",
+ "100": "#ccebfb",
+ "200": "#99d7f7",
+ "300": "#66c4f2",
+ "400": "#33b0ee",
+ "500": "#009cea",
+ "600": "#007dbb",
+ "700": "#005e8c",
+ "800": "#003e5e",
+ "900": "#001f2f"
+ },
+ "secondary": {
+ "50": "#e9f5e8",
+ "100": "#d2ebd2",
+ "200": "#a6d7a4",
+ "300": "#79c377",
+ "400": "#4daf49",
+ "500": "#209b1c",
+ "600": "#1a7c16",
+ "700": "#135d11",
+ "800": "#0d3e0b",
+ "900": "#061f06"
+ },
+ "red": {
+ "50": "#ffe6e6",
+ "100": "#ffcdcd",
+ "200": "#ff9a9a",
+ "300": "#ff6868",
+ "400": "#ff3535",
+ "500": "#ff0303",
+ "600": "#cc0202",
+ "700": "#990202",
+ "800": "#660101",
+ "900": "#330101"
+ },
+ "orange": {
+ "50": "#fef2e8",
+ "100": "#fde6d1",
+ "200": "#fbcca2",
+ "300": "#f8b374",
+ "400": "#f69945",
+ "500": "#f48017",
+ "600": "#c36612",
+ "700": "#924d0e",
+ "800": "#623309",
+ "900": "#311a05"
+ }
+
+ }
+ }
+ } ,
+ plugins: [
+ require('flowbite/plugin')
+ ]
+}
diff --git a/test/clj/auto_ap/import/transactions_test.clj b/test/clj/auto_ap/import/transactions_test.clj
index 2f17f13e..87f123ce 100644
--- a/test/clj/auto_ap/import/transactions_test.clj
+++ b/test/clj/auto_ap/import/transactions_test.clj
@@ -16,8 +16,7 @@
(def base-transaction #:transaction {:date #inst "2020-01-02T00:00:00-08:00"
:raw-id "1"
- :id
- (di/sha-256 "1")
+ :id (di/sha-256 "1")
:amount 12.0
:description-original "original-description"
:status "POSTED"
diff --git a/test/clj/auto_ap/integration/graphql/accounts.clj b/test/clj/auto_ap/integration/graphql/accounts.clj
index c1be61f2..09330b4a 100644
--- a/test/clj/auto_ap/integration/graphql/accounts.clj
+++ b/test/clj/auto_ap/integration/graphql/accounts.clj
@@ -8,159 +8,159 @@
(use-fixtures :each wrap-setup)
-(deftest test-account-search
- (testing "It should find matching account names"
- @(dc/transact conn [{:account/name "Food Research"
- :db/ident :client-specific-account
- :account/numeric-code 51100
- :account/search-terms "Food Research"
- :account/applicability :account-applicability/global
- :account/default-allowance :allowance/allowed}])
- (sut/rebuild-search-index)
- (is (> (count (sut/search {:id (admin-token)}
- {:query "Food Research"}
- nil
- ))
- 0)))
- (testing "It should find exact matches by numbers"
- (is (= (count (sut/search {:id (admin-token)}
- {:query "51100"}
- nil
- ))
- 1)))
- (testing "It should filter out accounts that are not allowed for clients"
- @(dc/transact conn [{:account/name "CLIENT SPECIFIC"
- :db/ident :client-specific-account
- :account/numeric-code 99999
- :account/search-terms "CLIENTSPECIFIC"
- :account/applicability :account-applicability/customized
- :account/default-allowance :allowance/allowed}])
- (sut/rebuild-search-index)
- (is (= [] (sut/search {:id (admin-token)}
- {:query "CLIENTSPECIFIC"}
- nil
- )))
-
- (testing "It should show up for the client specific version"
- (let [client-id (-> @(dc/transact conn [{:client/name "CLIENT"
- :db/id "client"}
- {:db/ident :client-specific-account
- :account/client-overrides [{:account-client-override/client "client"
- :account-client-override/name "HI"
- :account-client-override/search-terms "HELLOWORLD"}]}])
- :tempids
- (get "client"))]
- (sut/rebuild-search-index)
- (is (= 1 (count (sut/search {:id (admin-token)}
- {:query "HELLOWORLD"
- :client_id client-id}
- nil))))))
+#_(deftest test-account-search
- (testing "It should hide accounts that arent applicable"
- @(dc/transact conn [{:account/name "DENIED"
- :db/ident :denied-account
- :account/numeric-code 99998
- :account/search-terms "DENIED"
- :account/applicability :account-applicability/global
- :account/default-allowance :allowance/denied
- :account/vendor-allowance :allowance/denied
- :account/invoice-allowance :allowance/denied}])
- (is (= 0 (count (sut/search {:id (admin-token)}
- {:query "DENIED"}
- nil))))
- (is (= 0 (count (sut/search {:id (admin-token)}
- {:query "DENIED"
- :allowance :invoice}
- nil))))
- (is (= 0 (count (sut/search {:id (admin-token)}
- {:query "DENIED"
- :allowance :vendor}
- nil)))))
-
- (testing "It should warn when using a warn account"
- @(dc/transact conn [{:account/name "WARNING"
- :db/ident :warn-account
- :account/numeric-code 99997
- :account/search-terms "WARNING"
- :account/applicability :account-applicability/global
- :account/default-allowance :allowance/warn
- :account/vendor-allowance :allowance/warn
- :account/invoice-allowance :allowance/warn}])
+ (with-redefs [auto-ap.solr/impl (auto-ap.solr/->InMemSolrClient (atom {}))]
+ (testing "It should find matching account names"
+ @(dc/transact conn [{:account/name "Food Research"
+ :db/ident :client-specific-account
+ :account/numeric-code 51100
+ :account/search-terms "Food Research"
+ :account/applicability :account-applicability/global
+ :account/default-allowance :allowance/allowed}])
(sut/rebuild-search-index)
- (is (some? (:warning (first (sut/search {:id (admin-token)}
- {:query "WARNING"
- :allowance :global}
- nil)))))
- (is (some? (:warning (first (sut/search {:id (admin-token)}
- {:query "WARNING"
- :allowance :invoice}
- nil)))))
- (is (some? (:warning (first (sut/search {:id (admin-token)}
- {:query "WARNING"
- :allowance :vendor}
- nil))))))
- (testing "It should only include admin accounts for admins"
- @(dc/transact conn [{:account/name "ADMINONLY"
- :db/ident :warn-account
- :account/numeric-code 99997
- :account/search-terms "ADMINONLY"
- :account/applicability :account-applicability/global
- :account/default-allowance :allowance/admin-only
- :account/vendor-allowance :allowance/admin-only
- :account/invoice-allowance :allowance/admin-only}])
+ (clojure.pprint/pprint auto-ap.solr/impl)
+ (is (> (count (sut/search {:id (admin-token)}
+ {:query "Food Research"}
+ nil))
+ 0)))
+ (testing "It should find exact matches by numbers"
+ (is (= (count (sut/search {:id (admin-token)}
+ {:query "51100"}
+ nil))
+ 1)))
+ (testing "It should filter out accounts that are not allowed for clients"
+ @(dc/transact conn [{:account/name "CLIENT SPECIFIC"
+ :db/ident :client-specific-account
+ :account/numeric-code 99999
+ :account/search-terms "CLIENTSPECIFIC"
+ :account/applicability :account-applicability/customized
+ :account/default-allowance :allowance/allowed}])
(sut/rebuild-search-index)
- (is (= 1 (count (sut/search {:id (admin-token)}
- {:query "ADMINONLY"}
- nil))))
- (is (= 0 (count (sut/search {:id (user-token)}
- {:query "ADMINONLY"}
- nil)))))
+ (is (= [] (sut/search {:id (admin-token)}
+ {:query "CLIENTSPECIFIC"}
+ nil)))
- (testing "It should allow searching for vendor accounts for invoices"
- (let [vendor-id (-> @(dc/transact conn [{:account/name "VENDORONLY"
- :db/id "vendor-only"
- :db/ident :vendor-only
- :account/numeric-code 99996
- :account/search-terms "VENDORONLY"
- :account/applicability :account-applicability/global
- :account/default-allowance :allowance/allowed
- :account/vendor-allowance :allowance/allowed
- :account/invoice-allowance :allowance/denied}
- {:vendor/name "Allowed"
- :vendor/default-account "vendor-only"
- :db/id "vendor"}])
- :tempids
- (get "vendor"))]
- (sut/rebuild-search-index)
+ (testing "It should show up for the client specific version"
+ (let [client-id (-> @(dc/transact conn [{:client/name "CLIENT"
+ :db/id "client"}
+ {:db/ident :client-specific-account
+ :account/client-overrides [{:account-client-override/client "client"
+ :account-client-override/name "HI"
+ :account-client-override/search-terms "HELLOWORLD"}]}])
+ :tempids
+ (get "client"))]
+ (sut/rebuild-search-index)
+ (is (= 1 (count (sut/search {:id (admin-token)}
+ {:query "HELLOWORLD"
+ :client_id client-id}
+ nil))))))
+
+ (testing "It should hide accounts that arent applicable"
+ @(dc/transact conn [{:account/name "DENIED"
+ :db/ident :denied-account
+ :account/numeric-code 99998
+ :account/search-terms "DENIED"
+ :account/applicability :account-applicability/global
+ :account/default-allowance :allowance/denied
+ :account/vendor-allowance :allowance/denied
+ :account/invoice-allowance :allowance/denied}])
(is (= 0 (count (sut/search {:id (admin-token)}
- {:query "VENDORONLY"
+ {:query "DENIED"}
+ nil))))
+ (is (= 0 (count (sut/search {:id (admin-token)}
+ {:query "DENIED"
:allowance :invoice}
nil))))
+ (is (= 0 (count (sut/search {:id (admin-token)}
+ {:query "DENIED"
+ :allowance :vendor}
+ nil)))))
+ (testing "It should warn when using a warn account"
+ @(dc/transact conn [{:account/name "WARNING"
+ :db/ident :warn-account
+ :account/numeric-code 99997
+ :account/search-terms "WARNING"
+ :account/applicability :account-applicability/global
+ :account/default-allowance :allowance/warn
+ :account/vendor-allowance :allowance/warn
+ :account/invoice-allowance :allowance/warn}])
+ (sut/rebuild-search-index)
+ (is (some? (:warning (first (sut/search {:id (admin-token)}
+ {:query "WARNING"
+ :allowance :global}
+ nil)))))
+ (is (some? (:warning (first (sut/search {:id (admin-token)}
+ {:query "WARNING"
+ :allowance :invoice}
+ nil)))))
+ (is (some? (:warning (first (sut/search {:id (admin-token)}
+ {:query "WARNING"
+ :allowance :vendor}
+ nil))))))
+ (testing "It should only include admin accounts for admins"
+ @(dc/transact conn [{:account/name "ADMINONLY"
+ :db/ident :warn-account
+ :account/numeric-code 99997
+ :account/search-terms "ADMINONLY"
+ :account/applicability :account-applicability/global
+ :account/default-allowance :allowance/admin-only
+ :account/vendor-allowance :allowance/admin-only
+ :account/invoice-allowance :allowance/admin-only}])
+ (sut/rebuild-search-index)
(is (= 1 (count (sut/search {:id (admin-token)}
- {:query "VENDORONLY"
- :allowance :invoice
- :vendor_id vendor-id}
- nil))))))))
+ {:query "ADMINONLY"}
+ nil))))
+ (is (= 0 (count (sut/search {:id (user-token)}
+ {:query "ADMINONLY"}
+ nil)))))
-(deftest get-graphql
- (testing "should retrieve a single account"
- @(dc/transact conn [{:account/numeric-code 1
- :account/default-allowance :allowance/allowed
- :account/type :account-type/asset
- :account/location "A"
- :account/name "Test"}])
+ (testing "It should allow searching for vendor accounts for invoices"
+ (let [vendor-id (-> @(dc/transact conn [{:account/name "VENDORONLY"
+ :db/id "vendor-only"
+ :db/ident :vendor-only
+ :account/numeric-code 99996
+ :account/search-terms "VENDORONLY"
+ :account/applicability :account-applicability/global
+ :account/default-allowance :allowance/allowed
+ :account/vendor-allowance :allowance/allowed
+ :account/invoice-allowance :allowance/denied}
+ {:vendor/name "Allowed"
+ :vendor/default-account "vendor-only"
+ :db/id "vendor"}])
+ :tempids
+ (get "vendor"))]
+ (sut/rebuild-search-index)
+ (is (= 0 (count (sut/search {:id (admin-token)}
+ {:query "VENDORONLY"
+ :allowance :invoice}
+ nil))))
- (is (= {:name "Test",
- :invoice_allowance nil,
- :numeric_code 1,
- :vendor_allowance nil,
- :location "A",
- :applicability nil}
- (dissoc (first (:accounts (sut/get-graphql {:id (admin-token)} {} nil)))
- :id
- :type
- :default_allowance)))))
+ (is (= 1 (count (sut/search {:id (admin-token)}
+ {:query "VENDORONLY"
+ :allowance :invoice
+ :vendor_id vendor-id}
+ nil)))))))
+
+ (deftest get-graphql
+ (testing "should retrieve a single account"
+ @(dc/transact conn [{:account/numeric-code 1
+ :account/default-allowance :allowance/allowed
+ :account/type :account-type/asset
+ :account/location "A"
+ :account/name "Test"}])
+
+ (is (= {:name "Test",
+ :invoice_allowance nil,
+ :numeric_code 1,
+ :vendor_allowance nil,
+ :location "A",
+ :applicability nil}
+ (dissoc (first (:accounts (sut/get-graphql {:id (admin-token)} {} nil)))
+ :id
+ :type
+ :default_allowance)))))))
(deftest upsert-account
(testing "should create a new account"
diff --git a/test/clj/auto_ap/integration/routes/ezcater_xls.clj b/test/clj/auto_ap/integration/routes/ezcater_xls.clj
index 366c6208..b4712fbd 100644
--- a/test/clj/auto_ap/integration/routes/ezcater_xls.clj
+++ b/test/clj/auto_ap/integration/routes/ezcater_xls.clj
@@ -9,50 +9,51 @@
(use-fixtures :each wrap-setup)
(deftest stream->sales-orders
- (testing "Should import nothing when there are no clients"
- (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))]
- (is (= [:missing "Nick The Greek (Santa Cruz)"] (first (sut/stream->sales-orders s))))))
- (testing "should import for a single client"
- (let [{:strs [test-client]} (setup-test-data [(test-client
- :db/id "test-client"
- :client/code "NGOP"
- :client/locations ["DT"]
- :client/name "The client"
- :client/matches ["Nick the Greek (Elk Grove)"])])]
+ (with-redefs [auto-ap.solr/impl (auto-ap.solr/->InMemSolrClient (atom {}))]
+ (testing "Should import nothing when there are no clients"
(with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))]
- (is (seq (sut/stream->sales-orders s))))
- (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))]
- (is (= #:sales-order
- {:vendor :vendor/ccp-ezcater
- :service-charge -95.9
- :date #inst "2023-04-03T18:30:00"
- :reference-link "ZA2-320"
- :charges
- [#:charge{:type-name "CARD"
- :date #inst "2023-04-03T18:30:00"
- :client test-client
- :location "DT"
- :external-id
- "ezcater/charge/17592186045501-DT-ZA2-320-0"
- :processor :ccp-processor/ezcater
- :total 516.12
- :tip 0.0}]
- :client test-client
- :tip 0.0
- :tax 37.12
- :external-id "ezcater/order/17592186045501-DT-ZA2-320"
- :total 516.12
- :line-items
- [#:order-line-item{:external-id
- "ezcater/order/17592186045501-DT-ZA2-320-0"
- :item-name "EZCater Catering"
- :category "EZCater Catering"
- :discount 0.0
- :tax 37.12
- :total 516.12}]
- :discount 0.0
- :location "DT"
- :returns 0.0}
- (last (first (filter (comp #{:order} first)
- (sut/stream->sales-orders s))))))))))
+ (is (= [:missing "Nick The Greek (Santa Cruz)"] (first (sut/stream->sales-orders s))))))
+ (testing "should import for a single client"
+ (let [{:strs [test-client]} (setup-test-data [(test-client
+ :db/id "test-client"
+ :client/code "NGOP"
+ :client/locations ["DT"]
+ :client/name "The client"
+ :client/matches ["Nick the Greek (Elk Grove)"])])]
+ (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))]
+ (is (seq (sut/stream->sales-orders s))))
+ (with-open [s (io/input-stream (io/resource "sample-ezcater.xlsx"))]
+ (is (= #:sales-order
+ {:vendor :vendor/ccp-ezcater
+ :service-charge -95.9
+ :date #inst "2023-04-03T18:30:00"
+ :reference-link "ZA2-320"
+ :charges
+ [#:charge{:type-name "CARD"
+ :date #inst "2023-04-03T18:30:00"
+ :client test-client
+ :location "DT"
+ :external-id
+ "ezcater/charge/17592186045501-DT-ZA2-320-0"
+ :processor :ccp-processor/ezcater
+ :total 516.12
+ :tip 0.0}]
+ :client test-client
+ :tip 0.0
+ :tax 37.12
+ :external-id "ezcater/order/17592186045501-DT-ZA2-320"
+ :total 516.12
+ :line-items
+ [#:order-line-item{:external-id
+ "ezcater/order/17592186045501-DT-ZA2-320-0"
+ :item-name "EZCater Catering"
+ :category "EZCater Catering"
+ :discount 0.0
+ :tax 37.12
+ :total 516.12}]
+ :discount 0.0
+ :location "DT"
+ :returns 0.0}
+ (last (first (filter (comp #{:order} first)
+ (sut/stream->sales-orders s)))))))))))