PageSourceSearch

https://snowflakepruning.github.io/

html snowflakepruning.github.io collected 2026-10-03 09:58:01 UTC 63,521 bytes, 684 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3  <!-- Head -->
4  <head>
5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
6    
7    <!-- Metadata, OpenGraph and Schema.org -->
8
9
10
11
12<!-- Standard metadata -->
13<meta charset="utf-8">
14<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
15<meta http-equiv="X-UA-Compatible" content="IE=edge">
16<title>
17  
18  
19    
20      Pruning in Snowflake: Working Smarter, Not Harder | Andi Zimmerer
21    
22  
23</title>
24<meta name="author" content="Andi Zimmerer">
25<meta name="description" content="Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruning—skipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%.">
26
27  <meta name="keywords" content="Snowflake, Databases, Data Skipping, Pruning">
28
29
30
31
32
33
34  <!-- OpenGraph -->
35  <meta property="og:site_name" content="Andi Zimmerer">
36  <meta property="og:type" content="website">
37  <meta property="og:title" content="Andi Zimmerer | Pruning in Snowflake: Working Smarter, Not Harder">
38  <meta property="og:url" content="http://localhost:4000/papers/snowflake-pruning.html">
39  <meta property="og:description" content="Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruning—skipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%.">
40  
41    <meta property="og:image" content="/assets/img/posts/snowflake_pruning_flow.png">
42  
43  <meta property="og:locale" content="en">
44
45  <!-- Twitter card -->
46  <meta name="twitter:card" content="summary">
47  <meta name="twitter:title" content="Pruning in Snowflake: Working Smarter, Not Harder">
48  <meta name="twitter:description" content="Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruning—skipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%.">
49  
50    <meta name="twitter:image" content="/assets/img/posts/snowflake_pruning_flow.png">
51  
52  
53
54
55
56  <!-- Schema.org -->
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  
95<script type="application/ld+json">
96    {
97        "author":
98        {
99            "@type": "Person",
100            "name": "Andi Zimmerer"
101        },
102        "url": "http://localhost:4000/papers/snowflake-pruning.html",
103        "@type": "WebSite",
104        "description": "Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruning&mdash;skipping chunks of data that do not contain relevant information for computing query results. While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to LIMIT, top-k, and JOIN operations, dramatically expanding the opportunities for pruning across diverse query types. Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%.",
105        "headline": "Pruning in Snowflake: Working Smarter, Not Harder",
106        
107        "name": "Andi Zimmerer",
108        "@context": "https://schema.org"
109    }
110  </script>
110
111
112
113
114<!-- Vercel insights -->
115
116  
116<script defer src="/_vercel/speed-insights/script.js"></script>
116
117  
117<script defer src="/_vercel/insights/script.js"></script>
117
118
119
120<!-- Bootstrap & MDB -->
121<link rel="stylesheet" href="/assets/css/bootstrap.min.css?a4b3f509e79c54a512b890d73235ef04">
122<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/mdb.min.css" integrity="sha256-jpjYvU3G3N6nrrBwXJoVEYI/0zw8htfFnhT9ljN3JJw=" crossorigin="anonymous">
123
124
125
126<!-- Fonts & Icons -->
127<link defer rel="stylesheet" href="/assets/css/academicons.min.css?f0b7046b84e425c55f3463ac249818f5">
128<link defer rel="stylesheet" href="/assets/css/scholar-icons.css?62b2ac103a88034e6882a5be5f3e2772">
129<link defer rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Slab:100,300,400,500,700|Material+Icons&amp;display=swap">
130
131<!-- Code Syntax Highlighting -->
132<link defer rel="stylesheet" href="/assets/css/jekyll-pygments-themes-github.css?591dab5a4e56573bf4ef7fd332894c99" media="" id="highlight_theme_light">
133
134
135
136<!-- Styles -->
137
138
139
140
141  <link rel="shortcut icon" href="data:image/svg+xml,&lt;svg%20xmlns=%22http://www.w3.org/2000/svg%22%20viewBox=%220%200%20100%20100%22&gt;&lt;text%20y=%22.9em%22%20font-size=%2290%22&gt;%E2%9A%9B%EF%B8%8F&lt;/text&gt;&lt;/svg&gt;">
142
143<link rel="stylesheet" href="/assets/css/main.css?d41d8cd98f00b204e9800998ecf8427e">
144<link rel="canonical" href="http://localhost:4000/papers/snowflake-pruning.html">
145
146<!-- Dark Mode -->
147<script src="/assets/js/theme.js?a81d82887dd692e91686b43de4542f18"></script>
147
148
149  <link defer rel="stylesheet" href="/assets/css/jekyll-pygments-themes-native.css?5847e5ed4a4568527aa6cfab446049ca" media="none" id="highlight_theme_dark">
150  
150<script>
151    initTheme();
152  </script>
152
153
154
155
156
157
158
159
160
161
162
163  </head>
164
165  <!-- Body -->
166  <body class="fixed-top-nav sticky-bottom-footer">
167    <!-- Header -->
168    <header>
169  <!-- Nav Bar -->
170  <nav id="navbar" class="navbar navbar-light navbar-expand-sm fixed-top" role="navigation">
171    <div class="container">
172      
173        <a class="navbar-brand title font-weight-lighter" href="https://andi-zimmerer.com?utm_source=sfpruningcompanion">
174          
175            
176              <span class="font-weight-bold">Andi</span>
177            
178            
179            Zimmerer
180          
181        </a>
182      
183      <!-- Navbar Toggle -->
184      <button class="navbar-toggler collapsed ml-auto" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
185        <span class="sr-only">Toggle navigation</span>
186        <span class="icon-bar top-bar"></span>
187        <span class="icon-bar middle-bar"></span>
188        <span class="icon-bar bottom-bar"></span>
189      </button>
190
191      <div class="collapse navbar-collapse text-right" id="navbarNav">
192        <ul class="navbar-nav ml-auto flex-nowrap">
193          
194
195          <!-- About -->
196          <li class="nav-item ">
197            <a class="nav-link" href="https://andi-zimmerer.com?utm_source=sfpruningcompanion">About
198              
199            </a>
200          </li>
201
202          <!-- Other pages -->
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                <li class="nav-item ">
303                  <a class="nav-link" href="https://andi-zimmerer.com/blog?utm_source=sfpruningcompanion">Blog
304                    
305                  </a>
306                </li>
307              
308            
309          
310            
311              
312                
313                <li class="nav-item active">
314                  <a class="nav-link" href="https://andi-zimmerer.com/papers?utm_source=sfpruningcompanion">Papers
315                    
316                      <span class="sr-only">(current)</span>
317                    
318                  </a>
319                </li>
320              
321            
322          
323          
324            <!-- Search -->
325            <li class="nav-item">
326              <button id="search-toggle" title="Search" onclick="openSearchModal()">
327                <span class="nav-link">ctrl k <i class="ti ti-search"></i></span>
328              </button>
329            </li>
330          
331          
332            <!-- Toogle theme mode -->
333            <li class="toggle-container">
334              <button id="light-toggle" title="Change theme">
335                <i class="ti ti-sun-moon" id="light-toggle-system"></i>
336                <i class="ti ti-moon-filled" id="light-toggle-dark"></i>
337                <i class="ti ti-sun-filled" id="light-toggle-light"></i>
338              </button>
339            </li>
340          
341        </ul>
342      </div>
343    </div>
344  </nav>
345  
346    <!-- Scrolling Progress Bar -->
347    <progress id="progress" value="0">
348      <div class="progress-container">
349        <span class="progress-bar"></span>
350      </div>
351    </progress>
352  
353</header>
354
355
356    <!-- Content -->
357    <div class="container mt-5" role="main">
358      
359        
360
361<div class="post">
362  <header class="post-header">
363    
364    <span class="d-block text-muted text-center fst-italic mt-4 mb-2">Published in: Proceedings of the 2025 ACM SIGMOD International Conference on Management of Data</span>
365    
366    <h1 class="post-title" itemprop="headline">Pruning in Snowflake: Working Smarter, Not Harder</h1>
367  </header>
368
369  
370    <style>
371    .paper-author-list {
372        display: flex;
373        flex-wrap: wrap;
374        justify-content: space-evenly;
375        align-items: baseline;
376        gap: 1em 10px;
377        margin-top: 1em;
378        margin-bottom: 1.5em;
379        max-width: 7in;  /* 6.75in would be textwidth of ACM Latex template */
380    }
381    
382    .paper-author {
383        flex: 1 1 215px; /* 220px is based on width of widest element, but 170px works better with smaller layouts */
384        text-align: center;
385        line-height: 1.2em;
386    }
387    </style>
388
389    <div class="d-flex justify-content-center">
390      <div class="paper-author-list">
391        
392          <div class="paper-author">
393            <a href="https://www.linkedin.com/in/andi-zimmerer/" target="_blank" rel="noopener noreferrer">
394              <span class="d-block strong">Andreas Zimmerer</span>
395              <span class="d-block small">University of Technology Nuremberg</span>
396              <span class="d-block small">Nuremberg, Germany</span>
397            </a>
398          </div>
399        
400          <div class="paper-author">
401            <a href="https://www.linkedin.com/in/damien-dam/" target="_blank" rel="noopener noreferrer">
402              <span class="d-block strong">Damien Dam</span>
403              <span class="d-block small">Snowflake Inc.</span>
404              <span class="d-block small">Berlin, Germany</span>
405            </a>
406          </div>
407        
408          <div class="paper-author">
409            <a href="https://scholar.google.de/citations?hl=en&amp;user=nIYiva8AAAAJ" target="_blank" rel="noopener noreferrer">
410              <span class="d-block strong">Jan Kossmann</span>
411              <span class="d-block small">Snowflake Inc.</span>
412              <span class="d-block small">Berlin, Germany</span>
413            </a>
414          </div>
415        
416          <div class="paper-author">
417            <a href="https://www.linkedin.com/in/juliane-waack-327171202/" target="_blank" rel="noopener noreferrer">
418              <span class="d-block strong">Juliane Waack</span>
419              <span class="d-block small">Snowflake Inc.</span>
420              <span class="d-block small">Berlin, Germany</span>
421            </a>
422          </div>
423        
424          <div class="paper-author">
425            <a href="https://scholar.google.de/citations?hl=en&amp;user=QmwXUf4AAAAJ" target="_blank" rel="noopener noreferrer">
426              <span class="d-block strong">Ismail Oukid</span>
427              <span class="d-block small">Snowflake Inc.</span>
428              <span class="d-block small">Berlin, Germany</span>
429            </a>
430          </div>
431        
432          <div class="paper-author">
433            <a href="https://scholar.google.de/citations?hl=en&amp;user=y3IdRusAAAAJ" target="_blank" rel="noopener noreferrer">
434              <span class="d-block strong">Andreas Kipf</span>
435              <span class="d-block small">University of Technology Nuremberg</span>
436              <span class="d-block small">Nuremberg, Germany</span>
437            </a>
438          </div>
439        
440      </div>
441    </div>
442  
443
444  <div class="d-flex justify-content-center flex-wrap gap-2 pt-1 pb-5">
445    
446    <a href="https://arxiv.org/pdf/2504.11540" class="btn btn-blue btn-sm rounded-pill px-3" rel="external nofollow noopener" target="_blank"><i class="fa-solid fa-download mr-2"></i>PDF</a>
447    
448    <a href="https://arxiv.org/abs/2504.11540" class="btn btn-blue btn-sm rounded-pill px-3" rel="external nofollow noopener" target="_blank"><i class="ai ai-arxiv mr-2"></i>arXiv</a>
449
450    <a href="/assets/pdf/SIGMOD25-presentation-pruning-in-snowflake.pdf" class="btn btn-blue btn-sm rounded-pill px-3"><i class="fa-solid fa-display mr-2"></i>Slides (SIGMOD)</a>
451    
452    <a href="#cite" class="btn btn-blue btn-sm rounded-pill px-3"><i class="fa-solid fa-quote-left mr-2"></i>Cite</a>
453  </div>
454
455  <article>
456    <div class="d-flex justify-content-center">
457      <div class="w-75 mb-5" style="text-align: justify;">
458        <h2>Abstract</h2>
459        <p>Modern cloud-based data analytics systems must efficiently process petabytes of data residing on cloud storage. A key optimization technique in state-of-the-art systems like Snowflake is partition pruning—skipping chunks of data that do not contain relevant information for computing query results.</p> <p>While partition pruning based on query predicates is a well-established technique, we demonstrate that its scope can be extended to <code>LIMIT</code>, top-k, and <code>JOIN</code> operations, dramatically expanding the opportunities for pruning across diverse query types.</p> <p>Our analysis of Snowflake's production workloads reveals that real-world analytical queries exhibit much higher selectivity than commonly assumed, yielding effective partition pruning. We show that we can harness high selectivity by utilizing only min/max metadata available in modern data analytics systems and data lake formats like Apache Iceberg, reducing the number of processed micro-partitions by 99.4%.</p>
460      </div>
461    </div>
462
463    <h2>Highlights</h2>
464
465<p>We presented four data pruning techniques that are used in the Snowflake data platform and evaluated them based on their pruning effectiveness on real-world customer workloads.
466The pruning flow is as follows:</p>
467<ol>
468  <li>
469<b>Filter Pruning:</b> All queries containing a <code>WHERE</code> predicate are subject to <em>filter pruning</em>, which removes data partitions by identifying the ones that do not contain any rows that would match the filter condition in the <code>WHERE</code> clause.</li>
470  <li>
471<b>LIMIT Pruning:</b> If the query is a simple <code>LIMIT</code> query without an <code>ORDER BY</code>, the query engine tries to reduce the number of partitions to the minimally necessary set of partitions such that the query result can be computed. This works for queries with and without <code>WHERE</code> clause.</li>
472  <li>
473<b>Join Pruning:</b> While executing a join, the probe side of a join is subject to <em>join pruning</em>, i.e., removing partitions from the probe side that do not contain join partners based on the collected values from the build side.</li>
474  <li>
475<b>Top-K Pruning:</b>
475 Lastly, if a query is a top-k query, i.e., it contains an <code>ORDER BY ... LIMIT</code>, a specialized <em>top-k pruning</em> technique attempts to reduce the number of processed partitions by pushing runtime information about the current top-k heap down to the table scan.</li>
476</ol>
477<p>While the first two techniques can be applied during query optimization, the latter two techniques require runtime information about the current state of the query execution.</p>
478
479<p>The pruning flow can be visualized as follows:</p>
480<div class="text-center">
481  
482
483
484
485<figure>
486  <picture>
487    <!-- Auto scaling with imagemagick -->
488    <!--
489      See https://www.debugbear.com/blog/responsive-images#w-descriptors-and-the-sizes-attribute and
490      https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images for info on defining 'sizes' for responsive images
491    -->
492    
493      
494        <source class="responsive-img-srcset" srcset="/assets/img/posts/snowflake_pruning_flow-480.webp 480w,/assets/img/posts/snowflake_pruning_flow-800.webp 800w,/assets/img/posts/snowflake_pruning_flow-1400.webp 1400w," type="image/webp" sizes="95vw">
495      
496    
497    <img src="/assets/img/posts/snowflake_pruning_flow.png" class="img-fluid w-75" width="100%" height="auto" alt="Pruning flow in Snowflake across all query types. 58.7% of all queries have partitions pruned by filter pruning. 0.2% of all queries are first subject to filter pruning, then LIMIT-pruning. There is another 0.0002% of queries that have no partitions pruned by filters, but only have partitions pruned by LIMIT-pruning. Overall, 0.2% of all queries are subject to LIMIT-pruning. Let's go to join pruning now. Overall, 10.7% of queries have partitions pruned by join-pruning. 4.0% of all queries have partitions pruned by join pruning but have neither filter pruning nor LIMIT-pruning applied. 0.0001% of queries saw successful LIMIT-pruning before having partitions pruned by join-pruning. And 6.7% of queries had partitions pruned by filter pruning before getting at least one partition pruned by join-pruning. Lastly, 0.1% of all queries across all query types have at least one partition pruned by top-k pruning. 0.03% of queries only saw successful topk-pruning without having any other partitions pruned by other techniques. 0.007% had at least one partition pruned by join-pruning before successful top-k pruning. And 0.08% of all queries first had partitions pruned by filter pruning before top-k pruning." loading="eager" onerror="this.onerror=null; $('.responsive-img-srcset').remove();">
498  </source></picture>
499
500  
501    <figcaption class="caption">Pruning Flow in the Snowflake Data Platform across all Query Types</figcaption>
502  
503</figure>
504
505</div>
506<p>Note that the figure contains distributions across all query types, including DML queries. The distribution of <code>SELECT</code>-only queries might be different as certain operators might be seen more often—e.g., DML queries tend to not contain <code>LIMIT</code> clauses and might have fewer joins.</p>
507
508
509<p>As in interesting side-remark, we also objectified that it makes sense to optimize for small <code>LIMIT k</code> by looking at the relative distribution of of <code>k</code> across production queries:</p>
510<div class="d-flex justify-content-center">
511  <div>            
511<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_SVG"></script>
511<script type="text/javascript">if (window.MathJax && window.MathJax.Hub && window.MathJax.Hub.Config) {window.MathJax.Hub.Config({SVG: {font: "STIX-Web"}});}</script>
511                
511<script type="text/javascript">window.PlotlyConfig = {MathJaxConfig: 'local'};</script>
511
512        
512<script charset="utf-8" src="https://cdn.plot.ly/plotly-3.0.1.min.js"></script>
512                <div id="8d250aff-7fea-440f-86df-502f16115a23" class="plotly-graph-div" style="height:250px; width:700px;"></div>            
512<script type="text/javascript">                window.PLOTLYENV=window.PLOTLYENV || {};                                if (document.getElementById("8d250aff-7fea-440f-86df-502f16115a23")) {                    Plotly.newPlot(                        "8d250aff-7fea-440f-86df-502f16115a23",                        [{"fill":"tozeroy","line":{"color":"#29b5e8","width":1},"mode":"lines","name":"CDF","x":{"dtype":"i4","bdata":"AQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAHAAAAB4AAAAfAAAAIAAAACMAAAAoAAAAKQAAAC0AAAAuAAAALwAAADAAAAAyAAAAMwAAADQAAAA3AAAAPAAAAD0AAABAAAAAQwAAAEYAAABLAAAATAAAAFAAAABTAAAAVQAAAFoAAABbAAAAXwAAAGMAAABkAAAAZQAAAGYAAABoAAAAeAAAAIAAAACCAAAAhwAAAIkAAACMAAAAlAAAAJYAAACXAAAAnAAAAJ0AAACgAAAAoQAAAKIAAAClAAAAqQAAAKoAAACuAAAAtAAAALgAAAC7AAAAvgAAAMgAAADJAAAA0gAAANkAAADcAAAA4AAAAOEAAADqAAAA8AAAAPoAAAD7AAAA\u002fAAAAAABAAACAQAAAwEAAAQBAAAOAQAAEAEAABEBAAAeAQAAIgEAACMBAAAoAQAAKwEAACwBAAA2AQAAQAEAAFMBAABeAQAAbAEAAG0BAACPAQAAkAEAAJEBAACYAQAAmgEAAKQBAACsAQAAuQEAAL4BAADCAQAAwwEAAMYBAADMAQAA1gEAANgBAADwAQAA9AEAAPUBAAD2AQAA+AEAAPoBAAAAAgAAEgIAABkCAAAgAgAALAIAADACAAA2AgAAOgIAAD4CAABRAgAAVgIAAFgCAABbAgAAdgIAAIoCAACUAgAApwIAAKgCAACzAgAAvAIAAL0CAADLAgAA7gIAAAIDAAAHAwAADAMAABIDAAAWAwAAHQMAACADAAA+AwAAUgMAAHsDAACEAwAAhQMAAJgDAACsAwAAuQMAANQDAADnAwAA6AMAAOkDAADqAwAA\u002fAMAAAYEAAAaBAAATAQAAGAEAABlBAAAZgQAAIgEAACwBAAAtwQAAMQEAADiBAAAFAUAACgFAABaBQAAcwUAAHgFAAB+BQAAtAUAANwFAAAYBgAAIgYAADkGAABABgAASgYAAGAGAAByBgAAcwYAAHwGAACDBgAApAYAALgGAADWBgAACAcAABAHAAAcBwAAMAcAAGwHAACoBwAAtgcAAM0HAADQBwAA0QcAAOQHAAACCAAAIAgAADQIAABICAAAjggAAJgIAADLCAAA1AgAAOgIAAD8CAAAEAkAADgJAABMCQAAYAkAAGgJAACICQAAnAkAAKsJAADECQAAxQkAAPYJAAAoCgAAZAoAAPAKAABUCwAAaAsAAJALAACkCwAAuAsAALkLAADCCwAA6gsAAP4LAAAcDAAAgAwAABYNAABcDQAAZA0AAHoNAACsDQAArg0AAMANAADKDQAATA4AAGAOAAB0DgAA2A4AAOIOAAAKDwAAbg8AAJYPAACgDwAAoQ8AANwPAAD6DwAAaBAAAIYQAADMEAAA\u002fhAAAGIRAABsEQAAgBEAAJQRAACVEQAAqBEAANoRAAD4EQAAthIAAMASAADyEgAAGhMAACQTAAAuEwAAfhMAAIgTAACJEwAAnBMAAO0TAAD2EwAAUBQAAGQUAACCFAAAkBQAALEUAAC0FAAAGBUAAHwVAACuFQAAdhYAAAwXAAAqFwAAcBcAADgYAABVGAAAnBgAAAAZAABkGQAAlhkAAMgZAAD6GQAAXhoAAPQaAABYGwAAYhsAAIobAAC8GwAAIBwAAFAcAABSHAAA1BwAAOgcAAAcHQAAJB0AAEwdAAAUHgAAWh4AAJAeAABAHwAAQR8AAAAgAADsIAAAFyEAADQhAACYIQAAtiEAAPYhAAD3IQAAKiIAAFYiAABgIgAAeiIAAIUiAACSIgAAxCIAACgjAAApIwAAYCMAAPAjAAAiJAAAlSQAALgkAAC+JAAA6iQAANAlAAAQJgAAFiYAABomAAAfJgAAQiYAAEcmAABdJgAAfyYAAMgmAADVJgAA2CYAAOAmAADqJgAA8SYAAPImAAD1JgAA+CYAAPwmAAD\u002fJgAACycAAAwnAAANJwAADicAAA8nAAAQJwAAEScAABInAABCJwAApicAAKAoAAAEKQAAaCkAAAgqAACUKgAA+CoAAPkqAACILAAA7CwAAB4tAADgLgAARC8AAHAwAADUMAAAODEAAJwxAADOMQAAyDIAAMIzAAD0MwAAvDQAAO40AABMNgAAfjYAALA2AACxNgAA4jYAAHg3AABAOAAACDkAAJ45AADQOQAANDoAAJg6AABgOwAAxDsAAFo8AACMPAAAvjwAAG89AACGPQAAgD4AAMA+AABIPwAAnEAAAKZAAADYQAAAaEIAAJpCAAAMRAAAKkQAAFxEAADyRAAAHkYAAFBGAACCRgAAREgAAD5JAAAGSgAAOEoAAJBMAAAgTgAAIU4AACJOAADoTgAAzlAAAAhSAAA0UwAAZlMAAPxTAAAoVQAA8FUAABxXAACAVwAAslcAAHpYAACsWAAAQlkAANhZAAAEWwAAaFsAAMxbAAD+WwAAXF0AAMBdAACoYQAAqWEAAGpjAADIZAAAkGUAAJFlAAC8ZgAAhGcAABpoAAB4aQAAQGoAAGxrAAD8bAAAYG0AAJJtAAAWcQAASHEAAKxxAABCcgAApnIAANJzAAD+dAAAMHUAADF1AAAydQAAJHcAAFZ3AADsdwAAtHgAABh5AAAMewAAonsAANR7AAA4fAAAAH0AAAF9AAD0fgAA\u002f38AAACAAADogAAAOoQAAGyEAADQhAAAxIYAALiIAACAiQAAEIsAAG6MAACgjAAA\u002fo0AAIiQAAB8kgAAPpQAAHCUAAAAlgAAlpYAACaYAABYmAAAIJkAAEyaAAB4mwAA3JsAAECcAADEnwAAvqAAALihAAAcogAAEKQAAASmAADMpgAAxqcAAPinAADgqwAAoq0AANStAADIrwAAya8AACaxAACwswAAQLUAAJ62AACYtwAA\u002fLcAAC64AACAuwAAdL0AANK+AABovwAAusIAAB7DAABQwwAAUcMAALTDAADmwwAAGMQAAAbHAAAyyAAAZMgAAMjIAAAgywAA6MsAAEDOAAAIzwAAbM8AAJjQAABg0QAA8NIAAPHSAAC40wAA2NYAAMDaAAC03AAA4N0AANTfAAA44AAAauAAAJDiAAB45gAAQOcAAGDqAABh6gAAkuoAAEjuAADY7wAAMPIAABj2AAAM+AAAAPoAAAH6AADo\u002fQAA6f0AANz\u002fAACkAAEA0AEBAAICAQC4BQEAoAkBAHMLAQCIDQEA4A8BAHARAQBYFQEAQBkBADQbAQAoHQEAHB8BABAhAQAEIwEA+CQBAPkkAQDgKAEAqCkBAHAqAQCwMAEA4jABAEAyAQCYNAEAvjYBAIA4AQAWOQEAXD4BAPI+AQBQQAEAOEQBACBIAQAITAEA8E8BALhQAQDAVwEAwVcBAJBfAQBsZQEAYGcBAGFnAQBIawEAMG8BABhzAQAAdwEAUHkBAOh6AQCshAEAnYYBAKCGAQChhgEAiIoBAHCOAQBYkgEAQJYBACiaAQAEoAEA+KEBALyrAQCwrQEAgLUBAGi5AQBQvQEAOMEBADnBAQAgxQEACMkBAPDMAQDA1AEAwdQBAJDcAQBg5AEAVOYBAEjoAQA86gEAMOwBAIjuAQAM8gEAAPQBAOj3AQDQ+wEA0fsBAP\u002f\u002fAQCsAQIAoAMCAIgHAgBwCwIAcQsCAFgPAgBAEwIA7CACAOAiAgCwKgIAsSoCAIwwAgBoNgIAUDoCACxAAgAIRgIA8EkCAORLAgDYTQIAwFECAMFRAgC0UwIAbF8CADBpAgAkawIAAHECANx2AgDEegIAoIACAIiEAgBwiAIAII0CAECQAgA0kgIAEJgCAKCZAgD4mwIA4J8CALCnAgCkqQIAmKsCAIytAgBQtwIAOLsCACC\u002fAgDwxgIA2MoCAMzMAgDAzgIAqNICAGDeAgBU4AIAMOYCADHmAgAA7gIAuPkCAKD9AgAYAwMAcQUDAGQHAwBADQMAQQ0DABwTAwAQFQMABBcDAPgYAwDgHAMAmCgDAOgyAwBQNAMA5EUDANhHAwDASwMAnFEDAJBTAwBgWwMAVF0DADxhAwAwYwMAAGsDAPRsAwDobgMA3HADAKx4AwCgegMAiH4DAHCCAwBAigMANIwDALiPAwAQkgMA+JUDAOCZAwDUmwMAyJ0DALChAwCMpwMAgKkDAFCxAwAstwMAILkDAPDAAwDYxAMAwMgDAJDQAwB41AMAdN0DABjkAwDc7QMA0O8DAMTxAwCg9wMAKAsEABwNBAAQDwQA4BYEALAeBABcLAQAUC4EABQ4BAAIOgQASEAEAMBFBAC0RwQAnEsEAJBNBACETwQAVFcEADBdBADoaAQA0GwEALhwBACgdAQAcHwEACiIBADskQQA4JMEALCbBAB0pQQAUKsEABS1BAAItwQA8LoEAMDCBACcyAQAkMoEAHjOBABs0AQASNYEADDaBAAY3gQAAOIEAOjlBACs7wQAoPEEAJTzBAB89wQAZPsEAFj9BAAoBQUAEAkFAOwOB
512QDgEAUA4RAFAHQiBQBoJAUAUCgFACAwBQAhMAUA8DcFANg7BQDAPwUAbE0FAGBPBQBUUQUASFMFAElTBQCgVQUABFYFADBXBQAYWwUADF0FAABfBQDQZgUAoG4FAJRwBQB8dAUAcHYFAGR4BQBMfAUAQH4FADSABQAoggUAEIYFAMiRBQCAnQUAUKUFABSvBQAIsQUA2LgFAMy6BQCowAUAnMIFAGDMBQAA3AUAoOsFAHDzBQBx8wUAZPUFAFj3BQAo\u002fwUABAUGAPgGBgDhCgYAsBIGAIAaBgB0HAYACC4GAMA5BgC0OwYAkEEGAGBJBgDoXAYA3F4GALhkBgCgaAYA+IMGAMiLBgCwjwYAdJkGAFCfBgAgpwYAFKkGAPCuBgDYsgYAwLYGANDdBgCg5QYAWPEGACj5BgAQ\u002fQYA4AQHALAMBwCMEgcAgBQHAHQWBwAgJAcA8CsHALQ1BwCQOwcAeD8HAGBDBwAYTwcADFEHAABTBwC4XgcAZGwHAEByBwAQegcAvIcHALCJBwAsnwcAIKEHAAilBwDwqAcAYMAHADDIBwAYzAcA6NMHANDXBwC42wcAoN8HAEDvBwDIAggAsAYIAHQQCABoEggAUBYIADgaCABgPQgAVD8IAABNCADoUAgAcGQIAEBsCAAQdAgAmIcIAICLCAC0rAgAqK4IAKDZCABw4QgAWOUIAEznCAA06wgA1PoIALAACQA4FAkALBYJACAYCQAUGgkACBwJAMAnCQCoKwkAAEcJANxMCQDQTgkArFQJAHBeCQBYYgkA4HUJAICFCQDMogkAwaQJAKioCQBgtAkAAMQJAOjHCQDQywkAxM0JAKzRCQAQ6wkA7PAJALD6CQCAAgoAaAYKACASCgCoJQoAeC0KADA5CgAMPwoAAEEKAAFBCgD0QgoA0EgKALhMCgCgUAoAQGAKAChkCgC8dQoAmHsKAFCHCgAIkwoA2JoKALSgCgCcpAoAYK4KAEiyCgAYugoAAL4KANDFCgCI0QoAcNUKAPjoCgDA6QoA4OwKAMjwCgCA\u002fAoAOAgLAPATCwCQIwsAADsLAOg+CwC4RgsAoEoLAIhOCwBkVAsA+GULAABtCwCwcQsAIIkLAAiNCwBgqAsA0L8LAADRCwBA1wsANNkLABDfCwAE4QsA4OYLADgCDAB4IQwAADUMAOg4DACsQgwAWFAMADRWDAAQXAwAsGsMAJhvDABQewwAUXsMACyBDAAggwwAwJIMAKiWDABgogwAMKoMACSsDAC4vQwAZMsMAEzPDABA0QwAEdkMAMjkDADADw0A6DINALBlDQCAbQ0ACIENAPCEDQCQlA0AGKgNAKC7DQCIvw0A4NoNANTcDQCw4g0AOPYNACD6DQAI\u002fg0A\u002fP8NANgFDgDACQ4AqA0OAJERDgBgGQ4AACkOAFhEDgDgVw4AaGsOAJCODgB4kg4AAKYOAEDFDgAQzQ4AwAMPAKgHDwB4Dw8AP0IPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAEBCDwBAQg8AQEIPAA=="},"y":{"dtype":"f8","bdata":"LMU1+H9o6T8WELCce3bpP+OcMgF0g+k\u002fH9SgfteG6T\u002fiWR0vNp7pPxdEzl2qoOk\u002flc7rrkmk6T+kredOy6TpP7OM4+5Mpek\u002f61JianPl6T+7yqksLevpP9r+nmfq7uk\u002fkRmxQhzv6T\u002f\u002fTtX4f+\u002fpP15jHtXWFuo\u002foLbNqBIX6j+2JwiaJhfqP1fR34NEF+o\u002fy5l4I+0j6j+247wvNiXqP0EcWihAJeo\u002fV42UGVQl6j8Q2SLtnCnqP9C27xF4Leo\u002f5icqA4wt6j+MM\u002frd1zXqPyAvUiCLOeo\u002fFDxRdn0+6j\u002fhx51Cwz7qP3XD9YR2Quo\u002fAPySfYBC6j+LNDB2ikLqPxZtzW6UQuo\u002foaVqZ55C6j+3FqVYskLqP4SjJ72qT+o\u002f1kvQKyJT6j\u002fsvAodNlPqP41m4gZUU+o\u002fA+nDC6dU6j+OIWEEsVTqP0Q8c9\u002fiVOo\u002fz3QQ2OxU6j9wHujBClXqP\u002ftWhboUVeo\u002fho8isx5V6j\u002fI4tGGWlXqP1Mbb39kVeo\u002f9MRGaYJV6j+uENU8y1nqPwC5fatCXeo\u002fi\u002fEapExd6j\u002fylAAJHl7qPxh1PJVISOs\u002fNfAeAw5k6z9LYVn0IWTrP9aZ9uwrZOs\u002fjbQIyF1k6z8uXuCxe2TrP7mWfaqFZOs\u002fRM8ao49k6z\u002fPB7ibmWTrP+V48oytZOs\u002fcLGPhbdk6z94\u002fkzUpmXrP6TgwbbOZes\u002fulH8p+Jl6z9Fipmg7GXrP1v705EAZus\u002f5jNxigpm6z9xbA6DFGbrP\u002fykq3seZus\u002fh91IdChm6z+dToNlPGbrP7O\u002fvVZQZus\u002fN2Yc\u002fsdm6z\u002fCnrn20WbrP03XVu\u002fbZus\u002f2A\u002f05+Vm6z9qloTHkXTrP\u002faJoL34des\u002fDPvargx26z+XM3inFnbrP9mGJ3tSdus\u002f7\u002fdhbGZ26z96MP9kcHbrPwVpnF16dus\u002fphJ0R5h2
5126z+18W\u002fnGXfrP+HT5MlBd+s\u002f90Qfu1V36z8NtlmsaXfrP5ju9qRzd+s\u002fIyeUnX136z84mM6OkXfrP04JCYCld+s\u002f2UGmeK936z9kekNxuXfrP++y4GnDd+s\u002fBSQbW9d36z+QXLhT4XfrPxuVVUzrd+s\u002fvD4tNgl46z+Mt6qQdYrrPxfwR4l\u002fius\u002fLWGCepOK6z9D0rxrp4rrP84KWmSxius\u002f5HuUVcWK6z\u002fHeBsTH4vrP1KxuAspi+s\u002fNiQ9xDyO6z9MlXe1UI7rP9fNFK5ajus\u002fYgaypmSO6z94d+yXeI7rPwOwiZCCjus\u002fjugmiYyO6z+kWWF6oI7rP7rKm2u0jus\u002fKADAIRiP6z+zOF0aIo\u002frP8mplws2j+s\u002fVOI0BECP6z\u002ffGtL8SY\u002frP2pTb\u002fVTj+s\u002fG8wV1jHI6z9SXnaQKd7rP6oiYFV53us\u002fNVv9TYPe6z9LzDc\u002fl97rP9YE1Teh3us\u002f7HUPKbXe6z93rqwhv97rPwLnSRrJ3us\u002fjR\u002fnEtPe6z8YWIQL3d7rP6OQIQTn3us\u002fLsm+\u002fPDe6z+5AVz1+t7rP0Q6+e0E3+s\u002fWqsz3xjf6z+IA6a8+uHrPxM8Q7UE4us\u002fnnTgrQ7i6z8\u002fHriXLOLrP8pWVZA24us\u002fVY\u002fyiEDi6z\u002fgx4+BSuLrP2sALXpU4us\u002fcwhpxqDk6z\u002f+QAa\u002fquTrP4l5o7e05Os\u002fVgXwg\u002frk6z\u002fhPY18BOXrP\u002feux20Y5es\u002fDSACXyzl6z+YWJ9XNuXrP67J2UhK5es\u002fOQJ3QVTl6z\u002fl5AZw1evrP3AdpGjf6+s\u002f+1VBYenr6z+Gjt5Z8+vrP0xDa9ID7us\u002f13sIyw3u6z9itKXDF+7rP+3sQrwh7us\u002feCXgtCvu6z8DXn2tNe7rP1siZ3KF7us\u002foU9qoZW27T\u002fGWh8wiLjtP0oBftf\u002fuO0\u002f1Tkb0Am57T9gcrjIE7ntPwEckLIxue0\u002fCiTM\u002fn277T+VXGn3h7vtPyCVBvCRu+0\u002fNgZB4aW77T\u002fBPt7Zr7vtP8lGGib8ve0\u002fVH+3Hga+7T\u002fft1QXEL7tP2rw8Q8avu0\u002f0k5WckjA7T9dh\u002fNqUsDtP+i\u002fkGNcwO0\u002fc\u002fgtXGbA7T8Ny0XyTsLtP5gD4+pYwu0\u002fIzyA42LC7T+OQpTRFNjtPxl7Mcoe2O0\u002fpLPOwijY7T8v7Gu7MtjtP+AvvkIv2u0\u002fa2hbOzna7T\u002f2oPgzQ9rtP4HZlSxN2u0\u002fDBIzJVfa7T+XStAdYdrtPzj0pwd\u002f2u0\u002f\u002fqg0gI\u002fc7T+J4dF4mdztPxQab3Gj3O0\u002fUJZe8ane7T\u002fbzvvps97tP2YHmeK93u0\u002f8T8228fe7T9CLWBM4uDtP81l\u002fUTs4O0\u002fWJ6aPfbg7T\u002fj1jc2AOHtP402P4kdQ+4\u002fAIoQxr5Z7j+Lwq2+yFnuPxb7SrfSWe4\u002foTPor9xZ7j8IkkwSC1zuPx4DhwMfXO4\u002fv6xe7Txc7j\u002f7KE5tQ17uP2leciOnXu4\u002ff8+sFLte7j8KCEoNxV7uP4fX6GAHYe4\u002fEhCGWRFh7j+dSCNSG2HuPyiBwEolYe4\u002fZP2vyitj7j\u002fvNU3DNWPuP3pu6rs\u002fY+4\u002fBaeHtElj7j+Q3yStU2PuP08Cc9TRZe4\u002foe+cRexn7j8sKDo+9mfuP86MkCVxae4\u002fWcUtHntp7j+Fp6IAo2nuPxDgP\u002fmsae4\u002fmxjd8bZp7j8mUXrqwGnuP7GJF+PKae4\u002fdoRb9jB37j8BvfjuOnfuP4z1ledEd+4\u002fFy4z4E537j+iZtDYWHfuPy2fbdFid+4\u002fQxCownZ37j\u002fOSEW7gHfuP1mB4rOKd+4\u002f5Ll\u002frJR37j9v8hylnnfuPxCc9I68d+4\u002fPH5pceR37j\u002fHtgZq7nfuP90nQVsCeO4\u002fftEYRSB47j8JCrY9KnjuP5RCUzY0eO4\u002fH3vwLj547j+qs40nSHjuPzXsKiBSeO4\u002fS11lEWZ47j\u002fWlQIKcHjuP4HxMfzCp+4\u002fDCrP9Myn7j+XYmzt1qfuPyKbCebgp+4\u002frdOm3uqn7j84DETX9KfuP059fsgIqO4\u002f2bUbwRKo7j9k7ri5HKjuP+8mVrImqO4\u002fel\u002fzqjCo7j8xegWGYqjuP7yyon5sqO4\u002fR+s\u002fd3ao7j\u002fSI91vgKjuP11cemiKqO4\u002fc820WZ6o7j\u002f+BVJSqKjuP4k+70qyqO4\u002fFHeMQ7yo7j8q6MY00KjuP7UgZC3aqO4\u002fQFkBJuSo7j9Nf+r4bcHuP\u002fcw\u002fi7Yw+4\u002fgmmbJ+LD7j8Nojgg7MPuP5ja1Rj2w+4\u002fOYStAhTE7j\u002fEvEr7HcTuP0\u002f15\u002fMnxO4\u002f2i2F7DHE7j9lZiLlO8TuP\u002fCev91F
512xO4\u002fe9dc1k\u002fE7j8cgTTAbcTuP6e50bh3xO4\u002fMvJusYHE7j+9Kgyqi8TuP0hjqaKVxO4\u002f4npCOyHF7j9ts98zK8XuP\u002fjrfCw1xe4\u002fgyQaJT\u002fF7j+ZlVQWU8XuP9voA+qOxe4\u002fZiGh4pjF7j\u002fxWT7bosXuP3yS29Osxe4\u002fB8t4zLbF7j8dPLO9ysXuPysbr11Mxu4\u002ftlNMVlbG7j9BjOlOYMbuP8zEhkdqxu4\u002f4jXBOH7G7j9tbl4xiMbuP\u002fim+ymSxu4\u002fg9+YIpzG7j8OGDYbpsbuP5lQ0xOwxu4\u002fJIlwDLrG7j9Qa+Xu4cbuP9ujgufrxu4\u002fZtwf4PXG7j\u002fxFL3Y\u002f8buP0JHaEy9x+4\u002fzX8FRcfH7j\u002fj8D8228fuP24p3S7lx+4\u002f+WF6J+\u002fH7j+Emhcg+cfuPw\u002fTtBgDyO4\u002fmgtSEQ3I7j8lRO8JF8juP7B8jAIhyO4\u002fxu3G8zTI7j9RJmTsPsjuP9xeAeVIyO4\u002fZ5ee3VLI7j\u002fyzzvWXMjuP30I2c5myO4\u002fk3kTwHrI7j9hwN6JHcruP3cxGXsxyu4\u002fAmq2czvK7j8Y2\u002fBkT8ruP6MTjl1Zyu4\u002fLkwrVmPK7j+5hMhObcruP0S9ZUd3yu4\u002fz\u002fUCQIHK7j9aLqA4i8ruP3Cf2imfyu4\u002f+9d3IqnK7j8RSbITvcruP5yBTwzHyu4\u002fJ7rsBNHK7j+y8on92sruPz0rJ\u002fbkyu4\u002fyGPE7u7K7j9TnGHn+MruP97U\u002ft8Cy+4\u002faQ2c2AzL7j9\u002fftbJIMvuP5XvELs0y+4\u002fq2BLrEjL7j\u002fB0YWdXMvuP0sKI5Zmy+4\u002f1kLAjnDL7j9he12HesvuP+yz+n+Ey+4\u002fd+yXeI7L7j8CJTVxmMvuPxiWb2Ksy+4\u002fo84MW7bL7j\u002flIbwu8svuP675Aye9I+8\u002fGrpgehku7z+l8v1yIy7vPzArm2stLu8\u002fu2M4ZDcu7z9GnNVcQS7vP9HUclVLLu8\u002f50WtRl8u7z9yfko\u002faS7vP4jvhDB9Lu8\u002fOHhYuhwv7z\u002fDsPWyJi\u002fvP07pkqswL+8\u002f2SEwpDov7z9kWs2cRC\u002fvP0dXVFqeL+8\u002f0o\u002fxUqgv7z9dyI5Lsi\u002fvP+gALES8L+8\u002fcznJPMYv7z\u002f+cWY10C\u002fvP4mqAy7aL+8\u002fghjF3Ecw7z8NUWLVUTDvP5iJ\u002f81bMO8\u002frvo5v28w7z85M9e3eTDvP8RrdLCDMO8\u002fT6QRqY0w7z9IEtNX+zDvP9NKcFAFMe8\u002fXoMNSQ8x7z\u002fpu6pBGTHvP3T0RzojMe8\u002fimWCKzcx7z8Vnh8kQTHvP6DWvBxLMe8\u002fKw9aFVUx7z90r8Y3gDLvP\u002f\u002fnYzCKMu8\u002fiiABKZQy7z8VWZ4hnjLvPyvK2BKyMu8\u002ftgJ2C7wy7z9BOxMExjLvP8xzsPzPMu8\u002fJfMYv3w07z87ZFOwkDTvP8ac8KiaNO8\u002fUdWNoaQ07z\u002fcDSuarjTvP\u002fJ+ZYvCNO8\u002fAV5hK0Q17z+Mlv4jTjXvPxfPmxxYNe8\u002fogc5FWI17z+4eHMGdjXvP0OxEP9\u002fNe8\u002fzumt94k17z+bdfrDzzXvPyaul7zZNe8\u002fseY0teM17z88H9Kt7TXvP8dXb6b3Ne8\u002fNY2TXFs27z\u002fAxTBVZTbvP\u002f1ynM2CPO8\u002ftI2uqLQ87z\u002fF4qdD8D\u002fvP1AbRTz6P+8\u002f21PiNARA7z+SbvQPNkDvPx2nkQhAQO8\u002fqN8uAUpA7z++UGnyXUDvP0mJButnQO8\u002foE3wr7dA7z8rho2owUDvP0H3x5nVQO8\u002fzC9lkt9A7z9XaAKL6UDvP+Kgn4PzQO8\u002fbdk8fP1A7z\u002fFnSZBTUHvP1DWwzlXQe8\u002f2w5hMmFB7z9mR\u002f4qa0HvP3y4OBx\u002fQe8\u002fkilzDZNB7z9ftb\u002fZ2EHvP8zsT8ChW+8\u002fooDY2DNe7z8tuXXRPV7vP7jxEspHXu8\u002fJic3gKte7z+xX9R4tV7vPzyYcXG\u002fXu8\u002f3UFJW91e7z9oeuZT517vP5RcWzYPX+8\u002fH5X4Lhlf7z+qzZUnI1\u002fvPzUGMyAtX+8\u002fojtX1pBf7z8tdPTOml\u002fvP7iskcekX+8\u002f5I4Gqsxf7z9vx6Oi1l\u002fvP\u002fr\u002fQJvgX+8\u002fhTjek+pf7z8QcXuM9F\u002fvP5upGIX+X+8\u002f2VaE\u002fRtm7z+DCJgzhmjvP+pm\u002fJW0au8\u002fdZ+Zjr5q7z8A2DaHyGrvP4sQ1H\u002fSau8\u002fFklxeNxq7z8PtzInSmvvPyUobRhea+8\u002fsGAKEWhr7z87macJcmvvP8bRRAJ8a+8\u002f8rO55KNr7z997FbdrWvvP5Ndkc7Ba+8\u002fSnijqfNr7z+My1J9L2zvP7itx19XbO8\u002fzh4CUWts7z9ZV59JdWzvP2\u002fI2TqJbO8\u002f+gB3M5Ns7z+xG4kOxWzvPzxUJgfPbO8\u002fx4zD\u002f9hs7z9SxWD44mzvP939\u002ffDsbO8\u002faDab6fZs7z\u002fzbjjiAG3vPwngctMUbe8\u002flBgQzB5t7z81wue1PG3vP8D6hK5Gbe8\u002fSzMip1Bt7z\u002fWa7+fWm3vP2GkXJhkbe8\u002f7Nz5kG5t7z93FZeJeG3vPwJONIKCbe8\u002fjYbReoxt7z9TO17znG\u002fvP95z++umb+8\u002faayY5LBv7z\u002f05DXdum\u002fvP38d09XEb+8\u002fIMeqv+Jv7z+r\u002f0e47G\u002fvPzY45bD2b+8\u002fwXCCqQBw7z9iGlqTHnDvP3iLlIQycO8\u002fA8QxfTxw7z+O\u002fM51RnDvP6RtCWdacO8\u002fut5DWG5w7z9FF+FQeHDvP\u002fwx8yuqcO8\u002fh2qQJLRw7z8Soy0dvnDvPygUaA7ScO8\u002fs0wFB9xw7z8+haL\u002f5XDvP1T23PD5cO8\u002f3y566QNx7z9qZxfiDXHvP\u002fWftNoXce8\u002fgNhR0yFx7z8LEe\u002fLK3HvPw+4aL\u002f8d+8\u002fmvAFuAZ47z8lKaOwEHjvP7BhQKkaeO8\u002fxtJ6mi547z9RCxiTOHjvP9xDtYtCeO8\u002fZ3xShEx47z\u002fytO98VnjvPwgmKm5qeO8\u002fk17HZnR47z8el2RffnjvP6nPAViIeO8\u002fNAifUJJ47z+\u002fQDxJnHjvP0p52UGmeO8\u002f1bF2OrB47z9g6hMzunjvP+sisSvEeO8\u002fi8yIFeJ47z+hPcMG9njvPyx2YP\u002f\u002feO8\u002ft6799wl57z9C55rwE3nvP80fOOkdee8\u002fWFjV4Sd57z\u002fjkHLaMXnvP27JD9M7ee8\u002f+QGty0V57z\u002fc\u002fjOJn3nvPzTDHU7vee8\u002fv\u002fu6Rvl57z\u002fVbPU3DXrvP2ClkjAXeu8\u002f690vKSF67z8BT2oaNXrvP4yHBxM\u002feu8\u002fuGl89WZ67z+zCLqc637vP9\u002fqLn8Tf+8\u002fN68YRGN\u002f7z\u002fC57U8bX\u002fvP00gUzV3f+8\u002f7skqH5V\u002f7z95AsgXn3\u002fvP49zAgmzf+8\u002fMB3a8tB\u002f7z+7VXfr2n\u002fvP1z\u002fTtX4f+8\u002f5zfszQKA7z+BT4VmjoDvP5fAv1eigO8\u002fOGqXQcCA7z9O29Ey1IDvP9kTbyvegO8\u002fZEwMJOiA7z96vUYV\u002fIDvPwX24w0Gge8\u002f0oEw2kuB7z+CxYJhSIPvP66n90Nwg+8\u002fOeCUPHqD7z\u002fEGDI1hIPvP9qJbCaYg+8\u002fZcIJH6KD7z\u002fw+qYXrIPvP3szRBC2g+8\u002fBmzhCMCD7z\u002fKNakjD43vP1VuRhwZje8\u002f4KbjFCON7z9r34ANLY3vP5bB9e9Uje8\u002frDIw4WiN7z\u002fYFKXDkI3vP3m+fK2uje8\u002fGmhUl8yN7z+loPGP1o3vP7sRLIHqje8\u002fRkrJefSN7z8\u002fuIooYo7vP8rwJyFsju8\u002f4GFiEoCO7z9rmv8Kio7vP\u002fbSnAOUju8\u002fDETX9KeO7z\u002fDXunP2Y7vP9nPI8Htju8\u002fZAjBufeO7z8FspijFY\u002fvP5DqNZwfj+8\u002fGyPTlCmP7z+rNghCM8DvP98guXCnwu8\u002fljvLS9nC7z+srAU97cLvP01W3SYLw+8\u002fY8cXGB\u002fD7z\u002fu\u002f7QQKcPvP3k4Ugkzw+8\u002fBHHvAT3D7z+PqYz6RsPvP+dtdr+Ww+8\u002fcqYTuKDD7z+IF06ptMPvP56IiJrIw+8\u002ftPnCi9zD7z\u002fKav188MPvP2sU1WYOxO8\u002f9kxyXxjE7z+BhQ9YIsTvP++6Mw6GxO8\u002fevPQBpDE7z8FLG7\u002fmcTvP5BkC\u002fijxO8\u002fG52o8K3E7z+m1UXpt8TvPzEO4+HBxO8\u002fR38d09XE7z\u002fSt7rL38TvP+go9bzzxO8\u002fidLMphHF7z+fQweYJcXvP+CWtmthxe8\u002fa89TZGvF7z\u002f2B\u002fFcdcXvP4FAjlV\u002fxe8\u002fDHkrTonF7z+XschGk8XvPzhboDCxxe8\u002fw5M9KbvF7z9OzNohxcXvP9kEeBrPxe8\u002fZD0VE9nF7z9HOpzQMsbvP9JyOck8xu8\u002fXavWwUbG7z9zHBGzWsbvP4mNS6Ruxu8\u002fFMbonHjG7z+f\u002foWVgsbvPyo3I46Mxu8\u
512002frt2BNQTH7z85Fh8uDsfvP8ROvCYYx+8\u002f2r\u002f2FyzH7z9l+JMQNsfvP\u002fAwMQlAx+8\u002fe2nOAUrH7z8Gomv6U8fvP5HaCPNdx+8\u002fXmZVv6PH7z\u002fpnvK3rcfvP3TXj7C3x+8\u002f\u002fw8tqcHH7z8VgWea1cfvP6C5BJPfx+8\u002fK\u002fKhi+nH7z+2Kj+E88fvP0Fj3Hz9x+8\u002f+H3uVy\u002fI7z+DtotQOcjvPw7vKElDyO8\u002fJGBjOlfI7z+vmAAzYcjvPzrRnStryO8\u002f23p1FYnI7z9msxIOk8jvP\u002fHrrwadyO8\u002ffCRN\u002f6bI7z+oBsLhzsjvPzM\u002fX9rYyO8\u002fvnf80uLI7z9JsJnL7MjvP9ToNsT2yO8\u002f6llxtQrJ7z8Ay6umHsnvP4sDSZ8oye8\u002fQh5belrJ7z\u002fNVvhyZMnvP+PHMmR4ye8\u002fbgDQXILJ7z+EcQpOlsnvPw+qp0agye8\u002fmuJEP6rJ7z8lG+I3tMnvPxAgpUFazO8\u002fscl8K3jM7z88AhokgszvP1JzVBWWzO8\u002f3avxDaDM7z9o5I4GqszvP35Vyfe9zO8\u002fCY5m8MfM7z+UxgPp0czvPzVw29LvzO8\u002fwKh4y\u002fnM7z9L4RXEA83vP+yK7a0hze8\u002fd8OKpivN7z8C\u002fCefNc3vP0RP13Jxze8\u002fz4d0a3vN7z9awBFkhc3vP3AxTFWZze8\u002fhqKGRq3N7z8R2yM\u002ft83vPydMXjDLze8\u002fsoT7KNXN7z89vZgh383vP8j1NRrpze8\u002faZ8NBAfO7z8guh\u002ffOM7vPzYrWtBMzu8\u002fTJyUwWDO7z\u002fX1DG6as7vP+1FbKt+zu8\u002feH4JpIjO7z8ZKOGNps7vP6Rgfoawzu8\u002fL5kbf7rO7z+60bh3xM7vP0UKVnDOzu8\u002f\u002fCRoSwDP7z+HXQVECs\u002fvPxKWojwUz+8\u002fPngXHzzP7z\u002fJsLQXRs\u002fvP1TpURBQz+8\u002falqMAWTP7z8SUSE6cdDvP52JvjJ70O8\u002fKMJbK4XQ7z+z+vgjj9DvP8lrMxWj0O8\u002fVKTQDa3Q7z\u002ff3G0Gt9DvP4CGRfDU0O8\u002fC7\u002fi6N7Q7z+W93\u002fh6NDvP6xoutL80O8\u002fN6FXywbR7z\u002fC2fTDENHvP00Skrwa0e8\u002fY4PMrS7R7z\u002fuu2mmONHvPwQtpJdM0e8\u002fj2VBkFbR7z\u002fnKStVptHvP3JiyE2w0e8\u002f\u002fZplRrrR7z+I0wI\u002fxNHvPxMMoDfO0e8\u002fnkQ9MNjR7z8pfdoo4tHvP7S1dyHs0e8\u002fyiayEgDS7z9VX08LCtLvP+CX7AMU0u8\u002fa9CJ\u002fB3S7z\u002f2CCf1J9LvP4FBxO0x0u8\u002feq+FnJ\u002fS7z8F6CKVqdLvP5AgwI2z0u8\u002fG1ldhr3S7z+mkfp+x9LvP7wCNXDb0u8\u002fn\u002f+7LTXT7z8qOFkmP9PvP7Vw9h5J0+8\u002fQKmTF1PT7z\u002fL4TAQXdPvP+FSawFx0+8\u002fbIsI+nrT7z\u002f3w6XyhNPvP4L8QuuO0+8\u002fmG193KLT7z8jphrVrNPvP67et8220+8\u002fxE\u002fyvsrT7z9PiI+31NPvP9rALLDe0+8\u002fZfnJqOjT7z8Go6GSBtTvP5HbPosQ1O8\u002fSPZQZkLU7z\u002fTLu5eTNTvP+mfKFBg1O8\u002fdNjFSGrU7z\u002f\u002fEGNBdNTvP4pJADp+1O8\u002fFYKdMojU7z8r89cjnNTvP7UrdRym1O8\u002fQGQSFbDU7z\u002fLnK8NutTvP+EN6v7N1O8\u002fbEaH99fU7z+Ct8Ho69TvPw3wXuH11O8\u002fI2GZ0gnV7z+umTbLE9XvPznS08Md1e8\u002fxApxvCfV7z\u002fw7OWeT9XvP3slg5dZ1e8\u002fBl4gkGPV7z+Rlr2IbdXvPzJAlXKL1e8\u002fvXgya5XV7z9Isc9jn9XvP9PpbFyp1e8\u002fXiIKVbPV7z\u002fpWqdNvdXvP3STREbH1e8\u002fK65WIfnV7z9BH5ESDdbvP1eQywMh1u8\u002f4sho\u002fCrW7z\u002f4OaPtPtbvP4NyQOZI1u8\u002fr1S1yHDW7z\u002fFxe+5hNbvP1D+jLKO1u8\u002ffOABlbbW7z8HGZ+NwNbvP5JRPIbK1u8\u002fHYrZftTW7z++M7Fo8tbvP0lsTmH81u8\u002f1KTrWQbX7z\u002fqFSZLGtfvP3VOw0Mk1+8\u002fAIdgPC7X7z+Lv\u002f00ONfvPxb4mi1C1+8\u002foTA4JkzX7z8sadUeVtfvP7ehchdg1+8\u002fQtoPEGrX7z\u002fyYuOZCdjvP32bgJIT2O8\u002fkwy7gyfY7z8eRVh8MdjvP6l99XQ72O8\u002f69CkSHfY7z+MenwyldjvPxezGSuf2O8\u002fouu2I6nY7z8tJFQcs9jvP\u002fqvoOj42O8\u002fheg94QLZ7z8QIdvZDNnvPzwDULw02e8\u002fxzvttD7Z7z9SdIqtSNnvP92sJ6ZS2e8\u002faOXEnlzZ7z\u002fzHWKXZtnvP35W\u002f49w2e8\u002flMc5gYTZ7z\u002fdZ6ajr9rvP2igQ5y52u8\u002f89jglMPa7z9+EX6NzdrvPx+7VXfr2u8\u002fNSyQaP\u002fa7z\u002fAZC1hCdvvP0udylkT2+8\u002f1tVnUh3b7z\u002fsRqJDMdvvP3d\u002fPzw72+8\u002fo2G0HmPb7z8umlEXbdvvP7nS7g932+8\u002fz0MpAYvb7z\u002fltGPyntvvP3DtAOuo2+8\u002f+yWe47Lb7z8nCBPG2tvvP7JAsL7k2+8\u002fPXlNt+7b7z\u002fIseqv+NvvPwoFmoM03O8\u002flT03fD7c7z8gdtR0SNzvP6uucW1S3O8\u002fPjTMtEvd7z\u002fJbGmtVd3vP1SlBqZf3e8\u002f392jnmnd7z+Ah3uIh93vPwvAGIGR3e8\u002fITFTcqXd7z+safBqr93vP8LaKlzD3e8\u002fTRPIVM3d7z\u002fuvJ8+693vP3n1PDf13e8\u002fBC7aL\u002f\u002fd7z+PZncoCd7vPxqfFCET3u8\u002fMBBPEife7z+7SOwKMd7vP9G5JvxE3u8\u002fXPLD9E7e7z9yY\u002f7lYt7vP\u002f2bm95s3u8\u002fnkVzyIre7z8pfhDBlN7vP7S2rbme3u8\u002fyifoqrLe7z9VYIWjvN7vP+CYIpzG3u8\u002fa9G\u002flNDe7z\u002f1CV2N2t7vP4BC+oXk3u8\u002fC3uXfu7e7z+WszR3+N7vPyHs0W8C3+8\u002frCRvaAzf7z9NzkZSKt\u002fvP9gG5Eo03+8\u002fYz+BQz7f7z\u002fudx48SN\u002fvP3mwuzRS3+8\u002fBOlYLVzf7z+JSjbSMOHvPxSD08o64e8\u002fn7tww0Th7z8q9A28TuHvP7Usq7RY4e8\u002fQGVIrWLh7z\u002fLneWlbOHvP1bWgp524e8\u002fDfGUeajh7z+YKTJysuHvPyNiz2q84e8\u002frppsY8bh7z850wlc0OHvP8QLp1Ta4e8\u002fT0RETeTh7z\u002fafOFF7uHvP2W1fj744e8\u002f8O0bNwLi7z97JrkvDOLvP5GX8yAg4u8\u002fHNCQGSri7z+nCC4SNOLvPzJBywo+4u8\u002fvXloA0ji7z9eI0DtZeLvP+lb3eVv4u8\u002fdJR63nni7z\u002f\u002fzBfXg+LvP4oFtc+N4u8\u002fFT5SyJfi7z+gdu\u002fAoeLvPyuvjLmr4u8\u002ftucpsrXi7z\u
512002fiyZ6U3eLvP20CPI3n4u8\u002f+DrZhfHi7z+Dc3Z+++LvPw6sE3cF4+8\u002fmeSwbw\u002fj7z+vVetgI+PvPzqOiFkt4+8\u002fxcYlUjfj7z9Q\u002f8JKQePvP9s3YENL4+8\u002f8aiaNF\u002fj7z984TctaePvPwca1SVz4+8\u002fklJyHn3j7z8diw8Xh+PvP6jDrA+R4+8\u002fM\u002fxJCJvj7z++NOcApePvP0lthPmu4+8\u002f1KUh8rjj7z9f3r7qwuPvP+oWXOPM4+8\u002fdU\u002f529bj7z8AiJbU4OPvP4vAM83q4+8\u002fFfnQxfTj7z8ragu3COTvP7aiqK8S5O8\u002fzBPjoCbk7z9XTICZMOTvP+KEHZI65O8\u002fbb26ikTk7z\u002f49VeDTuTvPw5nknRi5O8\u002fmZ8vbWzk7z8k2MxlduTvP68Qal6A5O8\u002fxYGkT5Tk7z9QukFInuTvP9vy3kCo5O8\u002fZit8ObLk7z98nLYqxuTvPwfVUyPQ5O8\u002fqH4rDe7k7z8zt8gF+OTvP77vZf4B5e8\u002f1GCg7xXl7z9fmT3oH+XvP+rR2uAp5e8\u002fdQp42TPl7z8AQxXSPeXvP4t7sspH5e8\u002fFrRPw1Hl7z+h7Oy7W+XvPywlirRl5e8\u002ft10nrW\u002fl7z9ClsSleeXvP254OYih5e8\u002f+bDWgKvl7z+E6XN5teXvPw8iEXK\u002f5e8\u002fmlquasnl7z8lk0tj0+XvP7DL6Fvd5e8\u002fOwSGVOfl7z\u002fGPCNN8eXvP1F1wEX75e8\u002f3K1dPgXm7z9n5vo2D+bvP\u002fIemC8Z5u8\u002ffVc1KCPm7z8IkNIgLebvP5PIbxk35u8\u002fqTmqCkvm7z80ckcDVebvP7+q5Pte5u8\u002fSuOB9Gjm7z+MNjHIpObvPxdvzsCu5u8\u002foqdrubjm7z8t4AiywubvP0NRQ6PW5u8\u002fzongm+Dm7z9Zwn2U6ubvP+T6Go305u8\u002fbzO4hf7m7z\u002f6a1V+COfvP4Wk8nYS5+8\u002fEN2Pbxzn7z+bFS1oJufvPyZOymAw5+8\u002fsYZnWTrn7z\u002fH96FKTufvP2iheTRs5+8\u002f89kWLXbn7z9+ErQlgOfvP5SD7haU5+8\u002fqvQoCKjn7z81LcYAsufvP8BlY\u002fm75+8\u002fS54A8sXn7z\u002fW1p3qz+fvP2EPO+PZ5+8\u002fjfGvxQHo7z\u002fPRF+ZPejvP1p9\u002fJFH6O8\u002fcO42g1vo7z\u002f7JtR7ZejvP4ZfcXRv6O8\u002fnNCrZYPo7z8nCUlejejvP7JB5laX6O8\u002fPXqDT6Ho7z\u002fIsiBIq+jvP1PrvUC16O8\u002f3iNbOb\u002fo7z9pXPgxyejvP\u002fSUlSrT6O8\u002ff80yI93o7z8KBtAb5+jvP5U+bRTx6O8\u002fIHcKDfvo7z+rr6cFBenvPzXoRP4O6e8\u002fox1ptHLp7z8uVgatfOnvP7mOo6WG6e8\u002fRMdAnpDp7z\u002fP\u002f92WmunvP1o4e4+k6e8\u002fNqPD+2vq7z\u002fB22D0dervP7cZ3EJ\u002f8+8\u002fWMOzLJ3z7z9uNO4dsfPvP\u002flsixa78+8\u002fhKUoD8Xz7z\u002fcaRLUFPTvP\u002fLaTMUo9O8\u002ffRPqvTL07z8ITIe2PPTvP5OEJK9G9O8\u002fHr3Bp1D07z+p9V6gWvTvPzQu\u002fJhk9O8\u002fdoGrbKD07z8BukhlqvTvP\u002fonChQY9e8\u002fhWCnDCL17z+b0eH9NfXvPyYKf\u002fY\u002f9e8\u002fsUIc70n17z88e7nnU\u002fXvP8ezVuBd9e8\u002fUuzz2Gf17z\u002fdJJHRcfXvP2hdLsp79e8\u002ffs5ou4\u002f17z8JBwa0mfXvP5Q\u002fo6yj9e8\u002fH3hApa317z+qsN2dt\u002fXvPzXpepbB9e8\u002f1pJSgN\u002f17z9hy+946fXvP+wDjXHz9e8\u002fdzwqav317z8CdcdiB\u002fbvP42tZFsR9u8\u002fGOYBVBv27z+jHp9MJfbvP0TIdjZD9u8\u002fzwAUL0327z9aObEnV\u002fbvP+VxTiBh9u8\u002fcKrrGGv27z8RVMMCifbvP5yMYPuS9u8\u002fJ8X985z27z+y\u002fZrspvbvPz02OOWw9u8\u002fyG7V3br27z9Tp3LWxPbvP97fD8\u002fO9u8\u002faRitx9j27z9\u002fiee47PbvPwrChLH29u8\u002flfohqgD37z8gM7+iCvfvP6trXJsU9+8\u002fwdyWjCj37z9MFTSFMvfvP2KGbnZG9+8\u002f7b4Lb1D37z9496hnWvfvPwMwRmBk9+8\u002fjmjjWG737z8ZoYBRePfvPy8Su0KM9+8\u002fukpYO5b37z9Fg\u002fUzoPfvP1v0LyW09+8\u002fcWVqFsj37z\u002f8nQcP0vfvP4fWpAfc9+8\u002fEg9CAOb37z+dR9\u002f47\u002ffvPyiAfPH59+8\u002fs7gZ6gP47z8+8bbiDfjvP8kpVNsX+O8\u002fVGLx0yH47z\u002ffmo7MK\u002fjvP2rTK8U1+O8\u002f9QvJvT\u002f47z+ARGa2SfjvPwt9A69T+O8\u002flbWgp1347z8g7j2gZ\u002fjvP6sm25hx+O8\u002fNl94kXv47z\u002fBlxWKhfjvP0zQsoKP+O8\u002f1whQe5n47z+klJxH3\u002fjvPy\u002fNOUDp+O8\u002fRT50Mf347z9br64iEfnvP+bnSxsb+e8\u002fyeTS2HT57z9UHXDRfvnvP99VDcqI+e8\u002fao6qwpL57z+A\u002f+SzpvnvPws4gqyw+e8\u002flnAfpbr57z8hqbydxPnvP6zhWZbO+e8\u002fNxr3jtj57z\u002fCUpSH4vnvP4\u002fe4FMo+u8\u002fGhd+TDL67z+lTxtFPPrvPzCIuD1G+u8\u002fu8BVNlD67z9G+fIuWvrvP1xqLSBu+u8\u002f56LKGHj67z\u002f9EwUKjPrvPxOFP\u002fuf+u8\u002fnr3c86n67z8p9nnss\u002frvP7QuF+W9+u8\u002fP2e03cf67z\u002fKn1HW0frvP+AQjMfl+u8\u002fa0kpwO\u002f67z\u002f2gca4+frvP4G6Y7ED++8\u002fDPMAqg377z+XK56iF\u002fvvPyJkO5sh++8\u002frZzYkyv77z841XWMNfvvP8MNE4U\u002f++8\u002fMUM3O6P77z+8e9QzrfvvP0e0cSy3++8\u002fc5bmDt\u002f77z\u002f+zoMH6fvvP4kHIQDz++8\u002fFEC++Pz77z+feFvxBvzvPyqx+OkQ\u002fO8\u002ftemV4hr87z9AIjPbJPzvP8ta0NMu\u002fO8\u002fbASovUz87z\u002f3PEW2VvzvP4J14q5g\u002fO8\u002fDa5\u002fp2r87z+Y5hygdPzvPyMfuph+\u002fO8\u002frldXkYj87z85kPSJkvzvP8TIkYKc\u002fO8\u002fTwEve6b87z\u002faOcxzsPzvP2VyaWy6\u002fO8\u002f8KoGZcT87z9746NdzvzvPwYcQVbY\u002fO8\u002fkVTeTuL87z8cjXtH7PzvP6fFGED2\u002fO8\u002fMv61OAD97z+9NlMxCv3vP0hv8CkU\u002fe8\u002f06eNIh797z9e4CobKP3vP+kYyBMy\u002fe8\u002f\u002f4kCBUb97z+Kwp\u002f9T\u002f3vPxX7PPZZ\u002fe8\u002foDPa7mP97z8rbHfnbf3vP7WkFOB3\u002fe8\u002fQN2x2IH97z\u002fLFU\u002fRi\u002f3vP1ZO7MmV\u002fe8\u002f4YaJwp\u002f97z9svya7qf3vP\u002ff3w7Oz\u002fe8\u002fgjBhrL397z8Naf6kx\u002f3vP5ihm53R\u002fe8\u002fI9o4ltv97z+uEtaO5f3vPzlLc4fv\u002fe8\u002f2vRKcQ3+7z9lLehpF\u002f7vP\u002fBlhWIh\u002fu8\u002fe54iWyv+7z8G179TNf7vP5EPXUw\u002f\u002fu8\u002fHEj6REn+7z+ngJc9U\u002f7vPzK5NDZd\u002fu8\u002fvfHRLmf+7z9IKm8ncf7vP9NiDCB7\u002fu8\u002f6dNGEY\u002f+7z90DOQJmf7vP\u002f9EgQKj\u002fu8\u002fin0e+6z+7z8Vtrvztv7vPysn9uTK\u002fu8\u002ftl+T3dT+7z9BmDDW3v7vP8zQzc7o\u002fu8\u002fVwlrx\u002fL+7z\u002fiQQjA\u002fP7vP216pbgG\u002f+8\u002f+LJCsRD\u002f7z+D69+pGv\u002fvPw4kfaIk\u002f+8\u002fmVwamy7\u002f7z8klbeTOP\u002fvP6\u002fNVIxC\u002f+8\u002fOgbyhEz\u002f7z\u002fFPo99Vv\u002fvP1B3LHZg\u002f+8\u002f26\u002fJbmr\u002f7z9m6GZndP\u002fvP\u002fEgBGB+\u002f+8\u002ffFmhWIj\u002f7z8Hkj5Rkv\u002fvP5LK20mc\u002f+8\u002fHQN5Qqb\u002f7z+oOxY7sP\u002fvPzN0szO6\u002f+8\u002fvqxQLMT\u002f7z9J5e0kzv\u002fvP9Qdix3Y\u002f+8\u002fX1YoFuL\u002f7z\u002fqjsUO7P\u002fvP3XHYgf2\u002f+8\u002fAAAAAAAA8D8="},"type":"scatter"}],                        {"template":{"data":{"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"choropleth":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"choropleth"}],"contourcarpet":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"contourcarpet"}],"contour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"contour"}],"heatmap":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"heatmap"}],"histogram2dcontour":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2dcontour"}],"histogram2d":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"histogram2d"}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"mesh3d":[{"colorbar":{"outlinewidth":0,"ticks":""},"type":"mesh3d"}],"parcoords":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"parcoords"}],"pie":[{"automargin":true,"type":"pie"}],"scatter3d":[{"line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatter3d"}],"scattercarpet":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattercarpet"}],"scattergeo":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergeo"}],"scattergl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattergl"}],"scattermapbox":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermapbox"}],"scattermap":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scattermap"}],"scatterpolargl":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolargl"}],"scatterpolar":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterpolar"}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"scatterternary":[{"marker":{"colorbar":{"outlinewidth":0,"ticks":""}},"type":"scatterternary"}],"surface":[{"colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"type":"surface"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}]},"layout":{"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"autotypenumbers":"strict","coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"geo":{"bgcolor":"white","lakecolor":"white","landcolor":"white","showlakes":true,"showland":true,"subunitcolor":"#C8D4E3"},"hoverlabel":{"align":"left"},"hovermode":"closest","mapbox":{"style":"light"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"bgcolor":"white","radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","gridwidth":2,"linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8"}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"ternary":{"aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"bgcolor":"white","caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"title":{"x":0.05},"xaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2},"yaxis":{"automargin":true,"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","zerolinewidth":2}}},"xaxis":{"title":{"text":"Value k for LIMIT clause"},"type":"log","range":[0,6],"showgrid":true,"gridwidth":0.5,"gridcolor":"lightgray","showline":true,"linewidth":1,"linecolor":"black","showspikes":true,"spikemode":"across","spikesnap":"cursor","spikethickness":1,"spikedash":"solid","spikecolor":"black"},"yaxis":{"title":{"text":"CDF"},"minor":{"ticklen":4,"showgrid":true},"tickformat":".0%","range":[0,1],"showgrid":true,"gridwidth":0.5,"gridcolor":"lightgray","showline":true,"linewidth":1,"linecolor":"black","minallowed":0,"maxallowed":1}
512,"margin":{"l":40,"r":40,"t":40,"b":40},"width":700,"height":250,"showlegend":false,"paper_bgcolor":"white","plot_bgcolor":"white","hovermode":"x"},                        {"responsive": true}                    )                };            </script>
512        </div>
513</div>
514
515
516
517<h2>Related Links</h2>
518<ul>
519  <li>The blog series "<a href="https://www.snowflake.com/en/blog/super-fast-top-k-queries/" rel="external nofollow noopener" target="_blank">Say Hello to Superfast Top‑K Queries in Snowflake</a>", "<a href="https://www.snowflake.com/en/blog/continued-investments-in-price-performance-and-faster-top-k-queries/" rel="external nofollow noopener" target="_blank">Continued Investments in Price Performance and Faster Top‑K Queries</a>", and "<a href="https://www.snowflake.com/en/engineering-blog/optimizing-top-k-aggregation-snowflake/" rel="external nofollow noopener" target="_blank">Reimagining Top‑K Aggregation Optimization at Snowflake</a>" focuses on optimizations regarding pruning capabilities of Top‑K queries in Snowflake.</li>
520  <li>The blog post "<a href="https://www.snowflake.com/en/engineering-blog/iceberg-data-pruning/" rel="external nofollow noopener" target="_blank">Pruning for Iceberg: 90% of an Iceberg Is Underwater</a>" elaborates on pruning in Snowflake on Apache Iceberg tables.</li>
521</ul>
522
523
524<h2>Follow-Up Work and Scientific Discourse</h2>
525No follow-up work has been published yet. Please reach out to the main author of this paper if you think your work should be included here.
526
527  </article>
528
529
530    <div id="cite" class="mt-5">
531      <h2>Cite this Paper</h2>
532    
533    <div class="language-bibtex highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">@inproceedings</span><span class="p">{</span><span class="nl">Zimmerer2025Pruning</span><span class="p">,</span>
534  <span class="na">title</span>        <span class="p">=</span> <span class="s">{Pruning in Snowflake: Working Smarter, Not Harder}</span><span class="p">,</span>
535  <span class="na">author</span>       <span class="p">=</span> <span class="s">{Zimmerer, Andreas and Dam, Damien and Kossmann, Jan and Waack, Juliane and Oukid, Ismail and Kipf, Andreas}</span><span class="p">,</span>
536  <span class="na">editor</span>       <span class="p">=</span> <span class="s">{Volker Markl and Joe Hellerstein and Azza Abouzied}</span><span class="p">,</span>
537  <span class="na">booktitle</span>    <span class="p">=</span> <span class="s">{Companion of the 2025 International Conference on Management of Data ({SIGMOD}-Companion '25), June 22--27, 2025, Berlin, Germany}</span><span class="p">,</span>
538  <span class="na">publisher</span>    <span class="p">=</span> <span class="s">{{ACM}}</span><span class="p">,</span>
539  <span class="na">year</span>         <span class="p">=</span> <span class="s">{2025}</span><span class="p">,</span>
540  <span class="na">url</span>          <span class="p">=</span> <span class="s">{https://doi.org/10.1145/3722212.3724447}</span><span class="p">,</span>
541  <span class="na">doi</span>          <span class="p">=</span> <span class="s">{10.1145/3722212.3724447}</span><span class="p">,</span>
542<span class="p">}</span>
543</code></pre></div></div>
544
545  </div>
546  
547
548  
549
550  
551</div>
552
553      
554    </div>
555
556    <!-- Footer -->
557    
558
559
560  <footer class="sticky-bottom mt-5" role="contentinfo">
561    
562
563    <div class="container">
564      
565  © Copyright 2025
566  Andi
567  
568  Zimmerer. 
569  
570  
571    Last updated: May 05, 2025.
572  
573
574    </div>
575  </footer>
576
577
578
579    <!-- JavaScripts -->
580    <!-- jQuery -->
581<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
581
582
583<!-- Bootsrap & MDB scripts -->
584<script src="/assets/js/bootstrap.bundle.min.js"></script>
vendor: 1 bytes, line 584
584
585<script src="https://cdn.jsdelivr.net/npm/[email protected]/js/mdb.min.js" integrity="sha256-NdbiivsvWt7VYCt6hYNT3h/th9vSTL4EDWeGs5SN3DA=" crossorigin="anonymous"></script>
585
586
587
588  <!-- Masonry & imagesLoaded -->
589  
589<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/masonry.pkgd.min.js" integrity="sha256-Nn1q/fx0H7SNLZMQ5Hw5JLaTRZp0yILA/FRexe19VdI=" crossorigin="anonymous"></script>
589
590  
590<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/imagesloaded.pkgd.min.js" integrity="sha256-htrLFfZJ6v5udOG+3kNLINIKh2gvoKqwEhHYfTTMICc=" crossorigin="anonymous"></script>
590
591  
591<script defer src="/assets/js/masonry.js?a0db7e5d5c70cc3252b3138b0c91dcaf" type="text/javascript"></script>
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  <!-- Medium Zoom JS -->
616  
616<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/medium-zoom.min.js" integrity="sha256-ZgMyDAIYDYGxbcpJcfUnYwNevG/xi9OHKaR/8GK+jWc=" crossorigin="anonymous"></script>
616
617  
617<script defer src="/assets/js/zoom.js?85ddb88934d28b74e78031fd54cf8308"></script>
617
618
619
620
621
622
623
624<!-- Load Common JS -->
625<script src="/assets/js/no_defer.js?2781658a0a2b13ed609542042a859126"></script>
vendor: 1 bytes, line 625
625
626<script defer src="/assets/js/common.js?e0514a05c5c95ac1a93a8dfd5249b92e"></script>
vendor: 1 bytes, line 626
626
627<script defer src="/assets/js/copy_code.js?c8a01c11a92744d44b093fc3bda915df" type="text/javascript"></script>
627
628
629<!-- Jupyter Open External Links New Tab -->
630<script defer src="/assets/js/jupyter_new_tab.js?d9f17b6adc2311cbabd747f4538bb15f"></script>
630
631
632<!-- Badges -->
633
634  
634<script async src="https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js"></script>
634
635
636
637  
637<script async src="https://badge.dimensions.ai/badge.js"></script>
637
638
639
640
641  <!-- MathJax -->
642  
642<script defer type="text/javascript" id="MathJax-script" src="https://cdn.jsdelivr.net/npm/[email protected]/es5/tex-mml-chtml.js" integrity="sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI=" crossorigin="anonymous"></script>
642
643  
644    
644<script src="/assets/js/mathjax-setup.js?a5bb4e6a542c546dd929b24b8b236dfd"></script>
644
645    
645<script defer src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=es6" crossorigin="anonymous"></script>
645
646  
647
648
649
650
651
652
653
654
655
656  <!-- Scrolling Progress Bar -->
657  
657<script defer src="/assets/js/progress-bar.js?2f30e0e6801ea8f5036fa66e1ab0a71a" type="text/javascript"></script>
657
658
659
660
661
662
663
664
665  <!-- Back to Top -->
666  
666<script src="/assets/js/vanilla-back-to-top.min.js?f40d453793ff4f64e238e420181a1d17"></script>
666
667  
667<script>
668    addBackToTop();
669  </script>
669
670
671
672
673  <!-- Search -->
674  
674<script type="module" src="/assets/js/search/ninja-keys.min.js?a3446f084dcaecc5f75aa1757d087dcf"></script>
674
675  <ninja-keys hidebreadcrumbs noautoloadmdicons placeholder="Type to start searching"></ninja-keys>
676  
676<script src="/assets/js/search-setup.js?6c304f7b1992d4b60f7a07956e52f04a"></script>
676
677  
677<script src="/assets/js/search-data.js"></script>
677
678  
678<script src="/assets/js/shortcut-key.js?6f508d74becd347268a7f822bca7309d"></script>
678
679
680
681
682
683  </body>
684</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.