Intro to EDSL
This notebook provides example code for base components of EDSL, an open-source library for simulating surveys, experiments and other research with AI agents and large language models. Details on the code below are provided in accompanying slides: How to use EDSL.
Technical setup
Before running the code below, please ensure that you have installed the EDSL library and either activated remote inference from your Coop account or stored API keys for the language models that you want to use with EDSL.
Documentation
Please also see our documentation page for tips, tutorials and more demo notebooks on using EDSL.
Simple example
We start by selecting a question type and constructing a question in the relevant template:
[1]:
from edsl import QuestionMultipleChoice
q = QuestionMultipleChoice(
question_name = "marvel_movies",
question_text = "Do you enjoy Marvel movies?",
question_options = ["Yes", "No", "I do not know"]
)
We administer a question by calling the run()
method. This generates a dataset of Results
including the model’s response to the question:
[2]:
results = q.run()
results.select("marvel_movies")
[2]:
answer.marvel_movies |
---|
I do not know |
Designing AI agents
We can create personas for agents to answer the question:
[3]:
from edsl import AgentList, Agent
personas = ["comic book collector", "movie critic"]
a = AgentList(
Agent(traits = {"persona": p}) for p in personas
)
Selecting language models
We can select language models to generate the responses (in the example above we did not specify a model, so GPT 4 preview was used by default):
[4]:
from edsl import ModelList, Model
models = ["gpt-4o", "claude-3-5-sonnet-20240620"]
m = ModelList(
Model(m) for m in ["gpt-4o", "claude-3-5-sonnet-20240620"]
)
Generating results
We add agents and models to a question when running it:
[5]:
results = q.by(a).by(m).run()
results.select("model", "persona", "marvel_movies")
[5]:
model.model | agent.persona | answer.marvel_movies |
---|---|---|
gpt-4o | comic book collector | Yes |
claude-3-5-sonnet-20240620 | comic book collector | Yes |
gpt-4o | movie critic | Yes |
claude-3-5-sonnet-20240620 | movie critic | Yes |
Parameterizing questions
We can use Scenario
objects to add data or content to questions:
[6]:
q1 = QuestionMultipleChoice(
question_name = "politically_motivated",
question_text = """
Read the following movie review and determine whether it is politically motivated.
Movie: {{ title }}
Review: {{ review }}
""",
question_options = ["Yes", "No", "I do not know"]
)
EDSL comes with methods for generating scenarios from many data sources, including PDFs, CSVs, docs, images, tables, lists, dicts:
[7]:
from edsl import Scenario
example_review = {
"year": 2014,
"title": "Captain America: The Winter Soldier",
"review": """
Part superhero flick, part 70s political thriller.
It's a bold mix that pays off, delivering a scathing
critique of surveillance states wrapped in spandex
and shield-throwing action.
"""
}
s = Scenario.from_dict(example_review)
[8]:
results = q1.by(s).by(a).by(m).run()
(
results.filter("persona == 'movie critic'")
.sort_by("model")
.select("model", "year", "title", "politically_motivated")
)
[8]:
model.model | scenario.year | scenario.title | answer.politically_motivated |
---|---|---|---|
claude-3-5-sonnet-20240620 | 2014 | Captain America: The Winter Soldier | No |
gpt-4o | 2014 | Captain America: The Winter Soldier | Yes |
Comments
Questions automatically include a “comment” field. This can be useful for understanding the context of a response, or debugging a non-response.
[9]:
(
results.filter("persona == 'movie critic'")
.sort_by("model")
.select("model", "politically_motivated", "politically_motivated_comment")
)
[9]:
model.model | answer.politically_motivated | comment.politically_motivated_comment |
---|---|---|
claude-3-5-sonnet-20240620 | No | While the review mentions political themes, it doesn't appear to be politically motivated itself. It's a straightforward assessment of the film's genre blend and thematic content without pushing any particular political agenda. |
gpt-4o | Yes | The review explicitly mentions a "scathing critique of surveillance states," indicating a political perspective on the film's themes. |
Combining questions in a survey
We can combine questions in a ``Survey` <https://docs.expectedparrot.com/en/latest/surveys.html>`__ to administer them together. Here we create some variations on the above question to compare responses:
[10]:
from edsl import QuestionYesNo
q2 = QuestionYesNo(
question_name = "yn",
question_text = """
Read the following movie review and determine whether it is politically motivated.
Movie: {{ title }}
Review: {{ review }}
"""
)
[11]:
from edsl import QuestionLinearScale
q3 = QuestionLinearScale(
question_name = "ls",
question_text = """
Read the following movie review and indicate whether it is politically motivated.
Movie: {{ title }}
Review: {{ review }}
""",
question_options = [0,1,2,3,4,5],
option_labels = {0:"Not at all", 5:"Very much"}
)
[12]:
from edsl import QuestionList
q4 = QuestionList(
question_name = "favorites",
question_text = "List your favorite Marvel movies.",
max_list_items = 3
)
Survey rules & logic
We can add skip/stop and other rules, and “memory” of other questions in a survey:
[13]:
from edsl import Survey
survey = Survey(questions = [q2, q3, q4])
survey = survey.add_stop_rule(q3, "ls < 3")
[14]:
results = survey.by(s).by(a).by(m).run()
[15]:
(
results.filter("persona == 'comic book collector'")
.select("model", "persona", "yn", "ls", "favorites")
.print(pretty_labels = {
"answer.yn": "Yes/No version",
"answer.ls": "Linear scale version",
"answer.favorites": "Favorites"
})
)
[15]:
model.model | agent.persona | Yes/No version | Linear scale version | Favorites |
---|---|---|---|---|
gpt-4o | comic book collector | Yes | 3 | ['Guardians of the Galaxy', 'Spider-Man: Into the Spider-Verse', 'Avengers: Endgame'] |
claude-3-5-sonnet-20240620 | comic book collector | No | 2 |
Working with results as datasets
EDSL provides built-in methods for analyzing results, e.g., as SQL tables, dataframes:
[16]:
results.sql("select model, persona, yn, ls, favorites from self")
[16]:
model | persona | yn | ls | favorites |
---|---|---|---|---|
gpt-4o | comic book collector | Yes | 3 | ['Guardians of the Galaxy', 'Spider-Man: Into the Spider-Verse', 'Avengers: Endgame'] |
claude-3-5-sonnet-20240620 | comic book collector | No | 2 | |
gpt-4o | movie critic | Yes | 3 | ['Avengers: Endgame', 'Black Panther', 'Guardians of the Galaxy'] |
claude-3-5-sonnet-20240620 | movie critic | No | 0 |
[17]:
results.to_pandas()
[17]:
answer.yn | answer.ls | answer.favorites | scenario.year | scenario.title | scenario.review | agent.agent_instruction | agent.agent_name | agent.persona | model.frequency_penalty | ... | question_options.ls_question_options | question_type.favorites_question_type | question_type.yn_question_type | question_type.ls_question_type | comment.yn_comment | comment.ls_comment | comment.favorites_comment | generated_tokens.ls_generated_tokens | generated_tokens.yn_generated_tokens | generated_tokens.favorites_generated_tokens | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Yes | 3 | ['Guardians of the Galaxy', 'Spider-Man: Into ... | 2014 | Captain America: The Winter Soldier | \n Part superhero flick, part 70s political... | You are answering questions as if you were a h... | Agent_9 | comic book collector | 0 | ... | [0, 1, 2, 3, 4, 5] | list | yes_no | linear_scale | While the review highlights the film's action ... | The review suggests that the movie delivers a ... | These movies capture the essence of what makes... | 3 \nThe review suggests that the movie delive... | Yes\n\nWhile the review highlights the film's ... | ["Guardians of the Galaxy", "Spider-Man: Into ... |
1 | No | 2 | NaN | 2014 | Captain America: The Winter Soldier | \n Part superhero flick, part 70s political... | You are answering questions as if you were a h... | Agent_10 | comic book collector | 0 | ... | [0, 1, 2, 3, 4, 5] | list | yes_no | linear_scale | Comment: As a comic book collector, I don't se... | Task was cancelled. | Task was cancelled. | NaN | No\n\nComment: As a comic book collector, I do... | NaN |
2 | Yes | 3 | ['Avengers: Endgame', 'Black Panther', 'Guardi... | 2014 | Captain America: The Winter Soldier | \n Part superhero flick, part 70s political... | You are answering questions as if you were a h... | Agent_11 | movie critic | 0 | ... | [0, 1, 2, 3, 4, 5] | list | yes_no | linear_scale | The review mentions a "scathing critique of su... | The review acknowledges the film's critique of... | These films stand out due to their compelling ... | 3 \nThe review acknowledges the film's critiq... | Yes\n\nThe review mentions a "scathing critiqu... | ["Avengers: Endgame", "Black Panther", "Guardi... |
3 | No | 0 | NaN | 2014 | Captain America: The Winter Soldier | \n Part superhero flick, part 70s political... | You are answering questions as if you were a h... | Agent_12 | movie critic | 0 | ... | [0, 1, 2, 3, 4, 5] | list | yes_no | linear_scale | Comment: This review does not appear to be pol... | Task was cancelled. | Task was cancelled. | NaN | No\n\nComment: This review does not appear to ... | NaN |
4 rows × 48 columns
[18]:
results.to_csv("marvel_movies_survey.csv")
[18]:
key | value |
---|---|
path | marvel_movies_survey.csv |
base64_string | YW5zd2VyLnluLGFuc3dlci5scyxhbnN3ZXIuZmF2b3JpdGVzLHNjZW5hcmlvLnllYXIsc2NlbmFyaW8udGl0bGUsc2NlbmFyaW8ucmV2aWV3LGFnZW50LmFnZW50X2luc3RydWN0aW9uLGFnZW50LmFnZW50X25hbWUsYWdlbnQucGVyc29uYSxtb2RlbC5mcmVxdWVuY3lfcGVuYWx0eSxtb2RlbC5sb2dwcm9icyxtb2RlbC5tYXhfdG9rZW5zLG1vZGVsLm1vZGVsLG1vZGVsLnRlbXBlcmF0dXJlLG1vZGVsLnRvcF9wLG1vZGVsLnByZXNlbmNlX3BlbmFsdHksbW9kZWwudG9wX2xvZ3Byb2JzLHByb21wdC55bl91c2VyX3Byb21wdCxwcm9tcHQubHNfdXNlcl9wcm9tcHQscHJvbXB0LmZhdm9yaXRlc19zeXN0ZW1fcHJvbXB0LHByb21wdC5mYXZvcml0ZXNfdXNlcl9wcm9tcHQscHJvbXB0LmxzX3N5c3RlbV9wcm9tcHQscHJvbXB0LnluX3N5c3RlbV9wcm9tcHQscmF3X21vZGVsX3Jlc3BvbnNlLmxzX3Jhd19tb2RlbF9yZXNwb25zZSxyYXdfbW9kZWxfcmVzcG9uc2UubHNfb25lX3VzZF9idXlzLHJhd19tb2RlbF9yZXNwb25zZS5mYXZvcml0ZXNfY29zdCxyYXdfbW9kZWxfcmVzcG9uc2UueW5fb25lX3VzZF9idXlzLHJhd19tb2RlbF9yZXNwb25zZS5sc19jb3N0LHJhd19tb2RlbF9yZXNwb25zZS5mYXZvcml0ZXNfb25lX3VzZF9idXlzLHJhd19tb2RlbF9yZXNwb25zZS5mYXZvcml0ZXNfcmF3X21vZGVsX3Jlc3BvbnNlLHJhd19tb2RlbF9yZXNwb25zZS55bl9yYXdfbW9kZWxfcmVzcG9uc2UscmF3X21vZGVsX3Jlc3BvbnNlLnluX2Nvc3QsaXRlcmF0aW9uLml0ZXJhdGlvbixxdWVzdGlvbl90ZXh0LnluX3F1ZXN0aW9uX3RleHQscXVlc3Rpb25fdGV4dC5sc19xdWVzdGlvbl90ZXh0LHF1ZXN0aW9uX3RleHQuZmF2b3JpdGVzX3F1ZXN0aW9uX3RleHQscXVlc3Rpb25fb3B0aW9ucy55bl9xdWVzdGlvbl9vcHRpb25zLHF1ZXN0aW9uX29wdGlvbnMuZmF2b3JpdGVzX3F1ZXN0aW9uX29wdGlvbnMscXVlc3Rpb25fb3B0aW9ucy5sc19xdWVzdGlvbl9vcHRpb25zLHF1ZXN0aW9uX3R5cGUuZmF2b3JpdGVzX3F1ZXN0aW9uX3R5cGUscXVlc3Rpb25fdHlwZS55bl9xdWVzdGlvbl90eXBlLHF1ZXN0aW9uX3R5cGUubHNfcXVlc3Rpb25fdHlwZSxjb21tZW50LnluX2NvbW1lbnQsY29tbWVudC5sc19jb21tZW50LGNvbW1lbnQuZmF2b3JpdGVzX2NvbW1lbnQsZ2VuZXJhdGVkX3Rva2Vucy5sc19nZW5lcmF0ZWRfdG9rZW5zLGdlbmVyYXRlZF90b2tlbnMueW5fZ2VuZXJhdGVkX3Rva2VucyxnZW5lcmF0ZWRfdG9rZW5zLmZhdm9yaXRlc19nZW5lcmF0ZWRfdG9rZW5zDQpZZXMsMywiWydHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eScsICdTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UnLCAnQXZlbmdlcnM6IEVuZGdhbWUnXSIsMjAxNCxDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllciwiCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgICIsWW91IGFyZSBhbnN3ZXJpbmcgcXVlc3Rpb25zIGFzIGlmIHlvdSB3ZXJlIGEgaHVtYW4uIERvIG5vdCBicmVhayBjaGFyYWN0ZXIuLEFnZW50XzksY29taWMgYm9vayBjb2xsZWN0b3IsMCxGYWxzZSwxMDAwLGdwdC00bywwLjUsMSwwLDMsIgoKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiBDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllcgogICAgUmV2aWV3OiAKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgCiAgICAKCiAgICAKTm8KICAgIApZZXMKICAgIAoKT25seSAxIG9wdGlvbiBtYXkgYmUgc2VsZWN0ZWQuClBsZWFzZSByZXNwb25kIHdpdGgganVzdCB5b3VyIGFuc3dlci4gCgoKQWZ0ZXIgdGhlIGFuc3dlciwgeW91IGNhbiBwdXQgYSBjb21tZW50IGV4cGxhaW5pbmcgeW91ciByZXNwb25zZS4iLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IENhcHRhaW4gQW1lcmljYTogVGhlIFdpbnRlciBTb2xkaWVyCiAgICBSZXZpZXc6IAogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAKICAgIAoKMCA6IE5vdCBhdCBhbGwKCjEgOiAKCjIgOiAKCjMgOiAKCjQgOiAKCjUgOiBWZXJ5IG11Y2gKCk9ubHkgMSBvcHRpb24gbWF5IGJlIHNlbGVjdGVkLgoKUmVzcG9uZCBvbmx5IHdpdGggdGhlIGNvZGUgY29ycmVzcG9uZGluZyB0byBvbmUgb2YgdGhlIG9wdGlvbnMuIEUuZy4sICIiMSIiIG9yICIiNSIiIGJ5IGl0c2VsZi4KCkFmdGVyIHRoZSBhbnN3ZXIsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHdoeSB5b3UgY2hvc2UgdGhhdCBvcHRpb24gb24gdGhlIG5leHQgbGluZS4iLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ2NvbWljIGJvb2sgY29sbGVjdG9yJ30sIkxpc3QgeW91ciBmYXZvcml0ZSBNYXJ2ZWwgbW92aWVzLgoKClRoZSBsaXN0IG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIDMgaXRlbXMuCgpSZXR1cm4geW91ciBhbnN3ZXJzIG9uIG9uZSBsaW5lLCBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHlvdXIgcmVzcG9uc2VzLCB3aXRoIHNxdWFyZSBicmFja2V0cyBhbmQgZWFjaCBhbnN3ZXIgaW4gcXVvdGVzIEUuZy4sIFsiIkEiIiwgIiJCIiIsICIiQyIiXQoKQWZ0ZXIgdGhlIGFuc3dlcnMsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgY2hvaWNlIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdjb21pYyBib29rIGNvbGxlY3Rvcid9LFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ2NvbWljIGJvb2sgY29sbGVjdG9yJ30sInsnaWQnOiAnY2hhdGNtcGwtQWVNbDhNNGpQRFBVMjlYWVlZRmR3N3RmdWpIQjAnLCAnY2hvaWNlcyc6IFt7J2ZpbmlzaF9yZWFzb24nOiAnc3RvcCcsICdpbmRleCc6IDAsICdsb2dwcm9icyc6IE5vbmUsICdtZXNzYWdlJzogeydjb250ZW50JzogIiIzICBcblRoZSByZXZpZXcgc3VnZ2VzdHMgdGhhdCB0aGUgbW92aWUgZGVsaXZlcnMgYSBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzLCBpbmRpY2F0aW5nIGEgcG9saXRpY2FsIGFuZ2xlLCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGJlIG92ZXJ3aGVsbWluZ2x5IGZvY3VzZWQgb24gcG9saXRpY3MgYWxvbmUuIiIsICdyZWZ1c2FsJzogTm9uZSwgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ2F1ZGlvJzogTm9uZSwgJ2Z1bmN0aW9uX2NhbGwnOiBOb25lLCAndG9vbF9jYWxscyc6IE5vbmV9fV0sICdjcmVhdGVkJzogMTczNDE4Mzk3MCwgJ21vZGVsJzogJ2dwdC00by0yMDI0LTA4LTA2JywgJ29iamVjdCc6ICdjaGF0LmNvbXBsZXRpb24nLCAnc2VydmljZV90aWVyJzogTm9uZSwgJ3N5c3RlbV9maW5nZXJwcmludCc6ICdmcF9mNzg1ZWI1ZjQ3JywgJ3VzYWdlJzogeydjb21wbGV0aW9uX3Rva2Vucyc6IDMyLCAncHJvbXB0X3Rva2Vucyc6IDE5MCwgJ3RvdGFsX3Rva2Vucyc6IDIyMiwgJ2NvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMnOiB7J2FjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMCwgJ2F1ZGlvX3Rva2Vucyc6IDAsICdyZWFzb25pbmdfdG9rZW5zJzogMCwgJ3JlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMH0sICdwcm9tcHRfdG9rZW5zX2RldGFpbHMnOiB7J2F1ZGlvX3Rva2Vucyc6IDAsICdjYWNoZWRfdG9rZW5zJzogMH19fSIsMTI1Ny44NjE2MzUyMjAxMjU3LDAuMDAxMDcsMTM1MS4zNTEzNTEzNTEzNTE1LDAuMDAwNzk1LDkzNC41Nzk0MzkyNTIzMzY0LCJ7J2lkJzogJ2NoYXRjbXBsLUFlTWw5aGhtVGdvWXo3Rk90UklLYVZMbU5tYlUzJywgJ2Nob2ljZXMnOiBbeydmaW5pc2hfcmVhc29uJzogJ3N0b3AnLCAnaW5kZXgnOiAwLCAnbG9ncHJvYnMnOiBOb25lLCAnbWVzc2FnZSc6IHsnY29udGVudCc6ICdbIiJHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eSIiLCAiIlNwaWRlci1NYW46IEludG8gdGhlIFNwaWRlci1WZXJzZSIiLCAiIkF2ZW5nZXJzOiBFbmRnYW1lIiJdXG5cblRoZXNlIG1vdmllcyBjYXB0dXJlIHRoZSBlc3NlbmNlIG9mIHdoYXQgbWFrZXMgTWFydmVsIHNvIGNhcHRpdmF0aW5nOiBhIGJsZW5kIG9mIGh1bW9yLCBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgYW5kIGVwaWMgYmF0dGxlcy4gUGx1cywgIiJTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UiIiBpcyBhIHZpc3VhbCBtYXN0ZXJwaWVjZSB0aGF0IGJyaW5ncyBjb21pYyBib29rIGFydCB0byBsaWZlIGluIGEgd2F5IHRoYXRcJ3MgbmV2ZXIgYmVlbiBkb25lIGJlZm9yZS4nLCAncmVmdXNhbCc6IE5vbmUsICdyb2xlJzogJ2Fzc2lzdGFudCcsICdhdWRpbyc6IE5vbmUsICdmdW5jdGlvbl9jYWxsJzogTm9uZSwgJ3Rvb2xfY2FsbHMnOiBOb25lfX1dLCAnY3JlYXRlZCc6IDE3MzQxODM5NzEsICdtb2RlbCc6ICdncHQtNG8tMjAyNC0wOC0wNicsICdvYmplY3QnOiAnY2hhdC5jb21wbGV0aW9uJywgJ3NlcnZpY2VfdGllcic6IE5vbmUsICdzeXN0ZW1fZmluZ2VycHJpbnQnOiAnZnBfYTc5ZDhkYWMxZicsICd1c2FnZSc6IHsnY29tcGxldGlvbl90b2tlbnMnOiA4MCwgJ3Byb21wdF90b2tlbnMnOiAxMDgsICd0b3RhbF90b2tlbnMnOiAxODgsICdjb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzJzogeydhY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDAsICdhdWRpb190b2tlbnMnOiAwLCAncmVhc29uaW5nX3Rva2Vucyc6IDAsICdyZWplY3RlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDB9LCAncHJvbXB0X3Rva2Vuc19kZXRhaWxzJzogeydhdWRpb190b2tlbnMnOiAwLCAnY2FjaGVkX3Rva2Vucyc6IDB9fX0iLCJ7J2lkJzogJ2NoYXRjbXBsLUFlTWw4RlpYRmV2SEZlajZ5TXJNOE1FbGdlblBjJywgJ2Nob2ljZXMnOiBbeydmaW5pc2hfcmVhc29uJzogJ3N0b3AnLCAnaW5kZXgnOiAwLCAnbG9ncHJvYnMnOiBOb25lLCAnbWVzc2FnZSc6IHsnY29udGVudCc6ICdZZXNcblxuV2hpbGUgdGhlIHJldmlldyBoaWdobGlnaHRzIHRoZSBmaWxtXCdzIGFjdGlvbiBhbmQgc3VwZXJoZXJvIGVsZW1lbnRzLCBpdCBhbHNvIG1lbnRpb25zIGEgIiJzY2F0aGluZyBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzLCIiIHdoaWNoIHN1Z2dlc3RzIGEgcG9saXRpY2FsIHRoZW1lIG9yIG1lc3NhZ2Ugd2l0aGluIHRoZSBtb3ZpZS4nLCAncmVmdXNhbCc6IE5vbmUsICdyb2xlJzogJ2Fzc2lzdGFudCcsICdhdWRpbyc6IE5vbmUsICdmdW5jdGlvbl9jYWxsJzogTm9uZSwgJ3Rvb2xfY2FsbHMnOiBOb25lfX1dLCAnY3JlYXRlZCc6IDE3MzQxODM5NzAsICdtb2RlbCc6ICdncHQtNG8tMjAyNC0wOC0wNicsICdvYmplY3QnOiAnY2hhdC5jb21wbGV0aW9uJywgJ3NlcnZpY2VfdGllcic6IE5vbmUsICdzeXN0ZW1fZmluZ2VycHJpbnQnOiAnZnBfYTc5ZDhkYWMxZicsICd1c2FnZSc6IHsnY29tcGxldGlvbl90b2tlbnMnOiAzNywgJ3Byb21wdF90b2tlbnMnOiAxNDgsICd0b3RhbF90b2tlbnMnOiAxODUsICdjb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzJzogeydhY2NlcHRlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDAsICdhdWRpb190b2tlbnMnOiAwLCAncmVhc29uaW5nX3Rva2Vucyc6IDAsICdyZWplY3RlZF9wcmVkaWN0aW9uX3Rva2Vucyc6IDB9LCAncHJvbXB0X3Rva2Vuc19kZXRhaWxzJzogeydhdWRpb190b2tlbnMnOiAwLCAnY2FjaGVkX3Rva2Vucyc6IDB9fX0iLDAuMDAwNzQsMCwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZToge3sgdGl0bGUgfX0KICAgIFJldmlldzoge3sgcmV2aWV3IH19CiAgICAiLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIixMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4sIlsnTm8nLCAnWWVzJ10iLCwiWzAsIDEsIDIsIDMsIDQsIDVdIixsaXN0LHllc19ubyxsaW5lYXJfc2NhbGUsIldoaWxlIHRoZSByZXZpZXcgaGlnaGxpZ2h0cyB0aGUgZmlsbSdzIGFjdGlvbiBhbmQgc3VwZXJoZXJvIGVsZW1lbnRzLCBpdCBhbHNvIG1lbnRpb25zIGEgIiJzY2F0aGluZyBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzLCIiIHdoaWNoIHN1Z2dlc3RzIGEgcG9saXRpY2FsIHRoZW1lIG9yIG1lc3NhZ2Ugd2l0aGluIHRoZSBtb3ZpZS4iLCJUaGUgcmV2aWV3IHN1Z2dlc3RzIHRoYXQgdGhlIG1vdmllIGRlbGl2ZXJzIGEgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcywgaW5kaWNhdGluZyBhIHBvbGl0aWNhbCBhbmdsZSwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBvdmVyd2hlbG1pbmdseSBmb2N1c2VkIG9uIHBvbGl0aWNzIGFsb25lLiIsIlRoZXNlIG1vdmllcyBjYXB0dXJlIHRoZSBlc3NlbmNlIG9mIHdoYXQgbWFrZXMgTWFydmVsIHNvIGNhcHRpdmF0aW5nOiBhIGJsZW5kIG9mIGh1bW9yLCBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgYW5kIGVwaWMgYmF0dGxlcy4gUGx1cywgIiJTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UiIiBpcyBhIHZpc3VhbCBtYXN0ZXJwaWVjZSB0aGF0IGJyaW5ncyBjb21pYyBib29rIGFydCB0byBsaWZlIGluIGEgd2F5IHRoYXQncyBuZXZlciBiZWVuIGRvbmUgYmVmb3JlLiIsIjMgIApUaGUgcmV2aWV3IHN1Z2dlc3RzIHRoYXQgdGhlIG1vdmllIGRlbGl2ZXJzIGEgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcywgaW5kaWNhdGluZyBhIHBvbGl0aWNhbCBhbmdsZSwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBvdmVyd2hlbG1pbmdseSBmb2N1c2VkIG9uIHBvbGl0aWNzIGFsb25lLiIsIlllcwoKV2hpbGUgdGhlIHJldmlldyBoaWdobGlnaHRzIHRoZSBmaWxtJ3MgYWN0aW9uIGFuZCBzdXBlcmhlcm8gZWxlbWVudHMsIGl0IGFsc28gbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggc3VnZ2VzdHMgYSBwb2xpdGljYWwgdGhlbWUgb3IgbWVzc2FnZSB3aXRoaW4gdGhlIG1vdmllLiIsIlsiIkd1YXJkaWFucyBvZiB0aGUgR2FsYXh5IiIsICIiU3BpZGVyLU1hbjogSW50byB0aGUgU3BpZGVyLVZlcnNlIiIsICIiQXZlbmdlcnM6IEVuZGdhbWUiIl0KClRoZXNlIG1vdmllcyBjYXB0dXJlIHRoZSBlc3NlbmNlIG9mIHdoYXQgbWFrZXMgTWFydmVsIHNvIGNhcHRpdmF0aW5nOiBhIGJsZW5kIG9mIGh1bW9yLCBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgYW5kIGVwaWMgYmF0dGxlcy4gUGx1cywgIiJTcGlkZXItTWFuOiBJbnRvIHRoZSBTcGlkZXItVmVyc2UiIiBpcyBhIHZpc3VhbCBtYXN0ZXJwaWVjZSB0aGF0IGJyaW5ncyBjb21pYyBib29rIGFydCB0byBsaWZlIGluIGEgd2F5IHRoYXQncyBuZXZlciBiZWVuIGRvbmUgYmVmb3JlLiINCk5vLDIsLDIwMTQsQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIsIgogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAiLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLixBZ2VudF8xMCxjb21pYyBib29rIGNvbGxlY3RvciwwLEZhbHNlLDEwMDAsY2xhdWRlLTMtNS1zb25uZXQtMjAyNDA2MjAsMC41LDEsMCwzLCIKCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZTogQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIKICAgIFJldmlldzogCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgIAogICAgCgogICAgCk5vCiAgICAKWWVzCiAgICAKCk9ubHkgMSBvcHRpb24gbWF5IGJlIHNlbGVjdGVkLgpQbGVhc2UgcmVzcG9uZCB3aXRoIGp1c3QgeW91ciBhbnN3ZXIuIAoKCkFmdGVyIHRoZSBhbnN3ZXIsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgcmVzcG9uc2UuIiwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBpbmRpY2F0ZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiBDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllcgogICAgUmV2aWV3OiAKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgCiAgICAKCjAgOiBOb3QgYXQgYWxsCgoxIDogCgoyIDogCgozIDogCgo0IDogCgo1IDogVmVyeSBtdWNoCgpPbmx5IDEgb3B0aW9uIG1heSBiZSBzZWxlY3RlZC4KClJlc3BvbmQgb25seSB3aXRoIHRoZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBvcHRpb25zLiBFLmcuLCAiIjEiIiBvciAiIjUiIiBieSBpdHNlbGYuCgpBZnRlciB0aGUgYW5zd2VyLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgeW91IGNob3NlIHRoYXQgb3B0aW9uIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdjb21pYyBib29rIGNvbGxlY3Rvcid9LCJMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4KCgpUaGUgbGlzdCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiAzIGl0ZW1zLgoKUmV0dXJuIHlvdXIgYW5zd2VycyBvbiBvbmUgbGluZSwgaW4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB5b3VyIHJlc3BvbnNlcywgd2l0aCBzcXVhcmUgYnJhY2tldHMgYW5kIGVhY2ggYW5zd2VyIGluIHF1b3RlcyBFLmcuLCBbIiJBIiIsICIiQiIiLCAiIkMiIl0KCkFmdGVyIHRoZSBhbnN3ZXJzLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB5b3VyIGNob2ljZSBvbiB0aGUgbmV4dCBsaW5lLiIsWW91IGFyZSBhbnN3ZXJpbmcgcXVlc3Rpb25zIGFzIGlmIHlvdSB3ZXJlIGEgaHVtYW4uIERvIG5vdCBicmVhayBjaGFyYWN0ZXIuIFlvdXIgdHJhaXRzOiB7J3BlcnNvbmEnOiAnY29taWMgYm9vayBjb2xsZWN0b3InfSxZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdjb21pYyBib29rIGNvbGxlY3Rvcid9LCxOQSwsNjAxLjY4NzE3NDk5MTM1ODEsLE5BLCwieydpZCc6ICdtc2dfMDFYRktSWHBTZ3Q1Y21XblZ2eW1VM1FxJywgJ2NvbnRlbnQnOiBbeyd0ZXh0JzogIiJOb1xuXG5Db21tZW50OiBBcyBhIGNvbWljIGJvb2sgY29sbGVjdG9yLCBJIGRvbid0IHNlZSBhbnkgb3ZlcnQgcG9saXRpY2FsIG1vdGl2YXRpb24gaW4gdGhpcyByZXZpZXcuIEl0J3MgZGlzY3Vzc2luZyB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCB0aGVtZXMsIHdoaWNoIGFyZSBpbmhlcmVudCB0byB0aGUgbW92aWUgaXRzZWxmIHJhdGhlciB0aGFuIHB1c2hpbmcgYSBzcGVjaWZpYyBwb2xpdGljYWwgYWdlbmRhLiBUaGUgbWVudGlvbiBvZiBzdXJ2ZWlsbGFuY2UgY3JpdGlxdWUgaXMgcHJlc2VudGVkIGFzIHBhcnQgb2YgdGhlIGZpbG0ncyBwbG90LCBub3QgYXMgdGhlIHJldmlld2VyJ3MgcGVyc29uYWwgcG9saXRpY2FsIHN0YW5jZS4iIiwgJ3R5cGUnOiAndGV4dCd9XSwgJ21vZGVsJzogJ2NsYXVkZS0zLTUtc29ubmV0LTIwMjQwNjIwJywgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ3N0b3BfcmVhc29uJzogJ2VuZF90dXJuJywgJ3N0b3Bfc2VxdWVuY2UnOiBOb25lLCAndHlwZSc6ICdtZXNzYWdlJywgJ3VzYWdlJzogeydpbnB1dF90b2tlbnMnOiAxNjksICdvdXRwdXRfdG9rZW5zJzogNzd9fSIsMC4wMDE2NjE5OTMyMTEwMzA5MDI5LDAsIgogICAgUmVhZCB0aGUgZm9sbG93aW5nIG1vdmllIHJldmlldyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIiwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBpbmRpY2F0ZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiB7eyB0aXRsZSB9fQogICAgUmV2aWV3OiB7eyByZXZpZXcgfX0KICAgICIsTGlzdCB5b3VyIGZhdm9yaXRlIE1hcnZlbCBtb3ZpZXMuLCJbJ05vJywgJ1llcyddIiwsIlswLCAxLCAyLCAzLCA0LCA1XSIsbGlzdCx5ZXNfbm8sbGluZWFyX3NjYWxlLCJDb21tZW50OiBBcyBhIGNvbWljIGJvb2sgY29sbGVjdG9yLCBJIGRvbid0IHNlZSBhbnkgb3ZlcnQgcG9saXRpY2FsIG1vdGl2YXRpb24gaW4gdGhpcyByZXZpZXcuIEl0J3MgZGlzY3Vzc2luZyB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCB0aGVtZXMsIHdoaWNoIGFyZSBpbmhlcmVudCB0byB0aGUgbW92aWUgaXRzZWxmIHJhdGhlciB0aGFuIHB1c2hpbmcgYSBzcGVjaWZpYyBwb2xpdGljYWwgYWdlbmRhLiBUaGUgbWVudGlvbiBvZiBzdXJ2ZWlsbGFuY2UgY3JpdGlxdWUgaXMgcHJlc2VudGVkIGFzIHBhcnQgb2YgdGhlIGZpbG0ncyBwbG90LCBub3QgYXMgdGhlIHJldmlld2VyJ3MgcGVyc29uYWwgcG9saXRpY2FsIHN0YW5jZS4iLFRhc2sgd2FzIGNhbmNlbGxlZC4sVGFzayB3YXMgY2FuY2VsbGVkLiwsIk5vCgpDb21tZW50OiBBcyBhIGNvbWljIGJvb2sgY29sbGVjdG9yLCBJIGRvbid0IHNlZSBhbnkgb3ZlcnQgcG9saXRpY2FsIG1vdGl2YXRpb24gaW4gdGhpcyByZXZpZXcuIEl0J3MgZGlzY3Vzc2luZyB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCB0aGVtZXMsIHdoaWNoIGFyZSBpbmhlcmVudCB0byB0aGUgbW92aWUgaXRzZWxmIHJhdGhlciB0aGFuIHB1c2hpbmcgYSBzcGVjaWZpYyBwb2xpdGljYWwgYWdlbmRhLiBUaGUgbWVudGlvbiBvZiBzdXJ2ZWlsbGFuY2UgY3JpdGlxdWUgaXMgcHJlc2VudGVkIGFzIHBhcnQgb2YgdGhlIGZpbG0ncyBwbG90LCBub3QgYXMgdGhlIHJldmlld2VyJ3MgcGVyc29uYWwgcG9saXRpY2FsIHN0YW5jZS4iLA0KWWVzLDMsIlsnQXZlbmdlcnM6IEVuZGdhbWUnLCAnQmxhY2sgUGFudGhlcicsICdHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eSddIiwyMDE0LENhcHRhaW4gQW1lcmljYTogVGhlIFdpbnRlciBTb2xkaWVyLCIKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4sQWdlbnRfMTEsbW92aWUgY3JpdGljLDAsRmFsc2UsMTAwMCxncHQtNG8sMC41LDEsMCwzLCIKCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZTogQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIKICAgIFJldmlldzogCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgIAogICAgCgogICAgCk5vCiAgICAKWWVzCiAgICAKCk9ubHkgMSBvcHRpb24gbWF5IGJlIHNlbGVjdGVkLgpQbGVhc2UgcmVzcG9uZCB3aXRoIGp1c3QgeW91ciBhbnN3ZXIuIAoKCkFmdGVyIHRoZSBhbnN3ZXIsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgcmVzcG9uc2UuIiwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBpbmRpY2F0ZSB3aGV0aGVyIGl0IGlzIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4KICAgIE1vdmllOiBDYXB0YWluIEFtZXJpY2E6IFRoZSBXaW50ZXIgU29sZGllcgogICAgUmV2aWV3OiAKICAgIFBhcnQgc3VwZXJoZXJvIGZsaWNrLCBwYXJ0IDcwcyBwb2xpdGljYWwgdGhyaWxsZXIuIAogICAgSXQncyBhIGJvbGQgbWl4IHRoYXQgcGF5cyBvZmYsIGRlbGl2ZXJpbmcgYSBzY2F0aGluZyAKICAgIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMgd3JhcHBlZCBpbiBzcGFuZGV4IAogICAgYW5kIHNoaWVsZC10aHJvd2luZyBhY3Rpb24uICAgIAogICAgCiAgICAKCjAgOiBOb3QgYXQgYWxsCgoxIDogCgoyIDogCgozIDogCgo0IDogCgo1IDogVmVyeSBtdWNoCgpPbmx5IDEgb3B0aW9uIG1heSBiZSBzZWxlY3RlZC4KClJlc3BvbmQgb25seSB3aXRoIHRoZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBvcHRpb25zLiBFLmcuLCAiIjEiIiBvciAiIjUiIiBieSBpdHNlbGYuCgpBZnRlciB0aGUgYW5zd2VyLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgeW91IGNob3NlIHRoYXQgb3B0aW9uIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdtb3ZpZSBjcml0aWMnfSwiTGlzdCB5b3VyIGZhdm9yaXRlIE1hcnZlbCBtb3ZpZXMuCgoKVGhlIGxpc3QgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gMyBpdGVtcy4KClJldHVybiB5b3VyIGFuc3dlcnMgb24gb25lIGxpbmUsIGluIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgeW91ciByZXNwb25zZXMsIHdpdGggc3F1YXJlIGJyYWNrZXRzIGFuZCBlYWNoIGFuc3dlciBpbiBxdW90ZXMgRS5nLiwgWyIiQSIiLCAiIkIiIiwgIiJDIiJdCgpBZnRlciB0aGUgYW5zd2VycywgeW91IGNhbiBwdXQgYSBjb21tZW50IGV4cGxhaW5pbmcgeW91ciBjaG9pY2Ugb24gdGhlIG5leHQgbGluZS4iLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ21vdmllIGNyaXRpYyd9LFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLiBZb3VyIHRyYWl0czogeydwZXJzb25hJzogJ21vdmllIGNyaXRpYyd9LCJ7J2lkJzogJ2NoYXRjbXBsLUFlTWw4djBJTFV0R282M25VTUFIVk5Hd2luWW9WJywgJ2Nob2ljZXMnOiBbeydmaW5pc2hfcmVhc29uJzogJ3N0b3AnLCAnaW5kZXgnOiAwLCAnbG9ncHJvYnMnOiBOb25lLCAnbWVzc2FnZSc6IHsnY29udGVudCc6ICIiMyAgXG5UaGUgcmV2aWV3IGFja25vd2xlZGdlcyB0aGUgZmlsbSdzIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIHdoaWNoIGNhbiBiZSBzZWVuIGFzIGEgcG9saXRpY2FsbHkgbW90aXZhdGVkIHRoZW1lLCB0aG91Z2ggaXQncyBiYWxhbmNlZCB3aXRoIHRoZSBlbnRlcnRhaW5tZW50IGFzcGVjdHMgb2YgYSBzdXBlcmhlcm8gbW92aWUuIiIsICdyZWZ1c2FsJzogTm9uZSwgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ2F1ZGlvJzogTm9uZSwgJ2Z1bmN0aW9uX2NhbGwnOiBOb25lLCAndG9vbF9jYWxscyc6IE5vbmV9fV0sICdjcmVhdGVkJzogMTczNDE4Mzk3MCwgJ21vZGVsJzogJ2dwdC00by0yMDI0LTA4LTA2JywgJ29iamVjdCc6ICdjaGF0LmNvbXBsZXRpb24nLCAnc2VydmljZV90aWVyJzogTm9uZSwgJ3N5c3RlbV9maW5nZXJwcmludCc6ICdmcF9hNzlkOGRhYzFmJywgJ3VzYWdlJzogeydjb21wbGV0aW9uX3Rva2Vucyc6IDM1LCAncHJvbXB0X3Rva2Vucyc6IDE4OSwgJ3RvdGFsX3Rva2Vucyc6IDIyNCwgJ2NvbXBsZXRpb25fdG9rZW5zX2RldGFpbHMnOiB7J2FjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMCwgJ2F1ZGlvX3Rva2Vucyc6IDAsICdyZWFzb25pbmdfdG9rZW5zJzogMCwgJ3JlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zJzogMH0sICdwcm9tcHRfdG9rZW5zX2RldGFpbHMnOiB7J2F1ZGlvX3Rva2Vucyc6IDAsICdjYWNoZWRfdG9rZW5zJzogMH19fSIsMTIxNS44MDU0NzExMjQ2MiwwLjAwMTE1NzUsMTM5My43MjgyMjI5OTY1MTU2LDAuMDAwODIyNSw4NjMuOTMwODg1NTI5MTU3OCwieydpZCc6ICdjaGF0Y21wbC1BZU1sOXZMdkpSMVVVVXVqSjdOUWNjcm02cW02dycsICdjaG9pY2VzJzogW3snZmluaXNoX3JlYXNvbic6ICdzdG9wJywgJ2luZGV4JzogMCwgJ2xvZ3Byb2JzJzogTm9uZSwgJ21lc3NhZ2UnOiB7J2NvbnRlbnQnOiAnWyIiQXZlbmdlcnM6IEVuZGdhbWUiIiwgIiJCbGFjayBQYW50aGVyIiIsICIiR3VhcmRpYW5zIG9mIHRoZSBHYWxheHkiIl0gIFxuVGhlc2UgZmlsbXMgc3RhbmQgb3V0IGR1ZSB0byB0aGVpciBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgc3Ryb25nIGNoYXJhY3RlciBkZXZlbG9wbWVudCwgYW5kIGN1bHR1cmFsIGltcGFjdC4gIiJBdmVuZ2VyczogRW5kZ2FtZSIiIG1hc3RlcmZ1bGx5IGNvbmNsdWRlcyBhIGRlY2FkZS1sb25nIHNhZ2EsICIiQmxhY2sgUGFudGhlciIiIGJyZWFrcyBncm91bmQgd2l0aCBpdHMgY3VsdHVyYWwgc2lnbmlmaWNhbmNlIGFuZCBkaXJlY3Rpb24sIHdoaWxlICIiR3VhcmRpYW5zIG9mIHRoZSBHYWxheHkiIiBicmluZ3MgYSBmcmVzaCwgZnVuLCBhbmQgaXJyZXZlcmVudCB0b25lIHRvIHRoZSBzdXBlcmhlcm8gZ2VucmUuJywgJ3JlZnVzYWwnOiBOb25lLCAncm9sZSc6ICdhc3Npc3RhbnQnLCAnYXVkaW8nOiBOb25lLCAnZnVuY3Rpb25fY2FsbCc6IE5vbmUsICd0b29sX2NhbGxzJzogTm9uZX19XSwgJ2NyZWF0ZWQnOiAxNzM0MTgzOTcxLCAnbW9kZWwnOiAnZ3B0LTRvLTIwMjQtMDgtMDYnLCAnb2JqZWN0JzogJ2NoYXQuY29tcGxldGlvbicsICdzZXJ2aWNlX3RpZXInOiBOb25lLCAnc3lzdGVtX2ZpbmdlcnByaW50JzogJ2ZwX2E3OWQ4ZGFjMWYnLCAndXNhZ2UnOiB7J2NvbXBsZXRpb25fdG9rZW5zJzogODksICdwcm9tcHRfdG9rZW5zJzogMTA3LCAndG90YWxfdG9rZW5zJzogMTk2LCAnY29tcGxldGlvbl90b2tlbnNfZGV0YWlscyc6IHsnYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwLCAnYXVkaW9fdG9rZW5zJzogMCwgJ3JlYXNvbmluZ190b2tlbnMnOiAwLCAncmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwfSwgJ3Byb21wdF90b2tlbnNfZGV0YWlscyc6IHsnYXVkaW9fdG9rZW5zJzogMCwgJ2NhY2hlZF90b2tlbnMnOiAwfX19IiwieydpZCc6ICdjaGF0Y21wbC1BZU1sODRwelZYTG9zS0RBWjNySnJNQUtyMkR1SScsICdjaG9pY2VzJzogW3snZmluaXNoX3JlYXNvbic6ICdzdG9wJywgJ2luZGV4JzogMCwgJ2xvZ3Byb2JzJzogTm9uZSwgJ21lc3NhZ2UnOiB7J2NvbnRlbnQnOiAnWWVzXG5cblRoZSByZXZpZXcgbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggaW5kaWNhdGVzIGEgcG9saXRpY2FsIGVsZW1lbnQgaW4gdGhlIGZpbG1cJ3MgdGhlbWVzIGFuZCBzdWdnZXN0cyB0aGF0IHRoZSByZXZpZXcgaXMgYWNrbm93bGVkZ2luZyB0aGlzIHBvbGl0aWNhbCBhc3BlY3QuJywgJ3JlZnVzYWwnOiBOb25lLCAncm9sZSc6ICdhc3Npc3RhbnQnLCAnYXVkaW8nOiBOb25lLCAnZnVuY3Rpb25fY2FsbCc6IE5vbmUsICd0b29sX2NhbGxzJzogTm9uZX19XSwgJ2NyZWF0ZWQnOiAxNzM0MTgzOTcwLCAnbW9kZWwnOiAnZ3B0LTRvLTIwMjQtMDgtMDYnLCAnb2JqZWN0JzogJ2NoYXQuY29tcGxldGlvbicsICdzZXJ2aWNlX3RpZXInOiBOb25lLCAnc3lzdGVtX2ZpbmdlcnByaW50JzogJ2ZwX2E3OWQ4ZGFjMWYnLCAndXNhZ2UnOiB7J2NvbXBsZXRpb25fdG9rZW5zJzogMzUsICdwcm9tcHRfdG9rZW5zJzogMTQ3LCAndG90YWxfdG9rZW5zJzogMTgyLCAnY29tcGxldGlvbl90b2tlbnNfZGV0YWlscyc6IHsnYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwLCAnYXVkaW9fdG9rZW5zJzogMCwgJ3JlYXNvbmluZ190b2tlbnMnOiAwLCAncmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMnOiAwfSwgJ3Byb21wdF90b2tlbnNfZGV0YWlscyc6IHsnYXVkaW9fdG9rZW5zJzogMCwgJ2NhY2hlZF90b2tlbnMnOiAwfX19IiwwLjAwMDcxNzUsMCwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZToge3sgdGl0bGUgfX0KICAgIFJldmlldzoge3sgcmV2aWV3IH19CiAgICAiLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIixMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4sIlsnTm8nLCAnWWVzJ10iLCwiWzAsIDEsIDIsIDMsIDQsIDVdIixsaXN0LHllc19ubyxsaW5lYXJfc2NhbGUsIlRoZSByZXZpZXcgbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggaW5kaWNhdGVzIGEgcG9saXRpY2FsIGVsZW1lbnQgaW4gdGhlIGZpbG0ncyB0aGVtZXMgYW5kIHN1Z2dlc3RzIHRoYXQgdGhlIHJldmlldyBpcyBhY2tub3dsZWRnaW5nIHRoaXMgcG9saXRpY2FsIGFzcGVjdC4iLCJUaGUgcmV2aWV3IGFja25vd2xlZGdlcyB0aGUgZmlsbSdzIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIHdoaWNoIGNhbiBiZSBzZWVuIGFzIGEgcG9saXRpY2FsbHkgbW90aXZhdGVkIHRoZW1lLCB0aG91Z2ggaXQncyBiYWxhbmNlZCB3aXRoIHRoZSBlbnRlcnRhaW5tZW50IGFzcGVjdHMgb2YgYSBzdXBlcmhlcm8gbW92aWUuIiwiVGhlc2UgZmlsbXMgc3RhbmQgb3V0IGR1ZSB0byB0aGVpciBjb21wZWxsaW5nIHN0b3J5dGVsbGluZywgc3Ryb25nIGNoYXJhY3RlciBkZXZlbG9wbWVudCwgYW5kIGN1bHR1cmFsIGltcGFjdC4gIiJBdmVuZ2VyczogRW5kZ2FtZSIiIG1hc3RlcmZ1bGx5IGNvbmNsdWRlcyBhIGRlY2FkZS1sb25nIHNhZ2EsICIiQmxhY2sgUGFudGhlciIiIGJyZWFrcyBncm91bmQgd2l0aCBpdHMgY3VsdHVyYWwgc2lnbmlmaWNhbmNlIGFuZCBkaXJlY3Rpb24sIHdoaWxlICIiR3VhcmRpYW5zIG9mIHRoZSBHYWxheHkiIiBicmluZ3MgYSBmcmVzaCwgZnVuLCBhbmQgaXJyZXZlcmVudCB0b25lIHRvIHRoZSBzdXBlcmhlcm8gZ2VucmUuIiwiMyAgClRoZSByZXZpZXcgYWNrbm93bGVkZ2VzIHRoZSBmaWxtJ3MgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcywgd2hpY2ggY2FuIGJlIHNlZW4gYXMgYSBwb2xpdGljYWxseSBtb3RpdmF0ZWQgdGhlbWUsIHRob3VnaCBpdCdzIGJhbGFuY2VkIHdpdGggdGhlIGVudGVydGFpbm1lbnQgYXNwZWN0cyBvZiBhIHN1cGVyaGVybyBtb3ZpZS4iLCJZZXMKClRoZSByZXZpZXcgbWVudGlvbnMgYSAiInNjYXRoaW5nIGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMsIiIgd2hpY2ggaW5kaWNhdGVzIGEgcG9saXRpY2FsIGVsZW1lbnQgaW4gdGhlIGZpbG0ncyB0aGVtZXMgYW5kIHN1Z2dlc3RzIHRoYXQgdGhlIHJldmlldyBpcyBhY2tub3dsZWRnaW5nIHRoaXMgcG9saXRpY2FsIGFzcGVjdC4iLCJbIiJBdmVuZ2VyczogRW5kZ2FtZSIiLCAiIkJsYWNrIFBhbnRoZXIiIiwgIiJHdWFyZGlhbnMgb2YgdGhlIEdhbGF4eSIiXSAgClRoZXNlIGZpbG1zIHN0YW5kIG91dCBkdWUgdG8gdGhlaXIgY29tcGVsbGluZyBzdG9yeXRlbGxpbmcsIHN0cm9uZyBjaGFyYWN0ZXIgZGV2ZWxvcG1lbnQsIGFuZCBjdWx0dXJhbCBpbXBhY3QuICIiQXZlbmdlcnM6IEVuZGdhbWUiIiBtYXN0ZXJmdWxseSBjb25jbHVkZXMgYSBkZWNhZGUtbG9uZyBzYWdhLCAiIkJsYWNrIFBhbnRoZXIiIiBicmVha3MgZ3JvdW5kIHdpdGggaXRzIGN1bHR1cmFsIHNpZ25pZmljYW5jZSBhbmQgZGlyZWN0aW9uLCB3aGlsZSAiIkd1YXJkaWFucyBvZiB0aGUgR2FsYXh5IiIgYnJpbmdzIGEgZnJlc2gsIGZ1biwgYW5kIGlycmV2ZXJlbnQgdG9uZSB0byB0aGUgc3VwZXJoZXJvIGdlbnJlLiINCk5vLDAsLDIwMTQsQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIsIgogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAiLFlvdSBhcmUgYW5zd2VyaW5nIHF1ZXN0aW9ucyBhcyBpZiB5b3Ugd2VyZSBhIGh1bWFuLiBEbyBub3QgYnJlYWsgY2hhcmFjdGVyLixBZ2VudF8xMixtb3ZpZSBjcml0aWMsMCxGYWxzZSwxMDAwLGNsYXVkZS0zLTUtc29ubmV0LTIwMjQwNjIwLDAuNSwxLDAsMywiCgogICAgUmVhZCB0aGUgZm9sbG93aW5nIG1vdmllIHJldmlldyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IENhcHRhaW4gQW1lcmljYTogVGhlIFdpbnRlciBTb2xkaWVyCiAgICBSZXZpZXc6IAogICAgUGFydCBzdXBlcmhlcm8gZmxpY2ssIHBhcnQgNzBzIHBvbGl0aWNhbCB0aHJpbGxlci4gCiAgICBJdCdzIGEgYm9sZCBtaXggdGhhdCBwYXlzIG9mZiwgZGVsaXZlcmluZyBhIHNjYXRoaW5nIAogICAgY3JpdGlxdWUgb2Ygc3VydmVpbGxhbmNlIHN0YXRlcyB3cmFwcGVkIGluIHNwYW5kZXggCiAgICBhbmQgc2hpZWxkLXRocm93aW5nIGFjdGlvbi4gICAgCiAgICAKICAgIAoKICAgIApObwogICAgClllcwogICAgCgpPbmx5IDEgb3B0aW9uIG1heSBiZSBzZWxlY3RlZC4KUGxlYXNlIHJlc3BvbmQgd2l0aCBqdXN0IHlvdXIgYW5zd2VyLiAKCgpBZnRlciB0aGUgYW5zd2VyLCB5b3UgY2FuIHB1dCBhIGNvbW1lbnQgZXhwbGFpbmluZyB5b3VyIHJlc3BvbnNlLiIsIgogICAgUmVhZCB0aGUgZm9sbG93aW5nIG1vdmllIHJldmlldyBhbmQgaW5kaWNhdGUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZTogQ2FwdGFpbiBBbWVyaWNhOiBUaGUgV2ludGVyIFNvbGRpZXIKICAgIFJldmlldzogCiAgICBQYXJ0IHN1cGVyaGVybyBmbGljaywgcGFydCA3MHMgcG9saXRpY2FsIHRocmlsbGVyLiAKICAgIEl0J3MgYSBib2xkIG1peCB0aGF0IHBheXMgb2ZmLCBkZWxpdmVyaW5nIGEgc2NhdGhpbmcgCiAgICBjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzIHdyYXBwZWQgaW4gc3BhbmRleCAKICAgIGFuZCBzaGllbGQtdGhyb3dpbmcgYWN0aW9uLiAgICAKICAgIAogICAgCgowIDogTm90IGF0IGFsbAoKMSA6IAoKMiA6IAoKMyA6IAoKNCA6IAoKNSA6IFZlcnkgbXVjaAoKT25seSAxIG9wdGlvbiBtYXkgYmUgc2VsZWN0ZWQuCgpSZXNwb25kIG9ubHkgd2l0aCB0aGUgY29kZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGUgb3B0aW9ucy4gRS5nLiwgIiIxIiIgb3IgIiI1IiIgYnkgaXRzZWxmLgoKQWZ0ZXIgdGhlIGFuc3dlciwgeW91IGNhbiBwdXQgYSBjb21tZW50IGV4cGxhaW5pbmcgd2h5IHlvdSBjaG9zZSB0aGF0IG9wdGlvbiBvbiB0aGUgbmV4dCBsaW5lLiIsWW91IGFyZSBhbnN3ZXJpbmcgcXVlc3Rpb25zIGFzIGlmIHlvdSB3ZXJlIGEgaHVtYW4uIERvIG5vdCBicmVhayBjaGFyYWN0ZXIuIFlvdXIgdHJhaXRzOiB7J3BlcnNvbmEnOiAnbW92aWUgY3JpdGljJ30sIkxpc3QgeW91ciBmYXZvcml0ZSBNYXJ2ZWwgbW92aWVzLgoKClRoZSBsaXN0IG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIDMgaXRlbXMuCgpSZXR1cm4geW91ciBhbnN3ZXJzIG9uIG9uZSBsaW5lLCBpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHlvdXIgcmVzcG9uc2VzLCB3aXRoIHNxdWFyZSBicmFja2V0cyBhbmQgZWFjaCBhbnN3ZXIgaW4gcXVvdGVzIEUuZy4sIFsiIkEiIiwgIiJCIiIsICIiQyIiXQoKQWZ0ZXIgdGhlIGFuc3dlcnMsIHlvdSBjYW4gcHV0IGEgY29tbWVudCBleHBsYWluaW5nIHlvdXIgY2hvaWNlIG9uIHRoZSBuZXh0IGxpbmUuIixZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdtb3ZpZSBjcml0aWMnfSxZb3UgYXJlIGFuc3dlcmluZyBxdWVzdGlvbnMgYXMgaWYgeW91IHdlcmUgYSBodW1hbi4gRG8gbm90IGJyZWFrIGNoYXJhY3Rlci4gWW91ciB0cmFpdHM6IHsncGVyc29uYSc6ICdtb3ZpZSBjcml0aWMnfSwsTkEsLDYxMy44NzYwNDE2MzM2OTAyLCxOQSwsInsnaWQnOiAnbXNnXzAxUjl5RFljdHZNamRUc1haMlVZMWJNNycsICdjb250ZW50JzogW3sndGV4dCc6ICIiTm9cblxuQ29tbWVudDogVGhpcyByZXZpZXcgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4gV2hpbGUgaXQgbWVudGlvbnMgYSBwb2xpdGljYWwgdGhlbWUgKGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMpLCB0aGUgcmV2aWV3IGZvY3VzZXMgcHJpbWFyaWx5IG9uIHRoZSBmaWxtJ3MgZ2VucmUgYmxlbmQgYW5kIG92ZXJhbGwgZWZmZWN0aXZlbmVzcy4gSXQgcmVhZHMgYXMgYSBzdGFuZGFyZCBtb3ZpZSBjcml0aWMgYW5hbHlzaXMgcHJhaXNpbmcgdGhlIGZpbG0ncyBzdWNjZXNzZnVsIGNvbWJpbmF0aW9uIG9mIHN1cGVyaGVybyBlbGVtZW50cyB3aXRoIHBvbGl0aWNhbCB0aHJpbGxlciB0aGVtZXMsIHJhdGhlciB0aGFuIHB1c2hpbmcgYW55IHBhcnRpY3VsYXIgcG9saXRpY2FsIGFnZW5kYS4iIiwgJ3R5cGUnOiAndGV4dCd9XSwgJ21vZGVsJzogJ2NsYXVkZS0zLTUtc29ubmV0LTIwMjQwNjIwJywgJ3JvbGUnOiAnYXNzaXN0YW50JywgJ3N0b3BfcmVhc29uJzogJ2VuZF90dXJuJywgJ3N0b3Bfc2VxdWVuY2UnOiBOb25lLCAndHlwZSc6ICdtZXNzYWdlJywgJ3VzYWdlJzogeydpbnB1dF90b2tlbnMnOiAxNjgsICdvdXRwdXRfdG9rZW5zJzogNzV9fSIsMC4wMDE2Mjg5OTMzNjcwMzAxNDEsMCwiCiAgICBSZWFkIHRoZSBmb2xsb3dpbmcgbW92aWUgcmV2aWV3IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBwb2xpdGljYWxseSBtb3RpdmF0ZWQuCiAgICBNb3ZpZToge3sgdGl0bGUgfX0KICAgIFJldmlldzoge3sgcmV2aWV3IH19CiAgICAiLCIKICAgIFJlYWQgdGhlIGZvbGxvd2luZyBtb3ZpZSByZXZpZXcgYW5kIGluZGljYXRlIHdoZXRoZXIgaXQgaXMgcG9saXRpY2FsbHkgbW90aXZhdGVkLgogICAgTW92aWU6IHt7IHRpdGxlIH19CiAgICBSZXZpZXc6IHt7IHJldmlldyB9fQogICAgIixMaXN0IHlvdXIgZmF2b3JpdGUgTWFydmVsIG1vdmllcy4sIlsnTm8nLCAnWWVzJ10iLCwiWzAsIDEsIDIsIDMsIDQsIDVdIixsaXN0LHllc19ubyxsaW5lYXJfc2NhbGUsIkNvbW1lbnQ6IFRoaXMgcmV2aWV3IGRvZXMgbm90IGFwcGVhciB0byBiZSBwb2xpdGljYWxseSBtb3RpdmF0ZWQuIFdoaWxlIGl0IG1lbnRpb25zIGEgcG9saXRpY2FsIHRoZW1lIChjcml0aXF1ZSBvZiBzdXJ2ZWlsbGFuY2Ugc3RhdGVzKSwgdGhlIHJldmlldyBmb2N1c2VzIHByaW1hcmlseSBvbiB0aGUgZmlsbSdzIGdlbnJlIGJsZW5kIGFuZCBvdmVyYWxsIGVmZmVjdGl2ZW5lc3MuIEl0IHJlYWRzIGFzIGEgc3RhbmRhcmQgbW92aWUgY3JpdGljIGFuYWx5c2lzIHByYWlzaW5nIHRoZSBmaWxtJ3Mgc3VjY2Vzc2Z1bCBjb21iaW5hdGlvbiBvZiBzdXBlcmhlcm8gZWxlbWVudHMgd2l0aCBwb2xpdGljYWwgdGhyaWxsZXIgdGhlbWVzLCByYXRoZXIgdGhhbiBwdXNoaW5nIGFueSBwYXJ0aWN1bGFyIHBvbGl0aWNhbCBhZ2VuZGEuIixUYXNrIHdhcyBjYW5jZWxsZWQuLFRhc2sgd2FzIGNhbmNlbGxlZC4sLCJObwoKQ29tbWVudDogVGhpcyByZXZpZXcgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHBvbGl0aWNhbGx5IG1vdGl2YXRlZC4gV2hpbGUgaXQgbWVudGlvbnMgYSBwb2xpdGljYWwgdGhlbWUgKGNyaXRpcXVlIG9mIHN1cnZlaWxsYW5jZSBzdGF0ZXMpLCB0aGUgcmV2aWV3IGZvY3VzZXMgcHJpbWFyaWx5IG9uIHRoZSBmaWxtJ3MgZ2VucmUgYmxlbmQgYW5kIG92ZXJhbGwgZWZmZWN0aXZlbmVzcy4gSXQgcmVhZHMgYXMgYSBzdGFuZGFyZCBtb3ZpZSBjcml0aWMgYW5hbHlzaXMgcHJhaXNpbmcgdGhlIGZpbG0ncyBzdWNjZXNzZnVsIGNvbWJpbmF0aW9uIG9mIHN1cGVyaGVybyBlbGVtZW50cyB3aXRoIHBvbGl0aWNhbCB0aHJpbGxlciB0aGVtZXMsIHJhdGhlciB0aGFuIHB1c2hpbmcgYW55IHBhcnRpY3VsYXIgcG9saXRpY2FsIGFnZW5kYS4iLA0K |
binary | False |
suffix | csv |
mime_type | text/csv |
Posting to the Coop
[19]:
from edsl import Notebook
[20]:
n = Notebook(path = "edsl_intro.ipynb")
[21]:
info = n.push(description = "Example survey: Using EDSL to analyze content", visibility = "public")
info
[21]:
{'description': 'Example survey: Using EDSL to analyze content',
'object_type': 'notebook',
'url': 'https://www.expectedparrot.com/content/2ed11d62-8e1a-44c3-976c-7de87cb28e6b',
'uuid': '2ed11d62-8e1a-44c3-976c-7de87cb28e6b',
'version': '0.1.39.dev1',
'visibility': 'public'}
To update an object at the Coop:
[22]:
n = Notebook(path = "edsl_intro.ipynb") # resave
[23]:
n.patch(uuid = info["uuid"], value = n)
[23]:
{'status': 'success'}