-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobject-storage.html
More file actions
1481 lines (1423 loc) · 331 KB
/
object-storage.html
File metadata and controls
1481 lines (1423 loc) · 331 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html><html lang="zh-CN"><head><title>数据中心技术</title><meta property="og:title" content="数据中心技术"><meta charset="UTF-8"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0"><meta name="apple-mobile-web-app-capable" content="yes"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta property="og:type" content="website"><meta name="twitter:card" content="summary"><style>@media screen{body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{appearance:none;background-color:initial;border:0;color:inherit;cursor:pointer;font-size:inherit;opacity:.8;outline:none;padding:0;transition:opacity .2s linear;-webkit-tap-highlight-color:transparent}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:disabled{cursor:not-allowed;opacity:.15!important}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover{opacity:1}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:active{opacity:.6}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:not(:disabled){transition:none}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-prev{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNNjggOTAgMjggNTBsNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-next{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJtMzIgOTAgNDAtNDAtNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNNDAgNzBIMjBWNTBtMjAgMEwyMCA3MG00MC00MGgyMHYyMG0tMjAgMCAyMC0yMCIgY2xhc3M9ImEiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button.exit[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button.exit[data-bespoke-marp-osc=fullscreen]{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNMjAgNTBoMjB2MjBtLTIwIDAgMjAtMjBtNDAgMEg2MFYzMG0yMCAwTDYwIDUwIiBjbGFzcz0iYSIvPjwvc3ZnPg==")}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNODcuOCA0Ny41Qzg5IDUwIDg3LjcgNTIgODUgNTJIMzVhOC43IDguNyAwIDAgMS03LjItNC41bC0xNS42LTMxQzExIDE0IDEyLjIgMTIgMTUgMTJoNTBhOC44IDguOCAwIDAgMSA3LjIgNC41ek02MCA1MnYzNm0tMTAgMGgyME00NSA0MmgyMCIvPjwvc3ZnPg==") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-bigger{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODBNNTIgOTBWMTAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-smaller{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}}@keyframes __bespoke_marp_transition_reduced_outgoing__{0%{opacity:1}to{opacity:0}}@keyframes __bespoke_marp_transition_reduced_incoming__{0%{mix-blend-mode:plus-lighter;opacity:0}to{mix-blend-mode:plus-lighter;opacity:1}}.bespoke-marp-note,.bespoke-marp-osc,.bespoke-progress-parent{display:none;transition:none}@media screen{::view-transition-group(*){animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-timing-function:ease}::view-transition-new(*),::view-transition-old(*){animation-delay:0s;animation-direction:var(--marp-bespoke-transition-animation-direction,normal);animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-fill-mode:both;animation-name:var(--marp-bespoke-transition-animation-name,var(--marp-bespoke-transition-animation-name-fallback,__bespoke_marp_transition_no_animation__));mix-blend-mode:normal}::view-transition-old(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_outgoing__;animation-timing-function:ease}::view-transition-new(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_incoming__;animation-timing-function:ease}::view-transition-new(root),::view-transition-old(root){animation-timing-function:linear}::view-transition-new(__bespoke_marp_transition_osc__),::view-transition-old(__bespoke_marp_transition_osc__){animation-duration:0s!important;animation-name:__bespoke_marp_transition_osc__!important}::view-transition-new(__bespoke_marp_transition_osc__){opacity:0!important}.bespoke-marp-transition-warming-up::view-transition-group(*),.bespoke-marp-transition-warming-up::view-transition-new(*),.bespoke-marp-transition-warming-up::view-transition-old(*){animation-play-state:paused!important}body,html{height:100%;margin:0}body{background:#000;overflow:hidden}svg.bespoke-marp-slide{content-visibility:hidden;opacity:0;pointer-events:none;z-index:-1}svg.bespoke-marp-slide:not(.bespoke-marp-active) *{view-transition-name:none!important}svg.bespoke-marp-slide.bespoke-marp-active{content-visibility:visible;opacity:1;pointer-events:auto;z-index:0}svg.bespoke-marp-slide.bespoke-marp-active.bespoke-marp-active-ready *{animation-name:__bespoke_marp__!important}@supports not (content-visibility:hidden){svg.bespoke-marp-slide[data-bespoke-marp-load=hideable]{display:none}svg.bespoke-marp-slide[data-bespoke-marp-load=hideable].bespoke-marp-active{display:block}}}@media screen and (prefers-reduced-motion:reduce){svg.bespoke-marp-slide *{view-transition-name:none!important}}@media screen{[data-bespoke-marp-fragment=inactive]{visibility:hidden}body[data-bespoke-view=""] .bespoke-marp-parent,body[data-bespoke-view=next] .bespoke-marp-parent{inset:0;position:absolute}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc{background:#000000a6;border-radius:7px;bottom:50px;color:#fff;contain:paint;display:block;font-family:Helvetica,Arial,sans-serif;font-size:16px;left:50%;line-height:0;opacity:1;padding:12px;position:absolute;touch-action:manipulation;transform:translateX(-50%);transition:opacity .2s linear;-webkit-user-select:none;user-select:none;white-space:nowrap;will-change:transform;z-index:1;view-transition-name:__bespoke_marp_transition_osc__}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>*,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>*{margin-left:6px}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>:first-child,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>:first-child{margin-left:0}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>span,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>span{opacity:.8}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>span[data-bespoke-marp-osc=page],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>span[data-bespoke-marp-osc=page]{display:inline-block;min-width:140px;text-align:center}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev]{height:32px;line-height:32px;width:32px}body[data-bespoke-view=""] .bespoke-marp-parent.bespoke-marp-inactive,body[data-bespoke-view=next] .bespoke-marp-parent.bespoke-marp-inactive{cursor:none}body[data-bespoke-view=""] .bespoke-marp-parent.bespoke-marp-inactive>.bespoke-marp-osc,body[data-bespoke-view=next] .bespoke-marp-parent.bespoke-marp-inactive>.bespoke-marp-osc{opacity:0;pointer-events:none}body[data-bespoke-view=""] svg.bespoke-marp-slide,body[data-bespoke-view=next] svg.bespoke-marp-slide{height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent{background:#222;display:flex;height:5px;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent+.bespoke-marp-parent{top:5px}body[data-bespoke-view=""] .bespoke-progress-parent .bespoke-progress-bar{background:#0288d1;flex:0 0 0;transition:flex-basis .2s cubic-bezier(0,1,1,1)}body[data-bespoke-view=next]{background:#0000}body[data-bespoke-view=presenter]{background:#161616}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container{display:grid;font-family:Helvetica,Arial,sans-serif;grid-template:"current dragbar next" minmax(140px,1fr) "current dragbar note" 2fr "info dragbar note" 3em;grid-template-columns:minmax(3px,var(--bespoke-marp-presenter-split-ratio,66%)) 0 minmax(3px,1fr);height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-parent{grid-area:current;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-parent svg.bespoke-marp-slide{height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-parent svg.bespoke-marp-slide.bespoke-marp-active{filter:drop-shadow(0 3px 10px rgba(0,0,0,.5))}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container{background:#0288d1;cursor:col-resize;grid-area:dragbar;margin-left:-3px;opacity:0;position:relative;transition:opacity .4s linear .1s;width:6px;z-index:10}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container:hover{opacity:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container.active{opacity:1;transition-delay:0s}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container{background:#222;cursor:pointer;display:none;grid-area:next;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container iframe.bespoke-marp-presenter-next{background:#0000;border:0;display:block;filter:drop-shadow(0 3px 10px rgba(0,0,0,.5));height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container{background:#222;color:#eee;grid-area:note;position:relative;z-index:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper{display:block;inset:0;position:absolute}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons{background:#000000a6;border-radius:4px;bottom:0;display:flex;gap:4px;margin:12px;opacity:0;padding:6px;pointer-events:none;position:absolute;right:0;transition:opacity .2s linear}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons:focus-within,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper:focus-within+.bespoke-marp-presenter-note-buttons,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container:hover .bespoke-marp-presenter-note-buttons{opacity:1;pointer-events:auto}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note{box-sizing:border-box;font-size:calc(1.1em*var(--bespoke-marp-note-font-scale, 1));height:calc(100% - 40px);margin:20px;overflow:auto;padding-right:3px;white-space:pre-wrap;width:calc(100% - 40px);word-wrap:break-word;scrollbar-color:#eeeeee80 #0000;scrollbar-width:thin}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar{width:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-track{background:#0000}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-thumb{background:#eeeeee80;border-radius:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note:empty{pointer-events:none}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:first-child{margin-top:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:last-child{margin-bottom:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container{align-items:center;box-sizing:border-box;color:#eee;display:flex;flex-wrap:nowrap;grid-area:info;justify-content:center;overflow:hidden;padding:0 10px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-time,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer{box-sizing:border-box;display:block;padding:0 10px;white-space:nowrap;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page{order:2;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page .bespoke-marp-presenter-info-page-text{display:inline-block;min-width:120px;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-time{color:#999;order:1;text-align:left}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer{color:#999;order:3;text-align:right}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer:hover{cursor:pointer}}@media print{.bespoke-marp-presenter-info-container,.bespoke-marp-presenter-next-container,.bespoke-marp-presenter-note-container{display:none}}</style><style>@charset "UTF-8";@import "https://fonts.bunny.net/css?family=Lato:400,900|Roboto+Mono:400,700&display=swap";div#\:\$p > svg > foreignObject > section{width:1280px;height:720px;box-sizing:border-box;overflow:hidden;position:relative;scroll-snap-align:center center;-webkit-text-size-adjust:100%;text-size-adjust:100%}div#\:\$p > svg > foreignObject > section::after{bottom:0;content:attr(data-marpit-pagination);padding:inherit;pointer-events:none;position:absolute;right:0}div#\:\$p > svg > foreignObject > section:not([data-marpit-pagination])::after{display:none}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){font-size:2em;margin-block:0.67em}div#\:\$p > svg > foreignObject > section video::-webkit-media-controls{will-change:transform}@page {size:1280px 720px;margin:0}@media print{html, body{background-color:#fff;margin:0;page-break-inside:avoid;break-inside:avoid-page}div#\:\$p > svg > foreignObject > section{page-break-before:always;break-before:page}div#\:\$p > svg > foreignObject > section, div#\:\$p > svg > foreignObject > section *{-webkit-print-color-adjust:exact!important;animation-delay:0s!important;animation-duration:0s!important;color-adjust:exact!important;print-color-adjust:exact!important;transition:none!important}div#\:\$p > svg[data-marpit-svg]{display:block;height:100vh;width:100vw}}div#\:\$p > svg > foreignObject > :where(section){container-type:size}@font-face {font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_AMS-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_AMS-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_AMS-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Caligraphic-Bold.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Caligraphic-Bold.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Caligraphic-Bold.ttf') format("truetype")}@font-face {font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Caligraphic-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Caligraphic-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Caligraphic-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Fraktur-Bold.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Fraktur-Bold.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Fraktur-Bold.ttf') format("truetype")}@font-face {font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Fraktur-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Fraktur-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Fraktur-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Bold.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Bold.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Bold.ttf') format("truetype")}@font-face {font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-BoldItalic.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-BoldItalic.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-BoldItalic.ttf') format("truetype")}@font-face {font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Italic.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Italic.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Italic.ttf') format("truetype")}@font-face {font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Main-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Math-BoldItalic.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Math-BoldItalic.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Math-BoldItalic.ttf') format("truetype")}@font-face {font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Math-Italic.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Math-Italic.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Math-Italic.ttf') format("truetype")}@font-face {font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Bold.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Bold.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Bold.ttf') format("truetype")}@font-face {font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Italic.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Italic.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Italic.ttf') format("truetype")}@font-face {font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_SansSerif-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Script-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Script-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Script-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size1-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size1-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size1-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size2-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size2-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size2-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size3-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size3-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size3-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size4-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size4-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Size4-Regular.ttf') format("truetype")}@font-face {font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Typewriter-Regular.woff2') format("woff2"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Typewriter-Regular.woff') format("woff"), url('https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/fonts/KaTeX_Typewriter-Regular.ttf') format("truetype")}div#\:\$p > svg > foreignObject > section .katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}div#\:\$p > svg > foreignObject > section .katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}div#\:\$p > svg > foreignObject > section .katex .katex-version:after{content:"0.16.22"}div#\:\$p > svg > foreignObject > section .katex .katex-mathml{clip:rect(1px, 1px, 1px, 1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}div#\:\$p > svg > foreignObject > section .katex .katex-html>.newline{display:block}div#\:\$p > svg > foreignObject > section .katex .base{position:relative;white-space:nowrap;width:-moz-min-content;width:min-content}div#\:\$p > svg > foreignObject > section .katex .base,div#\:\$p > svg > foreignObject > section .katex .strut{display:inline-block}div#\:\$p > svg > foreignObject > section .katex .textbf{font-weight:700}div#\:\$p > svg > foreignObject > section .katex .textit{font-style:italic}div#\:\$p > svg > foreignObject > section .katex .textrm{font-family:KaTeX_Main}div#\:\$p > svg > foreignObject > section .katex .textsf{font-family:KaTeX_SansSerif}div#\:\$p > svg > foreignObject > section .katex .texttt{font-family:KaTeX_Typewriter}div#\:\$p > svg > foreignObject > section .katex .mathnormal{font-family:KaTeX_Math;font-style:italic}div#\:\$p > svg > foreignObject > section .katex .mathit{font-family:KaTeX_Main;font-style:italic}div#\:\$p > svg > foreignObject > section .katex .mathrm{font-style:normal}div#\:\$p > svg > foreignObject > section .katex .mathbf{font-family:KaTeX_Main;font-weight:700}div#\:\$p > svg > foreignObject > section .katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}div#\:\$p > svg > foreignObject > section .katex .amsrm,div#\:\$p > svg > foreignObject > section .katex .mathbb,div#\:\$p > svg > foreignObject > section .katex .textbb{font-family:KaTeX_AMS}div#\:\$p > svg > foreignObject > section .katex .mathcal{font-family:KaTeX_Caligraphic}div#\:\$p > svg > foreignObject > section .katex .mathfrak,div#\:\$p > svg > foreignObject > section .katex .textfrak{font-family:KaTeX_Fraktur}div#\:\$p > svg > foreignObject > section .katex .mathboldfrak,div#\:\$p > svg > foreignObject > section .katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}div#\:\$p > svg > foreignObject > section .katex .mathtt{font-family:KaTeX_Typewriter}div#\:\$p > svg > foreignObject > section .katex .mathscr,div#\:\$p > svg > foreignObject > section .katex .textscr{font-family:KaTeX_Script}div#\:\$p > svg > foreignObject > section .katex .mathsf,div#\:\$p > svg > foreignObject > section .katex .textsf{font-family:KaTeX_SansSerif}div#\:\$p > svg > foreignObject > section .katex .mathboldsf,div#\:\$p > svg > foreignObject > section .katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}div#\:\$p > svg > foreignObject > section .katex .mathitsf,div#\:\$p > svg > foreignObject > section .katex .mathsfit,div#\:\$p > svg > foreignObject > section .katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}div#\:\$p > svg > foreignObject > section .katex .mainrm{font-family:KaTeX_Main;font-style:normal}div#\:\$p > svg > foreignObject > section .katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}div#\:\$p > svg > foreignObject > section .katex .vlist-r{display:table-row}div#\:\$p > svg > foreignObject > section .katex .vlist{display:table-cell;position:relative;vertical-align:bottom}div#\:\$p > svg > foreignObject > section .katex .vlist>:is(span, marp-span){display:block;height:0;position:relative}div#\:\$p > svg > foreignObject > section .katex .vlist>:is(span, marp-span)>:is(span, marp-span){display:inline-block}div#\:\$p > svg > foreignObject > section .katex .vlist>:is(span, marp-span)>.pstrut{overflow:hidden;width:0}div#\:\$p > svg > foreignObject > section .katex .vlist-t2{margin-right:-2px}div#\:\$p > svg > foreignObject > section .katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.vlist-s{--marpit-root-font-size:1px;}div#\:\$p > svg > foreignObject > section .katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}div#\:\$p > svg > foreignObject > section .katex .hbox{width:100%}div#\:\$p > svg > foreignObject > section .katex .hbox,div#\:\$p > svg > foreignObject > section .katex .thinbox{display:inline-flex;flex-direction:row}div#\:\$p > svg > foreignObject > section .katex .thinbox{max-width:0;width:0}div#\:\$p > svg > foreignObject > section .katex .msupsub{text-align:left}div#\:\$p > svg > foreignObject > section .katex .mfrac>:is(span, marp-span)>:is(span, marp-span){text-align:center}div#\:\$p > svg > foreignObject > section .katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}div#\:\$p > svg > foreignObject > section .katex .hdashline,div#\:\$p > svg > foreignObject > section .katex .hline,div#\:\$p > svg > foreignObject > section .katex .mfrac .frac-line,div#\:\$p > svg > foreignObject > section .katex .overline .overline-line,div#\:\$p > svg > foreignObject > section .katex .rule,div#\:\$p > svg > foreignObject > section .katex .underline .underline-line{min-height:1px}div#\:\$p > svg > foreignObject > section .katex .mspace{display:inline-block}div#\:\$p > svg > foreignObject > section .katex .clap,div#\:\$p > svg > foreignObject > section .katex .llap,div#\:\$p > svg > foreignObject > section .katex .rlap{position:relative;width:0}div#\:\$p > svg > foreignObject > section .katex .clap>.inner,div#\:\$p > svg > foreignObject > section .katex .llap>.inner,div#\:\$p > svg > foreignObject > section .katex .rlap>.inner{position:absolute}div#\:\$p > svg > foreignObject > section .katex .clap>.fix,div#\:\$p > svg > foreignObject > section .katex .llap>.fix,div#\:\$p > svg > foreignObject > section .katex .rlap>.fix{display:inline-block}div#\:\$p > svg > foreignObject > section .katex .llap>.inner{right:0}div#\:\$p > svg > foreignObject > section .katex .clap>.inner,div#\:\$p > svg > foreignObject > section .katex .rlap>.inner{left:0}div#\:\$p > svg > foreignObject > section .katex .clap>.inner>:is(span, marp-span){margin-left:-50%;margin-right:50%}div#\:\$p > svg > foreignObject > section .katex .rule{border:0 solid;display:inline-block;position:relative}div#\:\$p > svg > foreignObject > section .katex .hline,div#\:\$p > svg > foreignObject > section .katex .overline .overline-line,div#\:\$p > svg > foreignObject > section .katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}div#\:\$p > svg > foreignObject > section .katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}div#\:\$p > svg > foreignObject > section .katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size1{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size1{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size2{font-size:1.2em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size2{--marpit-root-font-size:1.2em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size3{font-size:1.4em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size3{--marpit-root-font-size:1.4em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size4{font-size:1.6em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size4{--marpit-root-font-size:1.6em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size5{font-size:1.8em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size5{--marpit-root-font-size:1.8em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size6{font-size:2em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size6{--marpit-root-font-size:2em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size7{font-size:2.4em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size7{--marpit-root-font-size:2.4em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size8{font-size:2.88em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size8{--marpit-root-font-size:2.88em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size9{font-size:3.456em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size9{--marpit-root-font-size:3.456em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size10{font-size:4.148em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size10{--marpit-root-font-size:4.148em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size1.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size1.size11{font-size:4.976em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size1.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size1.size11{--marpit-root-font-size:4.976em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size1{font-size:.8333333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size1{--marpit-root-font-size:.8333333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size2{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size2{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size3{font-size:1.1666666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size3{--marpit-root-font-size:1.1666666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size4{font-size:1.3333333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size4{--marpit-root-font-size:1.3333333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size5{font-size:1.5em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size5{--marpit-root-font-size:1.5em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size6{font-size:1.6666666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size6{--marpit-root-font-size:1.6666666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size7{font-size:2em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size7{--marpit-root-font-size:2em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size8{font-size:2.4em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size8{--marpit-root-font-size:2.4em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size9{font-size:2.88em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size9{--marpit-root-font-size:2.88em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size10{font-size:3.4566666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size10{--marpit-root-font-size:3.4566666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size2.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size2.size11{font-size:4.1466666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size2.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size2.size11{--marpit-root-font-size:4.1466666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size1{font-size:.7142857143em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size1{--marpit-root-font-size:.7142857143em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size2{font-size:.8571428571em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size2{--marpit-root-font-size:.8571428571em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size3{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size3{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size4{font-size:1.1428571429em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size4{--marpit-root-font-size:1.1428571429em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size5{font-size:1.2857142857em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size5{--marpit-root-font-size:1.2857142857em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size6{font-size:1.4285714286em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size6{--marpit-root-font-size:1.4285714286em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size7{font-size:1.7142857143em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size7{--marpit-root-font-size:1.7142857143em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size8{font-size:2.0571428571em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size8{--marpit-root-font-size:2.0571428571em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size9{font-size:2.4685714286em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size9{--marpit-root-font-size:2.4685714286em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size10{font-size:2.9628571429em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size10{--marpit-root-font-size:2.9628571429em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size3.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size3.size11{font-size:3.5542857143em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size3.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size3.size11{--marpit-root-font-size:3.5542857143em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size1{font-size:.625em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size1{--marpit-root-font-size:.625em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size2{font-size:.75em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size2{--marpit-root-font-size:.75em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size3{font-size:.875em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size3{--marpit-root-font-size:.875em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size4{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size4{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size5{font-size:1.125em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size5{--marpit-root-font-size:1.125em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size6{font-size:1.25em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size6{--marpit-root-font-size:1.25em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size7{font-size:1.5em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size7{--marpit-root-font-size:1.5em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size8{font-size:1.8em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size8{--marpit-root-font-size:1.8em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size9{font-size:2.16em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size9{--marpit-root-font-size:2.16em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size10{font-size:2.5925em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size10{--marpit-root-font-size:2.5925em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size4.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size4.size11{font-size:3.11em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size4.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size4.size11{--marpit-root-font-size:3.11em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size1{font-size:.5555555556em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size1{--marpit-root-font-size:.5555555556em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size2{font-size:.6666666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size2{--marpit-root-font-size:.6666666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size3{font-size:.7777777778em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size3{--marpit-root-font-size:.7777777778em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size4{font-size:.8888888889em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size4{--marpit-root-font-size:.8888888889em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size5{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size5{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size6{font-size:1.1111111111em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size6{--marpit-root-font-size:1.1111111111em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size7{font-size:1.3333333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size7{--marpit-root-font-size:1.3333333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size8{font-size:1.6em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size8{--marpit-root-font-size:1.6em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size9{font-size:1.92em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size9{--marpit-root-font-size:1.92em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size10{font-size:2.3044444444em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size10{--marpit-root-font-size:2.3044444444em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size5.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size5.size11{font-size:2.7644444444em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size5.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size5.size11{--marpit-root-font-size:2.7644444444em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size1{font-size:.5em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size1{--marpit-root-font-size:.5em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size2{font-size:.6em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size2{--marpit-root-font-size:.6em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size3{font-size:.7em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size3{--marpit-root-font-size:.7em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size4{font-size:.8em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size4{--marpit-root-font-size:.8em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size5{font-size:.9em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size5{--marpit-root-font-size:.9em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size6{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size6{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size7{font-size:1.2em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size7{--marpit-root-font-size:1.2em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size8{font-size:1.44em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size8{--marpit-root-font-size:1.44em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size9{font-size:1.728em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size9{--marpit-root-font-size:1.728em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size10{font-size:2.074em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size10{--marpit-root-font-size:2.074em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size6.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size6.size11{font-size:2.488em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size6.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size6.size11{--marpit-root-font-size:2.488em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size1{font-size:.4166666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size1{--marpit-root-font-size:.4166666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size2{font-size:.5em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size2{--marpit-root-font-size:.5em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size3{font-size:.5833333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size3{--marpit-root-font-size:.5833333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size4{font-size:.6666666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size4{--marpit-root-font-size:.6666666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size5{font-size:.75em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size5{--marpit-root-font-size:.75em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size6{font-size:.8333333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size6{--marpit-root-font-size:.8333333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size7{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size7{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size8{font-size:1.2em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size8{--marpit-root-font-size:1.2em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size9{font-size:1.44em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size9{--marpit-root-font-size:1.44em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size10{font-size:1.7283333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size10{--marpit-root-font-size:1.7283333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size7.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size7.size11{font-size:2.0733333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size7.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size7.size11{--marpit-root-font-size:2.0733333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size1{font-size:.3472222222em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size1{--marpit-root-font-size:.3472222222em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size2{font-size:.4166666667em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size2{--marpit-root-font-size:.4166666667em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size3{font-size:.4861111111em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size3{--marpit-root-font-size:.4861111111em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size4{font-size:.5555555556em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size4{--marpit-root-font-size:.5555555556em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size5{font-size:.625em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size5{--marpit-root-font-size:.625em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size6{font-size:.6944444444em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size6{--marpit-root-font-size:.6944444444em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size7{font-size:.8333333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size7{--marpit-root-font-size:.8333333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size8{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size8{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size9{font-size:1.2em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size9{--marpit-root-font-size:1.2em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size10{font-size:1.4402777778em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size10{--marpit-root-font-size:1.4402777778em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size8.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size8.size11{font-size:1.7277777778em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size8.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size8.size11{--marpit-root-font-size:1.7277777778em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size1{font-size:.2893518519em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size1{--marpit-root-font-size:.2893518519em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size2{font-size:.3472222222em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size2{--marpit-root-font-size:.3472222222em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size3{font-size:.4050925926em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size3{--marpit-root-font-size:.4050925926em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size4{font-size:.462962963em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size4{--marpit-root-font-size:.462962963em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size5{font-size:.5208333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size5{--marpit-root-font-size:.5208333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size6{font-size:.5787037037em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size6{--marpit-root-font-size:.5787037037em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size7{font-size:.6944444444em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size7{--marpit-root-font-size:.6944444444em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size8{font-size:.8333333333em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size8{--marpit-root-font-size:.8333333333em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size9{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size9{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size10{font-size:1.2002314815em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size10{--marpit-root-font-size:1.2002314815em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size9.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size9.size11{font-size:1.4398148148em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size9.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size9.size11{--marpit-root-font-size:1.4398148148em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size1{font-size:.2410800386em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size1{--marpit-root-font-size:.2410800386em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size2{font-size:.2892960463em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size2{--marpit-root-font-size:.2892960463em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size3{font-size:.337512054em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size3{--marpit-root-font-size:.337512054em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size4{font-size:.3857280617em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size4{--marpit-root-font-size:.3857280617em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size5{font-size:.4339440694em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size5{--marpit-root-font-size:.4339440694em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size6{font-size:.4821600771em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size6{--marpit-root-font-size:.4821600771em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size7{font-size:.5785920926em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size7{--marpit-root-font-size:.5785920926em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size8{font-size:.6943105111em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size8{--marpit-root-font-size:.6943105111em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size9{font-size:.8331726133em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size9{--marpit-root-font-size:.8331726133em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size10{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size10{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size10.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size10.size11{font-size:1.1996142719em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size10.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size10.size11{--marpit-root-font-size:1.1996142719em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size1,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size1{font-size:.2009646302em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size1, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size1{--marpit-root-font-size:.2009646302em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size2,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size2{font-size:.2411575563em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size2, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size2{--marpit-root-font-size:.2411575563em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size3,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size3{font-size:.2813504823em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size3, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size3{--marpit-root-font-size:.2813504823em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size4,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size4{font-size:.3215434084em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size4, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size4{--marpit-root-font-size:.3215434084em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size5,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size5{font-size:.3617363344em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size5, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size5{--marpit-root-font-size:.3617363344em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size6,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size6{font-size:.4019292605em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size6, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size6{--marpit-root-font-size:.4019292605em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size7,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size7{font-size:.4823151125em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size7, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size7{--marpit-root-font-size:.4823151125em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size8,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size8{font-size:.578778135em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size8, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size8{--marpit-root-font-size:.578778135em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size9,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size9{font-size:.6945337621em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size9, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size9{--marpit-root-font-size:.6945337621em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size10,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size10{font-size:.8336012862em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size10, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size10{--marpit-root-font-size:.8336012862em;}div#\:\$p > svg > foreignObject > section .katex .fontsize-ensurer.reset-size11.size11,div#\:\$p > svg > foreignObject > section .katex .sizing.reset-size11.size11{font-size:1em}div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.fontsize-ensurer.reset-size11.size11, div#\:\$p > svg > foreignObject > section .katex div#\:\$p > svg > foreignObject > section section.sizing.reset-size11.size11{--marpit-root-font-size:1em;}div#\:\$p > svg > foreignObject > section .katex .delimsizing.size1{font-family:KaTeX_Size1}div#\:\$p > svg > foreignObject > section .katex .delimsizing.size2{font-family:KaTeX_Size2}div#\:\$p > svg > foreignObject > section .katex .delimsizing.size3{font-family:KaTeX_Size3}div#\:\$p > svg > foreignObject > section .katex .delimsizing.size4{font-family:KaTeX_Size4}div#\:\$p > svg > foreignObject > section .katex .delimsizing.mult .delim-size1>:is(span, marp-span){font-family:KaTeX_Size1}div#\:\$p > svg > foreignObject > section .katex .delimsizing.mult .delim-size4>:is(span, marp-span){font-family:KaTeX_Size4}div#\:\$p > svg > foreignObject > section .katex .nulldelimiter{display:inline-block;width:.12em}div#\:\$p > svg > foreignObject > section .katex .delimcenter,div#\:\$p > svg > foreignObject > section .katex .op-symbol{position:relative}div#\:\$p > svg > foreignObject > section .katex .op-symbol.small-op{font-family:KaTeX_Size1}div#\:\$p > svg > foreignObject > section .katex .op-symbol.large-op{font-family:KaTeX_Size2}div#\:\$p > svg > foreignObject > section .katex .accent>.vlist-t,div#\:\$p > svg > foreignObject > section .katex .op-limits>.vlist-t{text-align:center}div#\:\$p > svg > foreignObject > section .katex .accent .accent-body{position:relative}div#\:\$p > svg > foreignObject > section .katex .accent .accent-body:not(.accent-full){width:0}div#\:\$p > svg > foreignObject > section .katex .overlay{display:block}div#\:\$p > svg > foreignObject > section .katex .mtable .vertical-separator{display:inline-block;min-width:1px}div#\:\$p > svg > foreignObject > section .katex .mtable .arraycolsep{display:inline-block}div#\:\$p > svg > foreignObject > section .katex .mtable .col-align-c>.vlist-t{text-align:center}div#\:\$p > svg > foreignObject > section .katex .mtable .col-align-l>.vlist-t{text-align:left}div#\:\$p > svg > foreignObject > section .katex .mtable .col-align-r>.vlist-t{text-align:right}div#\:\$p > svg > foreignObject > section .katex .svg-align{text-align:left}div#\:\$p > svg > foreignObject > section .katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}div#\:\$p > svg > foreignObject > section .katex svg path{stroke:none}div#\:\$p > svg > foreignObject > section .katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}div#\:\$p > svg > foreignObject > section .katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}div#\:\$p > svg > foreignObject > section .katex .stretchy:after,div#\:\$p > svg > foreignObject > section .katex .stretchy:before{content:""}div#\:\$p > svg > foreignObject > section .katex .hide-tail{overflow:hidden;position:relative;width:100%}div#\:\$p > svg > foreignObject > section .katex .halfarrow-left{left:0}div#\:\$p > svg > foreignObject > section .katex .halfarrow-left,div#\:\$p > svg > foreignObject > section .katex .halfarrow-right{overflow:hidden;position:absolute;width:50.2%}div#\:\$p > svg > foreignObject > section .katex .halfarrow-right{right:0}div#\:\$p > svg > foreignObject > section .katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}div#\:\$p > svg > foreignObject > section .katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}div#\:\$p > svg > foreignObject > section .katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}div#\:\$p > svg > foreignObject > section .katex .x-arrow-pad{padding:0 .5em}div#\:\$p > svg > foreignObject > section .katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}div#\:\$p > svg > foreignObject > section .katex .mover,div#\:\$p > svg > foreignObject > section .katex .munder,div#\:\$p > svg > foreignObject > section .katex .x-arrow{text-align:center}div#\:\$p > svg > foreignObject > section .katex .boxpad{padding:0 .3em}div#\:\$p > svg > foreignObject > section .katex .fbox,div#\:\$p > svg > foreignObject > section .katex .fcolorbox{border:.04em solid;box-sizing:border-box}div#\:\$p > svg > foreignObject > section .katex .cancel-pad{padding:0 .2em}div#\:\$p > svg > foreignObject > section .katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}div#\:\$p > svg > foreignObject > section .katex .sout{border-bottom-style:solid;border-bottom-width:.08em}div#\:\$p > svg > foreignObject > section .katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}div#\:\$p > svg > foreignObject > section .katex .anglpad{padding:0 .03889em}div#\:\$p > svg > foreignObject > section .katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}div#\:\$p > svg > foreignObject > section .katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}div#\:\$p > svg > foreignObject > section .katex .mtr-glue{width:50%}div#\:\$p > svg > foreignObject > section .katex .cd-vert-arrow{display:inline-block;position:relative}div#\:\$p > svg > foreignObject > section .katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}div#\:\$p > svg > foreignObject > section .katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}div#\:\$p > svg > foreignObject > section .katex-display{display:block;margin:1em 0;text-align:center}div#\:\$p > svg > foreignObject > section .katex-display>.katex{display:block;text-align:center;white-space:nowrap}div#\:\$p > svg > foreignObject > section .katex-display>.katex>.katex-html{display:block;position:relative}div#\:\$p > svg > foreignObject > section .katex-display>.katex>.katex-html>.tag{position:absolute;right:0}div#\:\$p > svg > foreignObject > section .katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}div#\:\$p > svg > foreignObject > section .katex-display.fleqn>.katex{padding-left:2em;text-align:left}div#\:\$p > svg > foreignObject > section body{counter-reset:katexEqnNo mmlEqnNo}div#\:\$p > svg > foreignObject > section .katex-display{margin:0}div#\:\$p > svg > foreignObject > section .katex .delimcenter,div#\:\$p > svg > foreignObject > section .katex .op-symbol{display:inline-block}div#\:\$p > svg > foreignObject > section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em}/*!
* Marp / Marpit Gaia theme.
*
* @theme gaia
* @author Yuki Hattori
*
* @auto-scaling true
* @size 16:9 1280px 720px
* @size 4:3 960px 720px
*/div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code.hljs{display:block;overflow-x:auto;padding:1em}div#\:\$p > svg > foreignObject > section code.hljs{padding:3px 5px}div#\:\$p > svg > foreignObject > section .hljs{background:#000;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-comment,div#\:\$p > svg > foreignObject > section .hljs-quote{color:#aeaeae;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-keyword,div#\:\$p > svg > foreignObject > section .hljs-selector-tag,div#\:\$p > svg > foreignObject > section .hljs-type{color:#e28964}div#\:\$p > svg > foreignObject > section .hljs-string{color:#65b042}div#\:\$p > svg > foreignObject > section .hljs-subst{color:#daefa3}div#\:\$p > svg > foreignObject > section .hljs-link,div#\:\$p > svg > foreignObject > section .hljs-regexp{color:#e9c062}div#\:\$p > svg > foreignObject > section .hljs-name,div#\:\$p > svg > foreignObject > section .hljs-section,div#\:\$p > svg > foreignObject > section .hljs-tag,div#\:\$p > svg > foreignObject > section .hljs-title{color:#89bdff}div#\:\$p > svg > foreignObject > section .hljs-class .hljs-title,div#\:\$p > svg > foreignObject > section .hljs-doctag,div#\:\$p > svg > foreignObject > section .hljs-title.class_{text-decoration:underline}div#\:\$p > svg > foreignObject > section .hljs-bullet,div#\:\$p > svg > foreignObject > section .hljs-number,div#\:\$p > svg > foreignObject > section .hljs-symbol{color:#3387cc}div#\:\$p > svg > foreignObject > section .hljs-params,div#\:\$p > svg > foreignObject > section .hljs-template-variable,div#\:\$p > svg > foreignObject > section .hljs-variable{color:#3e87e3}div#\:\$p > svg > foreignObject > section .hljs-attribute{color:#cda869}div#\:\$p > svg > foreignObject > section .hljs-meta{color:#8996a8}div#\:\$p > svg > foreignObject > section .hljs-formula{background-color:#0e2231;color:#f8f8f8;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-addition{background-color:#253b22;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-deletion{background-color:#420e09;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-selector-class{color:#9b703f}div#\:\$p > svg > foreignObject > section .hljs-selector-id{color:#8b98ab}div#\:\$p > svg > foreignObject > section .hljs-emphasis{font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-strong{font-weight:700}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin:.5em 0 0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:580px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){font-size:1.8em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.5em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section p{margin:1em 0 0}div#\:\$p > svg > foreignObject > section ol>li,div#\:\$p > svg > foreignObject > section ul>li{margin:.3em 0 0}div#\:\$p > svg > foreignObject > section ol>li>p,div#\:\$p > svg > foreignObject > section ul>li>p{margin:.6em 0 0}div#\:\$p > svg > foreignObject > section code{display:inline-block;font-family:Roboto Mono,monospace;font-size:.8em;letter-spacing:0;margin:-.1em .15em;padding:.1em .2em;vertical-align:baseline}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){display:block;margin:1em 0 0;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{box-sizing:border-box;font-size:.7em;margin:0;min-width:100%;padding:.5em}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:calc(580px - 1em)}div#\:\$p > svg > foreignObject > section blockquote{margin:1em 0 0;padding:0 1em;position:relative}div#\:\$p > svg > foreignObject > section blockquote:after,div#\:\$p > svg > foreignObject > section blockquote:before{content:"“";display:block;font-family:Times New Roman,serif;font-weight:700;position:absolute}div#\:\$p > svg > foreignObject > section blockquote:before{left:0;top:0}div#\:\$p > svg > foreignObject > section blockquote:after{bottom:0;right:0;transform:rotate(180deg)}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section mark{background:transparent}div#\:\$p > svg > foreignObject > section table{border-collapse:collapse;border-spacing:0;margin:1em 0 0}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{border-style:solid;border-width:1px;padding:.2em .4em}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header,div#\:\$p > svg > foreignObject > section:after{box-sizing:border-box;font-size:66%;height:70px;line-height:50px;overflow:hidden;padding:10px 25px;position:absolute}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:66%;}div#\:\$p > svg > foreignObject > section header{top:0}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{left:0;right:0}div#\:\$p > svg > foreignObject > section footer{bottom:0}div#\:\$p > svg > foreignObject > section{background-color:var(--color-background);background-image:linear-gradient(135deg, hsla(0,0%,53%,0), hsla(0,0%,53%,.02) 50%, hsla(0,0%,100%,0) 0, hsla(0,0%,100%,.05));color:var(--color-foreground);font-family:Lato,Avenir Next,Avenir,Trebuchet MS,Segoe UI,sans-serif;font-size:35px;height:720px;letter-spacing:1.25px;line-height:1.35;padding:70px;width:1280px;word-wrap:break-word;--color-background:#fff8e1;--color-background-stripe:rgba(69,90,100,.1);--color-foreground:#455a64;--color-dimmed:#6a7a7d;--color-highlight:#0288d1;}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:35px;}div#\:\$p > svg > foreignObject > section:after{bottom:0;font-size:80%;right:0}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:80%;}div#\:\$p > svg > foreignObject > section a,div#\:\$p > svg > foreignObject > section mark{color:var(--color-highlight)}div#\:\$p > svg > foreignObject > section code{background:var(--color-dimmed);color:var(--color-background)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{color:var(--color-highlight)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){background:var(--color-foreground)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{background:transparent}div#\:\$p > svg > foreignObject > section blockquote:after,div#\:\$p > svg > foreignObject > section blockquote:before,div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header,div#\:\$p > svg > foreignObject > section section:after{color:var(--color-dimmed)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{border-color:var(--color-foreground)}div#\:\$p > svg > foreignObject > section table thead th{background:var(--color-foreground);color:var(--color-background)}div#\:\$p > svg > foreignObject > section table tbody>tr:nth-child(odd) td,div#\:\$p > svg > foreignObject > section table tbody>tr:nth-child(odd) th{background:var(--color-background-stripe, transparent)}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:where(.invert){--color-background:#455a64;--color-background-stripe:rgba(255,248,225,.1);--color-foreground:#fff8e1;--color-dimmed:#dad8c8;--color-highlight:#81d4fa;}div#\:\$p > svg > foreignObject > section:where(.gaia){--color-background:#0288d1;--color-background-stripe:rgba(255,248,225,.1);--color-foreground:#fff8e1;--color-dimmed:#cce2de;--color-highlight:#81d4fa;}div#\:\$p > svg > foreignObject > section:where(.lead){align-items:stretch;flex-flow:column nowrap;place-content:safe center center}div#\:\$p > svg > foreignObject > section:where(.lead) :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h6, marp-h6){text-align:center}div#\:\$p > svg > foreignObject > section:where(.lead) p{text-align:center}div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h1, marp-h1),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h2, marp-h2),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h3, marp-h3),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h4, marp-h4),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h5, marp-h5),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h6, marp-h6),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>p{text-align:left}div#\:\$p > svg > foreignObject > section:where(.lead) ol>li>p,div#\:\$p > svg > foreignObject > section:where(.lead) ul>li>p{text-align:left}div#\:\$p > svg > foreignObject > section:where(.lead) table{margin-left:auto;margin-right:auto}div#\:\$p > svg > foreignObject > section[data-marpit-scope-rgtIKCcc] li{font-size:45px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-rgtIKCcc] .columns{display:grid;grid-template-columns:1fr 1fr;gap:calc(var(--marpit-root-font-size, 1rem) * 2)}div#\:\$p > svg > foreignObject > section[data-marpit-scope-n378mS1x] :is(h2, marp-h2){padding-top:200px;text-align:center;font-size:72px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-n378mS1x] p{text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-dWFM5xeF] p{font-size:20px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-aGViY9oe] p{font-size:20px;text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-oXnf4PrF] p{font-size:30px;color:white;background-color:rgba(0, 64, 255, 0.5)}div#\:\$p > svg > foreignObject > section[data-marpit-scope-RPgBdFfM] :is(h2, marp-h2){padding-top:200px;text-align:center;font-size:60px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-RPgBdFfM] p{text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-VdJlWAvT] table{width:100%;table-layout:fixed}div#\:\$p > svg > foreignObject > section[data-marpit-scope-VdJlWAvT] th, div#\:\$p > svg > foreignObject > section[data-marpit-scope-VdJlWAvT] td{width:50%;word-wrap:break-word}div#\:\$p > svg > foreignObject > section[data-marpit-scope-VdJlWAvT] tr{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-3VaCm4lF] p{padding-top:600px;font-size:25px;text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-p3HxZRg9] th{font-size:36px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-p3HxZRg9] tr{font-size:16px;vertical-align:bottom}div#\:\$p > svg > foreignObject > section[data-marpit-scope-aOmUldR8] th{font-size:36px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-aOmUldR8] tr{font-size:30px;vertical-align:bottom}div#\:\$p > svg > foreignObject > section[data-marpit-scope-osxsP1JD] p{font-size:25px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-OCoShDRy] p{text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-7vkcgm41] p{text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-rGzbZl12] p{text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-rGzbZl12] tr{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-mXkken4M] p{font-size:18px;padding-top:620px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-9oHzUx41] p{font-size:18px;padding-top:620px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-V2zyc5wl] p{font-size:18px;text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-V2zyc5wl] li{font-size:25px;text-align:left}div#\:\$p > svg > foreignObject > section[data-marpit-scope-YlHxVK8A] li, div#\:\$p > svg > foreignObject > section[data-marpit-scope-YlHxVK8A] p{font-size:18px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-EhpyqL0V] p{font-size:20px;color:#F0F0F0;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-qbqnnvsZ] p{font-size:18px;text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-OJ4BKLQo] :is(h2, marp-h2){text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-RPlMGVb0] :is(h2, marp-h2), div#\:\$p > svg > foreignObject > section[data-marpit-scope-RPlMGVb0] p{text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-DisHRJPj] p{font-size:18px;padding-top:520px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-YHVTtCv0] :is(h3, marp-h3){padding-top:200px;text-align:center;font-size:70px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-vX1TcEl9] p{font-size:16px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-MiTOvurk] p{font-size:20px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-dCSIFYsn] li{font-size:30px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-dCSIFYsn] p{font-size:20px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-weJM4GZt] p{font-size:20px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-nkYT5ozq] p{padding-top:620px;font-size:20px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-2oqiH2aS] p{padding-top:620px;font-size:20px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-d9eeiDX9] p{font-size:20px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-dXz7BBRc] p{font-size:22px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-1rEYL4AI] :is(h2, marp-h2){padding-top:200px;text-align:center;font-size:60px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-1rEYL4AI] p{text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-AYlDrgC4] p{padding-top:600px;text-align:center;font-size:18px;color:0040FF}div#\:\$p > svg > foreignObject > section[data-marpit-scope-nq20HKUr] p{padding-top:200px;text-align:center;font-size:72px;color:0040FF}div#\:\$p > svg > foreignObject > section[data-marpit-scope-nq20HKUr] li{padding-top:270px;text-align:center;font-size:18px;color:0040FF}div#\:\$p > svg > foreignObject > section[data-marpit-scope-6TWtPye8] p{padding-top:150px;text-align:center;font-size:72px;color:0040FF}div#\:\$p > svg > foreignObject > section[data-marpit-scope-xOes7YaK] p{padding-top:150px;text-align:center;font-size:72px;color:0040FF}div#\:\$p > svg > foreignObject > section[data-marpit-scope-jPgqucEy] p{padding-top:150px;text-align:center;font-size:72px;color:0040FF}div#\:\$p > svg > foreignObject > section[data-marpit-scope-r3M8q5p8] p{font-size:20px;text-align:left}div#\:\$p > svg > foreignObject > section[data-marpit-scope-g8PW5m2k] p{font-size:16px;text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-hA3QiBYk] p{padding-top:620px;font-size:20px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-N5X6LpHT] p{font-size:20px;text-align:center}div#\:\$p > svg > foreignObject > section[data-marpit-scope-JiLiygks] p{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-QX9NlRQD] p{font-size:30px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-xXuDdHH9] li{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-xXuDdHH9] p{font-size:16px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-lT5QiHS9] p{font-size:16px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-928rGjNp] p{font-size:16px;text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-LYG6wkOk] th{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-LYG6wkOk] td{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-fofPmnUw] p{font-size:22px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-FDcHCOBh] :is(h2, marp-h2){padding-top:200px;text-align:center;font-size:60px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-FDcHCOBh] p{text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-FPQIg0CI] p{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-1MRxPRmx] p{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-ksVH35ZF] li{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-9HEZUuWz] li{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-9HEZUuWz] .columns{display:grid;grid-template-columns:1fr 2fr;gap:calc(var(--marpit-root-font-size, 1rem) * 2)}div#\:\$p > svg > foreignObject > section[data-marpit-scope-iKxr8YQ7] li{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-smIoIps0] p{font-size:20px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-5YlVQaDX] :is(h2, marp-h2){padding-top:200px;text-align:center;font-size:60px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-5YlVQaDX] p{text-align:right}div#\:\$p > svg > foreignObject > section[data-marpit-scope-9NM4oDa8] li{font-size:22px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-eXDRQxop] li{font-size:22px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-J5olVoYz] li{font-size:22px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-rCUudA6P] li{font-size:28px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-x6imdHE9] li{font-size:27px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-qY7L5r5G] li{font-size:27px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-pJMiGPkB] table{font-size:25px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-lS1NBaKg] p, div#\:\$p > svg > foreignObject > section[data-marpit-scope-lS1NBaKg] li{font-size:27px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-F9159ydl] p, div#\:\$p > svg > foreignObject > section[data-marpit-scope-F9159ydl] li{font-size:27px}div#\:\$p > svg > foreignObject > section[data-marpit-scope-WmtkvvC4] p{font-size:20px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%}
</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id=":$p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-class="lead" data-theme="gaia" lang="zh-CN" class="lead" style="--class:lead;--theme:gaia;">
<h1 id="%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E4%B8%93%E9%A2%98">对象存储系统专题</h1>
<p><strong>施展</strong><br />
武汉光电国家研究中心<br />
光电信息存储研究部</p>
<p><a href="https://shizhan.github.io/">https://shizhan.github.io/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-marpit-scope-rgtIKCcc="" data-theme="gaia" lang="zh-CN" style="--theme:gaia;">
<h2 id="%E5%86%85%E5%AE%B9%E5%A4%A7%E7%BA%B2">内容大纲</h2>
<ul>
<li><strong>背景</strong> 对象存储系统的诞生、发展和现状</li>
</ul>
<div class="columns">
<div>
<ul>
<li>挑战一:<strong>扩展</strong>
<ul>
<li>规模化的诉求</li>
</ul>
</li>
<li>挑战二:<strong>长尾</strong>
<ul>
<li>规模化的代价</li>
</ul>
</li>
</ul>
</div>
<div>
<ul>
<li>挑战三:<strong>预测</strong>
<ul>
<li>怎样管控代价</li>
</ul>
</li>
<li><strong>负载特征分析</strong>
<ul>
<li>知己也要知彼</li>
</ul>
</li>
</ul>
</div>
</div>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-marpit-scope-n378mS1x="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="3" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h2 id="%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E8%83%8C%E6%99%AF">对象存储背景</h2>
<p>对象存储系统的诞生、发展和现状</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-marpit-scope-dWFM5xeF="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="4" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E6%80%BB%E9%87%8F%E6%97%A5%E7%9B%8A%E5%A2%9E%E9%95%BF">总量日益增长</h3>
<p><img src="images/IDC_DataSphere.png" alt="" style="width:1150px;" /></p>
<p>Source: <a href="https://www.datanami.com/2018/11/27/global-datasphere-to-hit-175-zettabytes-by-2025-idc-says/">https://www.datanami.com/2018/11/27/global-datasphere-to-hit-175-zettabytes-by-2025-idc-says/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="5" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/idc-datasphere-2020.webp");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="5" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="5" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-marpit-scope-aGViY9oe="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="6" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E7%B1%BB%E5%9E%8B%E6%97%A5%E7%9B%8A%E4%B8%B0%E5%AF%8C">类型日益丰富</h3>
<p><img src="images/what-happens-online-in-60-seconds.png" alt="" style="height:500px;" /></p>
<p>Source: <a href="https://www.smartinsights.com/internet-marketing-statistics/happens-online-60-seconds/">https://www.smartinsights.com/internet-marketing-statistics/happens-online-60-seconds/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-oXnf4PrF="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="7" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/ai-storage-market.webp");filter:opacity(.5);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="7" data-marpit-scope-oXnf4PrF="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="7" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="ai%E5%8A%A0%E9%80%9F%E9%A9%B1%E5%8A%A8">AI加速驱动</h3>
<p>因为AI的原因,存储市场迎来了新一轮的繁荣期。有预测数据显示,全球AI驱动存储市场在2024年的规模大约是287.1亿美元。预计2025年将增长到359.5亿美元,并在2034年达到大约2552.4亿美元,年均复合增长率大约是24.42%。</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-oXnf4PrF="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="7" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-marpit-scope-RPgBdFfM="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="8" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h2 id="%E6%8C%91%E6%88%98%E4%B8%80%E6%89%A9%E5%B1%95">挑战一:扩展</h2>
<p>规模化的诉求</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-marpit-scope-VdJlWAvT="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="9" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%AD%98%E5%82%A8%E7%9A%84%E4%B8%A4%E7%A7%8D%E5%BD%A2%E5%BC%8F">存储的两种形式</h3>
<table>
<thead>
<tr>
<th>文件存储 (File Storage)</th>
<th>块存储 (Block Storage)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>组织结构</strong>:层次化:目录和文件名,形成树状文件系统</td>
<td><strong>组织结构</strong>:扁平化:数据以固定大小的块存放,直接通过块地址访问</td>
</tr>
<tr>
<td><strong>访问方式</strong>:通过文件路径和文件名进行访问,使用标准文件操作(打开、读取、写入、关闭)</td>
<td><strong>访问方式</strong>:通过块编号直接访问,使用底层块设备操作(读块、写块)</td>
</tr>
<tr>
<td><strong>管理层级</strong>:由文件系统管理层处理,提供命名、权限控制和目录管理功能</td>
<td><strong>管理层级</strong>:在更接近硬件的层级操作,通常由设备驱动程序管理</td>
</tr>
<tr>
<td><strong>抽象级别</strong>:提供高级抽象,用户通过文件名与数据交互,隐藏底层存储细节</td>
<td><strong>抽象级别</strong>:提供原始存储访问,不包含文件系统语义,呈现为原始磁盘卷</td>
</tr>
<tr>
<td><strong>典型应用</strong>:传统硬盘文件系统(如NTFS、ext4)、网络附加存储(NAS)</td>
<td><strong>典型应用</strong>:直接连接存储、存储区域网络(SAN)卷,表现为服务器本地磁盘</td>
</tr>
<tr>
<td><strong>适用场景</strong>:适合通用应用程序,提供易于理解的文件管理方式</td>
<td><strong>适用场景</strong>:适用于对性能要求高的应用,如数据库和虚拟机磁盘</td>
</tr>
</tbody>
</table>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-3VaCm4lF="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="10" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/the-storage-evolution.png");background-size:auto 550px;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="10" data-marpit-scope-3VaCm4lF="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="10" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>Source: <a href="https://www.snia.org/sites/default/files/2025-03/The_Storage_Evolution.pdf">https://www.snia.org/sites/default/files/2025-03/The_Storage_Evolution.pdf</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-3VaCm4lF="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="10" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="11" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/the-storage-evolution.png");background-size:auto 550px;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="11" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p><img src="images/folder-tree.png" alt="" style="width:200px;" /></p>
<p>…<br />
扩展难题<br />
…</p>
<p><img src="images/raid-0.png" alt="" style="width:200px;" /></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="11" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-marpit-scope-p3HxZRg9="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="12" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E6%89%A9%E5%B1%95%E7%9A%84%E4%B8%A4%E4%B8%AA%E6%96%B9%E9%9D%A2">扩展的两个方面</h3>
<table>
<thead>
<tr>
<th style="text-align:center">规模</th>
<th style="text-align:center">种类</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><img src="images/scaleout-diagram.jpg" alt="" style="width:550px;" /></td>
<td style="text-align:center"><img src="images/OSD-Metadata.webp" alt="" style="width:550px;" /></td>
</tr>
<tr>
<td style="text-align:center">Source: <a href="http://sancluster.com/scale-out-file-system/">http://sancluster.com/scale-out-file-system/</a></td>
<td style="text-align:center">Source: <a href="http://storagegaga.com/the-future-is-intelligent-objects/">http://storagegaga.com/the-future-is-intelligent-objects/</a></td>
</tr>
</tbody>
</table>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-marpit-scope-aOmUldR8="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="13" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%85%83%E6%95%B0%E6%8D%AE%E7%9A%84%E8%81%8C%E8%B4%A3">元数据的职责</h3>
<table>
<thead>
<tr>
<th style="text-align:center">规模</th>
<th style="text-align:center">种类</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><img src="images/scaleout-diagram.jpg" alt="" style="width:550px;" /></td>
<td style="text-align:center"><img src="images/OSD-Metadata.webp" alt="" style="width:550px;" /></td>
</tr>
<tr>
<td style="text-align:center"><strong>找位置</strong></td>
<td style="text-align:center"><strong>找内容</strong></td>
</tr>
</tbody>
</table>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-osxsP1JD="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="14" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/Object-Storage.webp");filter:opacity(.2);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="14" data-marpit-scope-osxsP1JD="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="14" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%8F%90%E5%87%BA">对象存储系统的提出</h3>
<ul>
<li>Object storage originated in the late 1990s:</li>
<li>Seagate specifications from 1999
<ul>
<li><a href="https://www.t10.org/ftp/t10/document.99/99-341r0.pdf">Object Based Storage: A Vision</a></li>
<li><a href="https://pdfs.semanticscholar.org/bcd1/97cb0f8544b651289dfdb95efd0b1fd70753.pdf">Object based storage devices: a command set proposal</a></li>
</ul>
</li>
<li><a href="http://www.cs.cmu.edu/~garth/">Dr. Garth Gibson</a>, CMU & <a href="https://www.pdl.cmu.edu/NASD/index.shtml">NASD project</a>
<ul>
<li>High-bandwidth, Low-latency, Scalable Storage Systems</li>
<li>File Server Scaling with Network-Attached Secure Disks (NASD), 1997</li>
</ul>
</li>
</ul>
<p>Source: <a href="https://www.snia.org/educational-library/object-storage-what-how-and-why-2020">https://www.snia.org/educational-library/object-storage-what-how-and-why-2020</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-osxsP1JD="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="14" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="15" data-marpit-scope-OCoShDRy="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="15" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%92%8C%E4%BC%A0%E7%BB%9F%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%AF%94%E8%BE%83">和传统存储系统的比较</h3>
<p><img src="images/object-vs-traditional.png" alt="" style="height:450px;" /><br />
Source: <a href="https://usdc.vn/object-storage-vs-traditional-storage/">https://usdc.vn/object-storage-vs-traditional-storage/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-marpit-scope-7vkcgm41="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="16" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E4%BC%A0%E7%BB%9F%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F">传统存储系统</h3>
<p><img src="images/Block-Storage-vs-File-Storage.jpg" alt="" style="height:450px;" /><br />
Source: <a href="https://www.ibm.com/cloud/learn/object-storage">https://www.ibm.com/cloud/learn/object-storage</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-marpit-scope-rGzbZl12="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="17" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%AF%B9%E8%B1%A1%E6%96%87%E4%BB%B6%E5%9D%97%E5%92%8C%E5%BD%92%E6%A1%A3%E5%AD%98%E5%82%A8">对象、文件、块和归档存储</h3>
<table>
<thead>
<tr>
<th style="text-align:left">Object</th>
<th style="text-align:left">File</th>
<th style="text-align:left">Block</th>
<th style="text-align:left">Archive</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Object Storage</td>
<td style="text-align:left">NAS</td>
<td style="text-align:left">SAN</td>
<td style="text-align:left">Tape</td>
</tr>
<tr>
<td style="text-align:left">Videos, photos serving streaming</td>
<td style="text-align:left">All kinds of file</td>
<td style="text-align:left">Attach to server</td>
<td style="text-align:left">The file needs to be saved permanently</td>
</tr>
<tr>
<td style="text-align:left">Read (download) data regularly</td>
<td style="text-align:left">Read data regularly, install as a network drive</td>
<td style="text-align:left">Run data directly on Storage</td>
<td style="text-align:left">Rarely to download</td>
</tr>
<tr>
<td style="text-align:left">High upload / download speed</td>
<td style="text-align:left">High upload / download speed</td>
<td style="text-align:left">Very High upload / download speed</td>
<td style="text-align:left">High upload speed, slow download</td>
</tr>
<tr>
<td style="text-align:left">Use with CDN</td>
<td style="text-align:left">Many usage scenarios</td>
<td style="text-align:left">Use with server (VM)</td>
<td style="text-align:left">Use independently</td>
</tr>
</tbody>
</table>
<p>Source: <a href="https://usdc.vn/object-storage-vs-traditional-storage/">https://usdc.vn/object-storage-vs-traditional-storage/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="18" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%AE%9A%E4%B9%89">定义</h3>
<ul>
<li><a href="https://www.snia.org/education/what-is-object-storage">What is Object Storage?</a>
<ul>
<li>Object Storage is a method of storing and subsequently retrieving sets of data as collections of single, uniquely identifiable indivisible items or objects. <strong>It applies to any forms of data that can be wrapped up and managed as an object.</strong></li>
<li>Objects are treated as an atomic unit. <strong>There is no structure corresponding to a hierarchy of directories in a file system</strong>; each object is uniquely identified in the system by a unique object identifier.</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="19" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E7%89%B9%E6%80%A7">特性</h3>
<ul>
<li><a href="https://www.snia.org/education/what-is-object-storage">What is Object Storage?</a>
<ul>
<li>When you create an object on this type of storage, the <strong>entire set of data</strong> is handled and processed without regard to what sub-parts it may have.</li>
<li>When reading from object storage, you can <strong>read either the whole object, or ask to read parts of it</strong>.</li>
<li>There is often no capability to update to the object or parts of the object; <strong>the entire object is usually required to be re-written</strong>.</li>
<li>Most object storage allows for objects to be deleted.</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="20" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="20" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E7%89%B9%E6%80%A7-1">特性…</h3>
<ul>
<li><a href="https://www.snia.org/education/what-is-object-storage">What is Object Storage?</a>
<ul>
<li>Object storage often supports meta-data.
<ul>
<li>This is data that is part of the object, but that is in addition to the object ID and the data.</li>
<li>It is often expressed as an <strong>attribute-value pair</strong>; for instance, an attribute of COLOR in our collection of objects may have the value RED for some objects and BLUE for others.</li>
<li>These permit collections of objects, individually addressable by their object ID, <strong>to be searched, filtered and read in groups</strong> without needing to know the specific object IDs.</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="21" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E6%A0%87%E5%87%86%E5%8C%96">标准化</h3>
<ul>
<li><strong>Storage Networking Industry Association</strong> - SNIA
<ul>
<li><a href="https://www.snia.org/educational-library/object-storage-what-how-and-why-2020">Object Storage: What, How and Why, 2020</a>
<ul>
<li>Object storage, as a definition, can be: A storage system that manages and manipulates data storage as <strong>distinct units</strong>, called objects</li>
</ul>
</li>
<li><a href="https://www.snia.org/cloud/cdmi">CDMI Cloud Storage Standard, 2.0a, 2020</a>
<ul>
<li>The Cloud Data Management Interface (CDMI) defines the <strong>functional interface</strong> that applications will use to create, retrieve, update and delete data elements from the Cloud.</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-mXkken4M="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="22" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/osd-2007.png");background-size:85%;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="22" data-marpit-scope-mXkken4M="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="22" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>Source: <a href="https://www.snia.org/educational-library/object-based-storage-device-osd-architecture-and-systems-2007">https://www.snia.org/educational-library/object-based-storage-device-osd-architecture-and-systems-2007</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-mXkken4M="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="22" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="23" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/OSD-vs-block-based.webp");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="23" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="23" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="23" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="24" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/SCSI-Architecture-OSD.webp");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="24" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="24" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="24" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="25" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/osd-commands.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="25" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="25" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="25" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-9oHzUx41="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="26" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/Restful-Web-Services.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="26" data-marpit-scope-9oHzUx41="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="26" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>Source: <a href="https://gocoding.org/what-are-restful-web-services/">What are Restful Web Services</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-9oHzUx41="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="26" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="27" data-marpit-scope-V2zyc5wl="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="27" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="amazon-s3-rest-api">Amazon S3 REST API</h3>
<ul>
<li><strong>GET</strong> on the API's root resource to list all of the Amazon S3 buckets of a caller.</li>
<li><strong>GET</strong> on a Folder resource to view a list of all of the objects in an Amazon S3 bucket.</li>
<li><strong>PUT</strong> on a Folder resource to add a bucket to Amazon S3.</li>
<li><strong>DELETE</strong> on a Folder resource to remove a bucket from Amazon S3.</li>
<li><strong>GET</strong> on a Folder/Item resource to view or download an object from an Amazon S3 bucket.</li>
<li><strong>PUT</strong> on a Folder/Item resource to upload an object to an Amazon S3 bucket.</li>
<li><strong>HEAD</strong> on a Folder/Item resource to get object metadata in an Amazon S3 bucket.</li>
<li><strong>DELETE</strong> on a Folder/Item resource to remove an object from an Amazon S3 bucket.</li>
</ul>
<p>Source: <a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html">https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-YlHxVK8A="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="28" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/aws_proxy_s3_create_methods_on_folder.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="28" data-marpit-scope-YlHxVK8A="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="28" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<p>To access the object-based storage system:</p>
<ul>
<li><strong>secret-access-key</strong> and <strong>access-key-id</strong> – private/public pair of keys that you can generate using different tools or sometimes directly on the provider dashboard</li>
<li><strong>endpoint</strong> – the web address of the space</li>
</ul>
<pre is="marp-pre" data-auto-scaling="downscale-only"><code class="language-java"><span class="hljs-type">const</span> <span class="hljs-variable">AWS</span> <span class="hljs-operator">=</span> require(<span class="hljs-string">"aws-sdk"</span>);
<span class="hljs-type">const</span> <span class="hljs-variable">s3</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">AWS</span>.S3({
endpoint: <span class="hljs-string">"provider-space-endpoint"</span>,
secretAccessKey: <span class="hljs-string">"my-secret-key"</span>,
accessKeyId: <span class="hljs-string">"my-access-key"</span>,
});
</code></pre>
<ul>
<li><a href="https://lakefs.io/object-storage/">https://lakefs.io/object-storage/</a></li>
<li><a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html">https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html</a></li>
</ul>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-YlHxVK8A="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="28" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-EhpyqL0V="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="29" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/s3-storage-classes.png");"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="29" data-marpit-scope-EhpyqL0V="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="29" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>Source: <a href="https://aws.amazon.com/cn/s3/storage-classes/">https://aws.amazon.com/cn/s3/storage-classes/</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-EhpyqL0V="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="29" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="30" data-marpit-scope-qbqnnvsZ="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="30" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<p><img src="images/S3-decision-flow-chart_1.png" alt="" style="height:600px;" /></p>
<p>Source: <a href="https://www.cloudhealthtech.com/blog/aws-cost-optimization-s3-storage-class">https://www.cloudhealthtech.com/blog/aws-cost-optimization-s3-storage-class</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-OJ4BKLQo="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="31" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/active-object-storage.png");"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="31" data-marpit-scope-OJ4BKLQo="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="31" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E6%9B%B4%E8%BF%9B%E4%B8%80%E6%AD%A5%E7%9A%84%E6%89%A9%E5%B1%95"><strong>更进一步的扩展</strong></h3>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-OJ4BKLQo="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="31" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-RPlMGVb0="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="32" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/active-object-storage.png");filter:opacity(.3);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="32" data-marpit-scope-RPlMGVb0="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="32" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E4%B8%BB%E5%8A%A8%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8"><strong>主动对象存储</strong></h3>
<p><img src="images/active-object-storage-award.png" alt="" style="width:300px;" /><br />
<strong>主动对象海量存储系统及关键技术</strong></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-RPlMGVb0="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="32" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-DisHRJPj="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="33" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/comp-storage-01.png");background-size:contain;"></figure><figure style="background-image:url("images/comp-storage-02.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="33" data-marpit-scope-DisHRJPj="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="33" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E5%AD%98%E7%AE%97%E4%B8%80%E4%BD%93%E5%8C%96">存算一体化</h3>
<p>Source: <a href="https://www.snia.org/computationaltwg">https://www.snia.org/computationaltwg</a>, <a href="https://www.snia.org/education/what-is-computational-storage">https://www.snia.org/education/what-is-computational-storage</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-DisHRJPj="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="33" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="34" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/comp-storage-01.png");background-size:contain;filter:opacity(.3);"></figure><figure style="background-image:url("images/comp-storage-02.png");background-size:contain;filter:opacity(.3);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="34" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="34" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E5%AD%98%E7%AE%97%E4%B8%80%E4%BD%93%E5%8C%96-1">存算一体化…</h3>
<ul>
<li>Computational Storage is defined as architectures that provide <strong>Computational Storage Functions (CSF) coupled to storage</strong>, <strong>offloading host processing</strong> or <strong>reducing data movement</strong>.</li>
<li>These architectures enable improvements in application performance and/or infrastructure efficiency through the integration of compute resources (outside of the traditional compute & memory architecture) either <strong>directly with storage</strong> or <strong>between the host and the storage</strong>.</li>
</ul>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="34" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="35" data-marpit-scope-YHVTtCv0="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="35" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%85%B8%E5%9E%8B%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F">典型对象存储系统</h3>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="36" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="36" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li><strong>Amazon S3</strong>: Amazon S3 stores data as objects within resources called “buckets.” AWS S3 offers features like 99.999999999% durability, cross-region replication, event notifications, versioning, encryption, and flexible storage options (redundant and standard).</li>
<li><strong>Rackspace Cloud Files</strong>: Cloud Files provides online object storage for files and media. Cloud Files writes each file to three storage disks on separate nodes that have dual power supplies. All traffic between your application and Cloud Files uses SSL to establish a secure, encrypted channel. You can host static websites (for example: blogs, brochure sites, small company sites) entirely from Cloud Files with a global CDN.</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="37" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="37" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li><strong>Azure Blob Storage</strong>: For users with large amounts of unstructured data to store in the cloud, Blob storage offers a cost-effective and scalable solution. Every blob is organized into a container with up to a 500 TB storage account capacity limit.</li>
<li><strong>Google cloud storage</strong>: Cloud Storage allows you to store data in Google’s cloud. Google Cloud Storage supports individual objects that are terabytes in size. It also supports a large number of buckets per account. Google Cloud Storage provides strong read-after-write consistency for all upload and delete operations. Two types of storage class are available: Standard Storage class and Storage Near line class (with Near Line being MUCH cheaper).</li>
</ul>
<p><a href="https://cloudacademy.com/blog/object-storage-block-storage/">https://cloudacademy.com/blog/object-storage-block-storage/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="38" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="38" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li><a href="https://www.aliyun.com/product/oss/"><strong>阿里云对象存储OSS(Object Storage Service)</strong></a>是一款海量、安全、低成本、高可靠的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。</li>
<li><a href="https://cloud.tencent.com/document/product/436"><strong>腾讯对象存储(Cloud Object Storage,COS)</strong></a>是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性、低成本、可靠安全等优点。通过控制台、API、SDK 和工具等多样化方式,用户可简单、快速地接入 COS,进行多格式文件的上传、下载和管理,实现海量数据存储和管理。</li>
<li><a href="https://www.huaweicloud.com/product/obs.html"><strong>华为对象存储服务(Object Storage Service)</strong></a>是一款稳定、安全、高效、易用的云存储服务,具备标准Restful API接口,可存储任意数量和形式的非结构化数据。</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="39" data-marpit-scope-vX1TcEl9="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="39" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="openstack">OpenStack</h4>
<ul>
<li>OpenStack was created during the first months of 2010. Rackspace wanted to rewrite the infrastructure code running its Cloud servers offering, and considered open sourcing the existing Cloud files code. At the same time, Anso Labs (contracting for NASA) had published beta code for Nova, a Python-based “cloud computing fabric controller”.</li>
<li>Both efforts converged and formed the base for OpenStack. The first Design Summit was held in Austin, TX on July 13-14, 2010, and the project was officially announced at OSCON in Portland, OR, on July 21st, 2010.</li>
</ul>
<p><a href="https://docs.openstack.org/project-team-guide/introduction.html">https://docs.openstack.org/project-team-guide/introduction.html</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="40" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="40" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="openstack-swift">OpenStack Swift</h4>
<ul>
<li>OpenStack Object Storage (swift) is used for <strong>redundant, scalable data storage using clusters of standardized servers</strong> to store petabytes of accessible data.</li>
<li>Swift uses a distributed architecture with <strong>no central point of control</strong>, providing greater scalability, redundancy, and performance.</li>
<li>Storage clusters <strong>scale horizontally</strong> by adding new nodes, uses software logic to ensure data replication and distribution across different devices, inexpensive <strong>commodity hard drives and servers</strong>.</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-MiTOvurk="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="41" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/swift_network_diagram-1.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="41" data-marpit-scope-MiTOvurk="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="41" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p><a href="https://docs.openstack.org/swift/">https://docs.openstack.org/swift/</a><br />
<a href="https://github.com/openstack/swift">https://github.com/openstack/swift</a><br />
Source: <a href="https://docs.openstack.org/security-guide/object-storage.html">https://docs.openstack.org/security-guide/object-storage.html</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-MiTOvurk="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="41" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="42" data-marpit-scope-dCSIFYsn="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="42" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="ceph-as-a-research-project">Ceph as a research project</h4>
<ul>
<li>Ceph was developed at <strong>University of California, Santa Cruz, by Sage Weil</strong> in 2003 as a part of his PhD project.
<ul>
<li>The initial project prototype was the Ceph filesystem, written in approximately 40,000 lines of C++ code, which was made open source in 2006 under LGPL to serve as a reference implementation and research platform.</li>
<li>LLNL supported Sage's initial research work.</li>
<li>The period from 2003 to 2007 was the research period of Ceph. By this time, its core components were emerging, and the community contribution to the project had begun at pace.</li>
</ul>
</li>
</ul>
<p><a href="https://subscription.packtpub.com/book/virtualization-and-cloud/9781783985623/1">Learning Ceph, Packt, 2015</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="43" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="43" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="ceph">Ceph</h4>
<ul>
<li>Ceph uniquely delivers <strong>object, block, and file storage in one unified system</strong>.</li>
<li>Ceph is highly reliable, easy to manage, and free.</li>
<li>Ceph delivers extraordinary scalability–thousands of clients accessing petabytes to exabytes of data.</li>
<li>A Ceph Node leverages <strong>commodity hardware</strong> and intelligent daemons, and a Ceph Storage Cluster accommodates large numbers of nodes, which communicate with each other to <strong>replicate and redistribute data dynamically</strong>.</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-weJM4GZt="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="44" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/ceph-graphic.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="44" data-marpit-scope-weJM4GZt="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="44" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p><a href="https://ceph.io/">https://ceph.io/</a><br />
<a href="https://github.com/ceph/ceph">https://github.com/ceph/ceph</a><br />
Source: <a href="https://icicimov.github.io/blog/images/CEPH-graphic.png">https://icicimov.github.io/blog/images/CEPH-graphic.png</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-weJM4GZt="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="44" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-nkYT5ozq="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="45" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/ceph-stack.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="45" data-marpit-scope-nkYT5ozq="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="45" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>Source: <a href="https://docs.ceph.com/en/pacific/architecture/">Ceph Documentation » Architecture</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-nkYT5ozq="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="45" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-2oqiH2aS="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="46" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/cephDiagramm.webp");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="46" data-marpit-scope-2oqiH2aS="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="46" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>Source: <a href="https://ubuntu.com/blog/ceph-storage-on-ubuntu-an-overview">Ceph storage on Ubuntu: An overview</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-2oqiH2aS="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="46" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="47" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/red-hat-ceph-storage.png");"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="47" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="47" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="47" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="48" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/github-object-storage.png");"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="48" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="48" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="48" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="49" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="49" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="minio">Minio</h4>
<ul>
<li>MinIO is a High Performance Object Storage released under GNU Affero General Public License v3.0.</li>
<li>It is <strong>API compatible with Amazon S3</strong> cloud storage service.</li>
<li><strong>Standalone MinIO servers</strong> are best suited for early development and evaluation.</li>
<li>Certain features such as versioning, object locking, and bucket replication require distributed deploying MinIO with <strong>Erasure Coding</strong>.</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-d9eeiDX9="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="50" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/minio_architecture_diagram.svg");"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="50" data-marpit-scope-d9eeiDX9="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="50" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p><a href="https://min.io/">https://min.io/</a><br />
<a href="http://www.minio.org.cn/">http://www.minio.org.cn/</a><br />
<a href="https://github.com/minio/minio">https://github.com/minio/minio</a></p>
<p>Source: <a href="http://www.minio.org.cn/static/picture/architecture_diagram.svg">http://www.minio.org.cn/static/picture/architecture_diagram.svg</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-d9eeiDX9="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="50" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="51" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="51" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%8A%A8%E6%89%8B%E4%BA%86%E8%A7%A3%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F">动手了解对象存储系统</h3>
<ul>
<li>说明
<ul>
<li><a href="big-data-storage-experiment">对象存储实验</a></li>
</ul>
</li>
<li>内容
<ul>
<li>认识对象存储系统
<ul>
<li>快速部署:Minio、mock_s3…</li>
<li>功能特性:RESTful接口</li>
</ul>
</li>
<li>熟悉性能指标:吞吐率、带宽、延迟
<ul>
<li>观测工具:s3bench、WARP…</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="52" data-marpit-scope-dXz7BBRc="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="52" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</h3>
<p><a href="https://ieeexplore.ieee.org/document/1612479">Object Storage: The Future Building Block for Storage Systems</a>, (MSST '05)</p>
<p>早期对对象存储架构的系统性探讨,提出对象存储作为未来存储系统基础组件的理念。</p>
<p><a href="https://www.usenix.org/conference/osdi-06/ceph-scalable-high-performance-distributed-file-system">Ceph: A Scalable, High-Performance Distributed File System</a>, (OSDI '06)</p>
<p>Ceph的奠基性论文,提出了去中心化元数据管理、动态数据分布(CRUSH算法)和高可扩展性的设计理念。</p>
<p><a href="https://ieeexplore.ieee.org/document/4090205">CRUSH: Controlled, Scalable, Decentralized Placement of Replicated Data</a>, (SC '06)</p>
<p>提出CRUSH算法,解决分布式存储系统中数据分布与复制的核心问题,成为Ceph和后续系统的核心组件。</p>
<p><a href="https://dl.acm.org/doi/10.1145/1294261.1294281">Dynamo: Amazon's Highly Available Key-value Store</a>, (SOSP '07)</p>
<p>尽管Dynamo是键值存储,但其去中心化、最终一致性设计对Amazon S3等对象存储系统产生深远影响。</p>
<p><a href="https://dl.acm.org/doi/10.1145/1374596.1374606">RADOS: A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters</a>, (PDSW '07)</p>
<p>描述Ceph的底层对象存储系统RADOS,奠定了大规模分布式对象存储的自治管理机制。</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="53" data-marpit-scope-1rEYL4AI="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="53" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h2 id="%E6%8C%91%E6%88%98%E4%BA%8C%E9%95%BF%E5%B0%BE">挑战二:长尾</h2>
<p>规模化的代价</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="54" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/the-long-tail.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="54" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="54" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<p><strong>长尾</strong>(The Long Tail)这一概念是由《连线》杂志主编Chris Anderson在2004年10月的“长尾”一文中最早提出,用来描述诸如亚马逊和Netflix之类网站的商业和经济模式。</p>
<p>实际上是统计学中幂律(Power Laws)和帕累托分布(Pareto distributions)特征的一个口语化表达。</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="54" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="55" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/the-long-tail.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="55" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="55" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<p><strong>规模化业务</strong>中,“<strong>尾部</strong>”产生的总体效益甚至会超过“<strong>头部</strong>”。</p>
<ul>
<li><em>冷门商品的销售量可以达到总额的半数</em></li>
<li><em>自然语言中的中低频词对信息量的贡献</em></li>
<li>...</li>
</ul>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="55" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-AYlDrgC4="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="56" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/Thelongtailshift.webp");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="56" data-marpit-scope-AYlDrgC4="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="56" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p><a href="https://newmedia.fandom.com/wiki/The_Long_Tail">https://newmedia.fandom.com/wiki/The_Long_Tail</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-AYlDrgC4="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="56" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-nq20HKUr="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="57" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/Thelongtailshift.webp");background-size:contain;filter:opacity(.3);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="57" data-marpit-scope-nq20HKUr="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="57" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>"<strong>长尾</strong>"即不起眼事件的积累</p>
<ul>
<li><a href="https://newmedia.fandom.com/wiki/The_Long_Tail">https://newmedia.fandom.com/wiki/The_Long_Tail</a></li>
</ul>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-nq20HKUr="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="57" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-6TWtPye8="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="58" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/distributed-storage.png");filter:opacity(.3);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="58" data-marpit-scope-6TWtPye8="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="58" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E5%AF%B9%E7%B3%BB%E7%BB%9F%E6%9D%A5%E8%AF%B4">对系统来说……</h3>
<p>系统以规模扩展应对需求增长</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-6TWtPye8="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="58" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-xOes7YaK="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="59" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/workload-plot-1.jpg");filter:opacity(.3);"></figure><figure style="background-image:url("images/workload-plot-2.jpg");filter:opacity(.3);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="59" data-marpit-scope-xOes7YaK="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="59" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E9%82%A3%E4%B9%88%E4%BB%A3%E4%BB%B7%E6%98%AF">那么代价是……</h3>
<p>不起眼的事件也在扩展中积累</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-xOes7YaK="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="59" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="60" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/yi-zhuan.jpg");background-size:contain;"></figure><figure style="background-image:url("images/who-moved-my-cheese.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="60" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="60" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="60" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="61" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/WYG0047-0179d.png");background-size:contain;"></figure><figure style="background-image:url("images/it-was-nature-for-change.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="61" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="61" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="61" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-jPgqucEy="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="62" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/WYG0047-0179d.png");background-size:contain;filter:opacity(.3) brightness(.5);"></figure><figure style="background-image:url("images/it-was-nature-for-change.png");background-size:contain;filter:opacity(.3) brightness(.5);"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="62" data-marpit-scope-jPgqucEy="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="62" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<h3 id="%E4%B8%8D%E8%B5%B7%E7%9C%BC%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%B0%86%E4%B8%80%E7%9B%B4%E5%AD%98%E5%9C%A8">『不起眼』的事件将一直存在</h3>
<p>唯一不变的是变化本身</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-jPgqucEy="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="62" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="63" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="63" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%BD%92%E7%BA%B3%E8%B5%B7%E6%9D%A5">归纳起来</h3>
<p>毫末之变、扩展之鉴</p>
<ol>
<li>大系统由小组件汇聚而成</li>
<li>汇聚改变的不仅仅是规模</li>
<li>还有伴随组件而来的变化</li>
</ol>
<p>系统的扩展将同时成为<strong>小概率事件的放大器</strong>!</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="64" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="64" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%AE%9E%E9%99%85%E7%B3%BB%E7%BB%9F%E7%BB%84%E4%BB%B6%E5%BC%82%E5%B8%B8%E6%83%85%E5%86%B5%E7%B9%81%E5%A4%8D">实际系统组件异常情况繁复</h3>
<p><img src="images/Source-of-Latency.png" alt="" style="height:450px;" /></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="65" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="65" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E8%99%BD%E7%84%B6%E5%90%84%E6%9C%89%E9%A2%84%E6%A1%88">虽然各有预案</h3>
<p><img src="images/Source-of-Latency-Solutions.png" alt="" style="height:450px;" /></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-r3M8q5p8="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="66" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/law-of-the-minimum.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="66" data-marpit-scope-r3M8q5p8="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="66" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h3 id="%E4%BB%8D%E7%84%B6%E9%9A%BE%E5%85%8D%E7%9F%AD%E6%9D%BF">仍然难免短板</h3>
<ul>
<li>必受各组件状态的影响
<ul>
<li>设备故障 <strong>Fail</strong></li>
<li>性能波动 <strong>Tail</strong></li>
</ul>
</li>
</ul>
<p>Source: <a href="https://nutrien-ekonomics.com/latest-fertilizer-research/liebigs-law-of-the-minimum/">https://nutrien-ekonomics.com/latest-fertilizer-research/liebigs-law-of-the-minimum/</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-r3M8q5p8="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="66" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="67" data-marpit-scope-g8PW5m2k="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="67" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%AE%B9%E9%94%99">容错</h3>
<ul>
<li>必受各组件状态的影响
<ul>
<li>设备故障——需要 <strong>Fault-Tolerant</strong> 容错!</li>
</ul>
</li>
</ul>
<p><img src="images/Replication-and-Erasure-Coding.jpg" alt="" style="height:350px;" /></p>
<p><a href="https://linkinghub.elsevier.com/retrieve/pii/S1084804517302734">Cloud Storage Reliability for Big Data Applications: A State of the Art Survey, Journal of Network and Computer Applications 2017</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="68" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="68" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%AE%B9%E6%BB%9E">容滞</h3>
<ul>
<li>必受各组件状态的影响
<ul>
<li>设备故障——需要 <strong>Fault-Tolerant</strong> 容错!</li>
<li>性能波动——需要 <strong>Tail-Tolerant</strong> 容滞?</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="69" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/SNIA-tail-latency.webp");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="69" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="69" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content"></section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="69" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-hA3QiBYk="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="70" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="background"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/latency-sla.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="1280" height="720"><section id="70" data-marpit-scope-hA3QiBYk="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="70" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129" data-marpit-advanced-background="content">
<p>Source: <a href="https://bravenewgeek.com/everything-you-know-about-latency-is-wrong/">https://bravenewgeek.com/everything-you-know-about-latency-is-wrong/</a></p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-hA3QiBYk="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="70" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="71" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/Screen-Shot-2015-10-04-at-6.15.24-PM-small.jpg");"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="71" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="71" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h3 id="%E7%AB%99%E5%9C%A8%E5%BA%94%E7%94%A8%E7%9A%84%E8%A7%92%E5%BA%A6%E4%B8%8A">站在应用的角度上</h3>
<ul>
<li><a href="https://bravenewgeek.com/everything-you-know-about-latency-is-wrong/">Everything You Know About Latency Is Wrong</a></li>
<li><a href="https://blog.csdn.net/u012802702/article/details/86421171">中译版</a>
<ul>
<li><strong>小概率事件</strong>不能忽视</li>
</ul>
</li>
</ul>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="71" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="72" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/graph_logbase10_ms.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="72" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="72" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h3 id="%E7%BB%8F%E5%85%B8%E8%A7%82%E6%B5%8B%E5%BE%88%E5%8F%AF%E8%83%BD%E5%BF%BD%E8%A7%86">经典观测很可能忽视</h3>
<ul>
<li><a href="https://bravenewgeek.com/everything-you-know-about-latency-is-wrong/">Everything You Know About Latency Is Wrong</a></li>
<li><a href="https://blog.csdn.net/u012802702/article/details/86421171">中译版</a>
<ul>
<li><strong>小概率事件</strong>不能忽视</li>
<li>延迟可能"<strong>被平均</strong>"</li>
</ul>
</li>
</ul>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="72" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="73" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/web-request-tail.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="73" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="73" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h3 id="%E5%8F%AF%E6%98%AF%E5%BD%B1%E5%93%8D%E5%85%B6%E5%AE%9E%E6%98%BE%E8%91%97">可是影响其实显著</h3>
<ul>
<li><a href="https://bravenewgeek.com/everything-you-know-about-latency-is-wrong/">Everything You Know About Latency Is Wrong</a></li>
<li><a href="https://blog.csdn.net/u012802702/article/details/86421171">中译版</a>
<ul>
<li><strong>小概率事件</strong>不能忽视</li>
<li>延迟可能"<strong>被平均</strong>"</li>
<li>任务可能<strong>被拖累</strong></li>
</ul>
</li>
</ul>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="73" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="74" data-marpit-scope-N5X6LpHT="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="74" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E9%87%8F%E5%8C%96%E6%8F%8F%E8%BF%B0%E5%B0%BE%E5%BB%B6%E8%BF%9F">量化描述尾延迟</h3>
<p><img src="images/measuring-percentile-latency.svg" alt="" style="height:500px;" /></p>
<p><a href="https://blog.bramp.net/post/2018/01/16/measuring-percentile-latency/">https://blog.bramp.net/post/2018/01/16/measuring-percentile-latency/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-JiLiygks="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="75" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/tail-latency-with-scaling-and-outliers.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="75" data-marpit-scope-JiLiygks="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="75" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h3 id="%E6%A8%AA%E5%90%91%E6%89%A9%E5%B1%95%E4%B8%8E%E5%B0%BE%E5%BB%B6%E8%BF%9F">横向扩展与尾延迟</h3>
<p>服务器通常响应时间10毫秒,但第P99百分位上的响应时间将达到一秒,即100个请求中将有1个慢请求用时超过1秒。</p>
<p>如果一个用户请求必须并行地从100个这样的服务器收集响应,则63%的用户请求将需要超过一秒的时间(在图表中标记为“x”)。</p>
<p>即使对于请求中只有1/10000(即P9999百分位)超过一秒延迟的服务器,基于2000台这样的服务器的系统也会有近五分之一的用户请求需要超过一秒的时间(在图表中标记为“o”)。</p>
<p>Source:<a href="https://dl.acm.org/doi/10.1145/2408776.2408794">The Tail at Scale</a>, CACM 2013.</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-JiLiygks="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="75" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="76" data-marpit-scope-QX9NlRQD="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="76" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E7%BA%B5%E5%90%91%E6%89%A9%E5%B1%95%E4%B8%8E%E5%B0%BE%E5%BB%B6%E8%BF%9F">纵向扩展与尾延迟</h3>
<p>显然,横向扩展放大了尾延迟,不过另一方面,缓存作为纵向扩展的基本方法,高命中率则帮助减少了尾延迟,事实上是公平减少了所有延迟</p>
<p>当然这样的方法也有其代价,具体在系统结构课堂上已有阐述,那么,有没有更具针对性的减少尾延迟的方法?</p>
<p>执行冗余请求,可以达到和缓存相仿的效果,简单计算比较一下</p>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mi>i</mi><mi>s</mi><mi>s</mi><mi>R</mi><mi>a</mi><mi>t</mi><mi>e</mi><mo>=</mo><mn>1</mn><mi mathvariant="normal">%</mi><mo>→</mo><mi>L</mi><mi>a</mi><mi>t</mi><mi>e</mi><mi>n</mi><mi>c</mi><msub><mi>y</mi><mrow><mi>n</mi><mi>e</mi><mi>w</mi></mrow></msub><mo>=</mo><mn>1</mn><mi mathvariant="normal">%</mi><mo>×</mo><mi>P</mi><mn>99</mn><mo>=</mo><mi>P</mi><mn>9999</mn></mrow><annotation encoding="application/x-tex">MissRate=1\% \rightarrow Latency_{new} = 1\% \times P99 = P9999</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">i</span><span class="mord mathnormal">ss</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8056em;vertical-align:-0.0556em;"></span><span class="mord">1%</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">L</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">c</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.0833em;"></span><span class="mord">1%</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">99</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">9999</span></span></span></span></p>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>N</mi><mrow><mi>H</mi><mi>e</mi><mi>d</mi><mi>g</mi><mi>e</mi></mrow></msub><mo>=</mo><mn>2</mn><mo>→</mo><mi>L</mi><mi>a</mi><mi>t</mi><mi>e</mi><mi>n</mi><mi>c</mi><msub><mi>y</mi><mrow><mi>n</mi><mi>e</mi><mi>w</mi></mrow></msub><mo>=</mo><mi>P</mi><mn>99</mn><mo>×</mo><mi>P</mi><mn>99</mn><mo>=</mo><mi>P</mi><mn>9999</mn></mrow><annotation encoding="application/x-tex">N_{Hedge}=2 \rightarrow Latency_{new} = P99 \times P99 = P9999</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">He</span><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">L</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">c</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">99</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">99</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord">9999</span></span></span></span></p>
<p>所以,具体来说</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="77" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="77" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%A6%82%E4%BD%95%E5%BA%94%E5%AF%B9">如何应对?</h3>
<ul>
<li>各组件状态的影响
<ul>
<li>设备故障——容错——<strong>提供冗余部件</strong> <em>(回顾计算机系统结构课…)</em></li>
<li>性能波动——容滞——?</li>
</ul>
</li>
</ul>
<p><img src="images/3-replica.png" alt="" style="height:300px;" /> <img src="images/erasure-code.png" alt="" style="height:300px;" /></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="78" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="78" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%A6%82%E4%BD%95%E5%BA%94%E5%AF%B9-1">如何应对?…</h3>
<ul>
<li>必受各组件状态的影响
<ul>
<li>设备故障——容错——<strong>提供冗余部件</strong></li>
<li>性能波动——容滞——<strong>执行冗余操作</strong></li>
</ul>
</li>
</ul>
<p><img src="images/hedged-requests.png" alt="" style="height:300px;" /> <img src="images/byte-dance-hedged-read.webp" alt="" style="height:200px;" /></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="79" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="79" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E7%BB%8F%E5%85%B8%E5%BA%94%E5%AF%B9%E7%AD%96%E7%95%A5">经典应对策略</h3>
<ul>
<li><a href="https://faststorage.eu/snia-avoiding-tail-latency-by-failing-io-operations-on-purpose/">SNIA: Avoiding tail latency by failing IO operations on purpose</a>
<ul>
<li>One of these initiatives is adding a per I/O tag that indicates whether a drive <strong>can fail fast</strong> and return an error if it takes too long to retrieve the data.</li>
<li>If there’s a replica of the data somewhere else, it might just be faster to retrieve the data from there, instead of waiting for the slow drive to respond.</li>
<li>The other side of the coin is a “<strong>try really hard</strong>” I/O tag, that indicates you’ve exhausted all other options and really need the data from this drive.</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="80" data-marpit-scope-xXuDdHH9="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="80" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E4%B8%BB%E8%A6%81%E6%96%B9%E6%B3%95%E5%88%86%E7%B1%BB">主要方法分类</h3>
<ul>
<li><strong>对冲请求</strong> Hedged Request
<ul>
<li>Issue the same request to multiple replicas and use the results from whichever replica responds first.</li>
<li>"hedged" - a client first sends one request to the replica believed to be the most appropriate, but then falls back on sending a secondary request after some brief delay.</li>
<li>The client cancels remaining outstanding requests once the first result is received.</li>
</ul>
</li>
<li><strong>关联请求</strong> Tied Request
<ul>
<li>The hedged-requests technique also has a window of vulnerability in which multiple servers can execute the same request unnecessarily.
<ul>
<li>Can be capped by waiting for the P95 expected latency before issuing the hedged request, but limits the benefits to only a small fraction of requests.</li>
</ul>
</li>
<li>Permitting more aggressive use of hedged requests with moderate resource consumption requires faster cancellation of requests.</li>
</ul>
</li>
</ul>
<p><a href="https://dl.acm.org/doi/10.1145/2408776.2408794">The Tail at Scale</a>, CACM 2013.</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="81" data-marpit-scope-lT5QiHS9="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="81" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="%E6%A1%88%E4%BE%8B1hdfs">案例1:HDFS</h4>
<ul>
<li><strong>HDFS</strong> (2.4+)
<ul>
<li>If a read from a block is slow, start up another parallel, <strong>'hedged' read</strong> against a different block replica.</li>
<li>We then <strong>take the result of which ever read returns first</strong> (<em>the outstanding read is cancelled</em>).</li>
<li>This 'hedged' read feature will help rein in the outliers, the odd read that takes a long time because it hit a bad patch on the disc, etc.</li>
</ul>
</li>
</ul>
<p><a href="https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/release/2.4.0/RELEASENOTES.2.4.0.html">https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/release/2.4.0/RELEASENOTES.2.4.0.html</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="82" data-marpit-scope-928rGjNp="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="82" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="%E6%A1%88%E4%BE%8B2mongodb">案例2:MongoDB</h4>
<ul>
<li><strong>mongodb</strong> (4.4+)
<ul>
<li>With hedged reads, the mongos instances can route read operations to <strong>two replica set members per each queried shard</strong> and <strong>return results from the first respondent</strong> per shard.</li>
<li>The additional read sent to hedge the read operation uses the <strong>maxTimeMS</strong> value of <strong>maxTimeMSForHedgedReads</strong>.</li>
</ul>
</li>
</ul>
<p><a href="https://docs.mongodb.com/manual/core/read-preference-hedge-option/">https://docs.mongodb.com/manual/core/read-preference-hedge-option/</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="83" data-marpit-scope-LYG6wkOk="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="83" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h4 id="%E6%A1%88%E4%BE%8B3%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8hdfs%E6%94%B9">案例3:字节跳动HDFS改</h4>
<table>
<thead>
<tr>
<th style="text-align:left">Host:X.X.X.X</th>
<th style="text-align:right">3 副本Switch Read</th>
<th style="text-align:right">2 副本 Hedged Read</th>
<th style="text-align:right">3 副本 Hedged Read</th>
<th style="text-align:right">3 副本 Fast Switch Read(优化)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">读取时长 p999</td>
<td style="text-align:right">977 ms</td>
<td style="text-align:right">549 ms</td>
<td style="text-align:right">192 ms</td>
<td style="text-align:right">128 ms</td>
</tr>
<tr>
<td style="text-align:left">最长读取时间</td>
<td style="text-align:right">300 s</td>
<td style="text-align:right">125 s</td>
<td style="text-align:right">60 s</td>
<td style="text-align:right">15.5 s</td>
</tr>
<tr>
<td style="text-align:left">长尾出现次数(大于 500ms)</td>
<td style="text-align:right">238 次/天</td>
<td style="text-align:right">75 次/天</td>
<td style="text-align:right">15 次/天</td>
<td style="text-align:right">3 次/天</td>
</tr>
<tr>
<td style="text-align:left">长尾出现次数(大于 1000ms)</td>
<td style="text-align:right">196 次/天</td>
<td style="text-align:right">64 次/天</td>
<td style="text-align:right">6 次/天</td>
<td style="text-align:right">3 次/天</td>
</tr>
</tbody>
</table>
<ul>
<li>优化:根据当前的读取状况动态地调整阈值,动态改变时间窗口的长度以及吞吐量阈值的大小。</li>
</ul>
<p><a href="https://juejin.cn/post/6844904035112189966">字节跳动 EB 级 HDFS 实践</a></p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="84" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="84" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E9%95%BF%E5%B0%BE%E5%BB%B6%E8%BF%9F%E7%9A%84%E8%A7%82%E6%B5%8B%E5%92%8C%E9%A2%84%E9%98%B2">长尾延迟的观测和预防</h3>
<ul>
<li>实验说明
<ul>
<li><a href="big-data-storage-experiment">对象存储实验</a></li>
</ul>
</li>
<li>实验内容
<ul>
<li>分析不同负载下的指标、延迟的分布</li>
<li>观测尾延迟现象</li>
<li>尝试对冲请求方案</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="85" data-marpit-scope-fofPmnUw="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="85" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE-1">参考文献…</h3>
<p><a href="https://dl.acm.org/doi/10.1145/2408776.2408794">The Tail at Scale</a>, (CACM 2013)</p>
<p>首次系统性分析了大规模分布式系统中长尾延迟的成因,提出了"对冲请求"等关键策略,成为后续研究的基石。</p>
<p><a href="https://dl.acm.org/doi/10.1145/3232559">Amdahl's Law for Tail Latency</a>, (CACM 2018)</p>
<p>将阿姆达尔定律扩展至尾部延迟分析,建立了量化尾部延迟与系统并行度的理论框架。</p>
<p><a href="https://dl.acm.org/doi/10.1145/3064176.3064209">Rein: Taming Tail Latency in Key-Value Stores via Multiget Scheduling</a>, (EuroSys 2017)</p>
<p>针对键值存储系统提出多请求调度算法,通过优化请求并行性显著降低尾部延迟。</p>
<p><a href="https://www.microsoft.com/en-us/research/publication/managing-tail-latency-in-datacenter-scale-file-systems-under-production-constraints/">Managing Tail Latency in Datacenter-Scale File Systems Under Production Constraints</a>, (EuroSys 2019)</p>
<p>基于微软生产环境数据,提出动态优先级调度和负载均衡策略,有效应对大规模文件系统的尾部延迟挑战。</p>
<p><a href="https://ieeexplore.ieee.org/document/8713931">Taming Tail Latency for Erasure-coded, Distributed Storage Systems</a>, (IEEE TNSM 2019)</p>
<p>针对纠删码存储系统提出数学建模与优化框架,显著降低尾部延迟概率。</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="86" data-marpit-scope-FDcHCOBh="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="86" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h2 id="%E6%8C%91%E6%88%98%E4%B8%89%E9%A2%84%E6%B5%8B">挑战三:预测</h2>
<p>怎样管控代价</p>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="87" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="87" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li><strong>容错的代价</strong>
<ul>
<li>…
<ul>
<li>…</li>
<li>…</li>
</ul>
</li>
</ul>
</li>
<li><strong>容滞的代价</strong>
<ul>
<li>…
<ul>
<li>…</li>
<li>…</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="88" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="88" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li>容错的代价
<ul>
<li><strong>浪费的空间</strong>
<ul>
<li>…</li>
<li>…</li>
</ul>
</li>
</ul>
</li>
<li>容滞的代价
<ul>
<li><strong>浪费的吞吐</strong>
<ul>
<li>…</li>
<li>…</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="89" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="89" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li>容错的代价
<ul>
<li>浪费的空间
<ul>
<li>从<strong>副本</strong>到<strong>纠删码</strong>、<strong>动态重编码</strong></li>
<li>…</li>
</ul>
</li>
</ul>
</li>
<li>容滞的代价
<ul>
<li>浪费的吞吐
<ul>
<li><strong>积极对冲</strong>加剧拥塞</li>
<li>…</li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="90" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="90" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li>容错的代价
<ul>
<li>浪费的空间
<ul>
<li>从副本到纠删码、动态重编码</li>
<li><strong>故障预测</strong></li>
</ul>
</li>
</ul>
</li>
<li>容滞的代价
<ul>
<li>浪费的吞吐
<ul>
<li>积极对冲加剧拥塞</li>
<li><strong>性能预测</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="91" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="91" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<ul>
<li>容错的代价
<ul>
<li>浪费的空间
<ul>
<li>从副本到纠删码、动态重编码</li>
<li><strong>故障预测</strong></li>
</ul>
</li>
</ul>
</li>
<li>容滞的代价
<ul>
<li>浪费的吞吐
<ul>
<li>积极对冲加剧拥塞</li>
<li><strong>性能预测</strong></li>
</ul>
</li>
</ul>
</li>
<li>更进一步:<strong>从偶然到必然</strong>……</li>
</ul>
</section>
</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-FPQIg0CI="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="92" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/amdahl-law.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="92" data-marpit-scope-FPQIg0CI="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="92" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h3 id="%E9%87%8D%E6%B8%A9%E9%98%BF%E5%A7%86%E8%BE%BE%E5%B0%94%E5%AE%9A%E5%BE%8B">重温阿姆达尔定律</h3>
<p>请再次回顾计算机系统结构课…</p>
<p><span is="marp-span" data-auto-scaling="downscale-only" class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mi>p</mi><mi>e</mi><mi>e</mi><mi>d</mi><mi>u</mi><msub><mi>p</mi><mrow><mi>O</mi><mi>v</mi><mi>e</mi><mi>r</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow></msub><mo>=</mo><mfrac><mrow><mi>T</mi><mi>i</mi><mi>m</mi><msub><mi>e</mi><mrow><mi>B</mi><mi>e</mi><mi>f</mi><mi>o</mi><mi>r</mi><mi>e</mi></mrow></msub></mrow><mrow><mi>T</mi><mi>i</mi><mi>m</mi><msub><mi>e</mi><mrow><mi>A</mi><mi>f</mi><mi>t</mi><mi>e</mi><mi>r</mi></mrow></msub></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>F</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi><mi>i</mi><mi>o</mi><msub><mi>n</mi><mrow><mi>I</mi><mi>m</mi><mi>p</mi><mi>r</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow></msub><mo stretchy="false">)</mo><mo>+</mo><mfrac><mrow><mi>F</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>t</mi><mi>i</mi><mi>o</mi><msub><mi>n</mi><mrow><mi>I</mi><mi>m</mi><mi>p</mi><mi>r</mi><mi>o</mi><mi>v</mi><mi>e</mi><mi>d</mi></mrow></msub></mrow><mrow><mi>S</mi><mi>p</mi><mi>e</mi><mi>e</mi><mi>d</mi><mi>u</mi><mi>p</mi></mrow></mfrac></mrow></mfrac></mrow><annotation encoding="application/x-tex">Speedup_{Overall}=\frac{Time_{Before}}{Time_{After}}=\frac{1}{(1-Fraction_{Improved})+\frac{Fraction_{Improved}}{Speedup}}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Sp</span><span class="mord mathnormal">ee</span><span class="mord mathnormal">d</span><span class="mord mathnormal">u</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">O</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">er</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">ll</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.3324em;vertical-align:-0.9721em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal">im</span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">A</span><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">er</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal">im</span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">B</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span><span class="mord mathnormal mtight">ore</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.9721em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.684em;vertical-align:-1.3625em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.1186em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">a</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">I</span><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">p</span><span class="mord mathnormal mtight">ro</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9914em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">Sp</span><span class="mord mathnormal mtight">ee</span><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.5131em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">F</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight">o</span><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">I</span><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">p</span><span class="mord mathnormal mtight">ro</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2901em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.4811em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.3625em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>在优化平均性能时,一些部分性能的提升可能不会对整体性能有太大影响…</p>
<p>但在优化尾部延迟时,<strong>每个部分都可能成为瓶颈</strong>。</p>
<p>因此,<strong>尾延迟(也就是最坏情况下的延迟)会使Amdahl's Law变得更有挑战性</strong>!</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-FPQIg0CI="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="92" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-marpit-scope-1MRxPRmx="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="93" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("images/homogeneous-server-queue.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="50%" height="720"><section id="93" data-marpit-scope-1MRxPRmx="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="93" style="--paginate:true;--theme:gaia;--marpit-advanced-background-split:50%;" data-marpit-pagination-total="129" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
<h3 id="%E5%B0%BE%E5%BB%B6%E8%BF%9F%E4%B8%8E%E9%98%BF%E5%A7%86%E8%BE%BE%E5%B0%94%E5%AE%9A%E5%BE%8B">尾延迟与阿姆达尔定律</h3>
<p><strong>尾延迟(也就是最坏情况下的延迟)会使Amdahl's Law变得更有挑战性</strong>:在优化平均性能时,一些部分性能的提升可能不会对整体性能有太大影响,但在优化尾部延迟时,每个部分都可能成为瓶颈。</p>
<p><strong>队列理论可以提供准确的基础理论</strong>:帮助我们预测和控制系统中的延迟,以指导如何设计未来交互式服务的硬件。</p>
<p>随着服务响应能力和可预测性变得越来越关键,需要根据应用的需求,<strong>找到计算和内存资源之间的平衡</strong>,以实现最优的系统性能。</p>
<p>Source:<a href="https://dl.acm.org/doi/10.1145/3232559">Amdahl's Law for Tail Latency</a>, CACM 2018.</p>
</section>
</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-marpit-scope-1MRxPRmx="" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="93" style="" data-marpit-pagination-total="129" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="94" data-paginate="true" data-theme="gaia" lang="zh-CN" data-marpit-pagination="94" style="--paginate:true;--theme:gaia;" data-marpit-pagination-total="129">
<h3 id="%E5%88%9D%E6%AD%A5%E5%B0%9D%E8%AF%95%E6%8E%92%E9%98%9F%E8%AE%BA%E6%A8%A1%E5%9E%8B">初步尝试——排队论模型</h3>
<p><img src="images/Basic-structure-of-queueing-models.png" alt="" style="height:350px;" /></p>
<p><strong>平均等待时间</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mo>=</mo><mfrac><mn>1</mn><mrow><mi>μ</mi><mo>−</mo><mi>λ</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">W = \frac{1}{\mu - \lambda}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.3262em;vertical-align:-0.4811em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">μ</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">λ</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.4811em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><br />
<strong>等待时间分布</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mi>q</mi></msub><mo>≤</mo><mi>t</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn><mo>−</mo><mfrac><mi>λ</mi><mi>μ</mi></mfrac><msup><mi>e</mi><mrow><mo>−</mo><mo stretchy="false">(</mo><mi>μ</mi><mo>−</mo><mi>λ</mi><mo stretchy="false">)</mo><mi>t</mi></mrow></msup></mrow><annotation encoding="application/x-tex">P(W_q \leq t) = 1 - \frac{\lambda}{\mu}e^{-(\mu-\lambda)t}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.3691em;vertical-align:-0.4811em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8801em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">μ</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">λ</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.4811em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">μ</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">λ</span><span class="mclose mtight">)</span><span class="mord mathnormal mtight">t</span></span></span></span></span></span></span></span></span></span></span></span></p>