{"id":26412,"date":"2021-06-12T01:59:08","date_gmt":"2021-06-11T20:59:08","guid":{"rendered":"https:\/\/kmwllc.com\/?p=26412"},"modified":"2024-05-01T07:10:08","modified_gmt":"2024-05-01T02:10:08","slug":"solr-payload-inequalities","status":"publish","type":"post","link":"https:\/\/kmwllc.com\/index.php\/2021\/06\/12\/solr-payload-inequalities\/","title":{"rendered":"Solr Payload Inequalities"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"26412\" class=\"elementor elementor-26412\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7e79a64a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7e79a64a\" data-element_type=\"section\" data-e-type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-thegem\"><div class=\"elementor-row\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-15dea9f5\" data-id=\"15dea9f5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7390724a flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor\" data-id=\"7390724a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-text-editor elementor-clearfix\">\r\n\t\t\t\t\t\t<p><\/p>\n<p><\/p>\n<p><\/p>\n<h2>Introduction<\/h2>\n<p>New in Solr\/Lucene 9.x is the ability to do inequality operations to search against payloads on terms.&nbsp; Inequalities provide the ability to search for values that are greater than, less than, or equal to some threshold.&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>As search and AI continue to&nbsp; converge, one common use case is to be able to search for documents that have been classified by a machine learned model.&nbsp; These models typically output a label and confidence score for each classification.&nbsp; Documents can have many classifications associated with them that are generated from many different machine learned models.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>The result is a data model where you have a document and a list of associated classifications.&nbsp; Let\u2019s explore three different approaches to indexing and querying these documents and classifications along with a fourth approach using our recent contribution back to the Lucene and Solr Apache projects: the inequality payload query operator.<\/p>\n<p><\/p>\n<p><\/p>\n<p>We\u2019ll start with&nbsp; a data model like the following which shows a relationship between a document and the document\u2019s associated classifications.<\/p>\n<p><\/p>\n<p><\/p>\n<figure><img src=\"https:\/\/lh6.googleusercontent.com\/Lk9ktdvrE8O4-7dCZJFZAxzTApNW-aVNe0N9MhQ4JtVgHqUtWPa8OhdIOuT6egWrkGiinwNCdy0CWpREyz29lIwOoTBgUHKtotl-q0J7a5s9j08ZpPHqHw8lPw88JWNRAkCRp_vt\" alt=\"\"><\/figure>\n<p><\/p>\n<p><\/p>\n<p>As each document is associated with zero or more classifications, each with their own label and confidence score, we are presented with the challenge to answer queries with the index to find something like the following:<\/p>\n<p><\/p>\n<p><\/p>\n<p><em>\u201cShow me all of the images that have a high confidence that they are of a person.\u201d<\/em><\/p>\n<p><\/p>\n<p><\/p>\n<p>For this example query, we\u2019ll take an example index that was created by running the COCO2017 image dataset through the Yolo and the VGG16 image classification neural networks.&nbsp; The output classifications by either model represent the objects that were detected in the image.<\/p>\n<p><\/p>\n<p><\/p>\n<p>The VGG16 image provides classification of 1000 object types and their confidence levels.&nbsp; The Yolo model provides us with 80 classes of objects that have been found with their confidence and additionally bounding box coordinates of where the image was found.<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong>Approach 1: Do it at index time<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>One common approach to answer this problem is to only tag the documents as being a \u201cperson\u201d if the classification was above a particular threshold.&nbsp; Having a single field on the document for the \u201chigh confidence\u201d classifications is a perfectly valid approach.&nbsp; The queries remain very simple, as they are just querying for a particular label in the classification field of the document.<\/p>\n<p><\/p>\n<p><\/p>\n<p>Example:&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p><em>high_confidence:person<\/em><\/p>\n<p><\/p>\n<p><\/p>\n<p>However, this will prevent the user from searching for documents with medium confidence labels.&nbsp; To address this query, the indexing of the documents could stamp two fields, one with \u201chigh confidence\u201d labels and another with \u201cmedium confidence\u201d labels.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Then you can search the \u201cmedium confidence\u201d field or the \u201chigh confidence\u201d field for the label in question.&nbsp; The trade off here is that at query time&nbsp; a search across multiple fields is required. As requirements for the&nbsp; confidence filter become more granular, additional bucketed fields need to be created.&nbsp; If the definition of those confidence levels changes the documents would need to be re-indexed to recompute the proper labels for the proper bucket.&nbsp; This approach works only if the definition of high confidence label is known up front and will never change.<\/p>\n<p><\/p>\n<p><\/p>\n<p>Example:<\/p>\n<p><\/p>\n<p><\/p>\n<p><em>high_confidence:person OR medium_confidence:person<\/em><\/p>\n<p><\/p>\n<p><\/p>\n<p>In reality, users want the ultimate flexibility to decide what they consider a high confidence classification.&nbsp; User interfaces might even want to present this as a slider control in a search UI.<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong>Approach 2 Do it at query time with a field for the labels<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>To avoid having to re-index all the documents when the definition of high confidence changes, there are&nbsp; a few viable options at query time&nbsp; to solve this problem.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>One approach is to store the confidence score for each label generated by the models in separate fields on the document, one field per label.&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Once the documents are indexed with a field for each label\u2019s score, a range search can be executed on the field that corresponds to the label that is being searched. &nbsp; In the above example query, searching for documents that have a \u201cperson\u201d with high confidence could be implemented as a range search on the \u201cperson\u201d field.<\/p>\n<p><\/p>\n<p><\/p>\n<p>For example:&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p><em>person:[0.75 TO *]<\/em><\/p>\n<p><\/p>\n<p><\/p>\n<p>This approach has its drawbacks as well in that you might have multiple persons detected in an image, each with their own confidence level.&nbsp; So at best, you could choose the highest confidence level of the person classification and use that for search purposes or potentially use a multi-valued field to represent each score.<\/p>\n<p><\/p>\n<p><\/p>\n<p>An additional drawback is that each possible label requires an additional field in the index.&nbsp; This approach could use dynamic fields unless all of the possible labels are be known up front.&nbsp; Some models might classify thousands of different object types.&nbsp; This would result in&nbsp; an explosion in the number of fields in the index.&nbsp; Aside from the potential for the number of fields to become unruly, the UI and query language would also need to know how to map the label to the appropriate field name to properly construct that query.<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong>Approach 3:&nbsp; Use joins to perform the filtering<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>The next possible approach is to index each classification as a child document and do parent\/child join queries against Solr.&nbsp; There is a join query parser in Solr that allows for all sorts of database-like join queries between two queries.&nbsp; These queries allow for relational queries between two different datasets.&nbsp; As wonderful as that sounds, (and it is wonderful!) there are some limitations and drawbacks to this approach.&nbsp; The first and most notable is that if you have a multi-shard index, special attention needs to be paid to how the documents are routed to the shards of the index.&nbsp; The key constraint for the parent\/child document queries is that the documents need to be routed to the shards based on the value of their join key.<\/p>\n<p><\/p>\n<p><\/p>\n<p>In this approach a document is indexed to represent each classification that is generated for the document being classified.&nbsp; Every document in the index will have zero or more classification documents that relate to it.&nbsp; For some applications it\u2019s ok to change how the routing is working, but depending on the query use cases, this might not be possible.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>The second notable drawback to the join query approach is that it is comparatively slow and very expensive to execute as compared to other simpler term and range queries.<\/p>\n<p><\/p>\n<p><\/p>\n<p>Lastly, the join query potentially introduces a large number of additional documents to the index.&nbsp; This will impact the overall search latency for any given query.&nbsp; Query latency is proportional to the number of documents per shard in an index.&nbsp; So, the introduction of all the classification documents will affect the cluster sizing, as now the index should be sized to support the additional documents.&nbsp; That typically means more shards and potentially servers with additional CPUs.<\/p>\n<p><\/p>\n<p><\/p>\n<p>The basic approach is to search on classifications but return the parent document.&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Search all documents that have a child document that contains a label of \u201cfoo\u201d with a confidence greater than 0.75.<\/p>\n<p><\/p>\n<p><\/p>\n<p>For example:<\/p>\n<p><\/p>\n<p><\/p>\n<p><em>{!join to=&#8221;id&#8221; from=&#8221;parent_id&#8221; v=&#8221;+label:foo +confidence:[0.75 TO *]&#8221;}<\/em>&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong>Approach 4:&nbsp; New &amp; improved inequality payload support!<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>Upon review, it seemed that an alternative approach to use payloads might be able to solve this problem.&nbsp; The payload_check query parser in Solr provides access to the SpanPayloadCheckQuery.&nbsp; This Lucene query provides access to the payload data while matching.&nbsp; Once the term has been matched, the payload is then checked to see if it\u2019s actually a match.&nbsp; This functionality was used to support things like part of speech tagging for terms.&nbsp; It allowed developers to use a delimited payload field in the Solr schema.&nbsp; The values in that field could then be encoded with the term and a value delimited by a pipe.<\/p>\n<p><\/p>\n<p><\/p>\n<p>An example of Part of Speech tagged text using the delimited payload:<\/p>\n<p><\/p>\n<p><\/p>\n<p>Lucene|NOUN is|VERB awesome|ADJ<\/p>\n<p><\/p>\n<p><\/p>\n<p>In addition to the payloads being strings, an integer or a floating point number can be stored there and encoded like:<\/p>\n<p><\/p>\n<p><\/p>\n<p>Person|0.82 Cat|0.75 Monitor|0.55<\/p>\n<p><\/p>\n<p><\/p>\n<p>The only missing piece to being able to use this for the AI model classification search was the ability to do a range search on the payload instead of just an equals operation.<\/p>\n<p><\/p>\n<p><\/p>\n<p>We had the pleasure of recently contributing this capability back to Lucene and Solr.&nbsp; The patch includes the ability to provide an operation while matching now to support common operations such as greater than, less than, in addition to the equals operator.&nbsp; We\u2019re happy to see that it will be included in the upcoming Solr 9.0 release.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>So, now we can express the desired query as:<\/p>\n<p><\/p>\n<p><\/p>\n<p>{!payload_check f=&#8221;classifications_dpfs&#8221; op=&#8221;gt&#8221; payloads=&#8221;0.75&#8243; v=&#8221;Person&#8221;}<\/p>\n<p><\/p>\n<p><\/p>\n<p>The new payload check query parser allows the user to specify the operation and the payload value to use as the reference for that operation.&nbsp; The above example searches the \u201cclassifications_dpfs\u201d field for any classification of \u201cPerson\u201d where the payload has a value greater than 0.75.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>So, with this last option we can use the payload check query parser in Solr to allow us to search for labels from the classification model that are above a threshold confidence score.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>The ultimate result here is that we get the full ability to search on a term with one additional dimension of metadata filtering.&nbsp; Term and Payload.&nbsp; This unlocks a lot of other possibilities when it comes to image search.<\/p>\n<p><\/p>\n<p><\/p>\n<p>One possible example is to put the number of people found as a payload.&nbsp; Yolo can detect multiple objects in a scene, so the user could search for something like:<\/p>\n<p><\/p>\n<p><\/p>\n<p>\u201cAt least 2 people and a tennis racket.\u201d<\/p>\n<p><\/p>\n<p><\/p>\n<p>Having the classifier output from Yolo in the following format:<\/p>\n<p><\/p>\n<p><\/p>\n<p>Person|2 Tennis_Racket|1&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>A similar approach can be taken if you want to encode the center point X and Y coordinates. This would enable searches like:&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>\u201cFind me a picture with a Person on the left and a Pizza on the right.\u201d<\/p>\n<p><\/p>\n<p><\/p>\n<p>The capabilities increase further when you start putting together scene labels along with object classification, like:&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Yolo + VGG16 to get context in the search results.<\/p>\n<p><\/p>\n<p><\/p>\n<p>By combining these two computer vision models we can start asking questions beyond what Yolo alone can answer.&nbsp;&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>\u201cShow me a picture of at least 2 people skiing\u201d&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Yolo will detect the number of people and the VGG16 model detects the act of skiing.<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong>Benchmarks<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>First, some notes about how the benchmarks were generated:<\/p>\n<p><\/p>\n<p><\/p>\n<p>Each of the 4 approaches has the same configset.&nbsp; All cache sizes (except for the perSegment cache) were set to zero size. All indices in the test were a single shard with one segment and no deleted documents.&nbsp; All of the indices represent 1,000,000 documents.&nbsp; Each document has an average of 50 classifications associated with it.&nbsp; Each classification has a random confidence score from 0 to 1.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Approach 1 Document Example: A multi-valued field that contains only the labels that had a confidence score greater than 0.75.<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong>{&nbsp;<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<pre><strong>&nbsp;&nbsp;\"id<\/strong>\":\"doc_78375\",<br>&nbsp;&nbsp;\"<strong>classification_ss<\/strong>\":&nbsp; [\"label_7792\",\"label_9689\",\"label_2049\",\"label_6581\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_4795\",\"label_1780\",\"label_6323\",\"label_4939\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_8818\",\"label_877\",\"label_8524\",\"label_3159\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_4776\",\"label_1276\",\"label_7104\",\"label_4335\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_108\",\"label_5675\",\"label_424\",\"label_7745\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_4144\",\"label_2712\",\"label_4782\",\"label_9894\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_2777\",\"label_1267\",\"label_8919\",\"label_5332\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_7159\",\"label_4139\",\"label_6714\"]}<\/pre>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p>Approach 2 Document Example: A document with a field for each label containing the value of the confidence score for that label.<\/p>\n<p><\/p>\n<p><\/p>\n<pre><strong>{<br><\/strong><strong>&nbsp;&nbsp;\"id\":<\/strong><strong>\"doc_doc_20295\"<\/strong><strong>,<br><\/strong><strong>&nbsp;&nbsp;\"label_264_fs\":[<\/strong><strong>0.5059256<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_4777_fs\":[<\/strong><strong>0.8075591<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5773_fs\":[<\/strong><strong>0.6512147<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_6584_fs\":[<\/strong><strong>0.44860387<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5053_fs\":[<\/strong><strong>0.77677464<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_2307_fs\":[<\/strong><strong>0.99134594<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_9447_fs\":[<\/strong><strong>0.6198554<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_1534_fs\":[<\/strong><strong>0.993752<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_2489_fs\":[<\/strong><strong>0.3812973<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_1578_fs\":[<\/strong><strong>0.67712253<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_7583_fs\":[<\/strong><strong>0.9276807<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_796_fs\":[<\/strong><strong>0.9256864<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_345_fs\":[<\/strong><strong>0.21647614<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_8326_fs\":[<\/strong><strong>0.42797613<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_6023_fs\":[<\/strong><strong>0.16159433<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3220_fs\":[<\/strong><strong>0.82546365<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_4067_fs\":[<\/strong><strong>0.940214<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_932_fs\":[<\/strong><strong>0.71239257<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_7323_fs\":[<\/strong><strong>0.33341646<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5203_fs\":[<\/strong><strong>0.072936356<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_8474_fs\":[<\/strong><strong>0.6330075<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_2032_fs\":[<\/strong><strong>0.45183575<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_6371_fs\":[<\/strong><strong>0.8656315<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3488_fs\":[<\/strong><strong>0.052257597<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_4137_fs\":[<\/strong><strong>0.15416396<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_6509_fs\":[<\/strong><strong>0.52511454<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_8989_fs\":[<\/strong><strong>0.41732424<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_1067_fs\":[<\/strong><strong>0.45847535<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5892_fs\":[<\/strong><strong>0.9040163<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_8169_fs\":[<\/strong><strong>0.26057434<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3524_fs\":[<\/strong><strong>0.26224774<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_4912_fs\":[<\/strong><strong>0.037523687<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3772_fs\":[<\/strong><strong>0.587384<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3116_fs\":[<\/strong><strong>0.2450012<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5069_fs\":[<\/strong><strong>0.70538366<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5939_fs\":[<\/strong><strong>0.90539235<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3369_fs\":[<\/strong><strong>0.4885615<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3798_fs\":[<\/strong><strong>0.35722762<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5111_fs\":[<\/strong><strong>0.3300156<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_1684_fs\":[<\/strong><strong>0.18698442<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_6735_fs\":[<\/strong><strong>0.7144106<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_7830_fs\":[<\/strong><strong>0.79478115<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3240_fs\":[<\/strong><strong>0.7042537<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_2410_fs\":[<\/strong><strong>0.09114766<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5419_fs\":[<\/strong><strong>0.83966637<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_4207_fs\":[<\/strong><strong>0.0035191178<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_4484_fs\":[<\/strong><strong>0.5441104<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_6761_fs\":[<\/strong><strong>0.69559073<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_2117_fs\":[<\/strong><strong>0.39736092<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_1298_fs\":[<\/strong><strong>0.8430424<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5847_fs\":[<\/strong><strong>0.22964293<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3950_fs\":[<\/strong><strong>0.6538746<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_6558_fs\":[<\/strong><strong>0.69730353<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_1273_fs\":[<\/strong><strong>0.024785161<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3927_fs\":[<\/strong><strong>0.0013412237<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_1759_fs\":[<\/strong><strong>0.75639284<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_3553_fs\":[<\/strong><strong>0.5268485<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_5143_fs\":[<\/strong><strong>0.8450275<\/strong><strong>],<br><\/strong><strong>&nbsp;&nbsp;\"label_9301_fs\":[<\/strong><strong>0.12585384<\/strong><strong>]}<\/strong><\/pre>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p>Approach 3 Example Document:&nbsp; One document that represents the record being classified and an additional document for every classification associated with that document.&nbsp; The total number of documents in this index was 1,000,000 for the parent documents and 50,485,334 documents for each of the classification records.<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong># Example Parent Document<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<pre><strong>{<br><\/strong><strong>&nbsp;&nbsp;\"id\":<\/strong><strong>\"doc_729413\"<br><\/strong><strong>}<\/strong><\/pre>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><strong># Example Classification Document (on average 50 of these for each parent document.)<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<pre><strong>{<br><\/strong><strong>&nbsp;&nbsp;\"id\":<\/strong><strong>\"doc_729413_5\"<\/strong><strong>,<br><\/strong><strong>&nbsp;&nbsp;\"parent_id_s\":<\/strong><strong>\"doc_729413\"<\/strong><strong>,<br><\/strong><strong>&nbsp;&nbsp;\"label_s\":<\/strong><strong>\"label_4067\"<\/strong><strong>,<br><\/strong><strong>&nbsp;&nbsp;\"confidence_f\":<\/strong><strong>0.21850449<br><\/strong><strong>}<\/strong><\/pre>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p>Approach 4 Example Document: A document with a single field containing all classification labels with the confidence level encoded as a payload.<\/p>\n<p><\/p>\n<p><\/p>\n<pre>{<br>&nbsp;&nbsp;\"<strong>id<\/strong>\":\"doc_doc_333114\",<br>&nbsp;&nbsp;\"<strong>class_dpfs<\/strong>\":[\"label_6872|0.7949082\",\"label_3550|0.22995031\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_7561|0.66999483\",\"label_3575|0.76349306\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_6567|0.29170412\",\"label_9300|0.22878802\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_7146|0.15249991\",\"label_7853|0.26775044\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_9330|0.69193286\",\"label_315|0.3812859\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_9941|0.60243666\",\"label_5448|0.4909597\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_3898|0.2772404\",\"label_3798|0.58473474\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_1040|0.39535648\",\"label_3017|0.5128221\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_5611|0.1511501\",\"label_7777|0.93621653\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_6589|0.48112237\",\"label_6023|0.69422346\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_6525|0.49891192\",\"label_6580|0.41795957\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_6807|0.5424252\",\"label_6233|0.3097676\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_624|0.9763578\",\"label_1726|0.3847112\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_9139|0.5317108\",\"label_6330|0.64640564\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_2413|0.24439555\",\"label_1372|0.17762291\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_562|0.3614515\",\"label_7828|0.7642365\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_3786|0.19018763\",\"label_9409|0.75261647\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_619|0.18773353\",\"label_3496|0.4446562\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_3556|0.43172425\",\"label_7278|0.5559282\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"label_6851|0.42342138\"]}<\/pre>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<h3>Benchmark Results<\/h3>\n<p><\/p>\n<p><\/p>\n<h4>Index Comparison&nbsp;<\/h4>\n<p><\/p>\n<p><\/p>\n<figure>\n<table>\n<tbody>\n<tr>\n<td><strong>Metric<\/strong><\/td>\n<td><strong>Approach 1<\/strong><\/td>\n<td><strong>Approach 2<\/strong><\/td>\n<td><strong>Approach 3<\/strong><\/td>\n<td><strong>Approach 4<\/strong><\/td>\n<td><strong>Comments<\/strong><\/td>\n<\/tr>\n<tr>\n<td>DPS<\/td>\n<td>11761<\/td>\n<td>209<\/td>\n<td>409<\/td>\n<td>3566<\/td>\n<td>Documents indexed on a single thread generating random data.&nbsp; Updates batched, no committing while feeding content.&nbsp; Only a single replica active.<\/td>\n<\/tr>\n<tr>\n<td>Index Size<\/td>\n<td>219.32<\/td>\n<td>906.99<\/td>\n<td>2610<\/td>\n<td>1220<\/td>\n<td>Size in MB<\/td>\n<\/tr>\n<tr>\n<td>Memory<\/td>\n<td>1772<\/td>\n<td>1361108<\/td>\n<td>5556<\/td>\n<td>1460<\/td>\n<td>As reported from solr admin gui<\/td>\n<\/tr>\n<tr>\n<td>Test Query<\/td>\n<td>classification_ss:label_7792<\/td>\n<td>label_7792_fs:[0.75 TO *]<\/td>\n<td>{!join from=&#8221;parent_id_s&#8221; to=&#8221;id&#8221; v=&#8221;+label_s:label_7792 +confidence_f:[0.75 TO *]&#8221;}<\/td>\n<td>{!payload_check op=&#8221;gt&#8221; f=&#8221;class_dpfs&#8221; payloads=&#8221;0.75&#8243;}label_7792<\/td>\n<td>Example syntax<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><\/p>\n<p><\/p>\n<p><strong>Indexing Benchmark Commentary<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>There are some interesting takeaways from this benchmark.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Indexing Performance<\/p>\n<p><\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li>As expected, with Approach 1, the documents were faster to index as some data is being discarded. Pre-filtering the data yields smaller documents, and as a result they are faster to index.&nbsp; It was slightly surprising to see the negative impact of having many fields on a document.&nbsp;&nbsp;<\/li>\n<li>Approach 2 documents were much larger overall compared to the rest of the approaches and as a result, this approach was the slowest to index overall.&nbsp;<\/li>\n<li>Approach 3 with the children documents was about 2x faster than approach 2 for indexing.<\/li>\n<li>Approach 4 with the payload was about 16 times faster Approach 2 to index.&nbsp; The payload approach definitely has a major indexing performance advantage over the other approaches.<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p>Index Size<\/p>\n<p><\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li>Approach 1 yielded the smallest index as data was being thrown away and the data model is the simplest.<\/li>\n<li>Approach 2 was the most efficient in terms of index side between 2,3 and 4.&nbsp; This lends some of the performance issues to this approach to simply be attributed to the json formatting.&nbsp;<\/li>\n<li>Approach 3 using children documents had the largest index size over all, showing the impact of the additional children documents in the index.&nbsp;&nbsp;<\/li>\n<li>Approach 4 was only about 33% larger than the field based Approach 2 and less than \u00bd the size of Approach 3.&nbsp; The key item to note here is the additional .pay files in the index to store the payload data.<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p>Memory Usage<\/p>\n<p><\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li>Approach 4 had the lowest memory overhead for having the index open.&nbsp; This was a very surprising result.&nbsp;&nbsp;<\/li>\n<li>Approach 2 yielded the largest surprise.&nbsp; The index heap usage was nearly 1000x that of the other approaches.&nbsp; This really highlights the overhead of having 10,000 fields in the index.&nbsp; This is relatively dramatic and shouldn\u2019t be ignored.&nbsp;&nbsp;<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<h4><strong>Query Performance Comparison<\/strong><\/h4>\n<p><\/p>\n<p><\/p>\n<figure>\n<table>\n<tbody>\n<tr>\n<td>Metrix<\/td>\n<td>Approach 1<\/td>\n<td>Approach 2<\/td>\n<td>Approach 3<\/td>\n<td>Approach 4<\/td>\n<td>Comments<\/td>\n<\/tr>\n<tr>\n<td>Number of queries<\/td>\n<td>10000<\/td>\n<td>10000<\/td>\n<td>100*<\/td>\n<td>10000<\/td>\n<td>Join queries were so slow, the test was stopped after 100 queries<\/td>\n<\/tr>\n<tr>\n<td>average<\/td>\n<td>1<\/td>\n<td>2<\/td>\n<td>1803<\/td>\n<td>3<\/td>\n<td>In milliseconds<\/td>\n<\/tr>\n<tr>\n<td>min<\/td>\n<td>1<\/td>\n<td>1<\/td>\n<td>1656<\/td>\n<td>2<\/td>\n<td>ms<\/td>\n<\/tr>\n<tr>\n<td>max<\/td>\n<td>6<\/td>\n<td>22<\/td>\n<td>2092<\/td>\n<td>47<\/td>\n<td>ms<\/td>\n<\/tr>\n<tr>\n<td>std dev<\/td>\n<td>0.55<\/td>\n<td>0.79<\/td>\n<td>88.28<\/td>\n<td>1.55<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td>throughput<\/td>\n<td>636<\/td>\n<td>347.9<\/td>\n<td>0.556666667<\/td>\n<td>254<\/td>\n<td>Queries per second (single threaded execution)<\/td>\n<\/tr>\n<tr>\n<td>sent kb\/sec<\/td>\n<td>109<\/td>\n<td>60.09<\/td>\n<td>0.15<\/td>\n<td>61.5<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td>received kb\/sec<\/td>\n<td>6124<\/td>\n<td>8988.84<\/td>\n<td>0.82<\/td>\n<td>948.88<\/td>\n<td>&nbsp;<\/td>\n<\/tr>\n<tr>\n<td>avg bytes<\/td>\n<td>9861<\/td>\n<td>26461.3<\/td>\n<td>1499<\/td>\n<td>3826.1<\/td>\n<td>Average response size in bytes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><\/p>\n<p><\/p>\n<p><strong>Query Benchmark Commentary<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>From a pure performance perspective, again, no surprise that Approach 1 is the fastest.&nbsp; The join query approach (Approach 3) really shows how its performance is orders of magnitude slower than simple term and range queries in Solr.&nbsp; The second best query performance was the field for each label (Approach 2).&nbsp; This really highlights how efficient Solr\/Lucene is at performing range query operations.&nbsp; It also shows that it\u2019s not much of a cost to use payloads compared to the expensive join operations.<\/p>\n<p><\/p>\n<p><\/p>\n<p>One other thing to note about the payload approach (Approach 4) is that for this dataset, the json encoding of the document with the payloads is even tighter than Approach 1.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p><strong>Next Steps&nbsp;<\/strong><\/p>\n<p><\/p>\n<p><\/p>\n<p>There are always things that can be improved and built upon.&nbsp; As a result of implementing this feature, it was noticed that the payload encoding and decoding code is a bit fragmented.&nbsp; It would be nice to centralize and consolidate some of that logic with the hope of making payloads more extensible.&nbsp;&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>There are some other novel queries that can be performed with the new payload support. For example, if using the classifications as a feature vector, a query can be created to find other documents that were classified in a similar manner to implement a \u201cfind similar\u201d for image data.&nbsp;<\/p>\n<p><\/p>\n<p><\/p>\n<p>Going beyond this, one could envision extending the payload supported data types to include a vector of floating point values to enable vector based matching calculations such as cosine, manhattan, or euclidean distance metrics for similarity.<\/p>\n<p><\/p>\n<p><\/p>\n<p>The ultimate realization of the power of this functionality will ultimately be through NLU techniques to translate free text queries into the appropriate payload check queries.&nbsp; More to come on that.<\/p>\n<p><\/p>\n<p><\/p>\n<h3><strong>Conclusion<\/strong><\/h3>\n<p><\/p>\n<p><\/p>\n<p>The biggest take away here is that as you require more granular query capabilities, the expense of the query goes up.&nbsp; If an application truly needs to do a full relational style join query, then special attention needs to be paid to how that system is scaled.&nbsp; Additionally, we can also see that payloads become a very attractive design pattern due to the indexing performance, memory usage characteristics, query performance, and ultimately query granularity make it a viable approach for applications to avoid needing to scale up for using a join query.<\/p>\n<p><\/p>\t\t\t\t\t\t\t<\/div>\r\n\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div><\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a836a41 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a836a41\" data-element_type=\"section\" data-e-type=\"section\">\r\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-thegem\"><div class=\"elementor-row\">\r\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-39d7612\" data-id=\"39d7612\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-49c25e1 flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-global elementor-global-28083 elementor-widget-post-navigation\" data-id=\"49c25e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"post-navigation.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-post-navigation\" role=\"navigation\" aria-label=\"Post Navigation\">\n\t\t\t<div class=\"elementor-post-navigation__prev elementor-post-navigation__link\">\n\t\t\t\t<a href=\"https:\/\/kmwllc.com\/index.php\/2020\/07\/15\/the-cross-collection-join-query\/\" rel=\"prev\"><span class=\"elementor-post-navigation__link__prev\"><span class=\"post-navigation__prev--label\">Previous Post<\/span><span class=\"post-navigation__prev--title\">The Cross Collection Join Query<\/span><\/span><\/a>\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"elementor-post-navigation__next elementor-post-navigation__link\">\n\t\t\t\t<a href=\"https:\/\/kmwllc.com\/index.php\/2022\/07\/02\/search-engine-upgrade\/\" rel=\"next\"><span class=\"elementor-post-navigation__link__next\"><span class=\"post-navigation__next--label\">Next Post<\/span><span class=\"post-navigation__next--title\">Search Engine Upgrade<\/span><\/span><\/a>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div><\/div>\r\n\t\t<\/section>\r\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>New in Solr &#038; Lucene 9 is the ability to do inequality operations to search against payloads on terms. We&#8217;ll go through this how new feature works using some different use cases.<\/p>\n","protected":false},"author":1,"featured_media":29688,"comment_status":"open","ping_status":"open","sticky":false,"template":"single-fullwidth.php","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[35,36,37,1],"tags":[41,40,39],"class_list":{"0":"post-26412","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-ai","8":"category-search","9":"category-solr","10":"category-uncategorized","11":"tag-lucene","12":"tag-search","13":"tag-solr"},"aioseo_notices":[],"post_meta_fields":{"_wp_page_template":["single-fullwidth.php"],"_edit_lock":["1714529321:7"],"_zilla_likes":["2"],"_edit_last":["7"],"_customize_sidebars":["yes"],"thegem_page_data":["a:190:{s:10:\"title_show\";s:7:\"default\";s:11:\"title_style\";s:1:\"2\";s:14:\"title_template\";s:5:\"27835\";s:23:\"title_use_page_settings\";i:0;s:12:\"title_xlarge\";i:0;s:18:\"title_rich_content\";i:0;s:13:\"title_content\";s:0:\"\";s:21:\"title_background_type\";s:5:\"color\";s:22:\"title_background_image\";s:0:\"\";s:29:\"title_background_image_repeat\";i:0;s:27:\"title_background_position_x\";s:6:\"center\";s:27:\"title_background_position_y\";s:3:\"top\";s:21:\"title_background_size\";s:5:\"cover\";s:28:\"title_background_image_color\";s:0:\"\";s:30:\"title_background_image_overlay\";s:0:\"\";s:30:\"title_background_gradient_type\";s:6:\"linear\";s:31:\"title_background_gradient_angle\";i:90;s:34:\"title_background_gradient_position\";s:13:\"center center\";s:38:\"title_background_gradient_point1_color\";s:9:\"#00BCD4BF\";s:41:\"title_background_gradient_point1_position\";i:0;s:38:\"title_background_gradient_point2_color\";s:9:\"#354093BF\";s:41:\"title_background_gradient_point2_position\";i:100;s:23:\"title_background_effect\";s:6:\"normal\";s:36:\"title_background_ken_burns_direction\";s:7:\"zoom_in\";s:43:\"title_background_ken_burns_transition_speed\";i:15000;s:37:\"title_background_video_play_on_mobile\";i:0;s:22:\"title_background_color\";s:7:\"#333144\";s:27:\"title_background_video_type\";s:0:\"\";s:22:\"title_background_video\";s:0:\"\";s:35:\"title_background_video_aspect_ratio\";s:0:\"\";s:36:\"title_background_video_overlay_color\";s:0:\"\";s:38:\"title_background_video_overlay_opacity\";s:0:\"\";s:29:\"title_background_video_poster\";s:0:\"\";s:19:\"title_menu_on_video\";s:0:\"\";s:16:\"title_text_color\";s:7:\"#ffffff\";s:24:\"title_excerpt_text_color\";s:7:\"#ffffff\";s:13:\"title_excerpt\";s:0:\"\";s:17:\"title_title_width\";i:0;s:19:\"title_excerpt_width\";i:0;s:22:\"title_font_preset_html\";s:0:\"\";s:23:\"title_font_preset_style\";s:0:\"\";s:24:\"title_font_preset_weight\";s:0:\"\";s:27:\"title_font_preset_transform\";s:0:\"\";s:30:\"title_excerpt_font_preset_html\";s:0:\"\";s:31:\"title_excerpt_font_preset_style\";s:0:\"\";s:32:\"title_excerpt_font_preset_weight\";s:0:\"\";s:35:\"title_excerpt_font_preset_transform\";s:0:\"\";s:17:\"title_padding_top\";i:80;s:24:\"title_padding_top_tablet\";i:80;s:24:\"title_padding_top_mobile\";i:80;s:20:\"title_padding_bottom\";i:80;s:27:\"title_padding_bottom_tablet\";i:80;s:27:\"title_padding_bottom_mobile\";i:80;s:18:\"title_padding_left\";i:0;s:25:\"title_padding_left_tablet\";i:0;s:25:\"title_padding_left_mobile\";i:0;s:19:\"title_padding_right\";i:0;s:26:\"title_padding_right_tablet\";i:0;s:26:\"title_padding_right_mobile\";i:0;s:16:\"title_top_margin\";s:0:\"\";s:23:\"title_top_margin_tablet\";i:0;s:23:\"title_top_margin_mobile\";i:0;s:24:\"title_excerpt_top_margin\";i:18;s:31:\"title_excerpt_top_margin_tablet\";i:18;s:31:\"title_excerpt_top_margin_mobile\";i:18;s:17:\"title_breadcrumbs\";i:1;s:15:\"title_alignment\";s:0:\"\";s:15:\"title_icon_pack\";s:7:\"elegant\";s:10:\"title_icon\";s:0:\"\";s:16:\"title_icon_color\";s:0:\"\";s:18:\"title_icon_color_2\";s:0:\"\";s:27:\"title_icon_background_color\";s:0:\"\";s:16:\"title_icon_shape\";s:6:\"circle\";s:23:\"title_icon_border_color\";s:0:\"\";s:15:\"title_icon_size\";s:5:\"large\";s:16:\"title_icon_style\";s:0:\"\";s:18:\"title_icon_opacity\";d:0;s:25:\"breadcrumbs_default_color\";s:0:\"\";s:24:\"breadcrumbs_active_color\";s:0:\"\";s:23:\"breadcrumbs_hover_color\";s:0:\"\";s:27:\"title_breadcrumbs_alignment\";s:6:\"center\";s:18:\"header_transparent\";i:0;s:14:\"header_opacity\";i:0;s:22:\"header_menu_logo_light\";i:0;s:20:\"header_hide_top_area\";s:7:\"default\";s:27:\"header_hide_top_area_tablet\";s:7:\"default\";s:27:\"header_hide_top_area_mobile\";s:7:\"default\";s:9:\"menu_show\";s:7:\"default\";s:12:\"menu_options\";s:7:\"default\";s:18:\"header_custom_menu\";i:0;s:27:\"header_top_area_transparent\";i:0;s:23:\"header_top_area_opacity\";i:0;s:16:\"top_area_options\";s:7:\"default\";s:13:\"header_source\";s:7:\"default\";s:14:\"header_builder\";s:1:\"0\";s:29:\"header_builder_sticky_desktop\";i:0;s:28:\"header_builder_sticky_mobile\";i:0;s:34:\"header_builder_sticky_hide_desktop\";i:0;s:33:\"header_builder_sticky_hide_mobile\";i:1;s:21:\"header_builder_sticky\";s:1:\"0\";s:29:\"header_builder_sticky_opacity\";i:80;s:26:\"header_builder_light_color\";s:7:\"#FFFFFF\";s:32:\"header_builder_light_color_hover\";s:7:\"#00bcd4\";s:20:\"main_background_type\";b:0;s:21:\"main_background_color\";s:7:\"#ffffff\";s:21:\"main_background_image\";s:0:\"\";s:28:\"main_background_image_repeat\";i:0;s:26:\"main_background_position_x\";s:6:\"center\";s:26:\"main_background_position_y\";s:6:\"center\";s:20:\"main_background_size\";s:4:\"auto\";s:27:\"main_background_image_color\";s:0:\"\";s:29:\"main_background_image_overlay\";s:0:\"\";s:29:\"main_background_gradient_type\";s:6:\"linear\";s:30:\"main_background_gradient_angle\";i:90;s:33:\"main_background_gradient_position\";s:0:\"\";s:37:\"main_background_gradient_point1_color\";s:9:\"#E9ECDAFF\";s:40:\"main_background_gradient_point1_position\";i:0;s:37:\"main_background_gradient_point2_color\";s:9:\"#D5F6FAFF\";s:40:\"main_background_gradient_point2_position\";i:100;s:23:\"main_background_pattern\";s:0:\"\";s:19:\"content_padding_top\";i:135;s:26:\"content_padding_top_tablet\";s:0:\"\";s:26:\"content_padding_top_mobile\";s:0:\"\";s:22:\"content_padding_bottom\";i:110;s:29:\"content_padding_bottom_tablet\";s:0:\"\";s:29:\"content_padding_bottom_mobile\";s:0:\"\";s:20:\"content_area_options\";s:7:\"default\";s:18:\"footer_custom_show\";s:7:\"default\";s:13:\"footer_custom\";s:5:\"24822\";s:19:\"footer_hide_default\";s:7:\"default\";s:23:\"footer_hide_widget_area\";s:7:\"default\";s:16:\"effects_disabled\";i:0;s:17:\"effects_one_pager\";i:0;s:23:\"effects_parallax_footer\";i:0;s:24:\"effects_no_bottom_margin\";i:0;s:21:\"effects_no_top_margin\";i:0;s:19:\"redirect_to_subpage\";i:0;s:19:\"effects_hide_header\";s:7:\"default\";s:19:\"effects_hide_footer\";s:7:\"default\";s:21:\"effects_page_scroller\";i:0;s:28:\"effects_page_scroller_mobile\";i:0;s:26:\"effects_page_scroller_type\";s:8:\"advanced\";s:22:\"fullpage_disabled_dots\";i:0;s:19:\"fullpage_style_dots\";s:7:\"outline\";s:31:\"fullpage_disabled_tooltips_dots\";i:0;s:25:\"fullpage_fixed_background\";b:0;s:26:\"fullpage_enable_continuous\";i:0;s:24:\"fullpage_disabled_mobile\";i:0;s:22:\"fullpage_scroll_effect\";s:6:\"normal\";s:21:\"enable_page_preloader\";s:7:\"default\";s:14:\"slideshow_type\";s:0:\"\";s:19:\"slideshow_slideshow\";s:0:\"\";s:21:\"slideshow_layerslider\";s:0:\"\";s:19:\"slideshow_revslider\";s:0:\"\";s:19:\"slideshow_preloader\";i:1;s:12:\"sidebar_show\";s:8:\"disabled\";s:16:\"sidebar_position\";s:4:\"left\";s:14:\"sidebar_sticky\";i:0;s:24:\"product_header_separator\";i:0;s:23:\"page_layout_breadcrumbs\";s:7:\"default\";s:37:\"page_layout_breadcrumbs_default_color\";s:9:\"#99A9B5FF\";s:36:\"page_layout_breadcrumbs_active_color\";s:9:\"#3C3950FF\";s:35:\"page_layout_breadcrumbs_hover_color\";s:9:\"#3C3950FF\";s:33:\"page_layout_breadcrumbs_alignment\";s:4:\"left\";s:38:\"page_layout_breadcrumbs_bottom_spacing\";s:1:\"0\";s:37:\"page_layout_breadcrumbs_shop_category\";i:0;s:18:\"delay_js_execution\";i:0;s:13:\"disable_cache\";i:0;s:27:\"title_video_overlay_opacity\";s:0:\"\";s:31:\"title_breadcrumbs_shop_category\";s:1:\"0\";s:20:\"title_padding_locked\";s:0:\"\";s:27:\"title_padding_tablet_locked\";s:0:\"\";s:27:\"title_padding_mobile_locked\";s:0:\"\";s:24:\"title_background_pattern\";s:0:\"\";s:30:\"title_background_video_overlay\";s:0:\"\";s:16:\"title_icon__pack\";s:0:\"\";s:21:\"title_icon_shape_show\";s:0:\"\";s:25:\"footer_widget_woocommerce\";s:1:\"1\";s:19:\"portfolio_item_data\";a:9:{s:8:\"back_url\";s:0:\"\";s:9:\"highlight\";s:0:\"\";s:14:\"highlight_type\";s:0:\"\";s:14:\"overview_title\";s:0:\"\";s:16:\"overview_summary\";s:0:\"\";s:12:\"project_link\";s:0:\"\";s:12:\"project_text\";s:0:\"\";s:9:\"fullwidth\";s:0:\"\";s:19:\"project_button_show\";s:0:\"\";}s:23:\"portfolio_elements_data\";a:7:{s:23:\"portfolio_page_elements\";s:7:\"default\";s:19:\"portfolio_hide_date\";s:0:\"\";s:19:\"portfolio_hide_sets\";s:0:\"\";s:20:\"portfolio_hide_likes\";s:0:\"\";s:22:\"portfolio_hide_socials\";s:0:\"\";s:29:\"portfolio_hide_top_navigation\";s:0:\"\";s:32:\"portfolio_hide_bottom_navigation\";s:0:\"\";}s:17:\"product_item_data\";a:109:{s:9:\"highlight\";s:0:\"\";s:14:\"highlight_type\";s:7:\"squared\";s:28:\"thegem_product_disable_hover\";s:1:\"0\";s:10:\"size_guide\";s:7:\"default\";s:16:\"size_guide_image\";s:0:\"\";s:23:\"product_layout_settings\";s:7:\"default\";s:19:\"product_page_layout\";s:7:\"default\";s:25:\"product_page_layout_style\";s:15:\"horizontal_tabs\";s:28:\"product_page_layout_centered\";s:1:\"0\";s:39:\"product_page_layout_centered_top_margin\";s:2:\"42\";s:34:\"product_page_layout_centered_boxed\";s:1:\"0\";s:40:\"product_page_layout_centered_boxed_color\";s:0:\"\";s:29:\"product_page_layout_fullwidth\";s:1:\"0\";s:26:\"product_page_layout_sticky\";s:1:\"0\";s:28:\"product_page_skeleton_loader\";s:1:\"0\";s:30:\"product_page_layout_background\";s:0:\"\";s:30:\"product_page_layout_title_area\";s:8:\"disabled\";s:29:\"product_page_ajax_add_to_cart\";s:1:\"1\";s:31:\"product_page_desc_review_source\";s:17:\"extra_description\";s:31:\"product_page_desc_review_layout\";s:4:\"tabs\";s:42:\"product_page_desc_review_layout_tabs_style\";s:10:\"horizontal\";s:46:\"product_page_desc_review_layout_tabs_alignment\";s:4:\"left\";s:44:\"product_page_desc_review_layout_acc_position\";s:13:\"below_gallery\";s:65:\"product_page_desc_review_layout_one_by_one_description_background\";s:9:\"#F4F6F7FF\";s:69:\"product_page_desc_review_layout_one_by_one_additional_info_background\";s:9:\"#FFFFFFFF\";s:61:\"product_page_desc_review_layout_one_by_one_reviews_background\";s:9:\"#F4F6F7FF\";s:36:\"product_page_desc_review_description\";s:1:\"1\";s:42:\"product_page_desc_review_description_title\";s:11:\"Description\";s:40:\"product_page_desc_review_additional_info\";s:1:\"1\";s:46:\"product_page_desc_review_additional_info_title\";s:15:\"Additional Info\";s:32:\"product_page_desc_review_reviews\";s:1:\"1\";s:38:\"product_page_desc_review_reviews_title\";s:7:\"Reviews\";s:36:\"product_page_button_add_to_cart_text\";s:11:\"Add to Cart\";s:36:\"product_page_button_add_to_cart_icon\";s:4:\"f1e7\";s:41:\"product_page_button_add_to_cart_icon_pack\";s:8:\"material\";s:45:\"product_page_button_add_to_cart_icon_position\";s:4:\"left\";s:40:\"product_page_button_add_to_wishlist_icon\";s:4:\"f37b\";s:45:\"product_page_button_add_to_wishlist_icon_pack\";s:8:\"material\";s:42:\"product_page_button_added_to_wishlist_icon\";s:4:\"f377\";s:47:\"product_page_button_added_to_wishlist_icon_pack\";s:8:\"material\";s:41:\"product_page_button_clear_attributes_text\";s:15:\"Clear selection\";s:31:\"product_page_elements_prev_next\";s:1:\"1\";s:38:\"product_page_elements_preview_on_hover\";s:1:\"1\";s:34:\"product_page_elements_back_to_shop\";s:1:\"1\";s:39:\"product_page_elements_back_to_shop_link\";s:9:\"main_shop\";s:50:\"product_page_elements_back_to_shop_link_custom_url\";s:0:\"\";s:27:\"product_page_elements_title\";s:1:\"1\";s:32:\"product_page_elements_attributes\";s:1:\"0\";s:37:\"product_page_elements_attributes_data\";s:0:\"\";s:29:\"product_page_elements_reviews\";s:1:\"1\";s:34:\"product_page_elements_reviews_text\";s:16:\"customer reviews\";s:27:\"product_page_elements_price\";s:1:\"1\";s:41:\"product_page_elements_price_strikethrough\";s:1:\"1\";s:33:\"product_page_elements_description\";s:1:\"1\";s:34:\"product_page_elements_stock_amount\";s:1:\"1\";s:39:\"product_page_elements_stock_amount_text\";s:17:\"Products in stock\";s:32:\"product_page_elements_size_guide\";s:1:\"1\";s:25:\"product_page_elements_sku\";s:1:\"1\";s:31:\"product_page_elements_sku_title\";s:3:\"SKU\";s:32:\"product_page_elements_categories\";s:1:\"1\";s:38:\"product_page_elements_categories_title\";s:10:\"Categories\";s:26:\"product_page_elements_tags\";s:1:\"1\";s:32:\"product_page_elements_tags_title\";s:4:\"Tags\";s:27:\"product_page_elements_share\";s:1:\"1\";s:33:\"product_page_elements_share_title\";s:5:\"Share\";s:36:\"product_page_elements_share_facebook\";s:1:\"1\";s:35:\"product_page_elements_share_twitter\";s:1:\"1\";s:37:\"product_page_elements_share_pinterest\";s:1:\"1\";s:34:\"product_page_elements_share_tumblr\";s:1:\"1\";s:36:\"product_page_elements_share_linkedin\";s:1:\"1\";s:34:\"product_page_elements_share_reddit\";s:1:\"1\";s:28:\"product_page_elements_upsell\";s:1:\"1\";s:34:\"product_page_elements_upsell_title\";s:17:\"You may also like\";s:34:\"product_page_elements_upsell_items\";s:2:\"-1\";s:44:\"product_page_elements_upsell_columns_desktop\";s:2:\"4x\";s:43:\"product_page_elements_upsell_columns_tablet\";s:2:\"3x\";s:43:\"product_page_elements_upsell_columns_mobile\";s:2:\"2x\";s:40:\"product_page_elements_upsell_columns_100\";s:1:\"5\";s:29:\"product_page_elements_related\";s:1:\"1\";s:35:\"product_page_elements_related_title\";s:16:\"Related Products\";s:35:\"product_page_elements_related_items\";s:2:\"-1\";s:45:\"product_page_elements_related_columns_desktop\";s:2:\"4x\";s:44:\"product_page_elements_related_columns_tablet\";s:2:\"3x\";s:44:\"product_page_elements_related_columns_mobile\";s:2:\"2x\";s:41:\"product_page_elements_related_columns_100\";s:1:\"5\";s:15:\"product_gallery\";s:7:\"enabled\";s:20:\"product_gallery_type\";s:10:\"horizontal\";s:31:\"product_gallery_column_position\";s:4:\"left\";s:28:\"product_gallery_column_width\";s:2:\"50\";s:26:\"product_gallery_show_image\";s:5:\"hover\";s:20:\"product_gallery_zoom\";s:1:\"1\";s:24:\"product_gallery_lightbox\";s:1:\"1\";s:22:\"product_gallery_labels\";s:1:\"1\";s:26:\"product_gallery_label_sale\";s:1:\"1\";s:25:\"product_gallery_label_new\";s:1:\"1\";s:31:\"product_gallery_label_out_stock\";s:1:\"1\";s:27:\"product_gallery_auto_height\";s:1:\"1\";s:30:\"product_gallery_elements_color\";s:0:\"\";s:28:\"product_gallery_grid_columns\";s:2:\"1x\";s:25:\"product_gallery_grid_gaps\";s:2:\"42\";s:30:\"product_gallery_grid_gaps_hide\";s:1:\"0\";s:31:\"product_gallery_grid_top_margin\";s:1:\"0\";s:30:\"product_gallery_video_autoplay\";s:1:\"0\";s:21:\"product_layout_source\";s:7:\"default\";s:24:\"product_builder_template\";s:0:\"\";s:33:\"product_page_layout_sticky_offset\";s:1:\"0\";s:44:\"product_page_elements_upsell_title_alignment\";s:4:\"left\";s:45:\"product_page_elements_related_title_alignment\";s:4:\"left\";s:15:\"size_guide_text\";s:10:\"Size guide\";}s:24:\"options_current_contents\";N;s:16:\"options_modified\";N;s:34:\"options_outside_parameter_modified\";b:0;s:22:\"options_saved_contents\";N;s:8:\"settings\";a:3:{s:5:\"theme\";s:5:\"light\";s:24:\"background_image_gallery\";a:0:{}s:21:\"colorpicker_favorites\";a:1:{s:7:\"default\";a:0:{}}}s:26:\"delay_js_execution_desktop\";s:1:\"0\";s:25:\"delay_js_execution_mobile\";s:1:\"0\";s:25:\"product_archive_item_data\";a:2:{s:29:\"product_archive_layout_source\";s:7:\"default\";s:32:\"product_archive_builder_template\";s:0:\"\";}s:22:\"blog_archive_item_data\";a:2:{s:26:\"blog_archive_layout_source\";s:7:\"default\";s:29:\"blog_archive_builder_template\";s:0:\"\";}}"],"thegem_post_general_item_data":["a:22:{s:20:\"post_layout_settings\";s:7:\"default\";s:18:\"post_layout_source\";s:7:\"default\";s:21:\"post_builder_template\";s:1:\"0\";s:26:\"show_featured_posts_slider\";i:0;s:21:\"show_featured_content\";s:8:\"disabled\";s:10:\"video_type\";s:7:\"youtube\";s:5:\"video\";s:0:\"\";s:18:\"video_aspect_ratio\";s:0:\"\";s:10:\"quote_text\";s:0:\"\";s:12:\"quote_author\";s:0:\"\";s:16:\"quote_background\";s:0:\"\";s:18:\"quote_author_color\";s:0:\"\";s:5:\"audio\";s:0:\"\";s:7:\"gallery\";i:0;s:18:\"gallery_autoscroll\";i:0;s:9:\"highlight\";i:0;s:14:\"highlight_type\";s:7:\"squared\";s:15:\"highlight_style\";s:7:\"default\";s:31:\"highlight_title_left_background\";s:0:\"\";s:26:\"highlight_title_left_color\";s:0:\"\";s:32:\"highlight_title_right_background\";s:0:\"\";s:27:\"highlight_title_right_color\";s:0:\"\";}"],"thegem_show_featured_posts_slider":["0"],"_elementor_template_type":["wp-post"],"_elementor_version":["3.18.3"],"_elementor_data":["[{\"id\":\"7e79a64a\",\"elType\":\"section\",\"settings\":[],\"elements\":[{\"id\":\"15dea9f5\",\"elType\":\"column\",\"settings\":{\"_column_size\":100,\"thegem_column_breakpoints_list\":[]},\"elements\":[{\"id\":\"7390724a\",\"elType\":\"widget\",\"settings\":{\"editor\":\"<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<h2>Introduction<\\\/h2>\\n<p>New in Solr\\\/Lucene 9.x is the ability to do inequality operations to search against payloads on terms.&nbsp; Inequalities provide the ability to search for values that are greater than, less than, or equal to some threshold.&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>As search and AI continue to&nbsp; converge, one common use case is to be able to search for documents that have been classified by a machine learned model.&nbsp; These models typically output a label and confidence score for each classification.&nbsp; Documents can have many classifications associated with them that are generated from many different machine learned models.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The result is a data model where you have a document and a list of associated classifications.&nbsp; Let\\u2019s explore three different approaches to indexing and querying these documents and classifications along with a fourth approach using our recent contribution back to the Lucene and Solr Apache projects: the inequality payload query operator.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>We\\u2019ll start with&nbsp; a data model like the following which shows a relationship between a document and the document\\u2019s associated classifications.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:image --><\\\/p>\\n<figure><img src=\\\"https:\\\/\\\/lh6.googleusercontent.com\\\/Lk9ktdvrE8O4-7dCZJFZAxzTApNW-aVNe0N9MhQ4JtVgHqUtWPa8OhdIOuT6egWrkGiinwNCdy0CWpREyz29lIwOoTBgUHKtotl-q0J7a5s9j08ZpPHqHw8lPw88JWNRAkCRp_vt\\\" alt=\\\"\\\"><\\\/figure>\\n<p><!-- \\\/wp:image --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>As each document is associated with zero or more classifications, each with their own label and confidence score, we are presented with the challenge to answer queries with the index to find something like the following:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><em>\\u201cShow me all of the images that have a high confidence that they are of a person.\\u201d<\\\/em><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>For this example query, we\\u2019ll take an example index that was created by running the COCO2017 image dataset through the Yolo and the VGG16 image classification neural networks.&nbsp; The output classifications by either model represent the objects that were detected in the image.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The VGG16 image provides classification of 1000 object types and their confidence levels.&nbsp; The Yolo model provides us with 80 classes of objects that have been found with their confidence and additionally bounding box coordinates of where the image was found.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Approach 1: Do it at index time<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>One common approach to answer this problem is to only tag the documents as being a \\u201cperson\\u201d if the classification was above a particular threshold.&nbsp; Having a single field on the document for the \\u201chigh confidence\\u201d classifications is a perfectly valid approach.&nbsp; The queries remain very simple, as they are just querying for a particular label in the classification field of the document.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Example:&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><em>high_confidence:person<\\\/em><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>However, this will prevent the user from searching for documents with medium confidence labels.&nbsp; To address this query, the indexing of the documents could stamp two fields, one with \\u201chigh confidence\\u201d labels and another with \\u201cmedium confidence\\u201d labels.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Then you can search the \\u201cmedium confidence\\u201d field or the \\u201chigh confidence\\u201d field for the label in question.&nbsp; The trade off here is that at query time&nbsp; a search across multiple fields is required. As requirements for the&nbsp; confidence filter become more granular, additional bucketed fields need to be created.&nbsp; If the definition of those confidence levels changes the documents would need to be re-indexed to recompute the proper labels for the proper bucket.&nbsp; This approach works only if the definition of high confidence label is known up front and will never change.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Example:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><em>high_confidence:person OR medium_confidence:person<\\\/em><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>In reality, users want the ultimate flexibility to decide what they consider a high confidence classification.&nbsp; User interfaces might even want to present this as a slider control in a search UI.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Approach 2 Do it at query time with a field for the labels<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>To avoid having to re-index all the documents when the definition of high confidence changes, there are&nbsp; a few viable options at query time&nbsp; to solve this problem.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>One approach is to store the confidence score for each label generated by the models in separate fields on the document, one field per label.&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Once the documents are indexed with a field for each label\\u2019s score, a range search can be executed on the field that corresponds to the label that is being searched. &nbsp; In the above example query, searching for documents that have a \\u201cperson\\u201d with high confidence could be implemented as a range search on the \\u201cperson\\u201d field.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>For example:&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><em>person:[0.75 TO *]<\\\/em><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>This approach has its drawbacks as well in that you might have multiple persons detected in an image, each with their own confidence level.&nbsp; So at best, you could choose the highest confidence level of the person classification and use that for search purposes or potentially use a multi-valued field to represent each score.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>An additional drawback is that each possible label requires an additional field in the index.&nbsp; This approach could use dynamic fields unless all of the possible labels are be known up front.&nbsp; Some models might classify thousands of different object types.&nbsp; This would result in&nbsp; an explosion in the number of fields in the index.&nbsp; Aside from the potential for the number of fields to become unruly, the UI and query language would also need to know how to map the label to the appropriate field name to properly construct that query.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Approach 3:&nbsp; Use joins to perform the filtering<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The next possible approach is to index each classification as a child document and do parent\\\/child join queries against Solr.&nbsp; There is a join query parser in Solr that allows for all sorts of database-like join queries between two queries.&nbsp; These queries allow for relational queries between two different datasets.&nbsp; As wonderful as that sounds, (and it is wonderful!) there are some limitations and drawbacks to this approach.&nbsp; The first and most notable is that if you have a multi-shard index, special attention needs to be paid to how the documents are routed to the shards of the index.&nbsp; The key constraint for the parent\\\/child document queries is that the documents need to be routed to the shards based on the value of their join key.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>In this approach a document is indexed to represent each classification that is generated for the document being classified.&nbsp; Every document in the index will have zero or more classification documents that relate to it.&nbsp; For some applications it\\u2019s ok to change how the routing is working, but depending on the query use cases, this might not be possible.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The second notable drawback to the join query approach is that it is comparatively slow and very expensive to execute as compared to other simpler term and range queries.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Lastly, the join query potentially introduces a large number of additional documents to the index.&nbsp; This will impact the overall search latency for any given query.&nbsp; Query latency is proportional to the number of documents per shard in an index.&nbsp; So, the introduction of all the classification documents will affect the cluster sizing, as now the index should be sized to support the additional documents.&nbsp; That typically means more shards and potentially servers with additional CPUs.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The basic approach is to search on classifications but return the parent document.&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Search all documents that have a child document that contains a label of \\u201cfoo\\u201d with a confidence greater than 0.75.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>For example:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><em>{!join to=\\\"id\\\" from=\\\"parent_id\\\" v=\\\"+label:foo +confidence:[0.75 TO *]\\\"}<\\\/em>&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Approach 4:&nbsp; New &amp; improved inequality payload support!<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Upon review, it seemed that an alternative approach to use payloads might be able to solve this problem.&nbsp; The payload_check query parser in Solr provides access to the SpanPayloadCheckQuery.&nbsp; This Lucene query provides access to the payload data while matching.&nbsp; Once the term has been matched, the payload is then checked to see if it\\u2019s actually a match.&nbsp; This functionality was used to support things like part of speech tagging for terms.&nbsp; It allowed developers to use a delimited payload field in the Solr schema.&nbsp; The values in that field could then be encoded with the term and a value delimited by a pipe.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>An example of Part of Speech tagged text using the delimited payload:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Lucene|NOUN is|VERB awesome|ADJ<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>In addition to the payloads being strings, an integer or a floating point number can be stored there and encoded like:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Person|0.82 Cat|0.75 Monitor|0.55<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The only missing piece to being able to use this for the AI model classification search was the ability to do a range search on the payload instead of just an equals operation.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>We had the pleasure of recently contributing this capability back to Lucene and Solr.&nbsp; The patch includes the ability to provide an operation while matching now to support common operations such as greater than, less than, in addition to the equals operator.&nbsp; We\\u2019re happy to see that it will be included in the upcoming Solr 9.0 release.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>So, now we can express the desired query as:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>{!payload_check f=\\\"classifications_dpfs\\\" op=\\\"gt\\\" payloads=\\\"0.75\\\" v=\\\"Person\\\"}<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The new payload check query parser allows the user to specify the operation and the payload value to use as the reference for that operation.&nbsp; The above example searches the \\u201cclassifications_dpfs\\u201d field for any classification of \\u201cPerson\\u201d where the payload has a value greater than 0.75.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>So, with this last option we can use the payload check query parser in Solr to allow us to search for labels from the classification model that are above a threshold confidence score.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The ultimate result here is that we get the full ability to search on a term with one additional dimension of metadata filtering.&nbsp; Term and Payload.&nbsp; This unlocks a lot of other possibilities when it comes to image search.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>One possible example is to put the number of people found as a payload.&nbsp; Yolo can detect multiple objects in a scene, so the user could search for something like:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>\\u201cAt least 2 people and a tennis racket.\\u201d<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Having the classifier output from Yolo in the following format:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Person|2 Tennis_Racket|1&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>A similar approach can be taken if you want to encode the center point X and Y coordinates. This would enable searches like:&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>\\u201cFind me a picture with a Person on the left and a Pizza on the right.\\u201d<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The capabilities increase further when you start putting together scene labels along with object classification, like:&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Yolo + VGG16 to get context in the search results.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>By combining these two computer vision models we can start asking questions beyond what Yolo alone can answer.&nbsp;&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>\\u201cShow me a picture of at least 2 people skiing\\u201d&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Yolo will detect the number of people and the VGG16 model detects the act of skiing.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Benchmarks<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>First, some notes about how the benchmarks were generated:<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Each of the 4 approaches has the same configset.&nbsp; All cache sizes (except for the perSegment cache) were set to zero size. All indices in the test were a single shard with one segment and no deleted documents.&nbsp; All of the indices represent 1,000,000 documents.&nbsp; Each document has an average of 50 classifications associated with it.&nbsp; Each classification has a random confidence score from 0 to 1.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Approach 1 Document Example: A multi-valued field that contains only the labels that had a confidence score greater than 0.75.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>{&nbsp;<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<pre><strong>&nbsp;&nbsp;\\\"id<\\\/strong>\\\":\\\"doc_78375\\\",<br>&nbsp;&nbsp;\\\"<strong>classification_ss<\\\/strong>\\\":&nbsp; [\\\"label_7792\\\",\\\"label_9689\\\",\\\"label_2049\\\",\\\"label_6581\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_4795\\\",\\\"label_1780\\\",\\\"label_6323\\\",\\\"label_4939\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_8818\\\",\\\"label_877\\\",\\\"label_8524\\\",\\\"label_3159\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_4776\\\",\\\"label_1276\\\",\\\"label_7104\\\",\\\"label_4335\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_108\\\",\\\"label_5675\\\",\\\"label_424\\\",\\\"label_7745\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_4144\\\",\\\"label_2712\\\",\\\"label_4782\\\",\\\"label_9894\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_2777\\\",\\\"label_1267\\\",\\\"label_8919\\\",\\\"label_5332\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_7159\\\",\\\"label_4139\\\",\\\"label_6714\\\"]}<\\\/pre>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Approach 2 Document Example: A document with a field for each label containing the value of the confidence score for that label.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<pre><strong>{<br><\\\/strong><strong>&nbsp;&nbsp;\\\"id\\\":<\\\/strong><strong>\\\"doc_doc_20295\\\"<\\\/strong><strong>,<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_264_fs\\\":[<\\\/strong><strong>0.5059256<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_4777_fs\\\":[<\\\/strong><strong>0.8075591<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5773_fs\\\":[<\\\/strong><strong>0.6512147<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_6584_fs\\\":[<\\\/strong><strong>0.44860387<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5053_fs\\\":[<\\\/strong><strong>0.77677464<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_2307_fs\\\":[<\\\/strong><strong>0.99134594<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_9447_fs\\\":[<\\\/strong><strong>0.6198554<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_1534_fs\\\":[<\\\/strong><strong>0.993752<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_2489_fs\\\":[<\\\/strong><strong>0.3812973<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_1578_fs\\\":[<\\\/strong><strong>0.67712253<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_7583_fs\\\":[<\\\/strong><strong>0.9276807<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_796_fs\\\":[<\\\/strong><strong>0.9256864<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_345_fs\\\":[<\\\/strong><strong>0.21647614<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_8326_fs\\\":[<\\\/strong><strong>0.42797613<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_6023_fs\\\":[<\\\/strong><strong>0.16159433<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3220_fs\\\":[<\\\/strong><strong>0.82546365<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_4067_fs\\\":[<\\\/strong><strong>0.940214<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_932_fs\\\":[<\\\/strong><strong>0.71239257<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_7323_fs\\\":[<\\\/strong><strong>0.33341646<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5203_fs\\\":[<\\\/strong><strong>0.072936356<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_8474_fs\\\":[<\\\/strong><strong>0.6330075<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_2032_fs\\\":[<\\\/strong><strong>0.45183575<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_6371_fs\\\":[<\\\/strong><strong>0.8656315<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3488_fs\\\":[<\\\/strong><strong>0.052257597<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_4137_fs\\\":[<\\\/strong><strong>0.15416396<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_6509_fs\\\":[<\\\/strong><strong>0.52511454<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_8989_fs\\\":[<\\\/strong><strong>0.41732424<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_1067_fs\\\":[<\\\/strong><strong>0.45847535<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5892_fs\\\":[<\\\/strong><strong>0.9040163<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_8169_fs\\\":[<\\\/strong><strong>0.26057434<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3524_fs\\\":[<\\\/strong><strong>0.26224774<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_4912_fs\\\":[<\\\/strong><strong>0.037523687<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3772_fs\\\":[<\\\/strong><strong>0.587384<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3116_fs\\\":[<\\\/strong><strong>0.2450012<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5069_fs\\\":[<\\\/strong><strong>0.70538366<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5939_fs\\\":[<\\\/strong><strong>0.90539235<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3369_fs\\\":[<\\\/strong><strong>0.4885615<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3798_fs\\\":[<\\\/strong><strong>0.35722762<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5111_fs\\\":[<\\\/strong><strong>0.3300156<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_1684_fs\\\":[<\\\/strong><strong>0.18698442<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_6735_fs\\\":[<\\\/strong><strong>0.7144106<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_7830_fs\\\":[<\\\/strong><strong>0.79478115<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3240_fs\\\":[<\\\/strong><strong>0.7042537<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_2410_fs\\\":[<\\\/strong><strong>0.09114766<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5419_fs\\\":[<\\\/strong><strong>0.83966637<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_4207_fs\\\":[<\\\/strong><strong>0.0035191178<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_4484_fs\\\":[<\\\/strong><strong>0.5441104<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_6761_fs\\\":[<\\\/strong><strong>0.69559073<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_2117_fs\\\":[<\\\/strong><strong>0.39736092<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_1298_fs\\\":[<\\\/strong><strong>0.8430424<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5847_fs\\\":[<\\\/strong><strong>0.22964293<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3950_fs\\\":[<\\\/strong><strong>0.6538746<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_6558_fs\\\":[<\\\/strong><strong>0.69730353<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_1273_fs\\\":[<\\\/strong><strong>0.024785161<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3927_fs\\\":[<\\\/strong><strong>0.0013412237<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_1759_fs\\\":[<\\\/strong><strong>0.75639284<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_3553_fs\\\":[<\\\/strong><strong>0.5268485<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_5143_fs\\\":[<\\\/strong><strong>0.8450275<\\\/strong><strong>],<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_9301_fs\\\":[<\\\/strong><strong>0.12585384<\\\/strong><strong>]}<\\\/strong><\\\/pre>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Approach 3 Example Document:&nbsp; One document that represents the record being classified and an additional document for every classification associated with that document.&nbsp; The total number of documents in this index was 1,000,000 for the parent documents and 50,485,334 documents for each of the classification records.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong># Example Parent Document<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<pre><strong>{<br><\\\/strong><strong>&nbsp;&nbsp;\\\"id\\\":<\\\/strong><strong>\\\"doc_729413\\\"<br><\\\/strong><strong>}<\\\/strong><\\\/pre>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong># Example Classification Document (on average 50 of these for each parent document.)<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<pre><strong>{<br><\\\/strong><strong>&nbsp;&nbsp;\\\"id\\\":<\\\/strong><strong>\\\"doc_729413_5\\\"<\\\/strong><strong>,<br><\\\/strong><strong>&nbsp;&nbsp;\\\"parent_id_s\\\":<\\\/strong><strong>\\\"doc_729413\\\"<\\\/strong><strong>,<br><\\\/strong><strong>&nbsp;&nbsp;\\\"label_s\\\":<\\\/strong><strong>\\\"label_4067\\\"<\\\/strong><strong>,<br><\\\/strong><strong>&nbsp;&nbsp;\\\"confidence_f\\\":<\\\/strong><strong>0.21850449<br><\\\/strong><strong>}<\\\/strong><\\\/pre>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Approach 4 Example Document: A document with a single field containing all classification labels with the confidence level encoded as a payload.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<pre>{<br>&nbsp;&nbsp;\\\"<strong>id<\\\/strong>\\\":\\\"doc_doc_333114\\\",<br>&nbsp;&nbsp;\\\"<strong>class_dpfs<\\\/strong>\\\":[\\\"label_6872|0.7949082\\\",\\\"label_3550|0.22995031\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_7561|0.66999483\\\",\\\"label_3575|0.76349306\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_6567|0.29170412\\\",\\\"label_9300|0.22878802\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_7146|0.15249991\\\",\\\"label_7853|0.26775044\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_9330|0.69193286\\\",\\\"label_315|0.3812859\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_9941|0.60243666\\\",\\\"label_5448|0.4909597\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_3898|0.2772404\\\",\\\"label_3798|0.58473474\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_1040|0.39535648\\\",\\\"label_3017|0.5128221\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_5611|0.1511501\\\",\\\"label_7777|0.93621653\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_6589|0.48112237\\\",\\\"label_6023|0.69422346\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_6525|0.49891192\\\",\\\"label_6580|0.41795957\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_6807|0.5424252\\\",\\\"label_6233|0.3097676\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_624|0.9763578\\\",\\\"label_1726|0.3847112\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_9139|0.5317108\\\",\\\"label_6330|0.64640564\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_2413|0.24439555\\\",\\\"label_1372|0.17762291\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_562|0.3614515\\\",\\\"label_7828|0.7642365\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_3786|0.19018763\\\",\\\"label_9409|0.75261647\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_619|0.18773353\\\",\\\"label_3496|0.4446562\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_3556|0.43172425\\\",\\\"label_7278|0.5559282\\\",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\\\"label_6851|0.42342138\\\"]}<\\\/pre>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<h3>Benchmark Results<\\\/h3>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<h4>Index Comparison&nbsp;<\\\/h4>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:table --><\\\/p>\\n<figure>\\n<table>\\n<tbody>\\n<tr>\\n<td><strong>Metric<\\\/strong><\\\/td>\\n<td><strong>Approach 1<\\\/strong><\\\/td>\\n<td><strong>Approach 2<\\\/strong><\\\/td>\\n<td><strong>Approach 3<\\\/strong><\\\/td>\\n<td><strong>Approach 4<\\\/strong><\\\/td>\\n<td><strong>Comments<\\\/strong><\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>DPS<\\\/td>\\n<td>11761<\\\/td>\\n<td>209<\\\/td>\\n<td>409<\\\/td>\\n<td>3566<\\\/td>\\n<td>Documents indexed on a single thread generating random data.&nbsp; Updates batched, no committing while feeding content.&nbsp; Only a single replica active.<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>Index Size<\\\/td>\\n<td>219.32<\\\/td>\\n<td>906.99<\\\/td>\\n<td>2610<\\\/td>\\n<td>1220<\\\/td>\\n<td>Size in MB<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>Memory<\\\/td>\\n<td>1772<\\\/td>\\n<td>1361108<\\\/td>\\n<td>5556<\\\/td>\\n<td>1460<\\\/td>\\n<td>As reported from solr admin gui<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>Test Query<\\\/td>\\n<td>classification_ss:label_7792<\\\/td>\\n<td>label_7792_fs:[0.75 TO *]<\\\/td>\\n<td>{!join from=\\\"parent_id_s\\\" to=\\\"id\\\" v=\\\"+label_s:label_7792 +confidence_f:[0.75 TO *]\\\"}<\\\/td>\\n<td>{!payload_check op=\\\"gt\\\" f=\\\"class_dpfs\\\" payloads=\\\"0.75\\\"}label_7792<\\\/td>\\n<td>Example syntax<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/figure>\\n<p><!-- \\\/wp:table --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Indexing Benchmark Commentary<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>There are some interesting takeaways from this benchmark.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Indexing Performance<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:list --><\\\/p>\\n<ul>\\n<li>As expected, with Approach 1, the documents were faster to index as some data is being discarded. Pre-filtering the data yields smaller documents, and as a result they are faster to index.&nbsp; It was slightly surprising to see the negative impact of having many fields on a document.&nbsp;&nbsp;<\\\/li>\\n<li>Approach 2 documents were much larger overall compared to the rest of the approaches and as a result, this approach was the slowest to index overall.&nbsp;<\\\/li>\\n<li>Approach 3 with the children documents was about 2x faster than approach 2 for indexing.<\\\/li>\\n<li>Approach 4 with the payload was about 16 times faster Approach 2 to index.&nbsp; The payload approach definitely has a major indexing performance advantage over the other approaches.<\\\/li>\\n<\\\/ul>\\n<p><!-- \\\/wp:list --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Index Size<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:list --><\\\/p>\\n<ul>\\n<li>Approach 1 yielded the smallest index as data was being thrown away and the data model is the simplest.<\\\/li>\\n<li>Approach 2 was the most efficient in terms of index side between 2,3 and 4.&nbsp; This lends some of the performance issues to this approach to simply be attributed to the json formatting.&nbsp;<\\\/li>\\n<li>Approach 3 using children documents had the largest index size over all, showing the impact of the additional children documents in the index.&nbsp;&nbsp;<\\\/li>\\n<li>Approach 4 was only about 33% larger than the field based Approach 2 and less than \\u00bd the size of Approach 3.&nbsp; The key item to note here is the additional .pay files in the index to store the payload data.<\\\/li>\\n<\\\/ul>\\n<p><!-- \\\/wp:list --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Memory Usage<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:list --><\\\/p>\\n<ul>\\n<li>Approach 4 had the lowest memory overhead for having the index open.&nbsp; This was a very surprising result.&nbsp;&nbsp;<\\\/li>\\n<li>Approach 2 yielded the largest surprise.&nbsp; The index heap usage was nearly 1000x that of the other approaches.&nbsp; This really highlights the overhead of having 10,000 fields in the index.&nbsp; This is relatively dramatic and shouldn\\u2019t be ignored.&nbsp;&nbsp;<\\\/li>\\n<\\\/ul>\\n<p><!-- \\\/wp:list --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<h4><strong>Query Performance Comparison<\\\/strong><\\\/h4>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:table --><\\\/p>\\n<figure>\\n<table>\\n<tbody>\\n<tr>\\n<td>Metrix<\\\/td>\\n<td>Approach 1<\\\/td>\\n<td>Approach 2<\\\/td>\\n<td>Approach 3<\\\/td>\\n<td>Approach 4<\\\/td>\\n<td>Comments<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>Number of queries<\\\/td>\\n<td>10000<\\\/td>\\n<td>10000<\\\/td>\\n<td>100*<\\\/td>\\n<td>10000<\\\/td>\\n<td>Join queries were so slow, the test was stopped after 100 queries<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>average<\\\/td>\\n<td>1<\\\/td>\\n<td>2<\\\/td>\\n<td>1803<\\\/td>\\n<td>3<\\\/td>\\n<td>In milliseconds<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>min<\\\/td>\\n<td>1<\\\/td>\\n<td>1<\\\/td>\\n<td>1656<\\\/td>\\n<td>2<\\\/td>\\n<td>ms<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>max<\\\/td>\\n<td>6<\\\/td>\\n<td>22<\\\/td>\\n<td>2092<\\\/td>\\n<td>47<\\\/td>\\n<td>ms<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>std dev<\\\/td>\\n<td>0.55<\\\/td>\\n<td>0.79<\\\/td>\\n<td>88.28<\\\/td>\\n<td>1.55<\\\/td>\\n<td>&nbsp;<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>throughput<\\\/td>\\n<td>636<\\\/td>\\n<td>347.9<\\\/td>\\n<td>0.556666667<\\\/td>\\n<td>254<\\\/td>\\n<td>Queries per second (single threaded execution)<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>sent kb\\\/sec<\\\/td>\\n<td>109<\\\/td>\\n<td>60.09<\\\/td>\\n<td>0.15<\\\/td>\\n<td>61.5<\\\/td>\\n<td>&nbsp;<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>received kb\\\/sec<\\\/td>\\n<td>6124<\\\/td>\\n<td>8988.84<\\\/td>\\n<td>0.82<\\\/td>\\n<td>948.88<\\\/td>\\n<td>&nbsp;<\\\/td>\\n<\\\/tr>\\n<tr>\\n<td>avg bytes<\\\/td>\\n<td>9861<\\\/td>\\n<td>26461.3<\\\/td>\\n<td>1499<\\\/td>\\n<td>3826.1<\\\/td>\\n<td>Average response size in bytes<\\\/td>\\n<\\\/tr>\\n<\\\/tbody>\\n<\\\/table>\\n<\\\/figure>\\n<p><!-- \\\/wp:table --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Query Benchmark Commentary<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>From a pure performance perspective, again, no surprise that Approach 1 is the fastest.&nbsp; The join query approach (Approach 3) really shows how its performance is orders of magnitude slower than simple term and range queries in Solr.&nbsp; The second best query performance was the field for each label (Approach 2).&nbsp; This really highlights how efficient Solr\\\/Lucene is at performing range query operations.&nbsp; It also shows that it\\u2019s not much of a cost to use payloads compared to the expensive join operations.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>One other thing to note about the payload approach (Approach 4) is that for this dataset, the json encoding of the document with the payloads is even tighter than Approach 1.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p><strong>Next Steps&nbsp;<\\\/strong><\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>There are always things that can be improved and built upon.&nbsp; As a result of implementing this feature, it was noticed that the payload encoding and decoding code is a bit fragmented.&nbsp; It would be nice to centralize and consolidate some of that logic with the hope of making payloads more extensible.&nbsp;&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>There are some other novel queries that can be performed with the new payload support. For example, if using the classifications as a feature vector, a query can be created to find other documents that were classified in a similar manner to implement a \\u201cfind similar\\u201d for image data.&nbsp;<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>Going beyond this, one could envision extending the payload supported data types to include a vector of floating point values to enable vector based matching calculations such as cosine, manhattan, or euclidean distance metrics for similarity.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The ultimate realization of the power of this functionality will ultimately be through NLU techniques to translate free text queries into the appropriate payload check queries.&nbsp; More to come on that.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<h3><strong>Conclusion<\\\/strong><\\\/h3>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\\n<p><!-- wp:paragraph --><\\\/p>\\n<p>The biggest take away here is that as you require more granular query capabilities, the expense of the query goes up.&nbsp; If an application truly needs to do a full relational style join query, then special attention needs to be paid to how that system is scaled.&nbsp; Additionally, we can also see that payloads become a very attractive design pattern due to the indexing performance, memory usage characteristics, query performance, and ultimately query granularity make it a viable approach for applications to avoid needing to scale up for using a join query.<\\\/p>\\n<p><!-- \\\/wp:paragraph --><\\\/p>\"},\"elements\":[],\"widgetType\":\"text-editor\"}],\"isInner\":false}],\"isInner\":false},{\"id\":\"a836a41\",\"elType\":\"section\",\"settings\":[],\"elements\":[{\"id\":\"39d7612\",\"elType\":\"column\",\"settings\":{\"_column_size\":100,\"_inline_size\":null,\"thegem_column_breakpoints_list\":[]},\"elements\":[{\"id\":\"49c25e1\",\"elType\":\"widget\",\"settings\":{\"prev_label\":\"Previous Post\",\"next_label\":\"Next Post\",\"show_borders\":\"\",\"title_typography_typography\":\"custom\",\"title_typography_font_size\":{\"unit\":\"px\",\"size\":14,\"sizes\":[]},\"title_typography_font_weight\":\"700\",\"__globals__\":{\"arrow_color\":\"globals\\\/colors?id=primary\",\"label_color\":\"globals\\\/colors?id=secondary\"},\"arrow\":\"fa fa-caret-left\",\"show_arrow\":\"\"},\"elements\":[],\"widgetType\":\"global\",\"templateID\":\"28083\"}],\"isInner\":false}],\"isInner\":false}]"],"thegem_page_data_old":["a:46:{s:11:\"title_style\";s:1:\"1\";s:14:\"title_template\";i:0;s:23:\"title_use_page_settings\";i:0;s:12:\"title_xlarge\";i:0;s:18:\"title_rich_content\";i:0;s:13:\"title_content\";s:0:\"\";s:22:\"title_background_image\";s:0:\"\";s:25:\"title_background_parallax\";i:0;s:22:\"title_background_color\";s:0:\"\";s:16:\"title_video_type\";s:0:\"\";s:22:\"title_video_background\";s:0:\"\";s:24:\"title_video_aspect_ratio\";s:0:\"\";s:25:\"title_video_overlay_color\";s:0:\"\";s:27:\"title_video_overlay_opacity\";s:0:\"\";s:18:\"title_video_poster\";s:0:\"\";s:19:\"title_menu_on_video\";s:0:\"\";s:16:\"title_text_color\";s:0:\"\";s:24:\"title_excerpt_text_color\";s:0:\"\";s:13:\"title_excerpt\";s:0:\"\";s:17:\"title_title_width\";s:1:\"0\";s:19:\"title_excerpt_width\";s:1:\"0\";s:17:\"title_padding_top\";s:2:\"80\";s:20:\"title_padding_bottom\";s:2:\"80\";s:16:\"title_top_margin\";s:1:\"0\";s:24:\"title_excerpt_top_margin\";s:2:\"18\";s:17:\"title_breadcrumbs\";s:1:\"1\";s:15:\"title_alignment\";s:0:\"\";s:15:\"title_icon_pack\";s:7:\"elegant\";s:10:\"title_icon\";s:0:\"\";s:16:\"title_icon_color\";s:0:\"\";s:18:\"title_icon_color_2\";s:0:\"\";s:27:\"title_icon_background_color\";s:0:\"\";s:16:\"title_icon_shape\";s:6:\"circle\";s:23:\"title_icon_border_color\";s:0:\"\";s:15:\"title_icon_size\";s:5:\"large\";s:16:\"title_icon_style\";s:0:\"\";s:18:\"title_icon_opacity\";d:0;s:14:\"header_opacity\";s:1:\"0\";s:23:\"header_top_area_opacity\";s:1:\"0\";s:13:\"footer_custom\";s:5:\"24822\";s:16:\"sidebar_position\";s:0:\"\";s:14:\"slideshow_type\";s:0:\"\";s:19:\"slideshow_slideshow\";s:0:\"\";s:19:\"fullpage_style_dots\";s:7:\"outline\";s:22:\"fullpage_scroll_effect\";s:6:\"normal\";s:14:\"sidebar_sticky\";i:0;}"],"thegem_post_general_item_data_old":["a:19:{s:26:\"show_featured_posts_slider\";i:0;s:21:\"show_featured_content\";i:0;s:10:\"video_type\";s:7:\"youtube\";s:5:\"video\";s:0:\"\";s:18:\"video_aspect_ratio\";s:0:\"\";s:10:\"quote_text\";s:0:\"\";s:12:\"quote_author\";s:0:\"\";s:16:\"quote_background\";s:0:\"\";s:18:\"quote_author_color\";s:0:\"\";s:5:\"audio\";s:0:\"\";s:7:\"gallery\";i:0;s:18:\"gallery_autoscroll\";i:0;s:9:\"highlight\";i:0;s:14:\"highlight_type\";s:7:\"squared\";s:15:\"highlight_style\";s:7:\"default\";s:31:\"highlight_title_left_background\";s:0:\"\";s:26:\"highlight_title_left_color\";s:0:\"\";s:32:\"highlight_title_right_background\";s:0:\"\";s:27:\"highlight_title_right_color\";s:0:\"\";}"],"thegem_post_page_elements_data":["a:12:{s:13:\"post_elements\";s:7:\"default\";s:11:\"show_author\";i:0;s:16:\"blog_hide_author\";i:0;s:14:\"blog_hide_date\";i:0;s:26:\"blog_hide_date_in_blog_cat\";i:0;s:20:\"blog_hide_categories\";i:0;s:14:\"blog_hide_tags\";i:0;s:18:\"blog_hide_comments\";i:0;s:15:\"blog_hide_likes\";i:0;s:20:\"blog_hide_navigation\";i:0;s:17:\"blog_hide_socials\";i:0;s:17:\"blog_hide_realted\";i:0;}"],"_elementor_edit_mode":["builder"],"_oembed_79d813f23eb66ee4bdc588fa6494d268":["{{unknown}}"],"_oembed_f3f4578d6cbba19c9cba61f73d1d065b":["{{unknown}}"],"_elementor_pro_version":["3.18.3"],"_last_editor_used_jetpack":["block-editor"],"_thumbnail_id":["29688"],"thegem_popups_data":["a:2:{s:20:\"popups_layout_source\";s:7:\"default\";s:12:\"thegemPopups\";a:0:{}}"],"_yoast_wpseo_primary_category":["36"],"_yoast_wpseo_content_score":["30"],"_yoast_wpseo_estimated-reading-time-minutes":["13"],"_yoast_wpseo_wordproof_timestamp":[""],"_elementor_controls_usage":["a:4:{s:11:\"text-editor\";a:3:{s:5:\"count\";i:1;s:15:\"control_percent\";i:0;s:8:\"controls\";a:1:{s:7:\"content\";a:1:{s:14:\"section_editor\";a:1:{s:6:\"editor\";i:1;}}}}s:6:\"column\";a:3:{s:5:\"count\";i:2;s:15:\"control_percent\";i:0;s:8:\"controls\";a:1:{s:6:\"layout\";a:1:{s:6:\"layout\";a:1:{s:12:\"_inline_size\";i:1;}}}}s:7:\"section\";a:3:{s:5:\"count\";i:2;s:15:\"control_percent\";i:0;s:8:\"controls\";a:0:{}}s:15:\"post-navigation\";a:3:{s:5:\"count\";i:1;s:15:\"control_percent\";i:2;s:8:\"controls\";a:2:{s:7:\"content\";a:1:{s:31:\"section_post_navigation_content\";a:5:{s:10:\"prev_label\";i:1;s:10:\"next_label\";i:1;s:12:\"show_borders\";i:1;s:5:\"arrow\";i:1;s:10:\"show_arrow\";i:1;}}s:5:\"style\";a:1:{s:11:\"title_style\";a:3:{s:27:\"title_typography_typography\";i:1;s:26:\"title_typography_font_size\";i:1;s:28:\"title_typography_font_weight\";i:1;}}}}}"],"_elementor_css":["a:6:{s:4:\"time\";i:1775616971;s:5:\"fonts\";a:0:{}s:5:\"icons\";a:0:{}s:20:\"dynamic_elements_ids\";a:0:{}s:6:\"status\";s:4:\"file\";i:0;s:0:\"\";}"],"_elementor_page_assets":["a:2:{s:7:\"scripts\";a:2:{i:0;s:18:\"elementor-frontend\";i:1;s:15:\"post-navigation\";}s:6:\"styles\";a:1:{i:0;s:22:\"widget-post-navigation\";}}"],"_elementor_element_cache":["{\"timeout\":1776637767,\"value\":{\"content\":\"\\t\\t<section class=\\\"elementor-section elementor-top-section elementor-element elementor-element-7e79a64a elementor-section-boxed elementor-section-height-default elementor-section-height-default\\\" data-id=\\\"7e79a64a\\\" data-element_type=\\\"section\\\" data-e-type=\\\"section\\\">\\r\\n\\t\\t\\t\\t\\t\\t<div class=\\\"elementor-container elementor-column-gap-thegem\\\"><div class=\\\"elementor-row\\\">\\r\\n\\t\\t\\t\\t\\t<div class=\\\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-15dea9f5\\\" data-id=\\\"15dea9f5\\\" data-element_type=\\\"column\\\" data-e-type=\\\"column\\\">\\n\\t\\t\\t<div class=\\\"elementor-widget-wrap elementor-element-populated\\\">\\n\\t\\t\\t\\t[elementor-element k=\\\"9109a976d8649ee6d2c8fef8daebbb8b\\\" data=\\\"eyJpZCI6IjczOTA3MjRhIiwiZWxUeXBlIjoid2lkZ2V0Iiwic2V0dGluZ3MiOnsiZWRpdG9yIjoiPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48aDI+SW50cm9kdWN0aW9uPFwvaDI+XG48cD5OZXcgaW4gU29sclwvTHVjZW5lIDkueCBpcyB0aGUgYWJpbGl0eSB0byBkbyBpbmVxdWFsaXR5IG9wZXJhdGlvbnMgdG8gc2VhcmNoIGFnYWluc3QgcGF5bG9hZHMgb24gdGVybXMuJm5ic3A7IEluZXF1YWxpdGllcyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBmb3IgdmFsdWVzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiwgbGVzcyB0aGFuLCBvciBlcXVhbCB0byBzb21lIHRocmVzaG9sZC4mbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkFzIHNlYXJjaCBhbmQgQUkgY29udGludWUgdG8mbmJzcDsgY29udmVyZ2UsIG9uZSBjb21tb24gdXNlIGNhc2UgaXMgdG8gYmUgYWJsZSB0byBzZWFyY2ggZm9yIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiBjbGFzc2lmaWVkIGJ5IGEgbWFjaGluZSBsZWFybmVkIG1vZGVsLiZuYnNwOyBUaGVzZSBtb2RlbHMgdHlwaWNhbGx5IG91dHB1dCBhIGxhYmVsIGFuZCBjb25maWRlbmNlIHNjb3JlIGZvciBlYWNoIGNsYXNzaWZpY2F0aW9uLiZuYnNwOyBEb2N1bWVudHMgY2FuIGhhdmUgbWFueSBjbGFzc2lmaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZW0gdGhhdCBhcmUgZ2VuZXJhdGVkIGZyb20gbWFueSBkaWZmZXJlbnQgbWFjaGluZSBsZWFybmVkIG1vZGVscy4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZSByZXN1bHQgaXMgYSBkYXRhIG1vZGVsIHdoZXJlIHlvdSBoYXZlIGEgZG9jdW1lbnQgYW5kIGEgbGlzdCBvZiBhc3NvY2lhdGVkIGNsYXNzaWZpY2F0aW9ucy4mbmJzcDsgTGV0XHUyMDE5cyBleHBsb3JlIHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIGluZGV4aW5nIGFuZCBxdWVyeWluZyB0aGVzZSBkb2N1bWVudHMgYW5kIGNsYXNzaWZpY2F0aW9ucyBhbG9uZyB3aXRoIGEgZm91cnRoIGFwcHJvYWNoIHVzaW5nIG91ciByZWNlbnQgY29udHJpYnV0aW9uIGJhY2sgdG8gdGhlIEx1Y2VuZSBhbmQgU29sciBBcGFjaGUgcHJvamVjdHM6IHRoZSBpbmVxdWFsaXR5IHBheWxvYWQgcXVlcnkgb3BlcmF0b3IuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5XZVx1MjAxOWxsIHN0YXJ0IHdpdGgmbmJzcDsgYSBkYXRhIG1vZGVsIGxpa2UgdGhlIGZvbGxvd2luZyB3aGljaCBzaG93cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgZG9jdW1lbnQgYW5kIHRoZSBkb2N1bWVudFx1MjAxOXMgYXNzb2NpYXRlZCBjbGFzc2lmaWNhdGlvbnMuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6aW1hZ2UgLS0+PFwvcD5cbjxmaWd1cmU+PGltZyBzcmM9XCJodHRwczpcL1wvbGg2Lmdvb2dsZXVzZXJjb250ZW50LmNvbVwvTGs5a3RkdnJFOE80LTdkQ1pKRlpBeHpUQXBOVy1hVk5lME45TWhRNEp0VmdIcVV0V1BhOE9oZElPdVQ2ZWdXcmtHaWlud05DZHkwQ1dwUkV5ejI5bEl3T29UQmdVSEt0b3RsLXEwSjdhNXM5ajA4WnBQSHFIdzhsUHc4OEpXTlJBa0NScF92dFwiIGFsdD1cIlwiPjxcL2ZpZ3VyZT5cbjxwPjwhLS0gXC93cDppbWFnZSAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkFzIGVhY2ggZG9jdW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHplcm8gb3IgbW9yZSBjbGFzc2lmaWNhdGlvbnMsIGVhY2ggd2l0aCB0aGVpciBvd24gbGFiZWwgYW5kIGNvbmZpZGVuY2Ugc2NvcmUsIHdlIGFyZSBwcmVzZW50ZWQgd2l0aCB0aGUgY2hhbGxlbmdlIHRvIGFuc3dlciBxdWVyaWVzIHdpdGggdGhlIGluZGV4IHRvIGZpbmQgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzo8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjxlbT5cdTIwMWNTaG93IG1lIGFsbCBvZiB0aGUgaW1hZ2VzIHRoYXQgaGF2ZSBhIGhpZ2ggY29uZmlkZW5jZSB0aGF0IHRoZXkgYXJlIG9mIGEgcGVyc29uLlx1MjAxZDxcL2VtPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+Rm9yIHRoaXMgZXhhbXBsZSBxdWVyeSwgd2VcdTIwMTlsbCB0YWtlIGFuIGV4YW1wbGUgaW5kZXggdGhhdCB3YXMgY3JlYXRlZCBieSBydW5uaW5nIHRoZSBDT0NPMjAxNyBpbWFnZSBkYXRhc2V0IHRocm91Z2ggdGhlIFlvbG8gYW5kIHRoZSBWR0cxNiBpbWFnZSBjbGFzc2lmaWNhdGlvbiBuZXVyYWwgbmV0d29ya3MuJm5ic3A7IFRoZSBvdXRwdXQgY2xhc3NpZmljYXRpb25zIGJ5IGVpdGhlciBtb2RlbCByZXByZXNlbnQgdGhlIG9iamVjdHMgdGhhdCB3ZXJlIGRldGVjdGVkIGluIHRoZSBpbWFnZS48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZSBWR0cxNiBpbWFnZSBwcm92aWRlcyBjbGFzc2lmaWNhdGlvbiBvZiAxMDAwIG9iamVjdCB0eXBlcyBhbmQgdGhlaXIgY29uZmlkZW5jZSBsZXZlbHMuJm5ic3A7IFRoZSBZb2xvIG1vZGVsIHByb3ZpZGVzIHVzIHdpdGggODAgY2xhc3NlcyBvZiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGZvdW5kIHdpdGggdGhlaXIgY29uZmlkZW5jZSBhbmQgYWRkaXRpb25hbGx5IGJvdW5kaW5nIGJveCBjb29yZGluYXRlcyBvZiB3aGVyZSB0aGUgaW1hZ2Ugd2FzIGZvdW5kLjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PHN0cm9uZz5BcHByb2FjaCAxOiBEbyBpdCBhdCBpbmRleCB0aW1lPFwvc3Ryb25nPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+T25lIGNvbW1vbiBhcHByb2FjaCB0byBhbnN3ZXIgdGhpcyBwcm9ibGVtIGlzIHRvIG9ubHkgdGFnIHRoZSBkb2N1bWVudHMgYXMgYmVpbmcgYSBcdTIwMWNwZXJzb25cdTIwMWQgaWYgdGhlIGNsYXNzaWZpY2F0aW9uIHdhcyBhYm92ZSBhIHBhcnRpY3VsYXIgdGhyZXNob2xkLiZuYnNwOyBIYXZpbmcgYSBzaW5nbGUgZmllbGQgb24gdGhlIGRvY3VtZW50IGZvciB0aGUgXHUyMDFjaGlnaCBjb25maWRlbmNlXHUyMDFkIGNsYXNzaWZpY2F0aW9ucyBpcyBhIHBlcmZlY3RseSB2YWxpZCBhcHByb2FjaC4mbmJzcDsgVGhlIHF1ZXJpZXMgcmVtYWluIHZlcnkgc2ltcGxlLCBhcyB0aGV5IGFyZSBqdXN0IHF1ZXJ5aW5nIGZvciBhIHBhcnRpY3VsYXIgbGFiZWwgaW4gdGhlIGNsYXNzaWZpY2F0aW9uIGZpZWxkIG9mIHRoZSBkb2N1bWVudC48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkV4YW1wbGU6Jm5ic3A7PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48ZW0+aGlnaF9jb25maWRlbmNlOnBlcnNvbjxcL2VtPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+SG93ZXZlciwgdGhpcyB3aWxsIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBzZWFyY2hpbmcgZm9yIGRvY3VtZW50cyB3aXRoIG1lZGl1bSBjb25maWRlbmNlIGxhYmVscy4mbmJzcDsgVG8gYWRkcmVzcyB0aGlzIHF1ZXJ5LCB0aGUgaW5kZXhpbmcgb2YgdGhlIGRvY3VtZW50cyBjb3VsZCBzdGFtcCB0d28gZmllbGRzLCBvbmUgd2l0aCBcdTIwMWNoaWdoIGNvbmZpZGVuY2VcdTIwMWQgbGFiZWxzIGFuZCBhbm90aGVyIHdpdGggXHUyMDFjbWVkaXVtIGNvbmZpZGVuY2VcdTIwMWQgbGFiZWxzLiZuYnNwOyZuYnNwOzxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+VGhlbiB5b3UgY2FuIHNlYXJjaCB0aGUgXHUyMDFjbWVkaXVtIGNvbmZpZGVuY2VcdTIwMWQgZmllbGQgb3IgdGhlIFx1MjAxY2hpZ2ggY29uZmlkZW5jZVx1MjAxZCBmaWVsZCBmb3IgdGhlIGxhYmVsIGluIHF1ZXN0aW9uLiZuYnNwOyBUaGUgdHJhZGUgb2ZmIGhlcmUgaXMgdGhhdCBhdCBxdWVyeSB0aW1lJm5ic3A7IGEgc2VhcmNoIGFjcm9zcyBtdWx0aXBsZSBmaWVsZHMgaXMgcmVxdWlyZWQuIEFzIHJlcXVpcmVtZW50cyBmb3IgdGhlJm5ic3A7IGNvbmZpZGVuY2UgZmlsdGVyIGJlY29tZSBtb3JlIGdyYW51bGFyLCBhZGRpdGlvbmFsIGJ1Y2tldGVkIGZpZWxkcyBuZWVkIHRvIGJlIGNyZWF0ZWQuJm5ic3A7IElmIHRoZSBkZWZpbml0aW9uIG9mIHRob3NlIGNvbmZpZGVuY2UgbGV2ZWxzIGNoYW5nZXMgdGhlIGRvY3VtZW50cyB3b3VsZCBuZWVkIHRvIGJlIHJlLWluZGV4ZWQgdG8gcmVjb21wdXRlIHRoZSBwcm9wZXIgbGFiZWxzIGZvciB0aGUgcHJvcGVyIGJ1Y2tldC4mbmJzcDsgVGhpcyBhcHByb2FjaCB3b3JrcyBvbmx5IGlmIHRoZSBkZWZpbml0aW9uIG9mIGhpZ2ggY29uZmlkZW5jZSBsYWJlbCBpcyBrbm93biB1cCBmcm9udCBhbmQgd2lsbCBuZXZlciBjaGFuZ2UuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5FeGFtcGxlOjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PGVtPmhpZ2hfY29uZmlkZW5jZTpwZXJzb24gT1IgbWVkaXVtX2NvbmZpZGVuY2U6cGVyc29uPFwvZW0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5JbiByZWFsaXR5LCB1c2VycyB3YW50IHRoZSB1bHRpbWF0ZSBmbGV4aWJpbGl0eSB0byBkZWNpZGUgd2hhdCB0aGV5IGNvbnNpZGVyIGEgaGlnaCBjb25maWRlbmNlIGNsYXNzaWZpY2F0aW9uLiZuYnNwOyBVc2VyIGludGVyZmFjZXMgbWlnaHQgZXZlbiB3YW50IHRvIHByZXNlbnQgdGhpcyBhcyBhIHNsaWRlciBjb250cm9sIGluIGEgc2VhcmNoIFVJLjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PHN0cm9uZz5BcHByb2FjaCAyIERvIGl0IGF0IHF1ZXJ5IHRpbWUgd2l0aCBhIGZpZWxkIGZvciB0aGUgbGFiZWxzPFwvc3Ryb25nPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+VG8gYXZvaWQgaGF2aW5nIHRvIHJlLWluZGV4IGFsbCB0aGUgZG9jdW1lbnRzIHdoZW4gdGhlIGRlZmluaXRpb24gb2YgaGlnaCBjb25maWRlbmNlIGNoYW5nZXMsIHRoZXJlIGFyZSZuYnNwOyBhIGZldyB2aWFibGUgb3B0aW9ucyBhdCBxdWVyeSB0aW1lJm5ic3A7IHRvIHNvbHZlIHRoaXMgcHJvYmxlbS4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPk9uZSBhcHByb2FjaCBpcyB0byBzdG9yZSB0aGUgY29uZmlkZW5jZSBzY29yZSBmb3IgZWFjaCBsYWJlbCBnZW5lcmF0ZWQgYnkgdGhlIG1vZGVscyBpbiBzZXBhcmF0ZSBmaWVsZHMgb24gdGhlIGRvY3VtZW50LCBvbmUgZmllbGQgcGVyIGxhYmVsLiZuYnNwOzxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+T25jZSB0aGUgZG9jdW1lbnRzIGFyZSBpbmRleGVkIHdpdGggYSBmaWVsZCBmb3IgZWFjaCBsYWJlbFx1MjAxOXMgc2NvcmUsIGEgcmFuZ2Ugc2VhcmNoIGNhbiBiZSBleGVjdXRlZCBvbiB0aGUgZmllbGQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbGFiZWwgdGhhdCBpcyBiZWluZyBzZWFyY2hlZC4gJm5ic3A7IEluIHRoZSBhYm92ZSBleGFtcGxlIHF1ZXJ5LCBzZWFyY2hpbmcgZm9yIGRvY3VtZW50cyB0aGF0IGhhdmUgYSBcdTIwMWNwZXJzb25cdTIwMWQgd2l0aCBoaWdoIGNvbmZpZGVuY2UgY291bGQgYmUgaW1wbGVtZW50ZWQgYXMgYSByYW5nZSBzZWFyY2ggb24gdGhlIFx1MjAxY3BlcnNvblx1MjAxZCBmaWVsZC48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkZvciBleGFtcGxlOiZuYnNwOyZuYnNwOzxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PGVtPnBlcnNvbjpbMC43NSBUTyAqXTxcL2VtPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+VGhpcyBhcHByb2FjaCBoYXMgaXRzIGRyYXdiYWNrcyBhcyB3ZWxsIGluIHRoYXQgeW91IG1pZ2h0IGhhdmUgbXVsdGlwbGUgcGVyc29ucyBkZXRlY3RlZCBpbiBhbiBpbWFnZSwgZWFjaCB3aXRoIHRoZWlyIG93biBjb25maWRlbmNlIGxldmVsLiZuYnNwOyBTbyBhdCBiZXN0LCB5b3UgY291bGQgY2hvb3NlIHRoZSBoaWdoZXN0IGNvbmZpZGVuY2UgbGV2ZWwgb2YgdGhlIHBlcnNvbiBjbGFzc2lmaWNhdGlvbiBhbmQgdXNlIHRoYXQgZm9yIHNlYXJjaCBwdXJwb3NlcyBvciBwb3RlbnRpYWxseSB1c2UgYSBtdWx0aS12YWx1ZWQgZmllbGQgdG8gcmVwcmVzZW50IGVhY2ggc2NvcmUuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5BbiBhZGRpdGlvbmFsIGRyYXdiYWNrIGlzIHRoYXQgZWFjaCBwb3NzaWJsZSBsYWJlbCByZXF1aXJlcyBhbiBhZGRpdGlvbmFsIGZpZWxkIGluIHRoZSBpbmRleC4mbmJzcDsgVGhpcyBhcHByb2FjaCBjb3VsZCB1c2UgZHluYW1pYyBmaWVsZHMgdW5sZXNzIGFsbCBvZiB0aGUgcG9zc2libGUgbGFiZWxzIGFyZSBiZSBrbm93biB1cCBmcm9udC4mbmJzcDsgU29tZSBtb2RlbHMgbWlnaHQgY2xhc3NpZnkgdGhvdXNhbmRzIG9mIGRpZmZlcmVudCBvYmplY3QgdHlwZXMuJm5ic3A7IFRoaXMgd291bGQgcmVzdWx0IGluJm5ic3A7IGFuIGV4cGxvc2lvbiBpbiB0aGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGUgaW5kZXguJm5ic3A7IEFzaWRlIGZyb20gdGhlIHBvdGVudGlhbCBmb3IgdGhlIG51bWJlciBvZiBmaWVsZHMgdG8gYmVjb21lIHVucnVseSwgdGhlIFVJIGFuZCBxdWVyeSBsYW5ndWFnZSB3b3VsZCBhbHNvIG5lZWQgdG8ga25vdyBob3cgdG8gbWFwIHRoZSBsYWJlbCB0byB0aGUgYXBwcm9wcmlhdGUgZmllbGQgbmFtZSB0byBwcm9wZXJseSBjb25zdHJ1Y3QgdGhhdCBxdWVyeS48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjxzdHJvbmc+QXBwcm9hY2ggMzombmJzcDsgVXNlIGpvaW5zIHRvIHBlcmZvcm0gdGhlIGZpbHRlcmluZzxcL3N0cm9uZz48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZSBuZXh0IHBvc3NpYmxlIGFwcHJvYWNoIGlzIHRvIGluZGV4IGVhY2ggY2xhc3NpZmljYXRpb24gYXMgYSBjaGlsZCBkb2N1bWVudCBhbmQgZG8gcGFyZW50XC9jaGlsZCBqb2luIHF1ZXJpZXMgYWdhaW5zdCBTb2xyLiZuYnNwOyBUaGVyZSBpcyBhIGpvaW4gcXVlcnkgcGFyc2VyIGluIFNvbHIgdGhhdCBhbGxvd3MgZm9yIGFsbCBzb3J0cyBvZiBkYXRhYmFzZS1saWtlIGpvaW4gcXVlcmllcyBiZXR3ZWVuIHR3byBxdWVyaWVzLiZuYnNwOyBUaGVzZSBxdWVyaWVzIGFsbG93IGZvciByZWxhdGlvbmFsIHF1ZXJpZXMgYmV0d2VlbiB0d28gZGlmZmVyZW50IGRhdGFzZXRzLiZuYnNwOyBBcyB3b25kZXJmdWwgYXMgdGhhdCBzb3VuZHMsIChhbmQgaXQgaXMgd29uZGVyZnVsISkgdGhlcmUgYXJlIHNvbWUgbGltaXRhdGlvbnMgYW5kIGRyYXdiYWNrcyB0byB0aGlzIGFwcHJvYWNoLiZuYnNwOyBUaGUgZmlyc3QgYW5kIG1vc3Qgbm90YWJsZSBpcyB0aGF0IGlmIHlvdSBoYXZlIGEgbXVsdGktc2hhcmQgaW5kZXgsIHNwZWNpYWwgYXR0ZW50aW9uIG5lZWRzIHRvIGJlIHBhaWQgdG8gaG93IHRoZSBkb2N1bWVudHMgYXJlIHJvdXRlZCB0byB0aGUgc2hhcmRzIG9mIHRoZSBpbmRleC4mbmJzcDsgVGhlIGtleSBjb25zdHJhaW50IGZvciB0aGUgcGFyZW50XC9jaGlsZCBkb2N1bWVudCBxdWVyaWVzIGlzIHRoYXQgdGhlIGRvY3VtZW50cyBuZWVkIHRvIGJlIHJvdXRlZCB0byB0aGUgc2hhcmRzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGVpciBqb2luIGtleS48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkluIHRoaXMgYXBwcm9hY2ggYSBkb2N1bWVudCBpcyBpbmRleGVkIHRvIHJlcHJlc2VudCBlYWNoIGNsYXNzaWZpY2F0aW9uIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciB0aGUgZG9jdW1lbnQgYmVpbmcgY2xhc3NpZmllZC4mbmJzcDsgRXZlcnkgZG9jdW1lbnQgaW4gdGhlIGluZGV4IHdpbGwgaGF2ZSB6ZXJvIG9yIG1vcmUgY2xhc3NpZmljYXRpb24gZG9jdW1lbnRzIHRoYXQgcmVsYXRlIHRvIGl0LiZuYnNwOyBGb3Igc29tZSBhcHBsaWNhdGlvbnMgaXRcdTIwMTlzIG9rIHRvIGNoYW5nZSBob3cgdGhlIHJvdXRpbmcgaXMgd29ya2luZywgYnV0IGRlcGVuZGluZyBvbiB0aGUgcXVlcnkgdXNlIGNhc2VzLCB0aGlzIG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZSBzZWNvbmQgbm90YWJsZSBkcmF3YmFjayB0byB0aGUgam9pbiBxdWVyeSBhcHByb2FjaCBpcyB0aGF0IGl0IGlzIGNvbXBhcmF0aXZlbHkgc2xvdyBhbmQgdmVyeSBleHBlbnNpdmUgdG8gZXhlY3V0ZSBhcyBjb21wYXJlZCB0byBvdGhlciBzaW1wbGVyIHRlcm0gYW5kIHJhbmdlIHF1ZXJpZXMuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5MYXN0bHksIHRoZSBqb2luIHF1ZXJ5IHBvdGVudGlhbGx5IGludHJvZHVjZXMgYSBsYXJnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBkb2N1bWVudHMgdG8gdGhlIGluZGV4LiZuYnNwOyBUaGlzIHdpbGwgaW1wYWN0IHRoZSBvdmVyYWxsIHNlYXJjaCBsYXRlbmN5IGZvciBhbnkgZ2l2ZW4gcXVlcnkuJm5ic3A7IFF1ZXJ5IGxhdGVuY3kgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIHBlciBzaGFyZCBpbiBhbiBpbmRleC4mbmJzcDsgU28sIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYWxsIHRoZSBjbGFzc2lmaWNhdGlvbiBkb2N1bWVudHMgd2lsbCBhZmZlY3QgdGhlIGNsdXN0ZXIgc2l6aW5nLCBhcyBub3cgdGhlIGluZGV4IHNob3VsZCBiZSBzaXplZCB0byBzdXBwb3J0IHRoZSBhZGRpdGlvbmFsIGRvY3VtZW50cy4mbmJzcDsgVGhhdCB0eXBpY2FsbHkgbWVhbnMgbW9yZSBzaGFyZHMgYW5kIHBvdGVudGlhbGx5IHNlcnZlcnMgd2l0aCBhZGRpdGlvbmFsIENQVXMuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5UaGUgYmFzaWMgYXBwcm9hY2ggaXMgdG8gc2VhcmNoIG9uIGNsYXNzaWZpY2F0aW9ucyBidXQgcmV0dXJuIHRoZSBwYXJlbnQgZG9jdW1lbnQuJm5ic3A7PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5TZWFyY2ggYWxsIGRvY3VtZW50cyB0aGF0IGhhdmUgYSBjaGlsZCBkb2N1bWVudCB0aGF0IGNvbnRhaW5zIGEgbGFiZWwgb2YgXHUyMDFjZm9vXHUyMDFkIHdpdGggYSBjb25maWRlbmNlIGdyZWF0ZXIgdGhhbiAwLjc1LjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+Rm9yIGV4YW1wbGU6PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48ZW0+eyFqb2luIHRvPVwiaWRcIiBmcm9tPVwicGFyZW50X2lkXCIgdj1cIitsYWJlbDpmb28gK2NvbmZpZGVuY2U6WzAuNzUgVE8gKl1cIn08XC9lbT4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjxzdHJvbmc+QXBwcm9hY2ggNDombmJzcDsgTmV3ICZhbXA7IGltcHJvdmVkIGluZXF1YWxpdHkgcGF5bG9hZCBzdXBwb3J0ITxcL3N0cm9uZz48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlVwb24gcmV2aWV3LCBpdCBzZWVtZWQgdGhhdCBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCB0byB1c2UgcGF5bG9hZHMgbWlnaHQgYmUgYWJsZSB0byBzb2x2ZSB0aGlzIHByb2JsZW0uJm5ic3A7IFRoZSBwYXlsb2FkX2NoZWNrIHF1ZXJ5IHBhcnNlciBpbiBTb2xyIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgU3BhblBheWxvYWRDaGVja1F1ZXJ5LiZuYnNwOyBUaGlzIEx1Y2VuZSBxdWVyeSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHBheWxvYWQgZGF0YSB3aGlsZSBtYXRjaGluZy4mbmJzcDsgT25jZSB0aGUgdGVybSBoYXMgYmVlbiBtYXRjaGVkLCB0aGUgcGF5bG9hZCBpcyB0aGVuIGNoZWNrZWQgdG8gc2VlIGlmIGl0XHUyMDE5cyBhY3R1YWxseSBhIG1hdGNoLiZuYnNwOyBUaGlzIGZ1bmN0aW9uYWxpdHkgd2FzIHVzZWQgdG8gc3VwcG9ydCB0aGluZ3MgbGlrZSBwYXJ0IG9mIHNwZWVjaCB0YWdnaW5nIGZvciB0ZXJtcy4mbmJzcDsgSXQgYWxsb3dlZCBkZXZlbG9wZXJzIHRvIHVzZSBhIGRlbGltaXRlZCBwYXlsb2FkIGZpZWxkIGluIHRoZSBTb2xyIHNjaGVtYS4mbmJzcDsgVGhlIHZhbHVlcyBpbiB0aGF0IGZpZWxkIGNvdWxkIHRoZW4gYmUgZW5jb2RlZCB3aXRoIHRoZSB0ZXJtIGFuZCBhIHZhbHVlIGRlbGltaXRlZCBieSBhIHBpcGUuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5BbiBleGFtcGxlIG9mIFBhcnQgb2YgU3BlZWNoIHRhZ2dlZCB0ZXh0IHVzaW5nIHRoZSBkZWxpbWl0ZWQgcGF5bG9hZDo8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkx1Y2VuZXxOT1VOIGlzfFZFUkIgYXdlc29tZXxBREo8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkluIGFkZGl0aW9uIHRvIHRoZSBwYXlsb2FkcyBiZWluZyBzdHJpbmdzLCBhbiBpbnRlZ2VyIG9yIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNhbiBiZSBzdG9yZWQgdGhlcmUgYW5kIGVuY29kZWQgbGlrZTo8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlBlcnNvbnwwLjgyIENhdHwwLjc1IE1vbml0b3J8MC41NTxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+VGhlIG9ubHkgbWlzc2luZyBwaWVjZSB0byBiZWluZyBhYmxlIHRvIHVzZSB0aGlzIGZvciB0aGUgQUkgbW9kZWwgY2xhc3NpZmljYXRpb24gc2VhcmNoIHdhcyB0aGUgYWJpbGl0eSB0byBkbyBhIHJhbmdlIHNlYXJjaCBvbiB0aGUgcGF5bG9hZCBpbnN0ZWFkIG9mIGp1c3QgYW4gZXF1YWxzIG9wZXJhdGlvbi48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPldlIGhhZCB0aGUgcGxlYXN1cmUgb2YgcmVjZW50bHkgY29udHJpYnV0aW5nIHRoaXMgY2FwYWJpbGl0eSBiYWNrIHRvIEx1Y2VuZSBhbmQgU29sci4mbmJzcDsgVGhlIHBhdGNoIGluY2x1ZGVzIHRoZSBhYmlsaXR5IHRvIHByb3ZpZGUgYW4gb3BlcmF0aW9uIHdoaWxlIG1hdGNoaW5nIG5vdyB0byBzdXBwb3J0IGNvbW1vbiBvcGVyYXRpb25zIHN1Y2ggYXMgZ3JlYXRlciB0aGFuLCBsZXNzIHRoYW4sIGluIGFkZGl0aW9uIHRvIHRoZSBlcXVhbHMgb3BlcmF0b3IuJm5ic3A7IFdlXHUyMDE5cmUgaGFwcHkgdG8gc2VlIHRoYXQgaXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdXBjb21pbmcgU29sciA5LjAgcmVsZWFzZS4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlNvLCBub3cgd2UgY2FuIGV4cHJlc3MgdGhlIGRlc2lyZWQgcXVlcnkgYXM6PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD57IXBheWxvYWRfY2hlY2sgZj1cImNsYXNzaWZpY2F0aW9uc19kcGZzXCIgb3A9XCJndFwiIHBheWxvYWRzPVwiMC43NVwiIHY9XCJQZXJzb25cIn08XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZSBuZXcgcGF5bG9hZCBjaGVjayBxdWVyeSBwYXJzZXIgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIG9wZXJhdGlvbiBhbmQgdGhlIHBheWxvYWQgdmFsdWUgdG8gdXNlIGFzIHRoZSByZWZlcmVuY2UgZm9yIHRoYXQgb3BlcmF0aW9uLiZuYnNwOyBUaGUgYWJvdmUgZXhhbXBsZSBzZWFyY2hlcyB0aGUgXHUyMDFjY2xhc3NpZmljYXRpb25zX2RwZnNcdTIwMWQgZmllbGQgZm9yIGFueSBjbGFzc2lmaWNhdGlvbiBvZiBcdTIwMWNQZXJzb25cdTIwMWQgd2hlcmUgdGhlIHBheWxvYWQgaGFzIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuNzUuJm5ic3A7Jm5ic3A7PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5Tbywgd2l0aCB0aGlzIGxhc3Qgb3B0aW9uIHdlIGNhbiB1c2UgdGhlIHBheWxvYWQgY2hlY2sgcXVlcnkgcGFyc2VyIGluIFNvbHIgdG8gYWxsb3cgdXMgdG8gc2VhcmNoIGZvciBsYWJlbHMgZnJvbSB0aGUgY2xhc3NpZmljYXRpb24gbW9kZWwgdGhhdCBhcmUgYWJvdmUgYSB0aHJlc2hvbGQgY29uZmlkZW5jZSBzY29yZS4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZSB1bHRpbWF0ZSByZXN1bHQgaGVyZSBpcyB0aGF0IHdlIGdldCB0aGUgZnVsbCBhYmlsaXR5IHRvIHNlYXJjaCBvbiBhIHRlcm0gd2l0aCBvbmUgYWRkaXRpb25hbCBkaW1lbnNpb24gb2YgbWV0YWRhdGEgZmlsdGVyaW5nLiZuYnNwOyBUZXJtIGFuZCBQYXlsb2FkLiZuYnNwOyBUaGlzIHVubG9ja3MgYSBsb3Qgb2Ygb3RoZXIgcG9zc2liaWxpdGllcyB3aGVuIGl0IGNvbWVzIHRvIGltYWdlIHNlYXJjaC48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPk9uZSBwb3NzaWJsZSBleGFtcGxlIGlzIHRvIHB1dCB0aGUgbnVtYmVyIG9mIHBlb3BsZSBmb3VuZCBhcyBhIHBheWxvYWQuJm5ic3A7IFlvbG8gY2FuIGRldGVjdCBtdWx0aXBsZSBvYmplY3RzIGluIGEgc2NlbmUsIHNvIHRoZSB1c2VyIGNvdWxkIHNlYXJjaCBmb3Igc29tZXRoaW5nIGxpa2U6PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5cdTIwMWNBdCBsZWFzdCAyIHBlb3BsZSBhbmQgYSB0ZW5uaXMgcmFja2V0Llx1MjAxZDxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+SGF2aW5nIHRoZSBjbGFzc2lmaWVyIG91dHB1dCBmcm9tIFlvbG8gaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5QZXJzb258MiBUZW5uaXNfUmFja2V0fDEmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkEgc2ltaWxhciBhcHByb2FjaCBjYW4gYmUgdGFrZW4gaWYgeW91IHdhbnQgdG8gZW5jb2RlIHRoZSBjZW50ZXIgcG9pbnQgWCBhbmQgWSBjb29yZGluYXRlcy4gVGhpcyB3b3VsZCBlbmFibGUgc2VhcmNoZXMgbGlrZTombmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlx1MjAxY0ZpbmQgbWUgYSBwaWN0dXJlIHdpdGggYSBQZXJzb24gb24gdGhlIGxlZnQgYW5kIGEgUGl6emEgb24gdGhlIHJpZ2h0Llx1MjAxZDxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+VGhlIGNhcGFiaWxpdGllcyBpbmNyZWFzZSBmdXJ0aGVyIHdoZW4geW91IHN0YXJ0IHB1dHRpbmcgdG9nZXRoZXIgc2NlbmUgbGFiZWxzIGFsb25nIHdpdGggb2JqZWN0IGNsYXNzaWZpY2F0aW9uLCBsaWtlOiZuYnNwOyZuYnNwOzxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+WW9sbyArIFZHRzE2IHRvIGdldCBjb250ZXh0IGluIHRoZSBzZWFyY2ggcmVzdWx0cy48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkJ5IGNvbWJpbmluZyB0aGVzZSB0d28gY29tcHV0ZXIgdmlzaW9uIG1vZGVscyB3ZSBjYW4gc3RhcnQgYXNraW5nIHF1ZXN0aW9ucyBiZXlvbmQgd2hhdCBZb2xvIGFsb25lIGNhbiBhbnN3ZXIuJm5ic3A7Jm5ic3A7Jm5ic3A7PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5cdTIwMWNTaG93IG1lIGEgcGljdHVyZSBvZiBhdCBsZWFzdCAyIHBlb3BsZSBza2lpbmdcdTIwMWQmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPllvbG8gd2lsbCBkZXRlY3QgdGhlIG51bWJlciBvZiBwZW9wbGUgYW5kIHRoZSBWR0cxNiBtb2RlbCBkZXRlY3RzIHRoZSBhY3Qgb2Ygc2tpaW5nLjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PHN0cm9uZz5CZW5jaG1hcmtzPFwvc3Ryb25nPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+Rmlyc3QsIHNvbWUgbm90ZXMgYWJvdXQgaG93IHRoZSBiZW5jaG1hcmtzIHdlcmUgZ2VuZXJhdGVkOjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+RWFjaCBvZiB0aGUgNCBhcHByb2FjaGVzIGhhcyB0aGUgc2FtZSBjb25maWdzZXQuJm5ic3A7IEFsbCBjYWNoZSBzaXplcyAoZXhjZXB0IGZvciB0aGUgcGVyU2VnbWVudCBjYWNoZSkgd2VyZSBzZXQgdG8gemVybyBzaXplLiBBbGwgaW5kaWNlcyBpbiB0aGUgdGVzdCB3ZXJlIGEgc2luZ2xlIHNoYXJkIHdpdGggb25lIHNlZ21lbnQgYW5kIG5vIGRlbGV0ZWQgZG9jdW1lbnRzLiZuYnNwOyBBbGwgb2YgdGhlIGluZGljZXMgcmVwcmVzZW50IDEsMDAwLDAwMCBkb2N1bWVudHMuJm5ic3A7IEVhY2ggZG9jdW1lbnQgaGFzIGFuIGF2ZXJhZ2Ugb2YgNTAgY2xhc3NpZmljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBpdC4mbmJzcDsgRWFjaCBjbGFzc2lmaWNhdGlvbiBoYXMgYSByYW5kb20gY29uZmlkZW5jZSBzY29yZSBmcm9tIDAgdG8gMS4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkFwcHJvYWNoIDEgRG9jdW1lbnQgRXhhbXBsZTogQSBtdWx0aS12YWx1ZWQgZmllbGQgdGhhdCBjb250YWlucyBvbmx5IHRoZSBsYWJlbHMgdGhhdCBoYWQgYSBjb25maWRlbmNlIHNjb3JlIGdyZWF0ZXIgdGhhbiAwLjc1LjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PHN0cm9uZz57Jm5ic3A7PFwvc3Ryb25nPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHByZT48c3Ryb25nPiZuYnNwOyZuYnNwO1wiaWQ8XC9zdHJvbmc+XCI6XCJkb2NfNzgzNzVcIiw8YnI+Jm5ic3A7Jm5ic3A7XCI8c3Ryb25nPmNsYXNzaWZpY2F0aW9uX3NzPFwvc3Ryb25nPlwiOiZuYnNwOyBbXCJsYWJlbF83NzkyXCIsXCJsYWJlbF85Njg5XCIsXCJsYWJlbF8yMDQ5XCIsXCJsYWJlbF82NTgxXCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfNDc5NVwiLFwibGFiZWxfMTc4MFwiLFwibGFiZWxfNjMyM1wiLFwibGFiZWxfNDkzOVwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzg4MThcIixcImxhYmVsXzg3N1wiLFwibGFiZWxfODUyNFwiLFwibGFiZWxfMzE1OVwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzQ3NzZcIixcImxhYmVsXzEyNzZcIixcImxhYmVsXzcxMDRcIixcImxhYmVsXzQzMzVcIiw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCJsYWJlbF8xMDhcIixcImxhYmVsXzU2NzVcIixcImxhYmVsXzQyNFwiLFwibGFiZWxfNzc0NVwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzQxNDRcIixcImxhYmVsXzI3MTJcIixcImxhYmVsXzQ3ODJcIixcImxhYmVsXzk4OTRcIiw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCJsYWJlbF8yNzc3XCIsXCJsYWJlbF8xMjY3XCIsXCJsYWJlbF84OTE5XCIsXCJsYWJlbF81MzMyXCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfNzE1OVwiLFwibGFiZWxfNDEzOVwiLFwibGFiZWxfNjcxNFwiXX08XC9wcmU+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5BcHByb2FjaCAyIERvY3VtZW50IEV4YW1wbGU6IEEgZG9jdW1lbnQgd2l0aCBhIGZpZWxkIGZvciBlYWNoIGxhYmVsIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBjb25maWRlbmNlIHNjb3JlIGZvciB0aGF0IGxhYmVsLjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHByZT48c3Ryb25nPns8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJpZFwiOjxcL3N0cm9uZz48c3Ryb25nPlwiZG9jX2RvY18yMDI5NVwiPFwvc3Ryb25nPjxzdHJvbmc+LDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzI2NF9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjUwNTkyNTY8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzQ3NzdfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC44MDc1NTkxPFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF81NzczX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNjUxMjE0NzxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNjU4NF9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjQ0ODYwMzg3PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF81MDUzX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNzc2Nzc0NjQ8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzIzMDdfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC45OTEzNDU5NDxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfOTQ0N19mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjYxOTg1NTQ8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzE1MzRfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC45OTM3NTI8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzI0ODlfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4zODEyOTczPFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF8xNTc4X2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNjc3MTIyNTM8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzc1ODNfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC45Mjc2ODA3PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF83OTZfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC45MjU2ODY0PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF8zNDVfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4yMTY0NzYxNDxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfODMyNl9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjQyNzk3NjEzPFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF82MDIzX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuMTYxNTk0MzM8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzMyMjBfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC44MjU0NjM2NTxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNDA2N19mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjk0MDIxNDxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfOTMyX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNzEyMzkyNTc8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzczMjNfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4zMzM0MTY0NjxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNTIwM19mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjA3MjkzNjM1NjxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfODQ3NF9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjYzMzAwNzU8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzIwMzJfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC40NTE4MzU3NTxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNjM3MV9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjg2NTYzMTU8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzM0ODhfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4wNTIyNTc1OTc8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzQxMzdfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4xNTQxNjM5NjxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNjUwOV9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjUyNTExNDU0PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF84OTg5X2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNDE3MzI0MjQ8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzEwNjdfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC40NTg0NzUzNTxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNTg5Ml9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjkwNDAxNjM8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzgxNjlfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4yNjA1NzQzNDxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfMzUyNF9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjI2MjI0Nzc0PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF80OTEyX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuMDM3NTIzNjg3PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF8zNzcyX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNTg3Mzg0PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF8zMTE2X2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuMjQ1MDAxMjxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNTA2OV9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjcwNTM4MzY2PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF81OTM5X2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuOTA1MzkyMzU8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzMzNjlfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC40ODg1NjE1PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF8zNzk4X2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuMzU3MjI3NjI8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzUxMTFfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4zMzAwMTU2PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF8xNjg0X2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuMTg2OTg0NDI8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzY3MzVfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC43MTQ0MTA2PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF83ODMwX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNzk0NzgxMTU8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzMyNDBfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC43MDQyNTM3PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF8yNDEwX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuMDkxMTQ3NjY8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzU0MTlfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC44Mzk2NjYzNzxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfNDIwN19mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjAwMzUxOTExNzg8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzQ0ODRfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC41NDQxMTA0PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF82NzYxX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuNjk1NTkwNzM8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzIxMTdfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4zOTczNjA5MjxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfMTI5OF9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjg0MzA0MjQ8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzU4NDdfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC4yMjk2NDI5MzxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfMzk1MF9mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjY1Mzg3NDY8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzY1NThfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC42OTczMDM1MzxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfMTI3M19mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjAyNDc4NTE2MTxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfMzkyN19mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjAwMTM0MTIyMzc8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzE3NTlfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC43NTYzOTI4NDxcL3N0cm9uZz48c3Ryb25nPl0sPGJyPjxcL3N0cm9uZz48c3Ryb25nPiZuYnNwOyZuYnNwO1wibGFiZWxfMzU1M19mc1wiOls8XC9zdHJvbmc+PHN0cm9uZz4wLjUyNjg0ODU8XC9zdHJvbmc+PHN0cm9uZz5dLDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsXzUxNDNfZnNcIjpbPFwvc3Ryb25nPjxzdHJvbmc+MC44NDUwMjc1PFwvc3Ryb25nPjxzdHJvbmc+XSw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJsYWJlbF85MzAxX2ZzXCI6WzxcL3N0cm9uZz48c3Ryb25nPjAuMTI1ODUzODQ8XC9zdHJvbmc+PHN0cm9uZz5dfTxcL3N0cm9uZz48XC9wcmU+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+QXBwcm9hY2ggMyBFeGFtcGxlIERvY3VtZW50OiZuYnNwOyBPbmUgZG9jdW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSByZWNvcmQgYmVpbmcgY2xhc3NpZmllZCBhbmQgYW4gYWRkaXRpb25hbCBkb2N1bWVudCBmb3IgZXZlcnkgY2xhc3NpZmljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZG9jdW1lbnQuJm5ic3A7IFRoZSB0b3RhbCBudW1iZXIgb2YgZG9jdW1lbnRzIGluIHRoaXMgaW5kZXggd2FzIDEsMDAwLDAwMCBmb3IgdGhlIHBhcmVudCBkb2N1bWVudHMgYW5kIDUwLDQ4NSwzMzQgZG9jdW1lbnRzIGZvciBlYWNoIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiByZWNvcmRzLjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PHN0cm9uZz4jIEV4YW1wbGUgUGFyZW50IERvY3VtZW50PFwvc3Ryb25nPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHByZT48c3Ryb25nPns8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJpZFwiOjxcL3N0cm9uZz48c3Ryb25nPlwiZG9jXzcyOTQxM1wiPGJyPjxcL3N0cm9uZz48c3Ryb25nPn08XC9zdHJvbmc+PFwvcHJlPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PHN0cm9uZz4jIEV4YW1wbGUgQ2xhc3NpZmljYXRpb24gRG9jdW1lbnQgKG9uIGF2ZXJhZ2UgNTAgb2YgdGhlc2UgZm9yIGVhY2ggcGFyZW50IGRvY3VtZW50Lik8XC9zdHJvbmc+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cHJlPjxzdHJvbmc+ezxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImlkXCI6PFwvc3Ryb25nPjxzdHJvbmc+XCJkb2NfNzI5NDEzXzVcIjxcL3N0cm9uZz48c3Ryb25nPiw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJwYXJlbnRfaWRfc1wiOjxcL3N0cm9uZz48c3Ryb25nPlwiZG9jXzcyOTQxM1wiPFwvc3Ryb25nPjxzdHJvbmc+LDxicj48XC9zdHJvbmc+PHN0cm9uZz4mbmJzcDsmbmJzcDtcImxhYmVsX3NcIjo8XC9zdHJvbmc+PHN0cm9uZz5cImxhYmVsXzQwNjdcIjxcL3N0cm9uZz48c3Ryb25nPiw8YnI+PFwvc3Ryb25nPjxzdHJvbmc+Jm5ic3A7Jm5ic3A7XCJjb25maWRlbmNlX2ZcIjo8XC9zdHJvbmc+PHN0cm9uZz4wLjIxODUwNDQ5PGJyPjxcL3N0cm9uZz48c3Ryb25nPn08XC9zdHJvbmc+PFwvcHJlPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+QXBwcm9hY2ggNCBFeGFtcGxlIERvY3VtZW50OiBBIGRvY3VtZW50IHdpdGggYSBzaW5nbGUgZmllbGQgY29udGFpbmluZyBhbGwgY2xhc3NpZmljYXRpb24gbGFiZWxzIHdpdGggdGhlIGNvbmZpZGVuY2UgbGV2ZWwgZW5jb2RlZCBhcyBhIHBheWxvYWQuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cHJlPns8YnI+Jm5ic3A7Jm5ic3A7XCI8c3Ryb25nPmlkPFwvc3Ryb25nPlwiOlwiZG9jX2RvY18zMzMxMTRcIiw8YnI+Jm5ic3A7Jm5ic3A7XCI8c3Ryb25nPmNsYXNzX2RwZnM8XC9zdHJvbmc+XCI6W1wibGFiZWxfNjg3MnwwLjc5NDkwODJcIixcImxhYmVsXzM1NTB8MC4yMjk5NTAzMVwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzc1NjF8MC42Njk5OTQ4M1wiLFwibGFiZWxfMzU3NXwwLjc2MzQ5MzA2XCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfNjU2N3wwLjI5MTcwNDEyXCIsXCJsYWJlbF85MzAwfDAuMjI4Nzg4MDJcIiw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCJsYWJlbF83MTQ2fDAuMTUyNDk5OTFcIixcImxhYmVsXzc4NTN8MC4yNjc3NTA0NFwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzkzMzB8MC42OTE5MzI4NlwiLFwibGFiZWxfMzE1fDAuMzgxMjg1OVwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzk5NDF8MC42MDI0MzY2NlwiLFwibGFiZWxfNTQ0OHwwLjQ5MDk1OTdcIiw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCJsYWJlbF8zODk4fDAuMjc3MjQwNFwiLFwibGFiZWxfMzc5OHwwLjU4NDczNDc0XCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfMTA0MHwwLjM5NTM1NjQ4XCIsXCJsYWJlbF8zMDE3fDAuNTEyODIyMVwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzU2MTF8MC4xNTExNTAxXCIsXCJsYWJlbF83Nzc3fDAuOTM2MjE2NTNcIiw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCJsYWJlbF82NTg5fDAuNDgxMTIyMzdcIixcImxhYmVsXzYwMjN8MC42OTQyMjM0NlwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzY1MjV8MC40OTg5MTE5MlwiLFwibGFiZWxfNjU4MHwwLjQxNzk1OTU3XCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfNjgwN3wwLjU0MjQyNTJcIixcImxhYmVsXzYyMzN8MC4zMDk3Njc2XCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfNjI0fDAuOTc2MzU3OFwiLFwibGFiZWxfMTcyNnwwLjM4NDcxMTJcIiw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCJsYWJlbF85MTM5fDAuNTMxNzEwOFwiLFwibGFiZWxfNjMzMHwwLjY0NjQwNTY0XCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfMjQxM3wwLjI0NDM5NTU1XCIsXCJsYWJlbF8xMzcyfDAuMTc3NjIyOTFcIiw8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCJsYWJlbF81NjJ8MC4zNjE0NTE1XCIsXCJsYWJlbF83ODI4fDAuNzY0MjM2NVwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzM3ODZ8MC4xOTAxODc2M1wiLFwibGFiZWxfOTQwOXwwLjc1MjYxNjQ3XCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfNjE5fDAuMTg3NzMzNTNcIixcImxhYmVsXzM0OTZ8MC40NDQ2NTYyXCIsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wibGFiZWxfMzU1NnwwLjQzMTcyNDI1XCIsXCJsYWJlbF83Mjc4fDAuNTU1OTI4MlwiLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcImxhYmVsXzY4NTF8MC40MjM0MjEzOFwiXX08XC9wcmU+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPGgzPkJlbmNobWFyayBSZXN1bHRzPFwvaDM+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPGg0PkluZGV4IENvbXBhcmlzb24mbmJzcDs8XC9oND5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6dGFibGUgLS0+PFwvcD5cbjxmaWd1cmU+XG48dGFibGU+XG48dGJvZHk+XG48dHI+XG48dGQ+PHN0cm9uZz5NZXRyaWM8XC9zdHJvbmc+PFwvdGQ+XG48dGQ+PHN0cm9uZz5BcHByb2FjaCAxPFwvc3Ryb25nPjxcL3RkPlxuPHRkPjxzdHJvbmc+QXBwcm9hY2ggMjxcL3N0cm9uZz48XC90ZD5cbjx0ZD48c3Ryb25nPkFwcHJvYWNoIDM8XC9zdHJvbmc+PFwvdGQ+XG48dGQ+PHN0cm9uZz5BcHByb2FjaCA0PFwvc3Ryb25nPjxcL3RkPlxuPHRkPjxzdHJvbmc+Q29tbWVudHM8XC9zdHJvbmc+PFwvdGQ+XG48XC90cj5cbjx0cj5cbjx0ZD5EUFM8XC90ZD5cbjx0ZD4xMTc2MTxcL3RkPlxuPHRkPjIwOTxcL3RkPlxuPHRkPjQwOTxcL3RkPlxuPHRkPjM1NjY8XC90ZD5cbjx0ZD5Eb2N1bWVudHMgaW5kZXhlZCBvbiBhIHNpbmdsZSB0aHJlYWQgZ2VuZXJhdGluZyByYW5kb20gZGF0YS4mbmJzcDsgVXBkYXRlcyBiYXRjaGVkLCBubyBjb21taXR0aW5nIHdoaWxlIGZlZWRpbmcgY29udGVudC4mbmJzcDsgT25seSBhIHNpbmdsZSByZXBsaWNhIGFjdGl2ZS48XC90ZD5cbjxcL3RyPlxuPHRyPlxuPHRkPkluZGV4IFNpemU8XC90ZD5cbjx0ZD4yMTkuMzI8XC90ZD5cbjx0ZD45MDYuOTk8XC90ZD5cbjx0ZD4yNjEwPFwvdGQ+XG48dGQ+MTIyMDxcL3RkPlxuPHRkPlNpemUgaW4gTUI8XC90ZD5cbjxcL3RyPlxuPHRyPlxuPHRkPk1lbW9yeTxcL3RkPlxuPHRkPjE3NzI8XC90ZD5cbjx0ZD4xMzYxMTA4PFwvdGQ+XG48dGQ+NTU1NjxcL3RkPlxuPHRkPjE0NjA8XC90ZD5cbjx0ZD5BcyByZXBvcnRlZCBmcm9tIHNvbHIgYWRtaW4gZ3VpPFwvdGQ+XG48XC90cj5cbjx0cj5cbjx0ZD5UZXN0IFF1ZXJ5PFwvdGQ+XG48dGQ+Y2xhc3NpZmljYXRpb25fc3M6bGFiZWxfNzc5MjxcL3RkPlxuPHRkPmxhYmVsXzc3OTJfZnM6WzAuNzUgVE8gKl08XC90ZD5cbjx0ZD57IWpvaW4gZnJvbT1cInBhcmVudF9pZF9zXCIgdG89XCJpZFwiIHY9XCIrbGFiZWxfczpsYWJlbF83NzkyICtjb25maWRlbmNlX2Y6WzAuNzUgVE8gKl1cIn08XC90ZD5cbjx0ZD57IXBheWxvYWRfY2hlY2sgb3A9XCJndFwiIGY9XCJjbGFzc19kcGZzXCIgcGF5bG9hZHM9XCIwLjc1XCJ9bGFiZWxfNzc5MjxcL3RkPlxuPHRkPkV4YW1wbGUgc3ludGF4PFwvdGQ+XG48XC90cj5cbjxcL3Rib2R5PlxuPFwvdGFibGU+XG48XC9maWd1cmU+XG48cD48IS0tIFwvd3A6dGFibGUgLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48c3Ryb25nPkluZGV4aW5nIEJlbmNobWFyayBDb21tZW50YXJ5PFwvc3Ryb25nPjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+VGhlcmUgYXJlIHNvbWUgaW50ZXJlc3RpbmcgdGFrZWF3YXlzIGZyb20gdGhpcyBiZW5jaG1hcmsuJm5ic3A7Jm5ic3A7PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5JbmRleGluZyBQZXJmb3JtYW5jZTxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOmxpc3QgLS0+PFwvcD5cbjx1bD5cbjxsaT5BcyBleHBlY3RlZCwgd2l0aCBBcHByb2FjaCAxLCB0aGUgZG9jdW1lbnRzIHdlcmUgZmFzdGVyIHRvIGluZGV4IGFzIHNvbWUgZGF0YSBpcyBiZWluZyBkaXNjYXJkZWQuIFByZS1maWx0ZXJpbmcgdGhlIGRhdGEgeWllbGRzIHNtYWxsZXIgZG9jdW1lbnRzLCBhbmQgYXMgYSByZXN1bHQgdGhleSBhcmUgZmFzdGVyIHRvIGluZGV4LiZuYnNwOyBJdCB3YXMgc2xpZ2h0bHkgc3VycHJpc2luZyB0byBzZWUgdGhlIG5lZ2F0aXZlIGltcGFjdCBvZiBoYXZpbmcgbWFueSBmaWVsZHMgb24gYSBkb2N1bWVudC4mbmJzcDsmbmJzcDs8XC9saT5cbjxsaT5BcHByb2FjaCAyIGRvY3VtZW50cyB3ZXJlIG11Y2ggbGFyZ2VyIG92ZXJhbGwgY29tcGFyZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGFwcHJvYWNoZXMgYW5kIGFzIGEgcmVzdWx0LCB0aGlzIGFwcHJvYWNoIHdhcyB0aGUgc2xvd2VzdCB0byBpbmRleCBvdmVyYWxsLiZuYnNwOzxcL2xpPlxuPGxpPkFwcHJvYWNoIDMgd2l0aCB0aGUgY2hpbGRyZW4gZG9jdW1lbnRzIHdhcyBhYm91dCAyeCBmYXN0ZXIgdGhhbiBhcHByb2FjaCAyIGZvciBpbmRleGluZy48XC9saT5cbjxsaT5BcHByb2FjaCA0IHdpdGggdGhlIHBheWxvYWQgd2FzIGFib3V0IDE2IHRpbWVzIGZhc3RlciBBcHByb2FjaCAyIHRvIGluZGV4LiZuYnNwOyBUaGUgcGF5bG9hZCBhcHByb2FjaCBkZWZpbml0ZWx5IGhhcyBhIG1ham9yIGluZGV4aW5nIHBlcmZvcm1hbmNlIGFkdmFudGFnZSBvdmVyIHRoZSBvdGhlciBhcHByb2FjaGVzLjxcL2xpPlxuPFwvdWw+XG48cD48IS0tIFwvd3A6bGlzdCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkluZGV4IFNpemU8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpsaXN0IC0tPjxcL3A+XG48dWw+XG48bGk+QXBwcm9hY2ggMSB5aWVsZGVkIHRoZSBzbWFsbGVzdCBpbmRleCBhcyBkYXRhIHdhcyBiZWluZyB0aHJvd24gYXdheSBhbmQgdGhlIGRhdGEgbW9kZWwgaXMgdGhlIHNpbXBsZXN0LjxcL2xpPlxuPGxpPkFwcHJvYWNoIDIgd2FzIHRoZSBtb3N0IGVmZmljaWVudCBpbiB0ZXJtcyBvZiBpbmRleCBzaWRlIGJldHdlZW4gMiwzIGFuZCA0LiZuYnNwOyBUaGlzIGxlbmRzIHNvbWUgb2YgdGhlIHBlcmZvcm1hbmNlIGlzc3VlcyB0byB0aGlzIGFwcHJvYWNoIHRvIHNpbXBseSBiZSBhdHRyaWJ1dGVkIHRvIHRoZSBqc29uIGZvcm1hdHRpbmcuJm5ic3A7PFwvbGk+XG48bGk+QXBwcm9hY2ggMyB1c2luZyBjaGlsZHJlbiBkb2N1bWVudHMgaGFkIHRoZSBsYXJnZXN0IGluZGV4IHNpemUgb3ZlciBhbGwsIHNob3dpbmcgdGhlIGltcGFjdCBvZiB0aGUgYWRkaXRpb25hbCBjaGlsZHJlbiBkb2N1bWVudHMgaW4gdGhlIGluZGV4LiZuYnNwOyZuYnNwOzxcL2xpPlxuPGxpPkFwcHJvYWNoIDQgd2FzIG9ubHkgYWJvdXQgMzMlIGxhcmdlciB0aGFuIHRoZSBmaWVsZCBiYXNlZCBBcHByb2FjaCAyIGFuZCBsZXNzIHRoYW4gXHUwMGJkIHRoZSBzaXplIG9mIEFwcHJvYWNoIDMuJm5ic3A7IFRoZSBrZXkgaXRlbSB0byBub3RlIGhlcmUgaXMgdGhlIGFkZGl0aW9uYWwgLnBheSBmaWxlcyBpbiB0aGUgaW5kZXggdG8gc3RvcmUgdGhlIHBheWxvYWQgZGF0YS48XC9saT5cbjxcL3VsPlxuPHA+PCEtLSBcL3dwOmxpc3QgLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5NZW1vcnkgVXNhZ2U8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpsaXN0IC0tPjxcL3A+XG48dWw+XG48bGk+QXBwcm9hY2ggNCBoYWQgdGhlIGxvd2VzdCBtZW1vcnkgb3ZlcmhlYWQgZm9yIGhhdmluZyB0aGUgaW5kZXggb3Blbi4mbmJzcDsgVGhpcyB3YXMgYSB2ZXJ5IHN1cnByaXNpbmcgcmVzdWx0LiZuYnNwOyZuYnNwOzxcL2xpPlxuPGxpPkFwcHJvYWNoIDIgeWllbGRlZCB0aGUgbGFyZ2VzdCBzdXJwcmlzZS4mbmJzcDsgVGhlIGluZGV4IGhlYXAgdXNhZ2Ugd2FzIG5lYXJseSAxMDAweCB0aGF0IG9mIHRoZSBvdGhlciBhcHByb2FjaGVzLiZuYnNwOyBUaGlzIHJlYWxseSBoaWdobGlnaHRzIHRoZSBvdmVyaGVhZCBvZiBoYXZpbmcgMTAsMDAwIGZpZWxkcyBpbiB0aGUgaW5kZXguJm5ic3A7IFRoaXMgaXMgcmVsYXRpdmVseSBkcmFtYXRpYyBhbmQgc2hvdWxkblx1MjAxOXQgYmUgaWdub3JlZC4mbmJzcDsmbmJzcDs8XC9saT5cbjxcL3VsPlxuPHA+PCEtLSBcL3dwOmxpc3QgLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48aDQ+PHN0cm9uZz5RdWVyeSBQZXJmb3JtYW5jZSBDb21wYXJpc29uPFwvc3Ryb25nPjxcL2g0PlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDp0YWJsZSAtLT48XC9wPlxuPGZpZ3VyZT5cbjx0YWJsZT5cbjx0Ym9keT5cbjx0cj5cbjx0ZD5NZXRyaXg8XC90ZD5cbjx0ZD5BcHByb2FjaCAxPFwvdGQ+XG48dGQ+QXBwcm9hY2ggMjxcL3RkPlxuPHRkPkFwcHJvYWNoIDM8XC90ZD5cbjx0ZD5BcHByb2FjaCA0PFwvdGQ+XG48dGQ+Q29tbWVudHM8XC90ZD5cbjxcL3RyPlxuPHRyPlxuPHRkPk51bWJlciBvZiBxdWVyaWVzPFwvdGQ+XG48dGQ+MTAwMDA8XC90ZD5cbjx0ZD4xMDAwMDxcL3RkPlxuPHRkPjEwMCo8XC90ZD5cbjx0ZD4xMDAwMDxcL3RkPlxuPHRkPkpvaW4gcXVlcmllcyB3ZXJlIHNvIHNsb3csIHRoZSB0ZXN0IHdhcyBzdG9wcGVkIGFmdGVyIDEwMCBxdWVyaWVzPFwvdGQ+XG48XC90cj5cbjx0cj5cbjx0ZD5hdmVyYWdlPFwvdGQ+XG48dGQ+MTxcL3RkPlxuPHRkPjI8XC90ZD5cbjx0ZD4xODAzPFwvdGQ+XG48dGQ+MzxcL3RkPlxuPHRkPkluIG1pbGxpc2Vjb25kczxcL3RkPlxuPFwvdHI+XG48dHI+XG48dGQ+bWluPFwvdGQ+XG48dGQ+MTxcL3RkPlxuPHRkPjE8XC90ZD5cbjx0ZD4xNjU2PFwvdGQ+XG48dGQ+MjxcL3RkPlxuPHRkPm1zPFwvdGQ+XG48XC90cj5cbjx0cj5cbjx0ZD5tYXg8XC90ZD5cbjx0ZD42PFwvdGQ+XG48dGQ+MjI8XC90ZD5cbjx0ZD4yMDkyPFwvdGQ+XG48dGQ+NDc8XC90ZD5cbjx0ZD5tczxcL3RkPlxuPFwvdHI+XG48dHI+XG48dGQ+c3RkIGRldjxcL3RkPlxuPHRkPjAuNTU8XC90ZD5cbjx0ZD4wLjc5PFwvdGQ+XG48dGQ+ODguMjg8XC90ZD5cbjx0ZD4xLjU1PFwvdGQ+XG48dGQ+Jm5ic3A7PFwvdGQ+XG48XC90cj5cbjx0cj5cbjx0ZD50aHJvdWdocHV0PFwvdGQ+XG48dGQ+NjM2PFwvdGQ+XG48dGQ+MzQ3Ljk8XC90ZD5cbjx0ZD4wLjU1NjY2NjY2NzxcL3RkPlxuPHRkPjI1NDxcL3RkPlxuPHRkPlF1ZXJpZXMgcGVyIHNlY29uZCAoc2luZ2xlIHRocmVhZGVkIGV4ZWN1dGlvbik8XC90ZD5cbjxcL3RyPlxuPHRyPlxuPHRkPnNlbnQga2JcL3NlYzxcL3RkPlxuPHRkPjEwOTxcL3RkPlxuPHRkPjYwLjA5PFwvdGQ+XG48dGQ+MC4xNTxcL3RkPlxuPHRkPjYxLjU8XC90ZD5cbjx0ZD4mbmJzcDs8XC90ZD5cbjxcL3RyPlxuPHRyPlxuPHRkPnJlY2VpdmVkIGtiXC9zZWM8XC90ZD5cbjx0ZD42MTI0PFwvdGQ+XG48dGQ+ODk4OC44NDxcL3RkPlxuPHRkPjAuODI8XC90ZD5cbjx0ZD45NDguODg8XC90ZD5cbjx0ZD4mbmJzcDs8XC90ZD5cbjxcL3RyPlxuPHRyPlxuPHRkPmF2ZyBieXRlczxcL3RkPlxuPHRkPjk4NjE8XC90ZD5cbjx0ZD4yNjQ2MS4zPFwvdGQ+XG48dGQ+MTQ5OTxcL3RkPlxuPHRkPjM4MjYuMTxcL3RkPlxuPHRkPkF2ZXJhZ2UgcmVzcG9uc2Ugc2l6ZSBpbiBieXRlczxcL3RkPlxuPFwvdHI+XG48XC90Ym9keT5cbjxcL3RhYmxlPlxuPFwvZmlndXJlPlxuPHA+PCEtLSBcL3dwOnRhYmxlIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PHN0cm9uZz5RdWVyeSBCZW5jaG1hcmsgQ29tbWVudGFyeTxcL3N0cm9uZz48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPkZyb20gYSBwdXJlIHBlcmZvcm1hbmNlIHBlcnNwZWN0aXZlLCBhZ2Fpbiwgbm8gc3VycHJpc2UgdGhhdCBBcHByb2FjaCAxIGlzIHRoZSBmYXN0ZXN0LiZuYnNwOyBUaGUgam9pbiBxdWVyeSBhcHByb2FjaCAoQXBwcm9hY2ggMykgcmVhbGx5IHNob3dzIGhvdyBpdHMgcGVyZm9ybWFuY2UgaXMgb3JkZXJzIG9mIG1hZ25pdHVkZSBzbG93ZXIgdGhhbiBzaW1wbGUgdGVybSBhbmQgcmFuZ2UgcXVlcmllcyBpbiBTb2xyLiZuYnNwOyBUaGUgc2Vjb25kIGJlc3QgcXVlcnkgcGVyZm9ybWFuY2Ugd2FzIHRoZSBmaWVsZCBmb3IgZWFjaCBsYWJlbCAoQXBwcm9hY2ggMikuJm5ic3A7IFRoaXMgcmVhbGx5IGhpZ2hsaWdodHMgaG93IGVmZmljaWVudCBTb2xyXC9MdWNlbmUgaXMgYXQgcGVyZm9ybWluZyByYW5nZSBxdWVyeSBvcGVyYXRpb25zLiZuYnNwOyBJdCBhbHNvIHNob3dzIHRoYXQgaXRcdTIwMTlzIG5vdCBtdWNoIG9mIGEgY29zdCB0byB1c2UgcGF5bG9hZHMgY29tcGFyZWQgdG8gdGhlIGV4cGVuc2l2ZSBqb2luIG9wZXJhdGlvbnMuPFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5PbmUgb3RoZXIgdGhpbmcgdG8gbm90ZSBhYm91dCB0aGUgcGF5bG9hZCBhcHByb2FjaCAoQXBwcm9hY2ggNCkgaXMgdGhhdCBmb3IgdGhpcyBkYXRhc2V0LCB0aGUganNvbiBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQgd2l0aCB0aGUgcGF5bG9hZHMgaXMgZXZlbiB0aWdodGVyIHRoYW4gQXBwcm9hY2ggMS4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjxzdHJvbmc+TmV4dCBTdGVwcyZuYnNwOzxcL3N0cm9uZz48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZXJlIGFyZSBhbHdheXMgdGhpbmdzIHRoYXQgY2FuIGJlIGltcHJvdmVkIGFuZCBidWlsdCB1cG9uLiZuYnNwOyBBcyBhIHJlc3VsdCBvZiBpbXBsZW1lbnRpbmcgdGhpcyBmZWF0dXJlLCBpdCB3YXMgbm90aWNlZCB0aGF0IHRoZSBwYXlsb2FkIGVuY29kaW5nIGFuZCBkZWNvZGluZyBjb2RlIGlzIGEgYml0IGZyYWdtZW50ZWQuJm5ic3A7IEl0IHdvdWxkIGJlIG5pY2UgdG8gY2VudHJhbGl6ZSBhbmQgY29uc29saWRhdGUgc29tZSBvZiB0aGF0IGxvZ2ljIHdpdGggdGhlIGhvcGUgb2YgbWFraW5nIHBheWxvYWRzIG1vcmUgZXh0ZW5zaWJsZS4mbmJzcDsmbmJzcDs8XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZXJlIGFyZSBzb21lIG90aGVyIG5vdmVsIHF1ZXJpZXMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIHdpdGggdGhlIG5ldyBwYXlsb2FkIHN1cHBvcnQuIEZvciBleGFtcGxlLCBpZiB1c2luZyB0aGUgY2xhc3NpZmljYXRpb25zIGFzIGEgZmVhdHVyZSB2ZWN0b3IsIGEgcXVlcnkgY2FuIGJlIGNyZWF0ZWQgdG8gZmluZCBvdGhlciBkb2N1bWVudHMgdGhhdCB3ZXJlIGNsYXNzaWZpZWQgaW4gYSBzaW1pbGFyIG1hbm5lciB0byBpbXBsZW1lbnQgYSBcdTIwMWNmaW5kIHNpbWlsYXJcdTIwMWQgZm9yIGltYWdlIGRhdGEuJm5ic3A7PFwvcD5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5Hb2luZyBiZXlvbmQgdGhpcywgb25lIGNvdWxkIGVudmlzaW9uIGV4dGVuZGluZyB0aGUgcGF5bG9hZCBzdXBwb3J0ZWQgZGF0YSB0eXBlcyB0byBpbmNsdWRlIGEgdmVjdG9yIG9mIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB0byBlbmFibGUgdmVjdG9yIGJhc2VkIG1hdGNoaW5nIGNhbGN1bGF0aW9ucyBzdWNoIGFzIGNvc2luZSwgbWFuaGF0dGFuLCBvciBldWNsaWRlYW4gZGlzdGFuY2UgbWV0cmljcyBmb3Igc2ltaWxhcml0eS48XC9wPlxuPHA+PCEtLSBcL3dwOnBhcmFncmFwaCAtLT48XC9wPlxuPHA+PCEtLSB3cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPlRoZSB1bHRpbWF0ZSByZWFsaXphdGlvbiBvZiB0aGUgcG93ZXIgb2YgdGhpcyBmdW5jdGlvbmFsaXR5IHdpbGwgdWx0aW1hdGVseSBiZSB0aHJvdWdoIE5MVSB0ZWNobmlxdWVzIHRvIHRyYW5zbGF0ZSBmcmVlIHRleHQgcXVlcmllcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBwYXlsb2FkIGNoZWNrIHF1ZXJpZXMuJm5ic3A7IE1vcmUgdG8gY29tZSBvbiB0aGF0LjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD48IS0tIHdwOnBhcmFncmFwaCAtLT48XC9wPlxuPGgzPjxzdHJvbmc+Q29uY2x1c2lvbjxcL3N0cm9uZz48XC9oMz5cbjxwPjwhLS0gXC93cDpwYXJhZ3JhcGggLS0+PFwvcD5cbjxwPjwhLS0gd3A6cGFyYWdyYXBoIC0tPjxcL3A+XG48cD5UaGUgYmlnZ2VzdCB0YWtlIGF3YXkgaGVyZSBpcyB0aGF0IGFzIHlvdSByZXF1aXJlIG1vcmUgZ3JhbnVsYXIgcXVlcnkgY2FwYWJpbGl0aWVzLCB0aGUgZXhwZW5zZSBvZiB0aGUgcXVlcnkgZ29lcyB1cC4mbmJzcDsgSWYgYW4gYXBwbGljYXRpb24gdHJ1bHkgbmVlZHMgdG8gZG8gYSBmdWxsIHJlbGF0aW9uYWwgc3R5bGUgam9pbiBxdWVyeSwgdGhlbiBzcGVjaWFsIGF0dGVudGlvbiBuZWVkcyB0byBiZSBwYWlkIHRvIGhvdyB0aGF0IHN5c3RlbSBpcyBzY2FsZWQuJm5ic3A7IEFkZGl0aW9uYWxseSwgd2UgY2FuIGFsc28gc2VlIHRoYXQgcGF5bG9hZHMgYmVjb21lIGEgdmVyeSBhdHRyYWN0aXZlIGRlc2lnbiBwYXR0ZXJuIGR1ZSB0byB0aGUgaW5kZXhpbmcgcGVyZm9ybWFuY2UsIG1lbW9yeSB1c2FnZSBjaGFyYWN0ZXJpc3RpY3MsIHF1ZXJ5IHBlcmZvcm1hbmNlLCBhbmQgdWx0aW1hdGVseSBxdWVyeSBncmFudWxhcml0eSBtYWtlIGl0IGEgdmlhYmxlIGFwcHJvYWNoIGZvciBhcHBsaWNhdGlvbnMgdG8gYXZvaWQgbmVlZGluZyB0byBzY2FsZSB1cCBmb3IgdXNpbmcgYSBqb2luIHF1ZXJ5LjxcL3A+XG48cD48IS0tIFwvd3A6cGFyYWdyYXBoIC0tPjxcL3A+In0sImVsZW1lbnRzIjpbXSwid2lkZ2V0VHlwZSI6InRleHQtZWRpdG9yIn0=\\\"]\\t\\t\\t<\\\/div>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t<\\\/div><\\\/div>\\r\\n\\t\\t<\\\/section>\\r\\n\\t\\t\\t\\t<section class=\\\"elementor-section elementor-top-section elementor-element elementor-element-a836a41 elementor-section-boxed elementor-section-height-default elementor-section-height-default\\\" data-id=\\\"a836a41\\\" data-element_type=\\\"section\\\" data-e-type=\\\"section\\\">\\r\\n\\t\\t\\t\\t\\t\\t<div class=\\\"elementor-container elementor-column-gap-thegem\\\"><div class=\\\"elementor-row\\\">\\r\\n\\t\\t\\t\\t\\t<div class=\\\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-39d7612\\\" data-id=\\\"39d7612\\\" data-element_type=\\\"column\\\" data-e-type=\\\"column\\\">\\n\\t\\t\\t<div class=\\\"elementor-widget-wrap elementor-element-populated\\\">\\n\\t\\t\\t\\t[elementor-element k=\\\"9109a976d8649ee6d2c8fef8daebbb8b\\\" data=\\\"eyJpZCI6IjQ5YzI1ZTEiLCJlbFR5cGUiOiJ3aWRnZXQiLCJzZXR0aW5ncyI6eyJwcmV2X2xhYmVsIjoiUHJldmlvdXMgUG9zdCIsIm5leHRfbGFiZWwiOiJOZXh0IFBvc3QiLCJzaG93X2JvcmRlcnMiOiIiLCJ0aXRsZV90eXBvZ3JhcGh5X3R5cG9ncmFwaHkiOiJjdXN0b20iLCJ0aXRsZV90eXBvZ3JhcGh5X2ZvbnRfc2l6ZSI6eyJ1bml0IjoicHgiLCJzaXplIjoxNCwic2l6ZXMiOltdfSwidGl0bGVfdHlwb2dyYXBoeV9mb250X3dlaWdodCI6IjcwMCIsIl9fZ2xvYmFsc19fIjp7ImFycm93X2NvbG9yIjoiZ2xvYmFsc1wvY29sb3JzP2lkPXByaW1hcnkiLCJsYWJlbF9jb2xvciI6Imdsb2JhbHNcL2NvbG9ycz9pZD1zZWNvbmRhcnkifSwiYXJyb3ciOiJmYSBmYS1jYXJldC1sZWZ0Iiwic2hvd19hcnJvdyI6IiJ9LCJlbGVtZW50cyI6W10sIndpZGdldFR5cGUiOiJnbG9iYWwiLCJ0ZW1wbGF0ZUlEIjoiMjgwODMifQ==\\\"]\\t\\t\\t<\\\/div>\\n\\t\\t<\\\/div>\\n\\t\\t\\t\\t\\t<\\\/div><\\\/div>\\r\\n\\t\\t<\\\/section>\\r\\n\\t\\t\",\"scripts\":[],\"styles\":[]}}"]},"jetpack_featured_media_url":"https:\/\/kmwllc.com\/wp-content\/uploads\/2021\/06\/blog_PayloadInequality_1200x900.png","menu_order":0,"_links":{"self":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/comments?post=26412"}],"version-history":[{"count":10,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26412\/revisions"}],"predecessor-version":[{"id":29691,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/posts\/26412\/revisions\/29691"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/media\/29688"}],"wp:attachment":[{"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/media?parent=26412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/categories?post=26412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kmwllc.com\/index.php\/wp-json\/wp\/v2\/tags?post=26412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}