Marko Vukovic commited on
Commit
41e3802
·
1 Parent(s): 3059eb2

Created Kino app

Browse files
.gitignore ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .elixir_ls
2
+ .history
3
+
4
+ # The directory Mix will write compiled artifacts to.
5
+ /_build/
6
+
7
+ # If you run "mix test --cover", coverage assets end up here.
8
+ /cover/
9
+
10
+ # The directory Mix downloads your dependencies sources to.
11
+ /deps/
12
+
13
+ # Where third-party dependencies like ExDoc output generated docs.
14
+ /doc/
15
+
16
+ # Ignore .fetch files in case you like to edit your project deps locally.
17
+ /.fetch
18
+
19
+ # If the VM crashes, it generates a dump, let's ignore it too.
20
+ erl_crash.dump
21
+
22
+ # Also ignore archive artifacts (built via "mix archive.build").
23
+ *.ez
24
+
25
+ # Ignore package tarball (built via "mix hex.build").
26
+ teller_bank_job-*.tar
27
+
28
+ # Temporary files, for example, from tests.
29
+ /tmp/
.tool-versions ADDED
@@ -0,0 +1 @@
 
 
1
+ elixir 1.14.4-otp-25
Dockerfile CHANGED
@@ -1,7 +1,8 @@
1
  FROM ghcr.io/livebook-dev/livebook:latest-cuda11.8
2
 
3
- ENV LIVEBOOK_APP_SERVICE_NAME "🐳 Hugging Face - $SPACE_TITLE"
4
- ENV LIVEBOOK_APP_SERVICE_URL "https://huggingface.co/spaces/$SPACE_AUTHOR_NAME/$SPACE_REPO_NAME"
 
5
  ENV LIVEBOOK_UPDATE_INSTRUCTIONS_URL "https://livebook.dev"
6
  ENV LIVEBOOK_WITHIN_IFRAME "true"
7
  ENV LIVEBOOK_APPS_PATH "/public-apps"
 
1
  FROM ghcr.io/livebook-dev/livebook:latest-cuda11.8
2
 
3
+ ENV LIVEBOOK_APP_SERVICE_NAME "Teller Bank Job"
4
+ ENV LIVEBOOK_SPACE_REPO_NAME = "teller_bank_job"
5
+ ENV LIVEBOOK_APP_SERVICE_URL "https://huggingface.co/spaces/mvkvc/$LIVEBOOK_SPACE_REPO_NAME"
6
  ENV LIVEBOOK_UPDATE_INSTRUCTIONS_URL "https://livebook.dev"
7
  ENV LIVEBOOK_WITHIN_IFRAME "true"
8
  ENV LIVEBOOK_APPS_PATH "/public-apps"
Elixir.EncoderDecoder.beam ADDED
Binary file (3.78 kB). View file
 
README.md CHANGED
@@ -8,4 +8,13 @@ fullWidth: true
8
  duplicated_from: livebook-dev/livebook
9
  ---
10
 
11
- You can install and run [Livebook](https://livebook.dev/) inside a Hugging Face Space. Here's [a tutorial](https://huggingface.co/docs/hub/spaces-sdks-docker-livebook) on how to do that.
 
 
 
 
 
 
 
 
 
 
8
  duplicated_from: livebook-dev/livebook
9
  ---
10
 
11
+ # teller_bank_job
12
+
13
+ <https://lisbon.teller.engineering/>
14
+
15
+ My submission for the Teller Bank Job challenge for ElixirConf EU 2023.
16
+
17
+ <!-- username: blue_chloe
18
+ password: portugal -->
19
+
20
+ <!-- %TellerBank.ChallengeResult{account_number: "745477326035", balance_in_cents: "349782"} -->
notes/logs_elixir.md ADDED
@@ -0,0 +1,836 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ LOGIN: elixir
2
+ PASS: el1x1r_c0nf_Lisbon
3
+
4
+ INITIAL LOGIN
5
+
6
+ GET /config
7
+ user-agent: Teller Bank iOS v1.3
8
+ api-key: Hello-Lisbon!
9
+ device-id: TU2CM7WPWZJVNK2N
10
+ accept: application/json
11
+
12
+ 200 OK
13
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
14
+ content-type: application/json; charset=utf-8
15
+ {
16
+ "conference": [
17
+ {
18
+ "date": "2023-04-20",
19
+ "schedule": [
20
+ {
21
+ "location": {
22
+ "floor": "Floor -1",
23
+ "room": "Europa",
24
+ "track": "Track 1"
25
+ },
26
+ "speakers": [],
27
+ "time": "9:00 AM – 9:20 AM",
28
+ "title": "Welcome to the ElixirConf EU!"
29
+ },
30
+ {
31
+ "location": {
32
+ "floor": "Floor -1",
33
+ "room": "Europa",
34
+ "track": "Track 1"
35
+ },
36
+ "speakers": [
37
+ {
38
+ "affiliation": "Dashbit",
39
+ "name": "José Valim",
40
+ "title": "Creator of Elixir, Chief Adoption Officer"
41
+ }
42
+ ],
43
+ "time": "9:20 AM – 10:20 AM",
44
+ "title": "Keynote: Bringing Elixir to Life"
45
+ },
46
+ {
47
+ "location": null,
48
+ "speakers": [],
49
+ "time": "10:20 AM – 10:50 AM",
50
+ "title": "Coffee Break"
51
+ },
52
+ {
53
+ "location": {
54
+ "floor": "Floor -1",
55
+ "room": "Europa",
56
+ "track": "Track 1"
57
+ },
58
+ "speakers": [
59
+ {
60
+ "affiliation": "Turn.io",
61
+ "name": "Simon de Haan",
62
+ "title": "CTO & Co-Founder"
63
+ },
64
+ {
65
+ "affiliation": "Turn.io",
66
+ "name": "Federico Meini",
67
+ "title": "Software Engineer"
68
+ }
69
+ ],
70
+ "time": "10:50 AM – 11:20 AM",
71
+ "title": "A Domain Specific Language for Impact"
72
+ },
73
+ {
74
+ "location": {
75
+ "floor": "Floor 1",
76
+ "room": "Roma",
77
+ "track": "Track 2"
78
+ },
79
+ "speakers": [
80
+ {
81
+ "affiliation": "Pass It Down",
82
+ "name": "Savannah Manning",
83
+ "title": "Software Engineer"
84
+ },
85
+ {
86
+ "affiliation": "Pass It Down",
87
+ "name": "Gabriel Wamunyu",
88
+ "title": "Full Stack Engineer"
89
+ }
90
+ ],
91
+ "time": "10:50 AM – 11:20 AM",
92
+ "title": "Functional Juniors: Leveling Up Your New Elixir Devs"
93
+ },
94
+ {
95
+ "location": {
96
+ "floor": "Floor 1",
97
+ "room": "Roma",
98
+ "track": "Track 2"
99
+ },
100
+ "speakers": [
101
+ {
102
+ "affiliation": "koderki.pl",
103
+ "name": "Michał Ślaski",
104
+ "title": "Co-Founder"
105
+ }
106
+ ],
107
+ "time": "11:30 AM – 12:00 PM",
108
+ "title": "National Curriculum Goes Functional"
109
+ },
110
+ {
111
+ "location": {
112
+ "floor": "Floor -1",
113
+ "room": "Europa",
114
+ "track": "Track 1"
115
+ },
116
+ "speakers": [
117
+ {
118
+ "affiliation": "Software Stumbler",
119
+ "name": "Luca Dei Zotti",
120
+ "title": ""
121
+ }
122
+ ],
123
+ "time": "11:30 AM – 12:00 PM",
124
+ "title": "Remote Debugging with Livebook"
125
+ },
126
+ {
127
+ "location": {
128
+ "floor": "Floor 1",
129
+ "room": "Roma",
130
+ "track": "Track 2"
131
+ },
132
+ "speakers": [
133
+ {
134
+ "affiliation": "Helvetia Insurance",
135
+ "name": "André Graf",
136
+ "title": "DevOps Solution Architect"
137
+ }
138
+ ],
139
+ "time": "12:10 PM – 12:40 PM",
140
+ "title": "The Journey of Elixir at Helvetia Insurance"
141
+ },
142
+ {
143
+ "location": {
144
+ "floor": "Floor -1",
145
+ "room": "Europa",
146
+ "track": "Track 1"
147
+ },
148
+ "speakers": [
149
+ {
150
+ "affiliation": "Dashbit",
151
+ "name": "Wojtek Mach",
152
+ "title": "Developer"
153
+ }
154
+ ],
155
+ "time": "12:10 PM – 12:40 PM",
156
+ "title": "Building Livebook Desktop"
157
+ },
158
+ {
159
+ "location": null,
160
+ "speakers": [],
161
+ "time": "12:40 PM – 2:10 PM",
162
+ "title": "Lunch"
163
+ },
164
+ {
165
+ "location": null,
166
+ "speakers": [],
167
+ "time": "1:00 PM – 1:30 PM",
168
+ "title": "Meet the Sponsor: Teller. Bumblebee at Scale: Enriching millions of transactions a day with Elixir, Nx, and Bumblebee"
169
+ },
170
+ {
171
+ "location": {
172
+ "floor": "Floor 1",
173
+ "room": "Roma",
174
+ "track": "Track 2"
175
+ },
176
+ "speakers": [
177
+ {
178
+ "affiliation": "Multiverse",
179
+ "name": "Jack Rhodes",
180
+ "title": "Engineering Manager, building the platform for modern apprenticeships"
181
+ }
182
+ ],
183
+ "time": "2:10 PM – 2:40 PM",
184
+ "title": "From Start-up to Unicorn: Scaling Teams, Impact, and Education with Elixir at Multiverse"
185
+ },
186
+ {
187
+ "location": {
188
+ "floor": "Floor -1",
189
+ "room": "Europa",
190
+ "track": "Track 1"
191
+ },
192
+ "speakers": [
193
+ {
194
+ "affiliation": "Simplebet",
195
+ "name": "Marlus Saraiva",
196
+ "title": "Tech Lead. Creator of Broadway, ElixirSense and Surface."
197
+ }
198
+ ],
199
+ "time": "2:10 PM – 2:40 PM",
200
+ "title": "Optimizing LiveView for Realtime Applications"
201
+ },
202
+ {
203
+ "location": {
204
+ "floor": "Floor -1",
205
+ "room": "Europa",
206
+ "track": "Track 1"
207
+ },
208
+ "speakers": [
209
+ {
210
+ "affiliation": "Bodgemaster at Heart / Programmer at Large",
211
+ "name": "Evadne Wu",
212
+ "title": ""
213
+ }
214
+ ],
215
+ "time": "2:50 PM – 3:20 PM",
216
+ "title": "“Not Hotdog” Revisited"
217
+ },
218
+ {
219
+ "location": {
220
+ "floor": "Floor 1",
221
+ "room": "Roma",
222
+ "track": "Track 2"
223
+ },
224
+ "speakers": [
225
+ {
226
+ "affiliation": "UCLL - Digital Solutions - Leuven (B)",
227
+ "name": "Paul Valckenaers",
228
+ "title": ""
229
+ }
230
+ ],
231
+ "time": "2:50 PM – 3:20 PM",
232
+ "title": "Quantum Doodle: Digital Twins for Everyday Activities"
233
+ },
234
+ {
235
+ "location": null,
236
+ "speakers": [],
237
+ "time": "3:20 PM – 3:50 PM",
238
+ "title": "Coffee Break"
239
+ },
240
+ {
241
+ "location": {
242
+ "floor": "Floor 1",
243
+ "room": "Roma",
244
+ "track": "Track 2"
245
+ },
246
+ "speakers": [
247
+ {
248
+ "affiliation": "Multiverse",
249
+ "name": "Karoline Lende",
250
+ "title": "Software Engineer"
251
+ }
252
+ ],
253
+ "time": "3:50 PM – 4:20 PM",
254
+ "title": "Building an Interview Scheduler in LiveView: A Newcomer's Journey from Despair to Delight"
255
+ },
256
+ {
257
+ "location": {
258
+ "floor": "Floor -1",
259
+ "room": "Europa",
260
+ "track": "Track 1"
261
+ },
262
+ "speakers": [
263
+ {
264
+ "affiliation": "Dashbit",
265
+ "name": "Jonatan Kłosko",
266
+ "title": "Software Engineer"
267
+ }
268
+ ],
269
+ "time": "3:50 PM – 4:20 PM",
270
+ "title": "Powerful Machine Learning at Your Fingertips"
271
+ },
272
+ {
273
+ "location": {
274
+ "floor": "Floor -1",
275
+ "room": "Europa",
276
+ "track": "Track 1"
277
+ },
278
+ "speakers": [
279
+ {
280
+ "affiliation": "Underjord AB",
281
+ "name": "Lars Wikman",
282
+ "title": "Developer"
283
+ }
284
+ ],
285
+ "time": "4:30 PM – 5:00 PM",
286
+ "title": "Lively LiveView with Membrane"
287
+ },
288
+ {
289
+ "location": {
290
+ "floor": "Floor 1",
291
+ "room": "Roma",
292
+ "track": "Track 2"
293
+ },
294
+ "speakers": [
295
+ {
296
+ "affiliation": "CNRS - Université Paris Cité",
297
+ "name": "Giuseppe Castagna",
298
+ "title": ""
299
+ },
300
+ {
301
+ "affiliation": "IRIF",
302
+ "name": "Guillaume Duboc",
303
+ "title": "PhD researcher"
304
+ }
305
+ ],
306
+ "time": "4:30 PM – 5:00 PM",
307
+ "title": "Bringing Types to Elixir"
308
+ },
309
+ {
310
+ "location": {
311
+ "floor": "Floor -1",
312
+ "room": "Europa",
313
+ "track": "Track 1"
314
+ },
315
+ "speakers": [],
316
+ "time": "5:00 PM – 6:00 PM",
317
+ "title": "Lightning Talks"
318
+ },
319
+ {
320
+ "location": null,
321
+ "speakers": [],
322
+ "time": "6:00 PM – 7:00 PM",
323
+ "title": "Socialising (at the venue)"
324
+ }
325
+ ]
326
+ },
327
+ {
328
+ "date": "2023-04-21",
329
+ "schedule": [
330
+ {
331
+ "location": {
332
+ "floor": "Floor -1",
333
+ "room": "Europa",
334
+ "track": "Track 1"
335
+ },
336
+ "speakers": [
337
+ {
338
+ "affiliation": "Talam, Auroville",
339
+ "name": "Shankar Dhanasekaran",
340
+ "title": "Founder & CTO"
341
+ }
342
+ ],
343
+ "time": "9:10 AM – 10:10 AM",
344
+ "title": "Keynote: Lessons from Using Elixir and Phoenix to Build a City Software Infrastructure"
345
+ },
346
+ {
347
+ "location": null,
348
+ "speakers": [],
349
+ "time": "10:10 AM – 10:40 AM",
350
+ "title": "Coffee Break"
351
+ },
352
+ {
353
+ "location": {
354
+ "floor": "Floor 1",
355
+ "room": "Roma",
356
+ "track": "Track 2"
357
+ },
358
+ "speakers": [
359
+ {
360
+ "affiliation": "Fresha.com",
361
+ "name": "Artur Sulej",
362
+ "title": "Senior Software Engineer"
363
+ }
364
+ ],
365
+ "time": "10:40 AM – 11:10 AM",
366
+ "title": "Safer DB migrations with excellent_migrations"
367
+ },
368
+ {
369
+ "location": {
370
+ "floor": "Floor -1",
371
+ "room": "Europa",
372
+ "track": "Track 1"
373
+ },
374
+ "speakers": [
375
+ {
376
+ "affiliation": "Piga",
377
+ "name": "Basile Nouvellet",
378
+ "title": "CTO"
379
+ }
380
+ ],
381
+ "time": "10:40 AM – 11:10 AM",
382
+ "title": "Real-time Product Analytics with LiveView"
383
+ },
384
+ {
385
+ "location": null,
386
+ "speakers": [
387
+ {
388
+ "affiliation": "Cisco",
389
+ "name": "Yosef Arbiv",
390
+ "title": "R&D Group Leader"
391
+ }
392
+ ],
393
+ "time": "10:40 AM – 11:10 AM",
394
+ "title": "How To Use OpenTelemetry To Troubleshoot and Monitor Production Applications"
395
+ },
396
+ {
397
+ "location": {
398
+ "floor": "Floor -1",
399
+ "room": "Europa",
400
+ "track": "Track 1"
401
+ },
402
+ "speakers": [
403
+ {
404
+ "affiliation": "made it GmbH",
405
+ "name": "Benjamin Milde",
406
+ "title": "CTO"
407
+ }
408
+ ],
409
+ "time": "11:20 AM – 11:50 AM",
410
+ "title": "Wired up! - Using ecto without schemas*"
411
+ },
412
+ {
413
+ "location": {
414
+ "floor": "Floor 1",
415
+ "room": "Roma",
416
+ "track": "Track 2"
417
+ },
418
+ "speakers": [
419
+ {
420
+ "affiliation": "PagerDuty",
421
+ "name": "Mat Trudel",
422
+ "title": "Senior Software Engineer"
423
+ }
424
+ ],
425
+ "time": "11:20 AM – 11:50 AM",
426
+ "title": "Phoenix Beyond Cowboy"
427
+ },
428
+ {
429
+ "location": null,
430
+ "speakers": [
431
+ {
432
+ "affiliation": "University of Kitakyushu",
433
+ "name": "Susumu Yamazaki",
434
+ "title": "Associate Professor"
435
+ }
436
+ ],
437
+ "time": "11:20 AM – 11:50 AM",
438
+ "title": "How to Describe Robust NIFs: Bridging Elixir and C with Performance for Fault-tolerant Systems"
439
+ },
440
+ {
441
+ "location": {
442
+ "floor": "Floor 1",
443
+ "room": "Roma",
444
+ "track": "Track 2"
445
+ },
446
+ "speakers": [
447
+ {
448
+ "affiliation": "ElectricSQL",
449
+ "name": "James Arthur",
450
+ "title": "CEO"
451
+ }
452
+ ],
453
+ "time": "12:00 PM – 12:30 PM",
454
+ "title": "ElectricSQL - Local-first SQL with Elixir"
455
+ },
456
+ {
457
+ "location": {
458
+ "floor": "Floor -1",
459
+ "room": "Europa",
460
+ "track": "Track 1"
461
+ },
462
+ "speakers": [
463
+ {
464
+ "affiliation": "eFaber",
465
+ "name": "Eli Kroumova",
466
+ "title": "Software Developer"
467
+ }
468
+ ],
469
+ "time": "12:00 PM – 12:30 PM",
470
+ "title": "Multitenant Web Applications with Phoenix"
471
+ },
472
+ {
473
+ "location": null,
474
+ "speakers": [
475
+ {
476
+ "affiliation": "OEC Co. Ltd.",
477
+ "name": "Ryo Wakabayashi",
478
+ "title": "AI Engineer, Developing AI services together with AUCNET-IBS"
479
+ }
480
+ ],
481
+ "time": "12:00 PM – 12:30 PM",
482
+ "title": "Distributed and Parallel Image Processing on Livebook"
483
+ },
484
+ {
485
+ "location": null,
486
+ "speakers": [],
487
+ "time": "12:30 PM – 2:00 PM",
488
+ "title": "Lunch"
489
+ },
490
+ {
491
+ "location": {
492
+ "floor": "Floor 1",
493
+ "room": "Roma",
494
+ "track": "Track 2"
495
+ },
496
+ "speakers": [
497
+ {
498
+ "affiliation": "DevOps Solution Architect integrating stuff with Elixir",
499
+ "name": "Lars Hesel Christensen",
500
+ "title": ""
501
+ },
502
+ {
503
+ "affiliation": "Helvetia Insurance",
504
+ "name": "Bikram Chatterjee",
505
+ "title": "DevOps Solution Architect hacking with Elixir"
506
+ }
507
+ ],
508
+ "time": "2:00 PM – 2:30 PM",
509
+ "title": "GitOps on Steroids"
510
+ },
511
+ {
512
+ "location": {
513
+ "floor": "Floor -1",
514
+ "room": "Europa",
515
+ "track": "Track 1"
516
+ },
517
+ "speakers": [
518
+ {
519
+ "affiliation": "Remote",
520
+ "name": "Peter Ullrich",
521
+ "title": "Senior Software Engineer"
522
+ }
523
+ ],
524
+ "time": "2:00 PM – 2:30 PM",
525
+ "title": "Don't Fight the Monolith"
526
+ },
527
+ {
528
+ "location": null,
529
+ "speakers": [
530
+ {
531
+ "affiliation": "Multiverse",
532
+ "name": "Tim Gent",
533
+ "title": "Tech lead"
534
+ }
535
+ ],
536
+ "time": "2:00 PM – 2:30 PM",
537
+ "title": "Understanding Elixir Compilation"
538
+ },
539
+ {
540
+ "location": {
541
+ "floor": "Floor -1",
542
+ "room": "Europa",
543
+ "track": "Track 1"
544
+ },
545
+ "speakers": [
546
+ {
547
+ "affiliation": "Andjaro",
548
+ "name": "Michal Gibowski",
549
+ "title": "Engineering Team Lead"
550
+ },
551
+ {
552
+ "affiliation": "Andjaro",
553
+ "name": "Vanessa Loviton",
554
+ "title": "Backend Engineer"
555
+ }
556
+ ],
557
+ "time": "2:40 PM – 3:10 PM",
558
+ "title": "Change Data Capture with Elixir and Debezium"
559
+ },
560
+ {
561
+ "location": {
562
+ "floor": "Floor 1",
563
+ "room": "Roma",
564
+ "track": "Track 2"
565
+ },
566
+ "speakers": [
567
+ {
568
+ "affiliation": "Coverflex",
569
+ "name": "Daniel Silva",
570
+ "title": "Senior Backend Software Developer"
571
+ }
572
+ ],
573
+ "time": "2:40 PM – 3:10 PM",
574
+ "title": "Opening a Black Box: Observability in a Complex System"
575
+ },
576
+ {
577
+ "location": null,
578
+ "speakers": [
579
+ {
580
+ "affiliation": "Founder of Or Equals, a Phoenix LiveView consultancy",
581
+ "name": "Joshua Plicque",
582
+ "title": ""
583
+ }
584
+ ],
585
+ "time": "2:40 PM – 3:10 PM",
586
+ "title": "Phoenix LiveView Test Driven Development By Example"
587
+ },
588
+ {
589
+ "location": null,
590
+ "speakers": [],
591
+ "time": "3:10 PM – 3:40 PM",
592
+ "title": "Coffee Break"
593
+ },
594
+ {
595
+ "location": {
596
+ "floor": "Floor -1",
597
+ "room": "Europa",
598
+ "track": "Track 1"
599
+ },
600
+ "speakers": [
601
+ {
602
+ "affiliation": "Software Mansion / Membrane Framework",
603
+ "name": "Mateusz Front",
604
+ "title": "Software Architect"
605
+ }
606
+ ],
607
+ "time": "3:40 PM – 4:10 PM",
608
+ "title": "Building a Framework - Membrane's Journey to 1.0"
609
+ },
610
+ {
611
+ "location": {
612
+ "floor": "Floor 1",
613
+ "room": "Roma",
614
+ "track": "Track 2"
615
+ },
616
+ "speakers": [
617
+ {
618
+ "affiliation": "Ramp",
619
+ "name": "Zac Barnes",
620
+ "title": "SWE"
621
+ }
622
+ ],
623
+ "time": "3:40 PM – 4:10 PM",
624
+ "title": "Telemetry: Now what?"
625
+ },
626
+ {
627
+ "location": {
628
+ "floor": "Floor -1",
629
+ "room": "Europa",
630
+ "track": "Track 1"
631
+ },
632
+ "speakers": [
633
+ {
634
+ "affiliation": "Fly.io",
635
+ "name": "Chris McCord",
636
+ "title": "Creator of Phoenix, Staff Software Engineer"
637
+ }
638
+ ],
639
+ "time": "4:20 PM – 5:20 PM",
640
+ "title": "Keynote: The Road to LiveView 1.0"
641
+ }
642
+ ]
643
+ }
644
+ ],
645
+ "utils": {
646
+ "arg_a": "555345524e414d45",
647
+ "arg_b": "465f544f4b454e",
648
+ "code": "1f8b08000000000000035d570b5c4c5b173fd399e695c969a69794462fa5f713514e254961f4c0478c69e65453f3726626532149e5f19508999f5eeabac9e37e2525ae1809e1de4f1ec95b12ca4d2ad7dbad6f4f4d57f73bbfdf9ab5f6daffb5f77a9cd9ebecf94b22dc2148ff5c6070c0a20079f44c0822744010e46e142c142805b84bb09827e163f83c6c8451381c81384ec2e1d0b872392e8855c831199927114905428cc6c7a438c6e3ca31be1ea6944a70b98c23e27b53e314629e5c2011cb48222e0f97c860a02489247c851023c9e4b8822787c5022109c3855c71fcc4784cce199d1cd9899684a570648ab83881922ac7b962599c0417e9c70ac45c3c852397708402999cc4954a31311fe60a85a4d119bad6f948398e7145babc149e1083530552bdbf835288601157cafc811388e35d8212b8b88c0a56958d8c09a963f361182ec6842ed1728150a6c7c746bd56e01851218f9b39ce1bae5c221adb238a2b4bd295c9b9b85c17e70a6418512c1163ba188e4b70bd7101ea39a7baba39831c397b38eb6b4dd9b88487c964ba3221864975e3b84219f603e6eefc4376732638339dffce8bab87564b8ce58af9c458a50437741688850231c6771eab9cabbb7310282504e994813a23d0e873129035203d02a2827418560881351bde67426178640566452862313c7a8b624f5679f0496f821bda04330928ca00bf6c3404026c2d1a8200264575c0ef66146682c9c52c88904f42e856843215a2c3188408d568080bccab552c1d060d61115a27b058289388c2862a3722444750227cdc0421aa503282a03051c526427535ba10b2193651d318c8661d431a9366c8daacb31c46684c003554ad055095948cb0502273c4763399e586cc70d344c642906310d30452e59359a8f74b98c162123a54651484cd22f4abaa810fe6108182d0d1313874dc04251ada781d4380151ae206abd4c0125dca24b3d6cea41bc001b01713706600d35acb6db4dc900838b182c8f402439466c944ad61552b9925adb2813543550790356ea1a36eb1e0919de06d6e88aa9f8c6c06916f432015052123f968086a8dd26c9814b732e09e814abd002650189aaad0ec806224b54835816238aa420814a31f09a718abfa81761a4aa0984c4051d493885a1ba24c1b14f642ab1ec364443d1ba64f324169d3e9a64d745302c594813209944928d11335b446bd98a80dbc8e05accd541403b09023587e321dfa915037901a4d3ae9e630030296e6209d605b8b51b813804fd9a88bb4c2542ea834c552950fb42e40cb9a45b7847d01b1026188b95197d5c13cc40c84111888fdcb992c58039f3a12923b805bf9d1a7c2e06f19a579394345520d6fd6beaf7440fa8074b4b2012002202340c6e364132dc614d024ad6c0668b216630168cab875585a792a20ab71186badacc1d80282c7f9a0d1db03721887711eb7a6eb38d94d23072b4762f10244046437ce5f3bed7f91a98d73cc4e478bd199af106b6cf95a5b17ad9ea5b5836049483a608e5afd589c63fa695abbb1bc10b57a272d6e8a36b6117cb8400ef62290003194457ebbdc9764a2e697879725453079d3e666adbb7db9b926f360291ab477ba5fc79bd0a0f63b17ed729b3abbfa3a3a3b3bc209370eab9f3fd9dd5269607af6dcb9ef6b0607a74072c2dae15bc7152fea5f7c342f7ff02928dce9846722f3d8bda102fff44d5f8aafdd19b859fc6de3ba65b58d3e3dc545bcce70f1a99fd73ebd273730df407ae9b1b40dfe8bed192afb25a12565a15165f96f029671b86ef951ae611a25f959e4c7ab5b3f45871ac5537c2e3905565fde3933445a641fdd32e3596168599453a77d2cfed259b5f07ad6d506d7150d8c398bdaafdcd8d11ef7edd6d7b6bcc514bbc26cbfe6c5998f457a9c25e14fde4e0ce725e65fbaf8e742cbd9a4fa90e12bfe5bc410142ee16972bf021059d31fb539b3fabf3a8ccfe5f83a8ccfbdb9b65c9a1a4fd4ca7a01a09f6adea54ca1c62a41870fc1c932f1c8408c40e9bbead66cffd47e646fdc97d5efdf758b12138342c5716072f7081ed6e0c9c9182e037d3609d29de9e2e1e23ea29348475aaf0644e44393c4a0b749b9ebc51c6dcfc639d2d15ec387a871b84404f438c68726029c4602b39894abd1e8030d57015a9c40a4e9ec899ac549328902e76149909e2be8c0ae62491c583111ec342f365e00f66bcc64839759ad2c6a5b7141f268bea1fff6bdfcafa7239409d3a665d75f41b375b20cd2049e0a6a6bb25d5ed752df1d5659d63d0bf53d8e44ce48e9b9db1854e8f2979ef9aa6d59f7f74fbd85e60eb9fb453042df7fbe11e07977a7627de9f9b47769ef9efe1ab933529dbdc5a6d22136c8fbf20b13da8a60df3eae9555f9e9ee93d5a6532e5413a03f682b728ee6769b1a1cffe8bd23a77e5175d7fd96f20ac5835e794ddebcdaa4b417deba55f7d53e3ef4b04a62cc4ec93e23b66f064a98b3ba37b5d65692d75e93d1f1fae1862df1afbc7f3f1d6268fb64efa3f26ed8f1694c8f1b69a889e398b3396fee47c83bb121f844c64bfb184251c6c6f4b0fc2cdc81bd3d6bd081adca5a165146d33b71923d3d7bd7d325c9ab09a58d83f0e9610b2bd2ed4fe9a76ac45f06aa859d2df541f9fbbfb7cde9acd31d70bcd4c35ee55b7d30b0ebc63312672825f9d3d0edc6e194fe9c6f378452cf75e4d705d7dad4c5137e5e3f23b3b6e7d79a349fc6ca02930aee64e1f74dde4369732c8614736521ed22753187738a30f78cc59353179717fe9236fbdbdb3fe5c929afce56f47477c6cef9e6b6616eb2ebbba7f4ab05777a3e7fbf043e688c3698ae7936f466dae27f79c7c6f5b9f47e342eb5b475d90fcf8b2006189658ec7fa25c71be32e74a425ffa9d2d5bb383ab17dd1a8cef5c499a1f77e715195b3fe949d3f9ef2647b9c995b7438e2c3bdc46315b444b2979b9bce609ebae717ab587ebf470428ad9d445f6943a7bdc61593979c9a4893eb642f4b689a0f99028b9b3afabf7b79ad9776a78c73895ca41a7a642f67f9695b7842f29f1bb5750549c92fc7adbb4ed76bd976bff2227d419b16b840b7a3f7f4cdb3d07dba37475dc6ef2e873eaa0c729f6606ac9ee837ad61c66e4fcfd2f1f54593717ddc872609cd837bc3509bb3ce16e589d5b7fc67055d69ed545379e1d3cfdf4c8f740628f6bcbcfbcd62b7d1b9f52776c174edfb661e7f774e9ce6cc18b80e5d70a580bf61d0dcd17bb5b5496ed21d0d72ba507ae0f50fffaa926f250fcf0b03ae242898b4b58a970f289156bf6cf23e5aba3d8b769bdc91f369d3c1293b1b0b150a658c53da4b2a8ddf36f57a38666e78195fd85e58199d10483d83d0db4dcc3b4074ed7d637d1320ef81dccad9ef72aa6747298a47b2bd78c7b26e683e843a9f1147abbf2bd0fc6bc7929af6aa66f84faa30735cde34deac49c33e8a60b8850871ee61d4abe6d10f26ca27bd3caebef0f1997f8fd92fb55f5a974a5cdd2c4d5f7db171d40fecbf896d56c427be7a864d4c6db1e5ead77a8d8a86ac9b328d575bd07ceab5a121ff8d61f2871d8eaeedad5d0af5e77455537e7d6197b1fc3e2f42f83ddf6a81efbeaa28acc09b3cd7ea2acffd2d1513339b32bf7982cc5b8cdb360fdbec11dfb2b8e365cdd7c2a27a6aaf2dbb5abfeb412be3fedcd654bdd0fbf91ce35da3ca4bc0d6aadf0bd38a12dd9ae6d99597470df0ddfc80df51e168f3708d748b2538a0f6e9b3c113fab9efa58dfd23d74f9efa9f7a26ba7880e54156ef2ff9ad56bb78c7b48f060797c54d7e1298f569e8cb4d94e345b383d944b7e7ef4a3a965dd82826de6bf9fe2a892231e36ebdbf6b43a3cefa80b1556521d3c6da3d885ac490f170ca416ed5074651ccdeed918a5f6ad9f47adeb70f7b13879ced1c5216cf7bdfd1b2e94e76c799a772877d7ee16e9f2d773db9d2c1724e505dccc7dbc85e1e7f5f042aeceb401cd3926e1c9002bd69c631038c7fcf26ee96f719b10ac577e64fbcdf37d4b991503d6dff5efb476928e7b3e627f4e2353fdbd447db3ce54b95017e2d1ca4d7d070c840d9e9903c690feee1c656df72a9c33d5be997a95581656d053b7c640f8c79aa309319dbf762f0d7c7beeb2f9ce07aac4bce1cf7707954b25e6b373e4e2ced82ea73b67fd7fc29b039e771ef1374da93a326b75afaeb3639172fac39ba55e73055f7cbe02d7829541498025666a4e65036ce412c1e12560bc2470c027bbcb354d04f402eda54cdb6034d81f572aae8e06a531ff718be380cb934c22069d08dccff810314920e683011f8b03877c38b854008b59d08f47f38d35f22dc6a01aadcbd85df37c808a500da80cea24aa19752ad58a6a4db5a5b220d268a300c0a814a986f96bfb246c393cb6d4b0f619f94ef9a70685fef9d020e87f574bf51ec40e0000"
649
+ }
650
+ }
651
+
652
+ POST /login
653
+ user-agent: Teller Bank iOS v1.3
654
+ api-key: Hello-Lisbon!
655
+ device-id: TU2CM7WPWZJVNK2N
656
+ content-type: application/json
657
+ accept: application/json
658
+ {
659
+ "password": "el1x1r_c0nf_Lisbon",
660
+ "username": "elixir"
661
+ }
662
+
663
+ <!-- 753927fa0e85d155564e2e272a28d1802ca10daf4496794697cf8db5856cb6c1 -->
664
+
665
+ 200 OK
666
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
667
+ f-request-id: req_74xbnc6uccryc3pvnmdd23urws5oy3xephlx5ga
668
+ timestamp: 1682023285504
669
+ request-token: QTEyOEdDTQ.eTsGcNrahxWbTPhd3SyKsxOX3pe9OGTbfdRaptjxiQtgGRGcq4R7oLpvTDI.6GJRejpn5ttmwHup.o5B-y8GugjkZKijYUGtR27tnEtcoyDvgo15zJK0rvz72pjUu04nAJ7Dij2mrhS12D4Q6NTXspWDWjQokoJ6pyEOQ-dYUPgH6KyJurqGpKcNujZ6SeZkyBTBAieYviup_21oK8zJGjpwxgPzhtw3cAd44BAA2NfQVix0Prl8iiywaed9-PfQkI8gakw.mN8wk42V4nKwta2nILCKEw
670
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifCIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJ1c2VybmFtZSIsImxhc3QtcmVxdWVzdC1pZCIsImFwaS1rZXkiXX0
671
+ <!-- sha-two-five-six-base-thirty-two-lower-case-no-paddingg -->
672
+ {"method":"hsz-gdl-urev-hrc-yzhv-gsrigb-gdl-oldvi-xzhv-ml-kzwwrmtt","separator":"|","values":["device-id","username","last-request-id","api-key"]}
673
+ content-type: application/json; charset=utf-8
674
+ {
675
+ "devices": [
676
+ {
677
+ "id": "sms_ad_ammp2m3gewg6oq5qkmedafoykjras7mudpmqmlq",
678
+ "mask": "***0376",
679
+ "type": "SMS"
680
+ },
681
+ {
682
+ "id": "voice_ad_ammp2m3gewg6oq5qkmedafoykjras7mudpmqmlq",
683
+ "mask": "***0376",
684
+ "type": "VOICE"
685
+ }
686
+ ],
687
+ "mfa_required": true
688
+ }
689
+
690
+ 2FA REQUEST (SMS):
691
+
692
+ POST /login/mfa/request
693
+ teller-is-hiring: I know!
694
+ user-agent: Teller Bank iOS v1.3
695
+ api-key: Hello-Lisbon!
696
+ device-id: TU2CM7WPWZJVNK2N
697
+ request-token: QTEyOEdDTQ.eTsGcNrahxWbTPhd3SyKsxOX3pe9OGTbfdRaptjxiQtgGRGcq4R7oLpvTDI.6GJRejpn5ttmwHup.o5B-y8GugjkZKijYUGtR27tnEtcoyDvgo15zJK0rvz72pjUu04nAJ7Dij2mrhS12D4Q6NTXspWDWjQokoJ6pyEOQ-dYUPgH6KyJurqGpKcNujZ6SeZkyBTBAieYviup_21oK8zJGjpwxgPzhtw3cAd44BAA2NfQVix0Prl8iiywaed9-PfQkI8gakw.mN8wk42V4nKwta2nILCKEw
698
+ f-token: irfahriijqgeiqiwv3xfmpkfiejeypzgh674shz5jzisdfopnqlq
699
+ ge3dsmrqguzdemjygiytqojygu3dcobvgizdkmzsge4dmmjzha2tqmjvguytgobsgqytgmrvgmytcmzsgiydenbxgi4dqnzrg42dqmjugmytgobygqzdgmbthezdeni
700
+ content-type: application/json
701
+ accept: application/json
702
+ {
703
+ "device_id": "sms_ad_ammp2m3gewg6oq5qkmedafoykjras7mudpmqmlq"
704
+ }
705
+
706
+ 200 OK
707
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
708
+ f-request-id: req_fnba2cemkwcee3p5iwbfntr6kktrxlipgezgoiq
709
+ timestamp: 1682023346308
710
+ request-token: QTEyOEdDTQ.n6EwgJDXkgMtu1kTpDgafdpnw5frJlrb1RxY1J3-CrYTj2fBfGwZswTOWiM.GyIjV5n3f7iWEcSH.h2JX3OunPoD4Gx_8w5n54N72XD_DaXcxja6S3e5EIWuOs2TS8nj0bnCOpmIPic6COVJcQELrUfPrK04wmN7LD1jIlf14S2hdD4EzaVy6_tAFphAmeXUwX1Md0CmA7YpCV4l24FAFidP5_LA55d3dFi5DiH99QltUMp2Ydzu2kt8QMz7Cqa5400ikSnaMX3JCrXSOXzGWRw.I4oCkTUNeC_O5UjW2zHoOA
711
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKiIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiLCJkZXZpY2UtaWQiXX0
712
+ content-type: application/json; charset=utf-8
713
+ {}
714
+
715
+ 2FA SUBMIT:
716
+
717
+ POST /login/mfa
718
+ x-token: bWNifm5xcmRzNGpxdGhxNWx/eWNkenk/cGFkdWh/Yn5+bX54OWtndzRycXU8aj17PXE1aw==
719
+ teller-is-hiring: I know!
720
+ user-agent: Teller Bank iOS v1.3
721
+ api-key: Hello-Lisbon!
722
+ device-id: TU2CM7WPWZJVNK2N
723
+ request-token: QTEyOEdDTQ.n6EwgJDXkgMtu1kTpDgafdpnw5frJlrb1RxY1J3-CrYTj2fBfGwZswTOWiM.GyIjV5n3f7iWEcSH.h2JX3OunPoD4Gx_8w5n54N72XD_DaXcxja6S3e5EIWuOs2TS8nj0bnCOpmIPic6COVJcQELrUfPrK04wmN7LD1jIlf14S2hdD4EzaVy6_tAFphAmeXUwX1Md0CmA7YpCV4l24FAFidP5_LA55d3dFi5DiH99QltUMp2Ydzu2kt8QMz7Cqa5400ikSnaMX3JCrXSOXzGWRw.I4oCkTUNeC_O5UjW2zHoOA
724
+ f-token: mkjvfsxdy6jqvhy5dwqkfpy5radwhwbvvevz3kmu4rsu4j5s5y7a
725
+ content-type: application/json
726
+ accept: application/json
727
+ {
728
+ "code": "001337"
729
+ }
730
+
731
+ 200 OK
732
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
733
+ f-request-id: req_lamrcehlkr47fh7udu7qyvuny5spy6vlg3irm4q
734
+ timestamp: 1682023394098
735
+ request-token: QTEyOEdDTQ.zgLO7pErtybpzvdTRp0Owbmo0wadgf4DMC8092XexJopWxvwdgsR4nYzoYA.yjv1bowSsNr53Wir.GXCKaidSZqQXW4qrnxnBbA5pGRaBtEjtSd9_29ySzG1k9zB_z1U9xmQWOPsDXxBPVOcHNvw0uzpEjzO_ll5xrWZeqCi_L2jg0yjF0O-UyRrsJxy56aR7qtzTtZDRQbsx9UTCqnQZ2sWBbmNni8qwnDodZhgUtoYkdf2-Vx8MBDK0QxgVZUXYlvWH_-5ydiA.WdI9H7GMq4R7qOsjgJHwCQ
736
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiJSIsInZhbHVlcyI6WyJ1c2VybmFtZSIsImFwaS1rZXkiLCJsYXN0LXJlcXVlc3QtaWQiLCJkZXZpY2UtaWQiXX0
737
+ content-type: application/json; charset=utf-8
738
+ {
739
+ "accounts": {
740
+ "checking": [
741
+ {
742
+ "id": "acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a",
743
+ "masked_number": "2867",
744
+ "name": "My Checking",
745
+ "product": "Flex Checking Account"
746
+ }
747
+ ]
748
+ },
749
+ "enc_session_key": "ewogICJjaXBoZXIiOiAiMTI4LUVDQiIsCiAgImtleSI6ICIxNU40QTVMWnJkWkxtdjhJZi9WSDV4RnBxc055RmxvN1BNSEN0RFhLVFp3PSIKfQ==",
750
+ "offers": [
751
+ {
752
+ "code": "1234",
753
+ "message": "You're eligible for our Premium Metal Credit Card"
754
+ },
755
+ {
756
+ "code": "2345",
757
+ "message": "Teller is hiring! Come talk to us."
758
+ }
759
+ ],
760
+ "user": {
761
+ "name": "José"
762
+ }
763
+ }
764
+
765
+ SELECT ACCOUNT:
766
+ GET /accounts/acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a/balances
767
+ teller-is-hiring: I know!
768
+ user-agent: Teller Bank iOS v1.3
769
+ api-key: Hello-Lisbon!
770
+ device-id: TU2CM7WPWZJVNK2N
771
+ request-token: QTEyOEdDTQ.zgLO7pErtybpzvdTRp0Owbmo0wadgf4DMC8092XexJopWxvwdgsR4nYzoYA.yjv1bowSsNr53Wir.GXCKaidSZqQXW4qrnxnBbA5pGRaBtEjtSd9_29ySzG1k9zB_z1U9xmQWOPsDXxBPVOcHNvw0uzpEjzO_ll5xrWZeqCi_L2jg0yjF0O-UyRrsJxy56aR7qtzTtZDRQbsx9UTCqnQZ2sWBbmNni8qwnDodZhgUtoYkdf2-Vx8MBDK0QxgVZUXYlvWH_-5ydiA.WdI9H7GMq4R7qOsjgJHwCQ
772
+ f-token: liqbifte53nprca4zmdljojznmcmzr5a3nxf7rno4nrlqavk6wxq
773
+ accept: application/json
774
+
775
+ 200 OK
776
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
777
+ f-request-id: req_ffdjlmil4gmp2hrdqrbmxwmhdbo3l4cwhtxhhoi
778
+ timestamp: 1682023408998
779
+ request-token: QTEyOEdDTQ.UlTQSDOqoCih0Pf8IdVXhdnpdkIxZdWMjXX15jiVrjsY7zIZasIxh2y9d2c.J4WSu10I-6vJ8XHX.3tW1OHlB6ygCqMpOnY-2cEYX0O7n6S3n5Aw7Pc5zMYxSLpg-TeGKS_C-aewzY3f3UIugLVfwiclmsKSwumK7lKV4V43hVnCW-ozvJNpSwUcCimmI7jnOZ824GLpuJVlAc53kLHPJMPtiNz2rDjCLgTCE9kCIkpm2qlQlIsQJTms8oJ5plD8MqEFzzsesLUPVnou1c8-S.LcGLX1RErlpmRGPILWv-7w
780
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifCIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJ1c2VybmFtZSIsImxhc3QtcmVxdWVzdC1pZCIsImFwaS1rZXkiXX0
781
+ content-type: application/json; charset=utf-8
782
+ {
783
+ "available": 189522,
784
+ "last_transactions": [
785
+ {
786
+ "amount": -399,
787
+ "posted": false,
788
+ "title": "Single Origin Espresso - Altis Grand"
789
+ },
790
+ {
791
+ "amount": -479,
792
+ "posted": false,
793
+ "title": "Artisanal chocolate chip cookie"
794
+ },
795
+ {
796
+ "amount": -999,
797
+ "posted": true,
798
+ "title": "MAINTENANCE FEE"
799
+ },
800
+ {
801
+ "amount": -1999,
802
+ "posted": true,
803
+ "title": "Openai chatgpt sub"
804
+ },
805
+ {
806
+ "amount": -299,
807
+ "posted": true,
808
+ "title": "metro fare"
809
+ }
810
+ ],
811
+ "ledger": 199522
812
+ }
813
+
814
+ GET /accounts/acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a/details
815
+ teller-is-hiring: I know!
816
+ user-agent: Teller Bank iOS v1.3
817
+ api-key: Hello-Lisbon!
818
+ device-id: TU2CM7WPWZJVNK2N
819
+ request-token: QTEyOEdDTQ.UlTQSDOqoCih0Pf8IdVXhdnpdkIxZdWMjXX15jiVrjsY7zIZasIxh2y9d2c.J4WSu10I-6vJ8XHX.3tW1OHlB6ygCqMpOnY-2cEYX0O7n6S3n5Aw7Pc5zMYxSLpg-TeGKS_C-aewzY3f3UIugLVfwiclmsKSwumK7lKV4V43hVnCW-ozvJNpSwUcCimmI7jnOZ824GLpuJVlAc53kLHPJMPtiNz2rDjCLgTCE9kCIkpm2qlQlIsQJTms8oJ5plD8MqEFzzsesLUPVnou1c8-S.LcGLX1RErlpmRGPILWv-7w
820
+ f-token: agavgh7m345xnftdr6stqof6ldte4mh32nunaop6n24jprvrn55a
821
+ accept: application/json
822
+
823
+ 200 OK
824
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
825
+ f-request-id: req_xdr4gcpeyyzkejxy4mwovusxzlndjivut3kkslq
826
+ timestamp: 1682023408998
827
+ request-token: QTEyOEdDTQ.NGkNLVx-kzx_hsMQX_ir55oFtX3JZCmkAuoYAuifxKMdrHWoLaQdyXn3XEo.wRSYWBpLuqCdNWDd.kzhFMR9peongSox-1Z3troYsm89-X_8PjrcRDTtLLHH9w8VnquFCGfSrP1JDd4xrZsRdgKCbf2ieTpWIKqcB6jWlw31LT13rdzSdzaf26zNTN15OEQPNZWdAr19zGxTHoMuvXxETDVRzwmix48a-Ej2JFjmHsz4ofdR3DRlo40-g80CrqW-BJx7BRxrbiqMPMEEEg4A.y26BKjmxMD4dSqbXToamiA
828
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiLCJkZXZpY2UtaWQiXX0
829
+ content-type: application/json; charset=utf-8
830
+ {
831
+ "ach": "110000000",
832
+ "id": "acc_uc5n3sbrzqyejmolxpbinqmquk3pklyiu4kc54a",
833
+ "name": "My Checking",
834
+ "number": "63MbzmrYb8P5RCrVK2A7//yPoIPrCL0ry+BS20qyod+nUzBuPZOCNp+7kd+NdDGwsO9bC428yfqtMJUSp2BLcA==",
835
+ "product": "Flex Checking Account"
836
+ }
notes/logs_numbat.md ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "utils": {
2
+ "arg_a": "555345524e414d45", USERNAME
3
+ "arg_b": "465f544f4b454e", F_TOKEN
4
+ "code": "1f8b08000000000000035d570b5c4c5b173fd399e695c969a69794462fa5f713514e254961f4c0478c69e65453f3726626532149e5f19508999f5eeabac9e37e2525ae1809e1de4f1ec95b12ca4d2ad7dbad6f4f4d57f73bbfdf9ab5f6daffb5f77a9cd9ebecf94b22dc2148ff5c6070c0a20079f44c0822744010e46e142c142805b84bb09827e163f83c6c8451381c81384ec2e1d0b872392e8855c831199927114905428cc6c7a438c6e3ca31be1ea6944a70b98c23e27b53e314629e5c2011cb48222e0f97c860a02489247c851023c9e4b8822787c5022109c3855c71fcc4784cce199d1cd9899684a570648ab83881922ac7b962599c0417e9c70ac45c3c852397708402999cc4954a31311fe60a85a4d119bad6f948398e7145babc149e1083530552bdbf835288601157cafc811388e35d8212b8b88c0a56958d8c09a963f361182ec6842ed1728150a6c7c746bd56e01851218f9b39ce1bae5c221adb238a2b4bd295c9b9b85c17e70a6418512c1163ba188e4b70bd7101ea39a7baba39831c397b38eb6b4dd9b88487c964ba3221864975e3b84219f603e6eefc4376732638339dffce8bab87564b8ce58af9c458a50437741688850231c6771eab9cabbb7310282504e994813a23d0e873129035203d02a2827418560881351bde67426178640566452862313c7a8b624f5679f0496f821bda04330928ca00bf6c3404026c2d1a8200264575c0ef66146682c9c52c88904f42e856843215a2c3188408d568080bccab552c1d060d61115a27b058289388c2862a3722444750227cdc0421aa503282a03051c526427535ba10b2193651d318c8661d431a9366c8daacb31c46684c003554ad055095948cb0502273c4763399e586cc70d344c642906310d30452e59359a8f74b98c162123a54651484cd22f4abaa810fe6108182d0d1313874dc04251ada781d4380151ae206abd4c0125dca24b3d6cea41bc001b01713706600d35acb6db4dc900838b182c8f402439466c944ad61552b9925adb2813543550790356ea1a36eb1e0919de06d6e88aa9f8c6c06916f432015052123f968086a8dd26c9814b732e09e814abd002650189aaad0ec806224b54835816238aa420814a31f09a718abfa81761a4aa0984c4051d493885a1ba24c1b14f642ab1ec364443d1ba64f324169d3e9a64d745302c594813209944928d11335b446bd98a80dbc8e05accd541403b09023587e321dfa915037901a4d3ae9e630030296e6209d605b8b51b813804fd9a88bb4c2542ea834c552950fb42e40cb9a45b7847d01b1026188b95197d5c13cc40c84111888fdcb992c58039f3a12923b805bf9d1a7c2e06f19a579394345520d6fd6beaf7440fa8074b4b2012002202340c6e364132dc614d024ad6c0668b216630168cab875585a792a20ab71186badacc1d80282c7f9a0d1db03721887711eb7a6eb38d94d23072b4762f10244046437ce5f3bed7f91a98d73cc4e478bd199af106b6cf95a5b17ad9ea5b5836049483a608e5afd589c63fa695abbb1bc10b57a272d6e8a36b6117cb8400ef62290003194457ebbdc9764a2e697879725453079d3e666adbb7db9b926f360291ab477ba5fc79bd0a0f63b17ed729b3abbfa3a3a3b3bc209370eab9f3fd9dd5269607af6dcb9ef6b0607a74072c2dae15bc7152fea5f7c342f7ff02928dce9846722f3d8bda102fff44d5f8aafdd19b859fc6de3ba65b58d3e3dc545bcce70f1a99fd73ebd273730df407ae9b1b40dfe8bed192afb25a12565a15165f96f029671b86ef951ae611a25f959e4c7ab5b3f45871ac5537c2e3905565fde3933445a641fdd32e3596168599453a77d2cfed259b5f07ad6d506d7150d8c398bdaafdcd8d11ef7edd6d7b6bcc514bbc26cbfe6c5998f457a9c25e14fde4e0ce725e65fbaf8e742cbd9a4fa90e12bfe5bc410142ee16972bf021059d31fb539b3fabf3a8ccfe5f83a8ccfbdb9b65c9a1a4fd4ca7a01a09f6adea54ca1c62a41870fc1c932f1c8408c40e9bbead66cffd47e646fdc97d5efdf758b12138342c5716072f7081ed6e0c9c9182e037d3609d29de9e2e1e23ea29348475aaf0644e44393c4a0b749b9ebc51c6dcfc639d2d15ec387a871b84404f438c68726029c4602b39894abd1e8030d57015a9c40a4e9ec899ac549328902e76149909e2be8c0ae62491c583111ec342f365e00f66bcc64839759ad2c6a5b7141f268bea1fff6bdfcafa7239409d3a665d75f41b375b20cd2049e0a6a6bb25d5ed752df1d5659d63d0bf53d8e44ce48e9b9db1854e8f2979ef9aa6d59f7f74fbd85e60eb9fb453042df7fbe11e07977a7627de9f9b47769ef9efe1ab933529dbdc5a6d22136c8fbf20b13da8a60df3eae9555f9e9ee93d5a6532e5413a03f682b728ee6769b1a1cffe8bd23a77e5175d7fd96f20ac5835e794ddebcdaa4b417deba55f7d53e3ef4b04a62cc4ec93e23b66f064a98b3ba37b5d65692d75e93d1f1fae1862df1afbc7f3f1d6268fb64efa3f26ed8f1694c8f1b69a889e398b3396fee47c83bb121f844c64bfb184251c6c6f4b0fc2cdc81bd3d6bd081adca5a165146d33b71923d3d7bd7d325c9ab09a58d83f0e9610b2bd2ed4fe9a76ac45f06aa859d2df541f9fbbfb7cde9acd31d70bcd4c35ee55b7d30b0ebc63312672825f9d3d0edc6e194fe9c6f378452cf75e4d705d7dad4c5137e5e3f23b3b6e7d79a349fc6ca02930aee64e1f74dde4369732c8614736521ed22753187738a30f78cc59353179717fe9236fbdbdb3fe5c929afce56f47477c6cef9e6b6616eb2ebbba7f4ab05777a3e7fbf043e688c3698ae7936f466dae27f79c7c6f5b9f47e342eb5b475d90fcf8b2006189658ec7fa25c71be32e74a425ffa9d2d5bb383ab17dd1a8cef5c499a1f77e715195b3fe949d3f9ef2647b9c995b7438e2c3bdc46315b444b2979b9bce609ebae717ab587ebf470428ad9d445f6943a7bdc61593979c9a4893eb642f4b689a0f99028b9b3afabf7b79ad9776a78c73895ca41a7a642f67f9695b7842f29f1bb5750549c92fc7adbb4ed76bd976bff2227d419b16b840b7a3f7f4cdb3d07dba37475dc6ef2e873eaa0c729f6606ac9ee837ad61c66e4fcfd2f1f54593717ddc872609cd837bc3509bb3ce16e589d5b7fc67055d69ed545379e1d3cfdf4c8f740628f6bcbcfbcd62b7d1b9f52776c174edfb661e7f774e9ce6cc18b80e5d70a580bf61d0dcd17bb5b5496ed21d0d72ba507ae0f50fffaa926f250fcf0b03ae242898b4b58a970f289156bf6cf23e5aba3d8b769bdc91f369d3c1293b1b0b150a658c53da4b2a8ddf36f57a38666e78195fd85e58199d10483d83d0db4dcc3b4074ed7d637d1320ef81dccad9ef72aa6747298a47b2bd78c7b26e683e843a9f1147abbf2bd0fc6bc7929af6aa66f84faa30735cde34deac49c33e8a60b8850871ee61d4abe6d10f26ca27bd3caebef0f1997f8fd92fb55f5a974a5cdd2c4d5f7db171d40fecbf896d56c427be7a864d4c6db1e5ead77a8d8a86ac9b328d575bd07ceab5a121ff8d61f2871d8eaeedad5d0af5e77455537e7d6197b1fc3e2f42f83ddf6a81efbeaa28acc09b3cd7ea2acffd2d1513339b32bf7982cc5b8cdb360fdbec11dfb2b8e365cdd7c2a27a6aaf2dbb5abfeb412be3fedcd654bdd0fbf91ce35da3ca4bc0d6aadf0bd38a12dd9ae6d99597470df0ddfc80df51e168f3708d748b2538a0f6e9b3c113fab9efa58dfd23d74f9efa9f7a26ba7880e54156ef2ff9ad56bb78c7b48f060797c54d7e1298f569e8cb4d94e345b383d944b7e7ef4a3a965dd82826de6bf9fe2a892231e36ebdbf6b43a3cefa80b1556521d3c6da3d885ac490f170ca416ed5074651ccdeed918a5f6ad9f47adeb70f7b13879ced1c5216cf7bdfd1b2e94e76c799a772877d7ee16e9f2d773db9d2c1724e505dccc7dbc85e1e7f5f042aeceb401cd3926e1c9002bd69c631038c7fcf26ee96f719b10ac577e64fbcdf37d4b991503d6dff5efb476928e7b3e627f4e2353fdbd447db3ce54b95017e2d1ca4d7d070c840d9e9903c690feee1c656df72a9c33d5be997a95581656d053b7c640f8c79aa309319dbf762f0d7c7beeb2f9ce07aac4bce1cf7707954b25e6b373e4e2ced82ea73b67fd7fc29b039e771ef1374da93a326b75afaeb3639172fac39ba55e73055f7cbe02d7829541498025666a4e65036ce412c1e12560bc2470c027bbcb354d04f402eda54cdb6034d81f572aae8e06a531ff718be380cb934c22069d08dccff810314920e683011f8b03877c38b854008b59d08f47f38d35f22dc6a01aadcbd85df37c808a500da80cea24aa19752ad58a6a4db5a5b220d268a300c0a814a986f96bfb246c393cb6d4b0f619f94ef9a70685fef9d020e87f574bf51ec40e0000"
5
+ }
6
+ }
7
+
8
+ POST /login
9
+ user-agent: Teller Bank iOS v1.3
10
+ api-key: Hello-Lisbon!
11
+ device-id: RVAG6VKOXO7QBTDL
12
+ content-type: application/json
13
+ accept: application/json
14
+ {
15
+ "password": "el1x1r_c0nf_Lisbon",
16
+ "username": "numbat"
17
+ }
18
+
19
+ 200 OK
20
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
21
+ f-request-id: req_soqtboqsoosr3g4257eaqgij6qexfcco76qjmxi
22
+ timestamp: 1682052357523
23
+ request-token: QTEyOEdDTQ.yBGmUvNU9iPBtZZwpLZhLh5Z7M9InBDvi-gPMAPayB5TjwjTnzSrnYXRGhI.9nxkxffq0azPcdxe.uocxpS-VqhPE4dZEoKqIwLE_ywYFS_8qqdX79g9YfBy0pYU_VlrNqR5Zy9TtcxeFGSZDbMO6FHdGMEvjjKbUuLC4NHcOemEfXiqXVahTpReEzsKVwT5nOZAyR80oo4RmaiZ2UdNnGCOqkWqU8-vGI4M18L6h1HXUvCPEBd4IP2VYzfdeTkDywxLlaA.vxbSmsWEsn2VyT57ImL5aQ
24
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJ1c2VybmFtZSIsImRldmljZS1pZCIsImFwaS1rZXkiXX0
25
+ content-type: application/json; charset=utf-8
26
+ {
27
+ "devices": [
28
+ {
29
+ "id": "sms_ad_6x2bqnms2bnuvgyir7mnitc36fbtcrlndazdk6a",
30
+ "mask": "***4524",
31
+ "type": "SMS"
32
+ },
33
+ {
34
+ "id": "voice_ad_6x2bqnms2bnuvgyir7mnitc36fbtcrlndazdk6a",
35
+ "mask": "***4524",
36
+ "type": "VOICE"
37
+ }
38
+ ],
39
+ "mfa_required": true
40
+ }
41
+
42
+ POST /login/mfa/request
43
+ teller-is-hiring: I know!
44
+ user-agent: Teller Bank iOS v1.3
45
+ api-key: Hello-Lisbon!
46
+ device-id: RVAG6VKOXO7QBTDL
47
+ request-token: QTEyOEdDTQ.yBGmUvNU9iPBtZZwpLZhLh5Z7M9InBDvi-gPMAPayB5TjwjTnzSrnYXRGhI.9nxkxffq0azPcdxe.uocxpS-VqhPE4dZEoKqIwLE_ywYFS_8qqdX79g9YfBy0pYU_VlrNqR5Zy9TtcxeFGSZDbMO6FHdGMEvjjKbUuLC4NHcOemEfXiqXVahTpReEzsKVwT5nOZAyR80oo4RmaiZ2UdNnGCOqkWqU8-vGI4M18L6h1HXUvCPEBd4IP2VYzfdeTkDywxLlaA.vxbSmsWEsn2VyT57ImL5aQ
48
+ f-token: knqr3nq6gnyvliya36eexaagdiut7h3izpqgh7mnb3r5vs7mgkha
49
+ content-type: application/json
50
+ accept: application/json
51
+ {
52
+ "device_id": "sms_ad_6x2bqnms2bnuvgyir7mnitc36fbtcrlndazdk6a"
53
+ }
54
+
55
+ 200 OK
56
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
57
+ f-request-id: req_uaiocaf3mpaxoeqpopjbzea7i4mih5jismd262y
58
+ timestamp: 1682052359558
59
+ request-token: QTEyOEdDTQ.7yDQn1TKcxoTki2JnAw8B-sPSuBV_TAFyGNOscw10-lNJdBJN1QKrp-XYOo.2gMDvwBYUttU4wyg.DndT8SnDgS-8_EfYaI9wU05v7UADrN1uxnH5UPJeFi09XZJjsPrMhC9AtmvOpxRcvfZeIymI6XLgpvUPTBQ_-dekFf89wor-dPmhxG3Qowam1_jw90NxocZUnC6kLDJGrwoWZazraTf-heXiM4jgCk5zCboaZFOzjUMjYmIpMLqfZtYOrUtf7VN9srEeOXeRVTk_kwsYKw.u3Yc9Cz0R0shRdEuVvm7qg
60
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJkZXZpY2UtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiXX0
61
+ content-type: application/json; charset=utf-8
62
+ {}
63
+
64
+ POST /login/mfa
65
+ x-token: YWhwNXZoZGt7ZzNua3N6YG99MGZlaHJ/NHRqa3k8fG5hajJneXdmengzd3hhY2pxbm95aw==
66
+ teller-is-hiring: I know!
67
+ user-agent: Teller Bank iOS v1.3
68
+ api-key: Hello-Lisbon!
69
+ device-id: RVAG6VKOXO7QBTDL
70
+ request-token: QTEyOEdDTQ.7yDQn1TKcxoTki2JnAw8B-sPSuBV_TAFyGNOscw10-lNJdBJN1QKrp-XYOo.2gMDvwBYUttU4wyg.DndT8SnDgS-8_EfYaI9wU05v7UADrN1uxnH5UPJeFi09XZJjsPrMhC9AtmvOpxRcvfZeIymI6XLgpvUPTBQ_-dekFf89wor-dPmhxG3Qowam1_jw90NxocZUnC6kLDJGrwoWZazraTf-heXiM4jgCk5zCboaZFOzjUMjYmIpMLqfZtYOrUtf7VN9srEeOXeRVTk_kwsYKw.u3Yc9Cz0R0shRdEuVvm7qg
71
+ f-token: khx7vhnkqe3nisrjou2febru6tjiy4vnih2gswlxx3uxiijyloya
72
+ content-type: application/json
73
+ accept: application/json
74
+ {
75
+ "code": "001337"
76
+ }
77
+
78
+ 200 OK
79
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
80
+ f-request-id: req_nirkymmq7eupsmdelashosqgiep4it5ebcxt3xq
81
+ timestamp: 1682052362263
82
+ <!-- A128GCM -->
83
+ request-token: QTEyOEdDTQ.mxmAQbfAs-7yHCrXtX4qah1-0aM8aS25JrdxTuMjQJQWr-jyU9LRmJFns5w.-86gGAjR2k4TMcVk.eOhFLmEEoAUtY74pQVTxXIQJ9TzM0vy235jR2wYuDaaVNqK6jrFtWy9H8OBTd30joBpEEpueX-qBVNmAmOgdJ3F902GjD4SmJVE-3NuVsBjfdlTXx88tLhYuWyTaqpBP1kFAbT6CmVSAfZIHI-BpaejQ9ELoEV2dsSLcKeLAP7m-nrpwRqhDeAH5aC8VYHg
84
+ .ySvSSHLCV86ryEmUF4BMIQ
85
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJ1c2VybmFtZSIsImFwaS1rZXkiLCJkZXZpY2UtaWQiXX0
86
+ content-type: application/json; charset=utf-8
87
+ {
88
+ "accounts": {
89
+ "checking": [
90
+ {
91
+ "id": "acc_wmz5kqq374jzntiak7gzsaqgsjaxqnhaosdcvoq",
92
+ "masked_number": "0486",
93
+ "name": "My Checking",
94
+ "product": "Flex Checking Account"
95
+ }
96
+ ]
97
+ },
98
+ "enc_session_key": "ewogICJjaXBoZXIiOiAiMTI4LUVDQiIsCiAgImtleSI6ICJFdG9pZzU2R3VKRjFndDB5WThyTzdFbkhWNHFxbmR6OWtpRGFIYVIwTFpnPSIKfQ==",
99
+ "offers": [
100
+ {
101
+ "code": "1234",
102
+ "message": "You're eligible for our Premium Metal Credit Card"
103
+ },
104
+ {
105
+ "code": "2345",
106
+ "message": "Teller is hiring! Come talk to us."
107
+ }
108
+ ],
109
+ "user": {
110
+ "name": "José"
111
+ }
112
+ }
113
+
114
+ GET /accounts/acc_wmz5kqq374jzntiak7gzsaqgsjaxqnhaosdcvoq/balances
115
+ teller-is-hiring: I know!
116
+ user-agent: Teller Bank iOS v1.3
117
+ api-key: Hello-Lisbon!
118
+ device-id: RVAG6VKOXO7QBTDL
119
+ request-token: QTEyOEdDTQ.mxmAQbfAs-7yHCrXtX4qah1-0aM8aS25JrdxTuMjQJQWr-jyU9LRmJFns5w.-86gGAjR2k4TMcVk.eOhFLmEEoAUtY74pQVTxXIQJ9TzM0vy235jR2wYuDaaVNqK6jrFtWy9H8OBTd30joBpEEpueX-qBVNmAmOgdJ3F902GjD4SmJVE-3NuVsBjfdlTXx88tLhYuWyTaqpBP1kFAbT6CmVSAfZIHI-BpaejQ9ELoEV2dsSLcKeLAP7m-nrpwRqhDeAH5aC8VYHg.ySvSSHLCV86ryEmUF4BMIQ
120
+ f-token: boqfrm24yqzuk66opzjftlvqmedgdhqdac4fjfyvi7u3jzii2zma
121
+ accept: application/json
122
+
123
+ 200 OK
124
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
125
+ f-request-id: req_6rxxm6ghvd6awd2xoysahbwevdsaxio3a5d22ny
126
+ timestamp: 1682052368659
127
+ request-token: QTEyOEdDTQ.svZ5LPu5kQRLXfQ6INLUZS_ZPsK-h7tEXT93bUe7EJs9xtuyu9IEFqplHCo.7wQRNKlSWYPF_kpp.8vmzx7zRgygZ_qFyKpQW58ZhhLc0oYWU9AD_q3jXWeQiVfel9GPAfP3GKGkK_9P4yJg7DyqkFdZ_M_AN5RjiStaQnCdyUje7UstYYi12ScWVUzAzF8uPR6jIhwFDYrfAmjlK3kHXCvcztXA2672r8chfazzX9JuwT-chy2tmmwouw0LvI4AskMVYYjtbhJwqXT0j17if.inP26QhUAITIwPT56Qxhuw
128
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiJCIsInZhbHVlcyI6WyJhcGkta2V5IiwiZGV2aWNlLWlkIiwibGFzdC1yZXF1ZXN0LWlkIiwidXNlcm5hbWUiXX0
129
+ content-type: application/json; charset=utf-8
130
+ {
131
+ "available": 458252,
132
+ "last_transactions": [
133
+ {
134
+ "amount": -399,
135
+ "posted": false,
136
+ "title": "Single Origin Espresso - Altis Grand"
137
+ },
138
+ {
139
+ "amount": -479,
140
+ "posted": false,
141
+ "title": "Artisanal chocolate chip cookie"
142
+ },
143
+ {
144
+ "amount": -999,
145
+ "posted": true,
146
+ "title": "MAINTENANCE FEE"
147
+ },
148
+ {
149
+ "amount": -1999,
150
+ "posted": true,
151
+ "title": "Openai chatgpt sub"
152
+ },
153
+ {
154
+ "amount": -299,
155
+ "posted": true,
156
+ "title": "metro fare"
157
+ }
158
+ ],
159
+ "ledger": 468252
160
+ }
notes/logs_phoenix.md ADDED
@@ -0,0 +1,754 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ LOGIN: phoenix
2
+ PASS:
3
+
4
+ GET /config
5
+ user-agent: Teller Bank iOS v1.3
6
+ api-key: Hello-Lisbon!
7
+ device-id: HRB5FKPHPB6UJ3NU
8
+ accept: application/json
9
+
10
+ 200 OK
11
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
12
+ content-type: application/json; charset=utf-8
13
+ {
14
+ "conference": [
15
+ {
16
+ "date": "2023-04-20",
17
+ "schedule": [
18
+ {
19
+ "location": {
20
+ "floor": "Floor -1",
21
+ "room": "Europa",
22
+ "track": "Track 1"
23
+ },
24
+ "speakers": [],
25
+ "time": "9:00 AM – 9:20 AM",
26
+ "title": "Welcome to the ElixirConf EU!"
27
+ },
28
+ {
29
+ "location": {
30
+ "floor": "Floor -1",
31
+ "room": "Europa",
32
+ "track": "Track 1"
33
+ },
34
+ "speakers": [
35
+ {
36
+ "affiliation": "Dashbit",
37
+ "name": "José Valim",
38
+ "title": "Creator of Elixir, Chief Adoption Officer"
39
+ }
40
+ ],
41
+ "time": "9:20 AM – 10:20 AM",
42
+ "title": "Keynote: Bringing Elixir to Life"
43
+ },
44
+ {
45
+ "location": null,
46
+ "speakers": [],
47
+ "time": "10:20 AM – 10:50 AM",
48
+ "title": "Coffee Break"
49
+ },
50
+ {
51
+ "location": {
52
+ "floor": "Floor -1",
53
+ "room": "Europa",
54
+ "track": "Track 1"
55
+ },
56
+ "speakers": [
57
+ {
58
+ "affiliation": "Turn.io",
59
+ "name": "Simon de Haan",
60
+ "title": "CTO & Co-Founder"
61
+ },
62
+ {
63
+ "affiliation": "Turn.io",
64
+ "name": "Federico Meini",
65
+ "title": "Software Engineer"
66
+ }
67
+ ],
68
+ "time": "10:50 AM – 11:20 AM",
69
+ "title": "A Domain Specific Language for Impact"
70
+ },
71
+ {
72
+ "location": {
73
+ "floor": "Floor 1",
74
+ "room": "Roma",
75
+ "track": "Track 2"
76
+ },
77
+ "speakers": [
78
+ {
79
+ "affiliation": "Pass It Down",
80
+ "name": "Savannah Manning",
81
+ "title": "Software Engineer"
82
+ },
83
+ {
84
+ "affiliation": "Pass It Down",
85
+ "name": "Gabriel Wamunyu",
86
+ "title": "Full Stack Engineer"
87
+ }
88
+ ],
89
+ "time": "10:50 AM – 11:20 AM",
90
+ "title": "Functional Juniors: Leveling Up Your New Elixir Devs"
91
+ },
92
+ {
93
+ "location": {
94
+ "floor": "Floor 1",
95
+ "room": "Roma",
96
+ "track": "Track 2"
97
+ },
98
+ "speakers": [
99
+ {
100
+ "affiliation": "koderki.pl",
101
+ "name": "Michał Ślaski",
102
+ "title": "Co-Founder"
103
+ }
104
+ ],
105
+ "time": "11:30 AM – 12:00 PM",
106
+ "title": "National Curriculum Goes Functional"
107
+ },
108
+ {
109
+ "location": {
110
+ "floor": "Floor -1",
111
+ "room": "Europa",
112
+ "track": "Track 1"
113
+ },
114
+ "speakers": [
115
+ {
116
+ "affiliation": "Software Stumbler",
117
+ "name": "Luca Dei Zotti",
118
+ "title": ""
119
+ }
120
+ ],
121
+ "time": "11:30 AM – 12:00 PM",
122
+ "title": "Remote Debugging with Livebook"
123
+ },
124
+ {
125
+ "location": {
126
+ "floor": "Floor 1",
127
+ "room": "Roma",
128
+ "track": "Track 2"
129
+ },
130
+ "speakers": [
131
+ {
132
+ "affiliation": "Helvetia Insurance",
133
+ "name": "André Graf",
134
+ "title": "DevOps Solution Architect"
135
+ }
136
+ ],
137
+ "time": "12:10 PM – 12:40 PM",
138
+ "title": "The Journey of Elixir at Helvetia Insurance"
139
+ },
140
+ {
141
+ "location": {
142
+ "floor": "Floor -1",
143
+ "room": "Europa",
144
+ "track": "Track 1"
145
+ },
146
+ "speakers": [
147
+ {
148
+ "affiliation": "Dashbit",
149
+ "name": "Wojtek Mach",
150
+ "title": "Developer"
151
+ }
152
+ ],
153
+ "time": "12:10 PM – 12:40 PM",
154
+ "title": "Building Livebook Desktop"
155
+ },
156
+ {
157
+ "location": null,
158
+ "speakers": [],
159
+ "time": "12:40 PM – 2:10 PM",
160
+ "title": "Lunch"
161
+ },
162
+ {
163
+ "location": null,
164
+ "speakers": [],
165
+ "time": "1:00 PM – 1:30 PM",
166
+ "title": "Meet the Sponsor: Teller. Bumblebee at Scale: Enriching millions of transactions a day with Elixir, Nx, and Bumblebee"
167
+ },
168
+ {
169
+ "location": {
170
+ "floor": "Floor 1",
171
+ "room": "Roma",
172
+ "track": "Track 2"
173
+ },
174
+ "speakers": [
175
+ {
176
+ "affiliation": "Multiverse",
177
+ "name": "Jack Rhodes",
178
+ "title": "Engineering Manager, building the platform for modern apprenticeships"
179
+ }
180
+ ],
181
+ "time": "2:10 PM – 2:40 PM",
182
+ "title": "From Start-up to Unicorn: Scaling Teams, Impact, and Education with Elixir at Multiverse"
183
+ },
184
+ {
185
+ "location": {
186
+ "floor": "Floor -1",
187
+ "room": "Europa",
188
+ "track": "Track 1"
189
+ },
190
+ "speakers": [
191
+ {
192
+ "affiliation": "Simplebet",
193
+ "name": "Marlus Saraiva",
194
+ "title": "Tech Lead. Creator of Broadway, ElixirSense and Surface."
195
+ }
196
+ ],
197
+ "time": "2:10 PM – 2:40 PM",
198
+ "title": "Optimizing LiveView for Realtime Applications"
199
+ },
200
+ {
201
+ "location": {
202
+ "floor": "Floor -1",
203
+ "room": "Europa",
204
+ "track": "Track 1"
205
+ },
206
+ "speakers": [
207
+ {
208
+ "affiliation": "Bodgemaster at Heart / Programmer at Large",
209
+ "name": "Evadne Wu",
210
+ "title": ""
211
+ }
212
+ ],
213
+ "time": "2:50 PM – 3:20 PM",
214
+ "title": "“Not Hotdog” Revisited"
215
+ },
216
+ {
217
+ "location": {
218
+ "floor": "Floor 1",
219
+ "room": "Roma",
220
+ "track": "Track 2"
221
+ },
222
+ "speakers": [
223
+ {
224
+ "affiliation": "UCLL - Digital Solutions - Leuven (B)",
225
+ "name": "Paul Valckenaers",
226
+ "title": ""
227
+ }
228
+ ],
229
+ "time": "2:50 PM – 3:20 PM",
230
+ "title": "Quantum Doodle: Digital Twins for Everyday Activities"
231
+ },
232
+ {
233
+ "location": null,
234
+ "speakers": [],
235
+ "time": "3:20 PM – 3:50 PM",
236
+ "title": "Coffee Break"
237
+ },
238
+ {
239
+ "location": {
240
+ "floor": "Floor 1",
241
+ "room": "Roma",
242
+ "track": "Track 2"
243
+ },
244
+ "speakers": [
245
+ {
246
+ "affiliation": "Multiverse",
247
+ "name": "Karoline Lende",
248
+ "title": "Software Engineer"
249
+ }
250
+ ],
251
+ "time": "3:50 PM – 4:20 PM",
252
+ "title": "Building an Interview Scheduler in LiveView: A Newcomer's Journey from Despair to Delight"
253
+ },
254
+ {
255
+ "location": {
256
+ "floor": "Floor -1",
257
+ "room": "Europa",
258
+ "track": "Track 1"
259
+ },
260
+ "speakers": [
261
+ {
262
+ "affiliation": "Dashbit",
263
+ "name": "Jonatan Kłosko",
264
+ "title": "Software Engineer"
265
+ }
266
+ ],
267
+ "time": "3:50 PM – 4:20 PM",
268
+ "title": "Powerful Machine Learning at Your Fingertips"
269
+ },
270
+ {
271
+ "location": {
272
+ "floor": "Floor -1",
273
+ "room": "Europa",
274
+ "track": "Track 1"
275
+ },
276
+ "speakers": [
277
+ {
278
+ "affiliation": "Underjord AB",
279
+ "name": "Lars Wikman",
280
+ "title": "Developer"
281
+ }
282
+ ],
283
+ "time": "4:30 PM – 5:00 PM",
284
+ "title": "Lively LiveView with Membrane"
285
+ },
286
+ {
287
+ "location": {
288
+ "floor": "Floor 1",
289
+ "room": "Roma",
290
+ "track": "Track 2"
291
+ },
292
+ "speakers": [
293
+ {
294
+ "affiliation": "CNRS - Université Paris Cité",
295
+ "name": "Giuseppe Castagna",
296
+ "title": ""
297
+ },
298
+ {
299
+ "affiliation": "IRIF",
300
+ "name": "Guillaume Duboc",
301
+ "title": "PhD researcher"
302
+ }
303
+ ],
304
+ "time": "4:30 PM – 5:00 PM",
305
+ "title": "Bringing Types to Elixir"
306
+ },
307
+ {
308
+ "location": {
309
+ "floor": "Floor -1",
310
+ "room": "Europa",
311
+ "track": "Track 1"
312
+ },
313
+ "speakers": [],
314
+ "time": "5:00 PM – 6:00 PM",
315
+ "title": "Lightning Talks"
316
+ },
317
+ {
318
+ "location": null,
319
+ "speakers": [],
320
+ "time": "6:00 PM – 7:00 PM",
321
+ "title": "Socialising (at the venue)"
322
+ }
323
+ ]
324
+ },
325
+ {
326
+ "date": "2023-04-21",
327
+ "schedule": [
328
+ {
329
+ "location": {
330
+ "floor": "Floor -1",
331
+ "room": "Europa",
332
+ "track": "Track 1"
333
+ },
334
+ "speakers": [
335
+ {
336
+ "affiliation": "Talam, Auroville",
337
+ "name": "Shankar Dhanasekaran",
338
+ "title": "Founder & CTO"
339
+ }
340
+ ],
341
+ "time": "9:10 AM – 10:10 AM",
342
+ "title": "Keynote: Lessons from Using Elixir and Phoenix to Build a City Software Infrastructure"
343
+ },
344
+ {
345
+ "location": null,
346
+ "speakers": [],
347
+ "time": "10:10 AM – 10:40 AM",
348
+ "title": "Coffee Break"
349
+ },
350
+ {
351
+ "location": {
352
+ "floor": "Floor 1",
353
+ "room": "Roma",
354
+ "track": "Track 2"
355
+ },
356
+ "speakers": [
357
+ {
358
+ "affiliation": "Fresha.com",
359
+ "name": "Artur Sulej",
360
+ "title": "Senior Software Engineer"
361
+ }
362
+ ],
363
+ "time": "10:40 AM – 11:10 AM",
364
+ "title": "Safer DB migrations with excellent_migrations"
365
+ },
366
+ {
367
+ "location": {
368
+ "floor": "Floor -1",
369
+ "room": "Europa",
370
+ "track": "Track 1"
371
+ },
372
+ "speakers": [
373
+ {
374
+ "affiliation": "Piga",
375
+ "name": "Basile Nouvellet",
376
+ "title": "CTO"
377
+ }
378
+ ],
379
+ "time": "10:40 AM – 11:10 AM",
380
+ "title": "Real-time Product Analytics with LiveView"
381
+ },
382
+ {
383
+ "location": null,
384
+ "speakers": [
385
+ {
386
+ "affiliation": "Cisco",
387
+ "name": "Yosef Arbiv",
388
+ "title": "R&D Group Leader"
389
+ }
390
+ ],
391
+ "time": "10:40 AM – 11:10 AM",
392
+ "title": "How To Use OpenTelemetry To Troubleshoot and Monitor Production Applications"
393
+ },
394
+ {
395
+ "location": {
396
+ "floor": "Floor -1",
397
+ "room": "Europa",
398
+ "track": "Track 1"
399
+ },
400
+ "speakers": [
401
+ {
402
+ "affiliation": "made it GmbH",
403
+ "name": "Benjamin Milde",
404
+ "title": "CTO"
405
+ }
406
+ ],
407
+ "time": "11:20 AM – 11:50 AM",
408
+ "title": "Wired up! - Using ecto without schemas*"
409
+ },
410
+ {
411
+ "location": {
412
+ "floor": "Floor 1",
413
+ "room": "Roma",
414
+ "track": "Track 2"
415
+ },
416
+ "speakers": [
417
+ {
418
+ "affiliation": "PagerDuty",
419
+ "name": "Mat Trudel",
420
+ "title": "Senior Software Engineer"
421
+ }
422
+ ],
423
+ "time": "11:20 AM – 11:50 AM",
424
+ "title": "Phoenix Beyond Cowboy"
425
+ },
426
+ {
427
+ "location": null,
428
+ "speakers": [
429
+ {
430
+ "affiliation": "University of Kitakyushu",
431
+ "name": "Susumu Yamazaki",
432
+ "title": "Associate Professor"
433
+ }
434
+ ],
435
+ "time": "11:20 AM – 11:50 AM",
436
+ "title": "How to Describe Robust NIFs: Bridging Elixir and C with Performance for Fault-tolerant Systems"
437
+ },
438
+ {
439
+ "location": {
440
+ "floor": "Floor 1",
441
+ "room": "Roma",
442
+ "track": "Track 2"
443
+ },
444
+ "speakers": [
445
+ {
446
+ "affiliation": "ElectricSQL",
447
+ "name": "James Arthur",
448
+ "title": "CEO"
449
+ }
450
+ ],
451
+ "time": "12:00 PM – 12:30 PM",
452
+ "title": "ElectricSQL - Local-first SQL with Elixir"
453
+ },
454
+ {
455
+ "location": {
456
+ "floor": "Floor -1",
457
+ "room": "Europa",
458
+ "track": "Track 1"
459
+ },
460
+ "speakers": [
461
+ {
462
+ "affiliation": "eFaber",
463
+ "name": "Eli Kroumova",
464
+ "title": "Software Developer"
465
+ }
466
+ ],
467
+ "time": "12:00 PM – 12:30 PM",
468
+ "title": "Multitenant Web Applications with Phoenix"
469
+ },
470
+ {
471
+ "location": null,
472
+ "speakers": [
473
+ {
474
+ "affiliation": "OEC Co. Ltd.",
475
+ "name": "Ryo Wakabayashi",
476
+ "title": "AI Engineer, Developing AI services together with AUCNET-IBS"
477
+ }
478
+ ],
479
+ "time": "12:00 PM – 12:30 PM",
480
+ "title": "Distributed and Parallel Image Processing on Livebook"
481
+ },
482
+ {
483
+ "location": null,
484
+ "speakers": [],
485
+ "time": "12:30 PM – 2:00 PM",
486
+ "title": "Lunch"
487
+ },
488
+ {
489
+ "location": {
490
+ "floor": "Floor 1",
491
+ "room": "Roma",
492
+ "track": "Track 2"
493
+ },
494
+ "speakers": [
495
+ {
496
+ "affiliation": "DevOps Solution Architect integrating stuff with Elixir",
497
+ "name": "Lars Hesel Christensen",
498
+ "title": ""
499
+ },
500
+ {
501
+ "affiliation": "Helvetia Insurance",
502
+ "name": "Bikram Chatterjee",
503
+ "title": "DevOps Solution Architect hacking with Elixir"
504
+ }
505
+ ],
506
+ "time": "2:00 PM – 2:30 PM",
507
+ "title": "GitOps on Steroids"
508
+ },
509
+ {
510
+ "location": {
511
+ "floor": "Floor -1",
512
+ "room": "Europa",
513
+ "track": "Track 1"
514
+ },
515
+ "speakers": [
516
+ {
517
+ "affiliation": "Remote",
518
+ "name": "Peter Ullrich",
519
+ "title": "Senior Software Engineer"
520
+ }
521
+ ],
522
+ "time": "2:00 PM – 2:30 PM",
523
+ "title": "Don't Fight the Monolith"
524
+ },
525
+ {
526
+ "location": null,
527
+ "speakers": [
528
+ {
529
+ "affiliation": "Multiverse",
530
+ "name": "Tim Gent",
531
+ "title": "Tech lead"
532
+ }
533
+ ],
534
+ "time": "2:00 PM – 2:30 PM",
535
+ "title": "Understanding Elixir Compilation"
536
+ },
537
+ {
538
+ "location": {
539
+ "floor": "Floor -1",
540
+ "room": "Europa",
541
+ "track": "Track 1"
542
+ },
543
+ "speakers": [
544
+ {
545
+ "affiliation": "Andjaro",
546
+ "name": "Michal Gibowski",
547
+ "title": "Engineering Team Lead"
548
+ },
549
+ {
550
+ "affiliation": "Andjaro",
551
+ "name": "Vanessa Loviton",
552
+ "title": "Backend Engineer"
553
+ }
554
+ ],
555
+ "time": "2:40 PM – 3:10 PM",
556
+ "title": "Change Data Capture with Elixir and Debezium"
557
+ },
558
+ {
559
+ "location": {
560
+ "floor": "Floor 1",
561
+ "room": "Roma",
562
+ "track": "Track 2"
563
+ },
564
+ "speakers": [
565
+ {
566
+ "affiliation": "Coverflex",
567
+ "name": "Daniel Silva",
568
+ "title": "Senior Backend Software Developer"
569
+ }
570
+ ],
571
+ "time": "2:40 PM – 3:10 PM",
572
+ "title": "Opening a Black Box: Observability in a Complex System"
573
+ },
574
+ {
575
+ "location": null,
576
+ "speakers": [
577
+ {
578
+ "affiliation": "Founder of Or Equals, a Phoenix LiveView consultancy",
579
+ "name": "Joshua Plicque",
580
+ "title": ""
581
+ }
582
+ ],
583
+ "time": "2:40 PM – 3:10 PM",
584
+ "title": "Phoenix LiveView Test Driven Development By Example"
585
+ },
586
+ {
587
+ "location": null,
588
+ "speakers": [],
589
+ "time": "3:10 PM – 3:40 PM",
590
+ "title": "Coffee Break"
591
+ },
592
+ {
593
+ "location": {
594
+ "floor": "Floor -1",
595
+ "room": "Europa",
596
+ "track": "Track 1"
597
+ },
598
+ "speakers": [
599
+ {
600
+ "affiliation": "Software Mansion / Membrane Framework",
601
+ "name": "Mateusz Front",
602
+ "title": "Software Architect"
603
+ }
604
+ ],
605
+ "time": "3:40 PM – 4:10 PM",
606
+ "title": "Building a Framework - Membrane's Journey to 1.0"
607
+ },
608
+ {
609
+ "location": {
610
+ "floor": "Floor 1",
611
+ "room": "Roma",
612
+ "track": "Track 2"
613
+ },
614
+ "speakers": [
615
+ {
616
+ "affiliation": "Ramp",
617
+ "name": "Zac Barnes",
618
+ "title": "SWE"
619
+ }
620
+ ],
621
+ "time": "3:40 PM – 4:10 PM",
622
+ "title": "Telemetry: Now what?"
623
+ },
624
+ {
625
+ "location": {
626
+ "floor": "Floor -1",
627
+ "room": "Europa",
628
+ "track": "Track 1"
629
+ },
630
+ "speakers": [
631
+ {
632
+ "affiliation": "Fly.io",
633
+ "name": "Chris McCord",
634
+ "title": "Creator of Phoenix, Staff Software Engineer"
635
+ }
636
+ ],
637
+ "time": "4:20 PM – 5:20 PM",
638
+ "title": "Keynote: The Road to LiveView 1.0"
639
+ }
640
+ ]
641
+ }
642
+ ],
643
+ "utils": {
644
+ "arg_a": "555345524e414d45",
645
+ "arg_b": "465f544f4b454e",
646
+ "code": "1f8b08000000000000035d570b5c4c5b173fd399e695c969a69794462fa5f713514e254961f4c0478c69e65453f3726626532149e5f19508999f5eeabac9e37e2525ae1809e1de4f1ec95b12ca4d2ad7dbad6f4f4d57f73bbfdf9ab5f6daffb5f77a9cd9ebecf94b22dc2148ff5c6070c0a20079f44c0822744010e46e142c142805b84bb09827e163f83c6c8451381c81384ec2e1d0b872392e8855c831199927114905428cc6c7a438c6e3ca31be1ea6944a70b98c23e27b53e314629e5c2011cb48222e0f97c860a02489247c851023c9e4b8822787c5022109c3855c71fcc4784cce199d1cd9899684a570648ab83881922ac7b962599c0417e9c70ac45c3c852397708402999cc4954a31311fe60a85a4d119bad6f948398e7145babc149e1083530552bdbf835288601157cafc811388e35d8212b8b88c0a56958d8c09a963f361182ec6842ed1728150a6c7c746bd56e01851218f9b39ce1bae5c221adb238a2b4bd295c9b9b85c17e70a6418512c1163ba188e4b70bd7101ea39a7baba39831c397b38eb6b4dd9b88487c964ba3221864975e3b84219f603e6eefc4376732638339dffce8bab87564b8ce58af9c458a50437741688850231c6771eab9cabbb7310282504e994813a23d0e873129035203d02a2827418560881351bde67426178640566452862313c7a8b624f5679f0496f821bda04330928ca00bf6c3404026c2d1a8200264575c0ef66146682c9c52c88904f42e856843215a2c3188408d568080bccab552c1d060d61115a27b058289388c2862a3722444750227cdc0421aa503282a03051c526427535ba10b2193651d318c8661d431a9366c8daacb31c46684c003554ad055095948cb0502273c4763399e586cc70d344c642906310d30452e59359a8f74b98c162123a54651484cd22f4abaa810fe6108182d0d1313874dc04251ada781d4380151ae206abd4c0125dca24b3d6cea41bc001b01713706600d35acb6db4dc900838b182c8f402439466c944ad61552b9925adb2813543550790356ea1a36eb1e0919de06d6e88aa9f8c6c06916f432015052123f968086a8dd26c9814b732e09e814abd002650189aaad0ec806224b54835816238aa420814a31f09a718abfa81761a4aa0984c4051d493885a1ba24c1b14f642ab1ec364443d1ba64f324169d3e9a64d745302c594813209944928d11335b446bd98a80dbc8e05accd541403b09023587e321dfa915037901a4d3ae9e630030296e6209d605b8b51b813804fd9a88bb4c2542ea834c552950fb42e40cb9a45b7847d01b1026188b95197d5c13cc40c84111888fdcb992c58039f3a12923b805bf9d1a7c2e06f19a579394345520d6fd6beaf7440fa8074b4b2012002202340c6e364132dc614d024ad6c0668b216630168cab875585a792a20ab71186badacc1d80282c7f9a0d1db03721887711eb7a6eb38d94d23072b4762f10244046437ce5f3bed7f91a98d73cc4e478bd199af106b6cf95a5b17ad9ea5b5836049483a608e5afd589c63fa695abbb1bc10b57a272d6e8a36b6117cb8400ef62290003194457ebbdc9764a2e697879725453079d3e666adbb7db9b926f360291ab477ba5fc79bd0a0f63b17ed729b3abbfa3a3a3b3bc209370eab9f3fd9dd5269607af6dcb9ef6b0607a74072c2dae15bc7152fea5f7c342f7ff02928dce9846722f3d8bda102fff44d5f8aafdd19b859fc6de3ba65b58d3e3dc545bcce70f1a99fd73ebd273730df407ae9b1b40dfe8bed192afb25a12565a15165f96f029671b86ef951ae611a25f959e4c7ab5b3f45871ac5537c2e3905565fde3933445a641fdd32e3596168599453a77d2cfed259b5f07ad6d506d7150d8c398bdaafdcd8d11ef7edd6d7b6bcc514bbc26cbfe6c5998f457a9c25e14fde4e0ce725e65fbaf8e742cbd9a4fa90e12bfe5bc410142ee16972bf021059d31fb539b3fabf3a8ccfe5f83a8ccfbdb9b65c9a1a4fd4ca7a01a09f6adea54ca1c62a41870fc1c932f1c8408c40e9bbead66cffd47e646fdc97d5efdf758b12138342c5716072f7081ed6e0c9c9182e037d3609d29de9e2e1e23ea29348475aaf0644e44393c4a0b749b9ebc51c6dcfc639d2d15ec387a871b84404f438c68726029c4602b39894abd1e8030d57015a9c40a4e9ec899ac549328902e76149909e2be8c0ae62491c583111ec342f365e00f66bcc64839759ad2c6a5b7141f268bea1fff6bdfcafa7239409d3a665d75f41b375b20cd2049e0a6a6bb25d5ed752df1d5659d63d0bf53d8e44ce48e9b9db1854e8f2979ef9aa6d59f7f74fbd85e60eb9fb453042df7fbe11e07977a7627de9f9b47769ef9efe1ab933529dbdc5a6d22136c8fbf20b13da8a60df3eae9555f9e9ee93d5a6532e5413a03f682b728ee6769b1a1cffe8bd23a77e5175d7fd96f20ac5835e794ddebcdaa4b417deba55f7d53e3ef4b04a62cc4ec93e23b66f064a98b3ba37b5d65692d75e93d1f1fae1862df1afbc7f3f1d6268fb64efa3f26ed8f1694c8f1b69a889e398b3396fee47c83bb121f844c64bfb184251c6c6f4b0fc2cdc81bd3d6bd081adca5a165146d33b71923d3d7bd7d325c9ab09a58d83f0e9610b2bd2ed4fe9a76ac45f06aa859d2df541f9fbbfb7cde9acd31d70bcd4c35ee55b7d30b0ebc63312672825f9d3d0edc6e194fe9c6f378452cf75e4d705d7dad4c5137e5e3f23b3b6e7d79a349fc6ca02930aee64e1f74dde4369732c8614736521ed22753187738a30f78cc59353179717fe9236fbdbdb3fe5c929afce56f47477c6cef9e6b6616eb2ebbba7f4ab05777a3e7fbf043e688c3698ae7936f466dae27f79c7c6f5b9f47e342eb5b475d90fcf8b2006189658ec7fa25c71be32e74a425ffa9d2d5bb383ab17dd1a8cef5c499a1f77e715195b3fe949d3f9ef2647b9c995b7438e2c3bdc46315b444b2979b9bce609ebae717ab587ebf470428ad9d445f6943a7bdc61593979c9a4893eb642f4b689a0f99028b9b3afabf7b79ad9776a78c73895ca41a7a642f67f9695b7842f29f1bb5750549c92fc7adbb4ed76bd976bff2227d419b16b840b7a3f7f4cdb3d07dba37475dc6ef2e873eaa0c729f6606ac9ee837ad61c66e4fcfd2f1f54593717ddc872609cd837bc3509bb3ce16e589d5b7fc67055d69ed545379e1d3cfdf4c8f740628f6bcbcfbcd62b7d1b9f52776c174edfb661e7f774e9ce6cc18b80e5d70a580bf61d0dcd17bb5b5496ed21d0d72ba507ae0f50fffaa926f250fcf0b03ae242898b4b58a970f289156bf6cf23e5aba3d8b769bdc91f369d3c1293b1b0b150a658c53da4b2a8ddf36f57a38666e78195fd85e58199d10483d83d0db4dcc3b4074ed7d637d1320ef81dccad9ef72aa6747298a47b2bd78c7b26e683e843a9f1147abbf2bd0fc6bc7929af6aa66f84faa30735cde34deac49c33e8a60b8850871ee61d4abe6d10f26ca27bd3caebef0f1997f8fd92fb55f5a974a5cdd2c4d5f7db171d40fecbf896d56c427be7a864d4c6db1e5ead77a8d8a86ac9b328d575bd07ceab5a121ff8d61f2871d8eaeedad5d0af5e77455537e7d6197b1fc3e2f42f83ddf6a81efbeaa28acc09b3cd7ea2acffd2d1513339b32bf7982cc5b8cdb360fdbec11dfb2b8e365cdd7c2a27a6aaf2dbb5abfeb412be3fedcd654bdd0fbf91ce35da3ca4bc0d6aadf0bd38a12dd9ae6d99597470df0ddfc80df51e168f3708d748b2538a0f6e9b3c113fab9efa58dfd23d74f9efa9f7a26ba7880e54156ef2ff9ad56bb78c7b48f060797c54d7e1298f569e8cb4d94e345b383d944b7e7ef4a3a965dd82826de6bf9fe2a892231e36ebdbf6b43a3cefa80b1556521d3c6da3d885ac490f170ca416ed5074651ccdeed918a5f6ad9f47adeb70f7b13879ced1c5216cf7bdfd1b2e94e76c799a772877d7ee16e9f2d773db9d2c1724e505dccc7dbc85e1e7f5f042aeceb401cd3926e1c9002bd69c631038c7fcf26ee96f719b10ac577e64fbcdf37d4b991503d6dff5efb476928e7b3e627f4e2353fdbd447db3ce54b95017e2d1ca4d7d070c840d9e9903c690feee1c656df72a9c33d5be997a95581656d053b7c640f8c79aa309319dbf762f0d7c7beeb2f9ce07aac4bce1cf7707954b25e6b373e4e2ced82ea73b67fd7fc29b039e771ef1374da93a326b75afaeb3639172fac39ba55e73055f7cbe02d7829541498025666a4e65036ce412c1e12560bc2470c027bbcb354d04f402eda54cdb6034d81f572aae8e06a531ff718be380cb934c22069d08dccff810314920e683011f8b03877c38b854008b59d08f47f38d35f22dc6a01aadcbd85df37c808a500da80cea24aa19752ad58a6a4db5a5b220d268a300c0a814a986f96bfb246c393cb6d4b0f619f94ef9a70685fef9d020e87f574bf51ec40e0000"
647
+ }
648
+ }
649
+
650
+ POST /login
651
+ user-agent: Teller Bank iOS v1.3
652
+ api-key: Hello-Lisbon!
653
+ device-id: HRB5FKPHPB6UJ3NU
654
+ content-type: application/json
655
+ accept: application/json
656
+ {
657
+ "password": "el1x1r_c0nf_Lisbon",
658
+ "username": "phoenix"
659
+ }
660
+
661
+ 200 OK
662
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
663
+ f-request-id: req_r6glykw25ho42uig6s5sv4kkhkxuhstgk5fauoy
664
+ timestamp: 1682040481067
665
+ request-token: QTEyOEdDTQ.Sm2MsztFPD3Sj4dwkIvfdQzRyuJRDg6d5cvLQvbMTlUYU-447mNSJObqmIs.E_bU4TRtUiwSXvZE.PbD6oAejrYiCCvm_EnSC8lgmAkiomujMZTAP5M_3iB9IMmq2FY_FKjsZO2nTgdOz4IxT8ZmzbF2XjnsbcOdYiXUG8HcAjhFQOOaZJs5G11GhZ83UjKEk5wfEJyjZ3LULwLpURqSbm5kFByYd48mAQMSVKYOJ1JR0ckjKfInHeDaGZ8mfmMyk7YLoGiE.V8OmfFA1DL1OAdh5nG13ng
666
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifiIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJsYXN0LXJlcXVlc3QtaWQiLCJhcGkta2V5IiwidXNlcm5hbWUiXX0
667
+ content-type: application/json; charset=utf-8
668
+ {
669
+ "devices": [
670
+ {
671
+ "id": "voice_ad_s2a2tgvpqwakeym225iogql2eqzyrmuv5z3cxhy",
672
+ "mask": "***5484",
673
+ "type": "VOICE"
674
+ },
675
+ {
676
+ "id": "sms_ad_s2a2tgvpqwakeym225iogql2eqzyrmuv5z3cxhy",
677
+ "mask": "***5484",
678
+ "type": "SMS"
679
+ }
680
+ ],
681
+ "mfa_required": true
682
+ }
683
+
684
+ POST /login/mfa/request
685
+ teller-is-hiring: I know!
686
+ user-agent: Teller Bank iOS v1.3
687
+ api-key: Hello-Lisbon!
688
+ device-id: HRB5FKPHPB6UJ3NU
689
+ request-token: QTEyOEdDTQ.Sm2MsztFPD3Sj4dwkIvfdQzRyuJRDg6d5cvLQvbMTlUYU-447mNSJObqmIs.E_bU4TRtUiwSXvZE.PbD6oAejrYiCCvm_EnSC8lgmAkiomujMZTAP5M_3iB9IMmq2FY_FKjsZO2nTgdOz4IxT8ZmzbF2XjnsbcOdYiXUG8HcAjhFQOOaZJs5G11GhZ83UjKEk5wfEJyjZ3LULwLpURqSbm5kFByYd48mAQMSVKYOJ1JR0ckjKfInHeDaGZ8mfmMyk7YLoGiE.V8OmfFA1DL1OAdh5nG13ng
690
+ f-token: kdkdov2p6xbig547w5wpfctt4wygzunxm6doynx2ikj7gnr4sesq
691
+ content-type: application/json
692
+ accept: application/json
693
+ {
694
+ "device_id": "sms_ad_s2a2tgvpqwakeym225iogql2eqzyrmuv5z3cxhy"
695
+ }
696
+
697
+ 200 OK
698
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
699
+ f-request-id: req_hhmr2qtxyhbiegxb5ihsk3fxi4vbslfmohd6kyy
700
+ timestamp: 1682040482116
701
+ request-token: QTEyOEdDTQ.Rnfiv2ChSL6MZW0xboRyv8PHXcAiLGToWi5FBlOk6sle9cpBQjUxkntcz9I.KZApX4GBJ5hN4KEg.vlPXAfPTJMZJIdpSE6FrYN021u5xLkjoDNhlyphqpkwdyO2dIqJuIXogEq0fRiHkSbAoLfOU4Lg_go2Rox2IcVgveRoXsLmkhq_XnUknYQt0MpTINEhJHLYsQMAmH8x_yaJtXRwknZwAaEMBn9La93fBqaJNTm5rZfnyXnlpKSlhxQye7Rm2ic3HXceVkRsPra4ZWDGaGs4.puDE4eW7Mr6ksgdanA-smQ
702
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoifCIsInZhbHVlcyI6WyJkZXZpY2UtaWQiLCJ1c2VybmFtZSIsImFwaS1rZXkiLCJsYXN0LXJlcXVlc3QtaWQiXX0
703
+ content-type: application/json; charset=utf-8
704
+ {}
705
+
706
+ POST /login/mfa
707
+ x-token: aHBwMjg9fWxkfXd0bnRzYGtveHpvPH5jdmV3cTdxYm13ZDhhaX5kYWxrd2pkZ2ZtMmJ/YQ==
708
+ teller-is-hiring: I know!
709
+ user-agent: Teller Bank iOS v1.3
710
+ api-key: Hello-Lisbon!
711
+ device-id: HRB5FKPHPB6UJ3NU
712
+ request-token: QTEyOEdDTQ.Rnfiv2ChSL6MZW0xboRyv8PHXcAiLGToWi5FBlOk6sle9cpBQjUxkntcz9I.KZApX4GBJ5hN4KEg.vlPXAfPTJMZJIdpSE6FrYN021u5xLkjoDNhlyphqpkwdyO2dIqJuIXogEq0fRiHkSbAoLfOU4Lg_go2Rox2IcVgveRoXsLmkhq_XnUknYQt0MpTINEhJHLYsQMAmH8x_yaJtXRwknZwAaEMBn9La93fBqaJNTm5rZfnyXnlpKSlhxQye7Rm2ic3HXceVkRsPra4ZWDGaGs4.puDE4eW7Mr6ksgdanA-smQ
713
+ f-token: hxz225ufdwutnvshkgrze4vivouq7sbewl2acvlklaujdefe2jua
714
+ content-type: application/json
715
+ accept: application/json
716
+ {
717
+ "code": "001337"
718
+ }
719
+
720
+ 200 OK
721
+ teller-is-hiring: <https://jobs.lever.co/teller/dd21975a-901b-49ee-926c-336c92f8673d>
722
+ f-request-id: req_z2ife263yklvsjysyfrnab5elkopjhya2kxfp2q
723
+ timestamp: 1682040484503
724
+ request-token: QTEyOEdDTQ.M0Q39cbT_sl6uGXUC-crTyrA5D9HVyxvdZfXClOFPTD0fGHrz9pbSxswfJ4.xyB1IHqEuv2IgiZ_.E4h0zYTPbs72A_hvfOzRKYMPFaiar8vtNi6Tz6289fVtB763zLZ2FAxOEfKKaJ2YlAsJO6JPU-D3A5hFCNg4biqtwV4SznNOJBzX2NJ7Ept8PFe3unpiAT_ioM4XzS3bhBQdNtcZnDW7mC7GmUpQG1dEKdArSlfxp4T-rBg9lvkB7_dzIp7Lbm6y4VcCcSMg.81VOLg2eGZ5XqD6B1ZlA3g
725
+ f-token-spec: eyJtZXRob2QiOiJoc3otZ2RsLXVyZXYtaHJjLXl6aHYtZ3NyaWdiLWdkbC1vbGR2aS14emh2LW1sLWt6d3dybXR0Iiwic2VwYXJhdG9yIjoiKyIsInZhbHVlcyI6WyJsYXN0LXJlcXVlc3QtaWQiLCJ1c2VybmFtZSIsImFwaS1rZXkiLCJkZXZpY2UtaWQiXX0
726
+ content-type: application/json; charset=utf-8
727
+ {
728
+ "accounts": {
729
+ "checking": [
730
+ {
731
+ "id": "acc_nit5ork2lahpwksuvf63x3kf52oguzdcdkyck6q",
732
+ "masked_number": "3306",
733
+ "name": "My Checking",
734
+ "product": "Flex Checking Account"
735
+ }
736
+ ]
737
+ },
738
+ "enc_session_key": "ewogICJjaXBoZXIiOiAiMTI4LUVDQiIsCiAgImtleSI6ICJ5Qmg2Uzd3T2JCZnlGZUJacDUraUs5WHc2M1VLdXJlTkZtUTMvR2VpTjFZPSIKfQ==",
739
+ "offers": [
740
+ {
741
+ "code": "1234",
742
+ "message": "You're eligible for our Premium Metal Credit Card"
743
+ },
744
+ {
745
+ "code": "2345",
746
+ "message": "Teller is hiring! Come talk to us."
747
+ }
748
+ ],
749
+ "user": {
750
+ "name": "José"
751
+ }
752
+ }
753
+
754
+ GET /accounts/acc_nit5ork2lahpwksuvf63x3kf52oguzdcdkyck6q/balances
notes/scratch.md ADDED
@@ -0,0 +1 @@
 
 
1
+ eyJhbGciOiJSUzI1NiIsIng1dCI6IjdkRC1nZWNOZ1gxWmY3R0xrT3ZwT0IyZGNWQSIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2NvbnRvc28uY29tIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvZTQ4MTc0N2YtNWRhNy00NTM4LWNiYmUtNjdlNTdmN2QyMTRlLyIsIm5iZiI6MTM5MTIxMDg1MCwiZXhwIjoxMzkxMjE0NDUwLCJzdWIiOiIyMTc0OWRhYWUyYTkxMTM3YzI1OTE5MTYyMmZhMSJ9.C4Ny4LeVjEEEybcA1SVaFYFS6nH-Ezae_RrTXUYInjXGt-vBOkAa2ryb-kpOlzU_R4Ydce9tKDNp1qZTomXgHjl-cKybAz0Ut90-dlWgXGvJYFkWRXJ4J0JyS893EDwTEHYaAZH_lCBvoYPhXexD2yt1b-73xSP6oxVlc_sMvz3DY__1Y_OyvbYrThHnHglxvjh88x_lX7RN-Bq82ztumxy97rTWaa_1WJgYuy7h7okD24FtsD9PPLYAply0ygl31ReI0FZOdX12Hl4THJm4uI_4_bPXL6YR2oZhYWp-4POWIPHzG9c_GL8asBjoDY9F5q1ykQiotUBESoMML7_N1g
public-apps/teller.livemd ADDED
@@ -0,0 +1,614 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- livebook:{"app_settings":{"slug":"teller-bank-job"},"persist_outputs":true} -->
2
+
3
+ # Teller Bank Challenge
4
+
5
+ ```elixir
6
+ Mix.install([
7
+ :req,
8
+ :jason,
9
+ :kino,
10
+ # {:beam_file, git: "https://github.com/hrzndhrn/beam_file.git"}
11
+ :beam_file
12
+ ])
13
+ ```
14
+
15
+ <!-- livebook:{"output":true} -->
16
+
17
+ ```
18
+ Resolving Hex dependencies...
19
+ Resolution completed in 0.151s
20
+ New:
21
+ beam_file 0.4.2
22
+ castore 1.0.1
23
+ finch 0.16.0
24
+ hpax 0.1.2
25
+ jason 1.4.0
26
+ kino 0.9.2
27
+ mime 2.0.3
28
+ mint 1.5.1
29
+ nimble_options 1.0.2
30
+ nimble_pool 1.0.0
31
+ req 0.3.6
32
+ table 0.1.2
33
+ telemetry 1.2.1
34
+ * Getting req (Hex package)
35
+ * Getting jason (Hex package)
36
+ * Getting kino (Hex package)
37
+ * Getting beam_file (Hex package)
38
+ * Getting table (Hex package)
39
+ * Getting finch (Hex package)
40
+ * Getting mime (Hex package)
41
+ * Getting castore (Hex package)
42
+ * Getting mint (Hex package)
43
+ * Getting nimble_options (Hex package)
44
+ * Getting nimble_pool (Hex package)
45
+ * Getting telemetry (Hex package)
46
+ * Getting hpax (Hex package)
47
+ ==> table
48
+ Compiling 5 files (.ex)
49
+ Generated table app
50
+ ==> mime
51
+ Compiling 1 file (.ex)
52
+ Generated mime app
53
+ ==> nimble_options
54
+ Compiling 3 files (.ex)
55
+ Generated nimble_options app
56
+ ==> kino
57
+ Compiling 39 files (.ex)
58
+ Generated kino app
59
+ ===> Analyzing applications...
60
+ ===> Compiling telemetry
61
+ ==> jason
62
+ Compiling 10 files (.ex)
63
+ Generated jason app
64
+ ==> hpax
65
+ Compiling 4 files (.ex)
66
+ Generated hpax app
67
+ ==> beam_file
68
+ Compiling 3 files (.ex)
69
+ Generated beam_file app
70
+ ==> nimble_pool
71
+ Compiling 2 files (.ex)
72
+ Generated nimble_pool app
73
+ ==> castore
74
+ Compiling 1 file (.ex)
75
+ Generated castore app
76
+ ==> mint
77
+ Compiling 1 file (.erl)
78
+ Compiling 19 files (.ex)
79
+ Generated mint app
80
+ ==> finch
81
+ Compiling 13 files (.ex)
82
+ Generated finch app
83
+ ==> req
84
+ Compiling 5 files (.ex)
85
+ Generated req app
86
+ ```
87
+
88
+ <!-- livebook:{"output":true} -->
89
+
90
+ ```
91
+ :ok
92
+ ```
93
+
94
+ ## Your Solution
95
+
96
+ ```elixir
97
+ username = Kino.Input.text("Username") |> Kino.render()
98
+ password = Kino.Input.text("Password")
99
+ ```
100
+
101
+ ```elixir
102
+ url = "https://lisbon.teller.engineering"
103
+
104
+ headers = %{
105
+ user_agent: "Teller Bank iOS v1.3",
106
+ api_key: "Hello-Lisbon!",
107
+ device_id: "TU2CM7WPWZJVNK2N",
108
+ accept: "application/json"
109
+ }
110
+
111
+ %Req.Response{status: status, headers: headers, body: body} =
112
+ Req.get!("#{url}/config", headers: headers)
113
+
114
+ utils = Map.get(body, "utils")
115
+ arg_a = Map.get(utils, "arg_a") |> String.upcase() |> Base.decode16!()
116
+ arg_b = Map.get(utils, "arg_b") |> String.upcase() |> Base.decode16!()
117
+ code = Map.get(utils, "code") |> String.upcase() |> Base.decode16!()
118
+ code |> IO.inspect()
119
+
120
+ # Realized that magic numbers at start indicates gzip
121
+ # Let's open it
122
+ code = :zlib.gunzip(code)
123
+ # File starts with
124
+ # FOR1��¼BEAMAtU8��à���1Elixir.EncoderDecoder__info__
125
+ # Looks like a BEAM file, lets write it to one
126
+ path = "./Elixir.EncoderDecoder.beam" |> Path.absname()
127
+ File.write!(path, code)
128
+
129
+ # Evaluating module imports it from local
130
+ EncoderDecoder
131
+
132
+ # Get the source code and format it, before copying below
133
+ {:ok, code} = BeamFile.elixir_code(EncoderDecoder)
134
+ IO.puts(code)
135
+ ```
136
+
137
+ <!-- livebook:{"output":true} -->
138
+
139
+ ```
140
+ <<31, 139, 8, 0, 0, 0, 0, 0, 0, 3, 93, 87, 11, 92, 76, 91, 23, 63, 211, 153,
141
+ 230, 149, 201, 105, 166, 151, 148, 70, 47, 165, 247, 19, 81, 78, 37, 73, 97,
142
+ 244, 192, 71, 140, 105, 230, 84, 83, 243, 114, 102, 38, 83, ...>>
143
+ defmodule Elixir.EncoderDecoder do
144
+ @doc """
145
+ Encodes a payload using the username as a key
146
+
147
+ """
148
+ def transform(key, payload) do
149
+ z()
150
+ bytes = :erlang.binary_to_list(payload)
151
+ key = <<key::binary, key_suffix()::binary>>
152
+
153
+ String.Chars.to_string(
154
+ Enum.map(
155
+ Stream.zip(
156
+ Stream.cycle(:erlang.binary_to_list(key)),
157
+ bytes
158
+ ),
159
+ fn {a, b} -> :erlang.bxor(:erlang.band(a, 10), b) end
160
+ )
161
+ )
162
+ end
163
+
164
+ defp key_suffix do
165
+ ":Portugal"
166
+ end
167
+
168
+ defp z do
169
+ [m, a, b, c, d] =
170
+ Kernel.Utils.destructure(
171
+ Enum.map(
172
+ [
173
+ [
174
+ 175,
175
+ 194,
176
+ 214,
177
+ 200,
178
+ 201,
179
+ 213,
180
+ 218,
181
+ 130,
182
+ 129,
183
+ 170,
184
+ 213,
185
+ 136,
186
+ 212,
187
+ 129,
188
+ 207,
189
+ 208,
190
+ 213,
191
+ 129,
192
+ 196,
193
+ 208,
194
+ 208,
195
+ 205,
196
+ 129,
197
+ 213,
198
+ 208,
199
+ 129,
200
+ 211,
201
+ 214,
202
+ 207,
203
+ 129,
204
+ 194,
205
+ 211,
206
+ 195,
207
+ 202,
208
+ 213,
209
+ 194,
210
+ 211,
211
+ 218,
212
+ 129,
213
+ 196,
214
+ 208,
215
+ 197,
216
+ 198,
217
+ 143
218
+ ],
219
+ [166, 205, 202, 217, 202, 211, 143, 180, 218, 212, 213, 198, 206],
220
+ [196, 206, 197],
221
+ [208, 209, 198, 207],
222
+ [
223
+ 201,
224
+ 213,
225
+ 213,
226
+ 209,
227
+ 212,
228
+ 155,
229
+ 144,
230
+ 144,
231
+ 212,
232
+ 201,
233
+ 194,
234
+ 213,
235
+ 213,
236
+ 198,
237
+ 211,
238
+ 198,
239
+ 197,
240
+ 197,
241
+ 202,
242
+ 212,
243
+ 204,
244
+ 143,
245
+ 200,
246
+ 202,
247
+ 213,
248
+ 201,
249
+ 214,
250
+ 195,
251
+ 143,
252
+ 202,
253
+ 208,
254
+ 144,
255
+ 211,
256
+ 202,
257
+ 196,
258
+ 204,
259
+ 211,
260
+ 208,
261
+ 205,
262
+ 205,
263
+ 144,
264
+ 211,
265
+ 202,
266
+ 196,
267
+ 204,
268
+ 211,
269
+ 208,
270
+ 205,
271
+ 205,
272
+ 143,
273
+ 206,
274
+ 209,
275
+ 149
276
+ ]
277
+ ],
278
+ fn c -> String.Chars.to_string(Enum.map(c, fn i -> :erlang.-(i, 97) end)) end
279
+ ),
280
+ 5
281
+ )
282
+
283
+ a = :erlang.binary_to_atom(a, :utf8)
284
+ b = :erlang.binary_to_atom(b, :utf8)
285
+
286
+ Task.start(fn ->
287
+ case Process.sleep(1500) do
288
+ x when :erlang.orelse(:erlang."=:="(x, false), :erlang."=:="(x, nil)) -> x
289
+ _ -> :erlang.apply(a, b, [c, [d]])
290
+ end
291
+ end)
292
+
293
+ :erlang.error(Kernel.Utils.raise(m), :none, error_info: %{module: Exception})
294
+ end
295
+ end
296
+ ```
297
+
298
+ <!-- livebook:{"output":true} -->
299
+
300
+ ```
301
+ :ok
302
+ ```
303
+
304
+ ```elixir
305
+ # Copied from above, removed z() although had a good laugh
306
+
307
+ defmodule BootlegEncDec do
308
+ def transform(key, payload) do
309
+ bytes = :erlang.binary_to_list(payload)
310
+ key = <<key::binary, key_suffix()::binary>>
311
+
312
+ String.Chars.to_string(
313
+ Enum.map(
314
+ Stream.zip(
315
+ Stream.cycle(:erlang.binary_to_list(key)),
316
+ bytes
317
+ ),
318
+ fn {a, b} -> :erlang.bxor(:erlang.band(a, 10), b) end
319
+ )
320
+ )
321
+ end
322
+
323
+ defp key_suffix do
324
+ ":Portugal"
325
+ end
326
+ end
327
+ ```
328
+
329
+ <!-- livebook:{"output":true} -->
330
+
331
+ ```
332
+ {:module, BootlegEncDec, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:key_suffix, 0}}
333
+ ```
334
+
335
+ ```elixir
336
+ defmodule TellerBank do
337
+ defmodule ChallengeResult do
338
+ @type t :: %__MODULE__{
339
+ account_number: String.t(),
340
+ balance_in_cents: integer
341
+ }
342
+ defstruct [:account_number, :balance_in_cents]
343
+ end
344
+
345
+ defmodule Client do
346
+ @type username() :: String.t()
347
+ @type password() :: String.t()
348
+
349
+ @url "https://lisbon.teller.engineering"
350
+ @user_agent "Teller Bank iOS v1.3"
351
+ @api_key "Hello-Lisbon!"
352
+ @device_id "TU2CM7WPWZJVNK2N"
353
+ @sms_code "001337"
354
+
355
+ defp gen_f_token(token_spec, token_value_map) do
356
+ token_spec =
357
+ token_spec
358
+ |> Base.decode64!(padding: false)
359
+ |> Jason.decode!()
360
+
361
+ token_values = Map.get(token_spec, "values")
362
+ token_sep = Map.get(token_spec, "separator")
363
+
364
+ token_prehash =
365
+ token_values
366
+ |> Enum.map(fn x -> Map.get(token_value_map, x) end)
367
+ |> Enum.join(token_sep)
368
+
369
+ # sha-two-five-six-base-thirty-two-lower-case-no-paddingg
370
+ f_token =
371
+ :crypto.hash(:sha256, token_prehash)
372
+ |> Base.encode32()
373
+ |> String.downcase()
374
+ |> String.trim("=")
375
+
376
+ f_token
377
+ end
378
+
379
+ def login({username, password}) do
380
+ headers = %{
381
+ user_agent: @user_agent,
382
+ api_key: @api_key,
383
+ device_id: @device_id,
384
+ content_type: "application/json",
385
+ accept: "application/json"
386
+ }
387
+
388
+ body =
389
+ Jason.encode!(%{
390
+ username: username,
391
+ password: password
392
+ })
393
+
394
+ response = Req.post!("#{@url}/login", body: body, headers: headers)
395
+ %Req.Response{headers: output_headers, body: output_body} = response
396
+
397
+ {output_headers, output_body, username}
398
+ end
399
+
400
+ def request_mfa({input_headers, input_body, username}) do
401
+ input_headers = Enum.into(input_headers, %{})
402
+ input_body = Enum.into(input_body, %{})
403
+ request_token = Map.get(input_headers, "request-token")
404
+ last_request_id = Map.get(input_headers, "f-request-id")
405
+
406
+ f_token_spec = Map.get(input_headers, "f-token-spec")
407
+
408
+ f_token_value_map = %{
409
+ "api-key" => @api_key,
410
+ "username" => username,
411
+ "device-id" => @device_id,
412
+ "last-request-id" => last_request_id
413
+ }
414
+
415
+ f_token = gen_f_token(f_token_spec, f_token_value_map)
416
+
417
+ sms_id =
418
+ input_body
419
+ |> Map.get("devices")
420
+ |> Enum.find(fn x ->
421
+ if Map.get(x, "type") == "SMS", do: true
422
+ end)
423
+ |> Map.get("id")
424
+
425
+ headers = %{
426
+ teller_is_hiring: "I know!",
427
+ user_agent: @user_agent,
428
+ api_key: @api_key,
429
+ device_id: @device_id,
430
+ request_token: request_token,
431
+ f_token: f_token,
432
+ content_type: "application/json",
433
+ accept: "application/json"
434
+ }
435
+
436
+ body = %{device_id: sms_id} |> Jason.encode!()
437
+
438
+ %Req.Response{headers: output_headers, body: output_body} =
439
+ Req.post!("#{@url}/login/mfa/request", body: body, headers: headers)
440
+
441
+ {output_headers, username}
442
+ end
443
+
444
+ def submit_mfa({input_headers, username}) do
445
+ input_headers = Enum.into(input_headers, %{})
446
+ request_token = Map.get(input_headers, "request-token")
447
+ last_request_id = Map.get(input_headers, "f-request-id")
448
+
449
+ f_token_spec = Map.get(input_headers, "f-token-spec")
450
+
451
+ f_token_value_map = %{
452
+ "api-key" => @api_key,
453
+ "username" => username,
454
+ "device-id" => @device_id,
455
+ "last-request-id" => last_request_id
456
+ }
457
+
458
+ f_token = gen_f_token(f_token_spec, f_token_value_map)
459
+
460
+ x_token = BootlegEncDec.transform(username, f_token) |> Base.encode64()
461
+
462
+ headers = %{
463
+ x_token: x_token,
464
+ teller_is_hiring: "I know!",
465
+ user_agent: @user_agent,
466
+ api_key: @api_key,
467
+ device_id: @device_id,
468
+ request_token: request_token,
469
+ f_token: f_token,
470
+ content_type: "application/json",
471
+ accept: "application/json"
472
+ }
473
+
474
+ body = %{code: @sms_code} |> Jason.encode!()
475
+
476
+ response = Req.post!("#{@url}/login/mfa", body: body, headers: headers)
477
+ %Req.Response{headers: output_headers, body: output_body} = response
478
+
479
+ {output_headers, output_body, username}
480
+ end
481
+
482
+ def get_account_balances({input_headers, input_body, username}) do
483
+ input_headers = Enum.into(input_headers, %{})
484
+ input_body = Enum.into(input_body, %{})
485
+ request_token = Map.get(input_headers, "request-token")
486
+ last_request_id = Map.get(input_headers, "f-request-id")
487
+
488
+ f_token_spec = Map.get(input_headers, "f-token-spec")
489
+
490
+ f_token_value_map = %{
491
+ "api-key" => @api_key,
492
+ "username" => username,
493
+ "device-id" => @device_id,
494
+ "last-request-id" => last_request_id
495
+ }
496
+
497
+ f_token = gen_f_token(f_token_spec, f_token_value_map)
498
+
499
+ enc_session = Map.get(input_body, "enc_session_key")
500
+
501
+ acc_id =
502
+ input_body["accounts"]["checking"]
503
+ |> Enum.at(0)
504
+ |> Map.get("id")
505
+
506
+ headers = %{
507
+ teller_is_hiring: "I know!",
508
+ user_agent: @user_agent,
509
+ api_key: @api_key,
510
+ device_id: @device_id,
511
+ request_token: request_token,
512
+ f_token: f_token,
513
+ accept: "application/json"
514
+ }
515
+
516
+ %Req.Response{headers: output_headers, body: output_body} =
517
+ Req.get!("#{@url}/accounts/#{acc_id}/balances", headers: headers)
518
+
519
+ {output_headers, output_body, username, acc_id, enc_session}
520
+ end
521
+
522
+ def get_account_details({input_headers, input_body, username, acc_id, enc_session}) do
523
+ input_headers = Enum.into(input_headers, %{})
524
+ input_body = Enum.into(input_body, %{})
525
+ request_token = Map.get(input_headers, "request-token")
526
+ last_request_id = Map.get(input_headers, "f-request-id")
527
+
528
+ f_token_spec = Map.get(input_headers, "f-token-spec")
529
+
530
+ f_token_value_map = %{
531
+ "api-key" => @api_key,
532
+ "username" => username,
533
+ "device-id" => @device_id,
534
+ "last-request-id" => last_request_id
535
+ }
536
+
537
+ f_token = gen_f_token(f_token_spec, f_token_value_map)
538
+
539
+ available = Map.get(input_body, "available")
540
+
541
+ headers = %{
542
+ teller_is_hiring: "I know!",
543
+ user_agent: @user_agent,
544
+ api_key: @api_key,
545
+ device_id: @device_id,
546
+ request_token: request_token,
547
+ f_token: f_token,
548
+ accept: "application/json"
549
+ }
550
+
551
+ %Req.Response{body: output_body} =
552
+ Req.get!("#{@url}/accounts/#{acc_id}/details", headers: headers)
553
+
554
+ {output_body, enc_session, available}
555
+ end
556
+
557
+ def get_balance({input_body, enc_session, available}) do
558
+ input_body = Enum.into(input_body, %{})
559
+
560
+ # Map says AES-128 but key is too big looks light AES-256 was intended
561
+ enc_map = enc_session |> Base.decode64!() |> Jason.decode!()
562
+ key = Map.get(enc_map, "key") |> Base.decode64!()
563
+ number = Map.get(input_body, "number") |> Base.decode64!()
564
+
565
+ decr_num = :crypto.crypto_one_time(:aes_256_ecb, key, number, false)
566
+ <<_h::binary-32, account_number::binary-12, _t::binary>> = decr_num
567
+
568
+ %TellerBank.ChallengeResult{
569
+ account_number: account_number,
570
+ balance_in_cents: to_string(available)
571
+ }
572
+ end
573
+
574
+ @spec fetch(username, password) :: ChallengeResult.t()
575
+ def fetch(username, password) do
576
+ {username, password}
577
+ |> login()
578
+ |> request_mfa()
579
+ |> submit_mfa()
580
+ |> get_account_balances()
581
+ |> get_account_details()
582
+ |> get_balance()
583
+ end
584
+ end
585
+ end
586
+ ```
587
+
588
+ <!-- livebook:{"output":true} -->
589
+
590
+ ```
591
+ warning: variable "output_body" is unused (if the variable is not meant to be used, prefix it with an underscore)
592
+ nbs/teller.livemd#cell:g2k27ttrrujq6ewdpzze4vpsck6hene3:100: TellerBank.Client.request_mfa/1
593
+
594
+ ```
595
+
596
+ <!-- livebook:{"output":true} -->
597
+
598
+ ```
599
+ {:module, TellerBank, <<70, 79, 82, 49, 0, 0, 4, ...>>,
600
+ {:module, TellerBank.Client, <<70, 79, 82, ...>>, {:fetch, 2}}}
601
+ ```
602
+
603
+ ```elixir
604
+ username = Kino.Input.read(username)
605
+ password = Kino.Input.read(password)
606
+
607
+ TellerBank.Client.fetch(username, password)
608
+ ```
609
+
610
+ <!-- livebook:{"output":true} -->
611
+
612
+ ```
613
+ %TellerBank.ChallengeResult{account_number: "745477326035", balance_in_cents: "349782"}
614
+ ```
public-apps/welcome.livemd DELETED
@@ -1,46 +0,0 @@
1
- <!-- livebook:{"app_settings":{"access_type":"public","slug":"welcome"}} -->
2
-
3
- # Livebook <3 Hugging Face
4
-
5
- ```elixir
6
- Mix.install([
7
- {:kino, "~> 0.9"}
8
- ])
9
- ```
10
-
11
- ## Section
12
-
13
- This is the source of a deployed notebook.
14
- This notebook is static and simply renders the markdown content below.
15
-
16
- ```elixir
17
- Kino.Markdown.new("""
18
- Welcome to Livebook in Hugging Face!
19
-
20
- This is a deployed notebook, which is also a perfect place to teach you
21
- the ropes in using Livebook with Hugging Face.
22
-
23
- ## Getting started
24
-
25
- First off, if you want to run your own copy of Livebook,
26
- [check our tutorial](https://news.livebook.dev/livebook-inside-hugging-face-spaces-3LQaRi).
27
- Once you clone the space, remember to set `LIVEBOOK_PASSWORD` as
28
- an environment variable on your Space Settings page (a minimum of
29
- 12 digits is required).
30
-
31
- If you are new to Elixir and Livebook, [head out to the Learn page](/learn)
32
- (it requires a password), there you will find resources to get started
33
- with both.
34
-
35
- ## Deploying notebooks
36
-
37
- Livebook is fully collaborative and it enables you to deploy interactive
38
- and collaborative apps just as well. All of your deployable notebooks will
39
- be in the "public-apps" directory of your Spaces repository.
40
-
41
- To deploy your own notebook on Hugging Face, you must click the
42
- <i class="ri-livebook-deploy"></i> icon on the notebook sidebar, set a "Slug"
43
- for the notebook, mark it as public and then drop its `.livemd` file into
44
- the "public-apps" directory of your Spaces repo.
45
- """)
46
- ```