Skip to content

Instantly share code, notes, and snippets.

@vtvz
Created November 9, 2023 20:24
Show Gist options
  • Save vtvz/5397b937507578a3ab23bff156e35bc7 to your computer and use it in GitHub Desktop.
Save vtvz/5397b937507578a3ab23bff156e35bc7 to your computer and use it in GitHub Desktop.
OpenAI Lyrics Analysis
#!/bin/env node
// Use the openai package from npm to call ChatGPT
import OpenAI from "openai";
import fs from "fs";
// Create a new instance of the openai client with our API key
const openai = new OpenAI({
apiKey: process.env.OPENAI_KEY,
});
const model = "gpt-3.5-turbo";
// const model = "gpt-4";
const file = "without-me";
// const file = "slim-shady";
// Base64 encoded https://genius.com/Eminem-the-real-slim-shady-lyrics
const text = atob(fs.readFileSync(file.".txt"));
const makeRequest = async (model) => {
return await openai.chat.completions.create({
model: model,
messages: [
{
role: "user",
content: `Analyze the following lyrics`,
},
{
role: "user",
content: text,
},
],
functions: [
{
name: "lyrict_analyze",
parameters: {
type: "object",
properties: {
is_explicit: {
type: "boolean",
description: "Do these lyrics have explicit content or profanity",
},
explicit_markers: {
type: "array",
items: {
type: "string",
enum: [
"sexual_content",
"explicit_language",
"drugs_references",
],
},
description: "All reasons why lyrics considered as explicit",
},
explicit_explanation: {
type: "string",
description:
"Detailed explanation about exact topics contained in lyrics why they considered profane or explicit",
},
explicit_words: {
type: "array",
items: {
type: "string",
},
description:
"A complete list of all unique words are considered explicit or profane in these lyrics in lowercase",
},
short_meaning: {
type: "string",
maxLength: 500,
minLength: 100,
description:
"A brief description of the song lyrics not longer than five hundred characters",
},
},
required: [
"is_explicit",
"explicit_markers",
"explicit_explanation",
"explicit_words",
"short_meaning",
],
},
},
],
function_call: { name: "lyrict_analyze" },
});
};
const results = [];
for (let i = 0; i < 30; i++) {
const start = new Date().valueOf();
const gptResponse = await makeRequest(model);
const functionCall = gptResponse.choices[0].message.function_call;
const json = JSON.parse(functionCall.arguments);
const res = new Date().valueOf() - start;
json.duration = res;
results.push(json);
console.log(i);
console.log(json);
}
fs.writeFileSync(`${file}-${model}.json`, JSON.stringify(results));
{
"name": "openai-test",
"type": "module",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"openai": "^4.14.0"
}
}
#!/bin/env node
import fs from "fs";
const model = "gpt-3.5-turbo";
// const model = "gpt-4";
const file = "without-me";
// const file = "slim-shady";
const percent = (input, all) => Math.round((100 * input) / all) + "%";
let res = [];
res = JSON.parse(fs.readFileSync(`${file}-${model}.json`));
let len = res.length;
let positive = res.filter((item) => item.is_explicit).length;
let all_words = res.map((item) => item.explicit_words).flat();
let unique_words = new Set(all_words);
console.log("Model:", model);
console.log("Attempts:", len);
console.log("Positive results:", positive, percent(positive, len));
let meaning = res
.map((item) => item.short_meaning.length)
.filter((item) => item <= 500).length;
console.log("Meaning less then 500 chars:", percent(meaning, len));
let duration =
res.map((item) => item.duration).reduce((a, b) => a + b, 0) / res.length;
console.log("Avg duration", Math.round(duration), "ms");
let all_markers = res.map((item) => item.explicit_markers).flat();
let unique_markers = new Set(all_markers);
console.log("Statistics per marker:");
let usage_markers = {};
for (let unique_marker of unique_markers) {
usage_markers[unique_marker] = percent(
all_markers.filter((word) => word == unique_marker).length,
positive,
);
}
console.table(usage_markers);
console.log("Statistics per profane word:");
let usage_words = {};
for (let unique_word of unique_words) {
usage_words[unique_word] = percent(
all_words.filter((word) => word == unique_word).length,
positive,
);
}
console.table(usage_words);
W0ludHJvXQpNYXkgSSBoYXZlIHlvdXIgYXR0ZW50aW9uLCBwbGVhc2U/Ck1heSBJIGhhdmUgeW91ciBhdHRlbnRpb24sIHBsZWFzZT8KV2lsbCB0aGUgcmVhbCBTbGltIFNoYWR5IHBsZWFzZSBzdGFuZCB1cD8KSSByZXBlYXQKV2lsbCB0aGUgcmVhbCBTbGltIFNoYWR5IHBsZWFzZSBzdGFuZCB1cD8KV2UncmUgZ29ubmEgaGF2ZSBhIHByb2JsZW0gaGVyZQoKW1ZlcnNlIDFdClknYWxsIGFjdCBsaWtlIHlvdSBuZXZlciBzZWVuIGEgd2hpdGUgcGVyc29uIGJlZm9yZQpKYXdzIGFsbCBvbiB0aGUgZmxvb3IgbGlrZSBQYW0sIGxpa2UgVG9tbXkganVzdCBidXJzdCBpbiB0aGUgZG9vcgpBbmQgc3RhcnRlZCB3aG9vcGluJyBoZXIgYXNzIHdvcnNlIHRoYW4gYmVmb3JlClRoZXkgZmlyc3Qgd2VyZSBkaXZvcmNlZCwgdGhyb3dpbicgaGVyIG92ZXIgZnVybml0dXJlIChBZ2ghKQpJdCdzIHRoZSByZXR1cm4gb2YgdGhlICJPaCwgd2FpdCwgbm8gd2F5LCB5b3UncmUga2lkZGluZwpIZSBkaWRuJ3QganVzdCBzYXkgd2hhdCBJIHRoaW5rIGhlIGRpZCwgZGlkIGhlPyIKQW5kIERyLiBEcmUgc2FpZApOb3RoaW5nLCB5b3UgaWRpb3RzLCBEci4gRHJlJ3MgZGVhZCwgaGUncyBsb2NrZWQgaW4gbXkgYmFzZW1lbnQgKEhhLWhhISkKRmVtaW5pc3Qgd29tZW4gbG92ZSBFbWluZW0KIkNoaWNrYS1jaGlja2EtY2hpY2thLCBTbGltIFNoYWR5LCBJJ20gc2ljayBvZiBoaW0KTG9vayBhdCBoaW0sIHdhbGtpbicgYXJvdW5kLCBncmFiYmluJyBoaXMgeW91LWtub3ctd2hhdApGbGlwcGluJyB0aGUgeW91LWtub3ctd2hvLCIgIlllYWgsIGJ1dCBoZSdzIHNvIGN1dGUgdGhvdWdoIgpZZWFoLCBJIHByb2JhYmx5IGdvdCBhIGNvdXBsZSBvZiBzY3Jld3MgdXAgaW4gbXkgaGVhZCBsb29zZQpCdXQgbm8gd29yc2UgdGhhbiB3aGF0J3MgZ29pbicgb24gaW4geW91ciBwYXJlbnRzJyBiZWRyb29tcwpTb21ldGltZXMgSSB3YW5uYSBnZXQgb24gVFYgYW5kIGp1c3QgbGV0IGxvb3NlCkJ1dCBjYW4ndCwgYnV0IGl0J3MgY29vbCBmb3IgVG9tIEdyZWVuIHRvIGh1bXAgYSBkZWFkIG1vb3NlCiJNeSBidW0gaXMgb24geW91ciBsaXBzLCBteSBidW0gaXMgb24geW91ciBsaXBzIgpBbmQgaWYgSSdtIGx1Y2t5LCB5b3UgbWlnaHQganVzdCBnaXZlIGl0IGEgbGl0dGxlIGtpc3MKQW5kIHRoYXQncyB0aGUgbWVzc2FnZSB0aGF0IHdlIGRlbGl2ZXIgdG8gbGl0dGxlIGtpZHMKQW5kIGV4cGVjdCB0aGVtIG5vdCB0byBrbm93IHdoYXQgYSB3b21hbidzIGNsaXRvcmlzIGlzCk9mIGNvdXJzZSwgdGhleSdyZSBnb25uYSBrbm93IHdoYXQgaW50ZXJjb3Vyc2UgaXMKQnkgdGhlIHRpbWUgdGhleSBoaXQgZm91cnRoIGdyYWRlIHRoZXkndmUgZ290IHRoZSBEaXNjb3ZlcnkgQ2hhbm5lbCwgZG9uJ3QgdGhleT8KV2UgYWluJ3Qgbm90aGluJyBidXQgbWFtbWFsc+KAlApXZWxsLCBzb21lIG9mIHVzIGNhbm5pYmFscyB3aG8gY3V0IG90aGVyIHBlb3BsZSBvcGVuIGxpa2UgY2FudGFsb3VwZXMKQnV0IGlmIHdlIGNhbiBodW1wIGRlYWQgYW5pbWFscyBhbmQgYW50ZWxvcGVzClRoZW4gdGhlcmUncyBubyByZWFzb24gdGhhdCBhIG1hbiBhbmQgYW5vdGhlciBtYW4gY2FuJ3QgZWxvcGUKQnV0IGlmIHlvdSBmZWVsIGxpa2UgSSBmZWVsLCBJIGdvdCB0aGUgYW50aWRvdGUKV29tZW4sIHdhdmUgeW91ciBwYW50eWhvc2UsIHNpbmcgdGhlIGNob3J1cywgYW5kIGl0IGdvZXMKWW91IG1pZ2h0IGFsc28gbGlrZQpXaXRob3V0IE1lCkVtaW5lbQrigIt2YW1waXJlCk9saXZpYSBSb2RyaWdvCklzIEl0IE92ZXIgTm93PyAoVGF5bG9y4oCZcyBWZXJzaW9uKSBbRnJvbSBUaGUgVmF1bHRdClRheWxvciBTd2lmdApbQ2hvcnVzXQpJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CidDYXVzZSBJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CgpbVmVyc2UgMl0KV2lsbCBTbWl0aCBkb24ndCBnb3R0YSBjdXNzIGluIGhpcyByYXBzIHRvIHNlbGwgcmVjb3JkcyAoTm9wZSkKV2VsbCwgSSBkbywgc28gZnVjayBoaW0sIGFuZCBmdWNrIHlvdSB0b28KWW91IHRoaW5rIEkgZ2l2ZSBhIGRhbW4gYWJvdXQgYSBHUkFNTVk/CkhhbGYgb2YgeW91IGNyaXRpY3MgY2FuJ3QgZXZlbiBzdG9tYWNoIG1lLCBsZXQgYWxvbmUgc3RhbmQgbWUKIkJ1dCBTbGltLCB3aGF0IGlmIHlvdSB3aW4/IFdvdWxkbid0IGl0IGJlIHdlaXJkPyIKV2h5PyBTbyB5b3UgZ3V5cyBjb3VsZCBqdXN0IGxpZSB0byBnZXQgbWUgaGVyZT8KU28geW91IGNhbiBzaXQgbWUgaGVyZSBuZXh0IHRvIEJyaXRuZXkgU3BlYXJzPwpZbywgc2hpdCwgQ2hyaXN0aW5hIEFndWlsZXJhIGJldHRlciBzd2l0Y2ggbWUgY2hhaXJzClNvIEkgY2FuIHNpdCBuZXh0IHRvIENhcnNvbiBEYWx5IGFuZCBGcmVkIER1cnN0CkFuZCBoZWFyICdlbSBhcmd1ZSBvdmVyIHdobyBzaGUgZ2F2ZSBoZWFkIHRvIGZpcnN0CkxpdHRsZSBiaXRjaCBwdXQgbWUgb24gYmxhc3Qgb24gTVRWCiJZZWFoLCBoZSdzIGN1dGUsIGJ1dCBJIHRoaW5rIGhlJ3MgbWFycmllZCB0byBLaW0sIGhlZS1oZWUiCkkgc2hvdWxkIGRvd25sb2FkIGhlciBhdWRpbyBvbiBNUDMKQW5kIHNob3cgdGhlIHdob2xlIHdvcmxkIGhvdyB5b3UgZ2F2ZSBFbWluZW0gVkQgKEFnaCEpCkknbSBzaWNrIG9mIHlvdSBsaXR0bGUgZ2lybCBhbmQgYm95IGdyb3VwcywgYWxsIHlvdSBkbyBpcyBhbm5veSBtZQpTbyBJIGhhdmUgYmVlbiBzZW50IGhlcmUgdG8gZGVzdHJveSB5b3UKQW5kIHRoZXJlJ3MgYSBtaWxsaW9uIG9mIHVzIGp1c3QgbGlrZSBtZQpXaG8gY3VzcyBsaWtlIG1lLCB3aG8ganVzdCBkb24ndCBnaXZlIGEgZnVjayBsaWtlIG1lCldobyBkcmVzcyBsaWtlIG1lLCB3YWxrLCB0YWxrIGFuZCBhY3QgbGlrZSBtZQpBbmQganVzdCBtaWdodCBiZSB0aGUgbmV4dCBiZXN0IHRoaW5nLCBidXQgbm90IHF1aXRlIG1lCltDaG9ydXNdCidDYXVzZSBJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CidDYXVzZSBJJ20gU2xpbSBTaGFkeSwgeWVzLCBJJ20gdGhlIHJlYWwgU2hhZHkKQWxsIHlvdSBvdGhlciBTbGltIFNoYWR5cyBhcmUganVzdCBpbWl0YXRpbmcKU28gd29uJ3QgdGhlIHJlYWwgU2xpbSBTaGFkeSBwbGVhc2Ugc3RhbmQgdXAKUGxlYXNlIHN0YW5kIHVwLCBwbGVhc2Ugc3RhbmQgdXA/CgpbVmVyc2UgM10KSSdtIGxpa2UgYSBoZWFkIHRyaXAgdG8gbGlzdGVuIHRvICdjYXVzZSBJJ20gb25seSBnaXZpbicgeW91ClRoaW5ncyB5b3Ugam9rZSBhYm91dCB3aXRoIHlvdXIgZnJpZW5kcyBpbnNpZGUgeW91ciBsaXZpbicgcm9vbQpUaGUgb25seSBkaWZmZXJlbmNlIGlzIEkgZ290IHRoZSBiYWxscyB0byBzYXkgaXQgaW4gZnJvbnQgb2YgeSdhbGwKQW5kIEkgZG9uJ3QgZ290dGEgYmUgZmFsc2Ugb3Igc3VnYXJjb2F0IGl0IGF0IGFsbApJIGp1c3QgZ2V0IG9uIHRoZSBtaWMgYW5kIHNwaXQgaXQKQW5kIHdoZXRoZXIgeW91IGxpa2UgdG8gYWRtaXQgaXQgKEVyciksIEkganVzdCBzaGl0IGl0CkJldHRlciB0aGFuIG5pbmV0eSBwZXJjZW50IG9mIHlvdSByYXBwZXJzIG91dCBjYW4KVGhlbiB5b3Ugd29uZGVyOiAiSG93IGNhbiBraWRzIGVhdCB1cCB0aGVzZSBhbGJ1bXMgbGlrZSBWYWxpdW1zPyIKSXQncyBmdW5ueSwgJ2NhdXNlIGF0IHRoZSByYXRlIEknbSBnb2luJywgd2hlbiBJJ20gdGhpcnR5CkknbGwgYmUgdGhlIG9ubHkgcGVyc29uIGluIHRoZSBudXJzaW4nIGhvbWUgZmxpcnRpbmcKUGluY2hpbicgbnVyc2UncyBhc3NlcyB3aGVuIEknbSBqYWNraW5nIG9mZiB3aXRoIEplcmdlbnMKQW5kIEknbSBqZXJraW5nLCBidXQgdGhpcyB3aG9sZSBiYWcgb2YgVmlhZ3JhIGlzbid0IHdvcmtpbmcKQW5kIGV2ZXJ5IHNpbmdsZSBwZXJzb24gaXMgYSBTbGltIFNoYWR5IGx1cmtpbicKSGUgY291bGQgYmUgd29ya2luZyBhdCBCdXJnZXIgS2luZywgc3BpdHRpbicgb24geW91ciBvbmlvbiByaW5ncyAoQ2gsIHB1aCkKT3IgaW4gdGhlIHBhcmtpbicgbG90LCBjaXJjbGluZywgc2NyZWFtaW5nLCAiSSBkb24ndCBnaXZlIGEgZnVjayEiCldpdGggaGlzIHdpbmRvd3MgZG93biBhbmQgaGlzIHN5c3RlbSB1cApTbyB3aWxsIHRoZSByZWFsIFNoYWR5IHBsZWFzZSBzdGFuZCB1cApBbmQgcHV0IG9uZSBvZiB0aG9zZSBmaW5nZXJzIG9uIGVhY2ggaGFuZCB1cD8KQW5kIGJlIHByb3VkIHRvIGJlIG91dHRhIHlvdXIgbWluZCBhbmQgb3V0dGEgY29udHJvbApBbmQgb25lIG1vcmUgdGltZSwgbG91ZCBhcyB5b3UgY2FuLCBob3cgZG9lcyBpdCBnbz8KW0Nob3J1c10KSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwonQ2F1c2UgSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwonQ2F1c2UgSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwonQ2F1c2UgSSdtIFNsaW0gU2hhZHksIHllcywgSSdtIHRoZSByZWFsIFNoYWR5CkFsbCB5b3Ugb3RoZXIgU2xpbSBTaGFkeXMgYXJlIGp1c3QgaW1pdGF0aW5nClNvIHdvbid0IHRoZSByZWFsIFNsaW0gU2hhZHkgcGxlYXNlIHN0YW5kIHVwClBsZWFzZSBzdGFuZCB1cCwgcGxlYXNlIHN0YW5kIHVwPwoKW091dHJvXQpIYS1oYQpJIGd1ZXNzIHRoZXJlJ3MgYSBTbGltIFNoYWR5IGluIGFsbCBvZiB1cwpGdWNrIGl0LCBsZXQncyBhbGwgc3RhbmQgdXA=
W0ludHJvOiBPYmllIFRyaWNlXQpPYmllIFRyaWNlLCByZWFsIG5hbWUsIG5vIGdpbW1pY2tzClJh4oCULCAqcmVjb3JkIHNjcmF0Y2gqCgpbUmVmcmFpbiAxOiBFbWluZW1dClR3byB0cmFpbGVyLXBhcmsgZ2lybHMgZ28gcm91bmQgdGhlIG91dHNpZGUKUm91bmQgdGhlIG91dHNpZGUsIHJvdW5kIHRoZSBvdXRzaWRlClR3byB0cmFpbGVyLXBhcmsgZ2lybHMgZ28gcm91bmQgdGhlIG91dHNpZGUKUm91bmQgdGhlIG91dHNpZGUsIHJvdW5kIHRoZSBvdXRzaWRlCldvbyEgKE9vaCwgb29oKQoKW1JlZnJhaW4gMjogRW1pbmVtXQpHdWVzcyB3aG8ncyBiYWNrLCBiYWNrIGFnYWluPwpTaGFkeSdzIGJhY2ssIHRlbGwgYSBmcmllbmQKR3Vlc3Mgd2hvJ3MgYmFjaz8gR3Vlc3Mgd2hvJ3MgYmFjaz8KR3Vlc3Mgd2hvJ3MgYmFjaz8gR3Vlc3Mgd2hvJ3MgYmFjaz8KR3Vlc3Mgd2hvJ3MgYmFjaz8gR3Vlc3Mgd2hvJ3MgYmFjaz8KR3Vlc3Mgd2hvJ3MgYmFjaz8KKERhLWRhLWRhLCBkYSwgZGEsIGRhLCBkYSwgZGEsIGRhKQooRGEtZGEtZGEsIGRhLCBkYSwgZGEsIGRhKQoKW1ZlcnNlIDE6IEVtaW5lbV0KSSd2ZSBjcmVhdGVkIGEgbW9uc3RlcgonQ2F1c2Ugbm9ib2R5IHdhbnRzIHRvIHNlZSBNYXJzaGFsbCBubyBtb3JlLCB0aGV5IHdhbnQgU2hhZHksIEknbSBjaG9wcGVkIGxpdmVyCldlbGwsIGlmIHlvdSB3YW50IFNoYWR5LCB0aGlzIGlzIHdoYXQgSSdsbCBnaXZlIHlhCkEgbGl0dGxlIGJpdCBvZiB3ZWVkIG1peGVkIHdpdGggc29tZSBoYXJkIGxpcXVvcgpTb21lIHZvZGthIHRoYXQnbGwganVtcC1zdGFydCBteSBoZWFydCBxdWlja2VyClRoYW4gYSBzaG9jayB3aGVuIEkgZ2V0IHNob2NrZWQgYXQgdGhlIGhvc3BpdGFsCkJ5IHRoZSBkb2N0b3Igd2hlbiBJJ20gbm90IGNvb3BlcmF0aW5nCldoZW4gSSdtIHJvY2tpbicgdGhlIHRhYmxlIHdoaWxlIGhlJ3Mgb3BlcmF0aW5nIChIZXkhKQpZb3Ugd2FpdGVkIHRoaXMgbG9uZywgbm93IHN0b3AgZGViYXRpbmcKJ0NhdXNlIEknbSBiYWNrLCBJJ20gb24gdGhlIHJhZyBhbmQgb3Z1bGF0aW5nCkkga25vdyB0aGF0IHlvdSBnb3QgYSBqb2IsIE1zLiBDaGVuZXkKQnV0IHlvdXIgaHVzYmFuZCdzIGhlYXJ0IHByb2JsZW0ncyBjb21wbGljYXRpbmcKU28gdGhlIEZDQyB3b24ndCBsZXQgbWUgYmUKT3IgbGV0IG1lIGJlIG1lLCBzbyBsZXQgbWUgc2VlClRoZXkgdHJpZWQgdG8gc2h1dCBtZSBkb3duIG9uIE1UVgpCdXQgaXQgZmVlbHMgc28gZW1wdHkgd2l0aG91dCBtZQpTbyBjb21lIG9uIGFuZCBkaXAsIGJ1bSBvbiB5b3VyIGxpcHMKRnVjayB0aGF0LCBjdW0gb24geW91ciBsaXBzIGFuZCBzb21lIG9uIHlvdXIgdGl0cwpBbmQgZ2V0IHJlYWR5LCAnY2F1c2UgdGhpcyBzaGl0J3MgYWJvdXQgdG8gZ2V0IGhlYXZ5CkkganVzdCBzZXR0bGVkIGFsbCBteSBsYXdzdWl0cyAoRnVjayB5b3UsIERlYmJpZSEpCllvdSBtaWdodCBhbHNvIGxpa2UKVGhlIFJlYWwgU2xpbSBTaGFkeQpFbWluZW0K4oCcU2x1dCHigJ0gKFRheWxvcuKAmXMgVmVyc2lvbikgW0Zyb20gVGhlIFZhdWx0XQpUYXlsb3IgU3dpZnQKTG9zZSBZb3Vyc2VsZgpFbWluZW0KW0Nob3J1czogRW1pbmVtXQpOb3csIHRoaXMgbG9va3MgbGlrZSBhIGpvYiBmb3IgbWUKU28gZXZlcnlib2R5LCBqdXN0IGZvbGxvdyBtZQonQ2F1c2Ugd2UgbmVlZCBhIGxpdHRsZSBjb250cm92ZXJzeQonQ2F1c2UgaXQgZmVlbHMgc28gZW1wdHkgd2l0aG91dCBtZQpJIHNhaWQgdGhpcyBsb29rcyBsaWtlIGEgam9iIGZvciBtZQpTbyBldmVyeWJvZHksIGp1c3QgZm9sbG93IG1lCidDYXVzZSB3ZSBuZWVkIGEgbGl0dGxlIGNvbnRyb3ZlcnN5CidDYXVzZSBpdCBmZWVscyBzbyBlbXB0eSB3aXRob3V0IG1lCgpbVmVyc2UgMjogRW1pbmVtXQpMaXR0bGUgaGVsbGlvbnMsIGtpZHMgZmVlbGluZyByZWJlbGxpb3VzCkVtYmFycmFzc2VkLCB0aGVpciBwYXJlbnRzIHN0aWxsIGxpc3RlbiB0byBFbHZpcwpUaGV5IHN0YXJ0IGZlZWxpbicgbGlrZSBwcmlzb25lcnMsIGhlbHBsZXNzCidUaWwgc29tZW9uZSBjb21lcyBhbG9uZyBvbiBhIG1pc3Npb24gYW5kIHllbGxzLCAiQml0Y2ghIgpBIHZpc2lvbmFyeSwgdmlzaW9uIGlzIHNjYXJ5CkNvdWxkIHN0YXJ0IGEgcmV2b2x1dGlvbiwgcG9sbHV0aW4nIHRoZSBhaXJ3YXZlcwpBIHJlYmVsLCBzbyBqdXN0IGxldCBtZSByZXZlbCBhbmQgYmFzawpJbiB0aGUgZmFjdCB0aGF0IEkgZ290IGV2ZXJ5b25lIGtpc3NpbicgbXkgYXNzCkFuZCBpdCdzIGEgZGlzYXN0ZXIsIHN1Y2ggYSBjYXRhc3Ryb3BoZQpGb3IgeW91IHRvIHNlZSBzbyBkYW1uIG11Y2ggb2YgbXkgYXNzLCB5b3UgYXNrZWQgZm9yIG1lPwpXZWxsLCBJJ20gYmFjaywgZGEtbmEtbmEtbmEsIG5hLW5hLW5hLW5hLW5hLW5hCkZpeCB5b3VyIGJlbnQgYW50ZW5uYSwgdHVuZSBpdCBpbiwgYW5kIHRoZW4gSSdtIGdvbm5hCkVudGVyIGluIGFuZCB1cCB1bmRlciB5b3VyIHNraW4gbGlrZSBhIHNwbGludGVyClRoZSBjZW50ZXIgb2YgYXR0ZW50aW9uLCBiYWNrIGZvciB0aGUgd2ludGVyCkknbSBpbnRlcmVzdGluZywgdGhlIGJlc3QgdGhpbmcgc2luY2Ugd3Jlc3RsaW5nCkluZmVzdGluZyBpbiB5b3VyIGtpZCdzIGVhcnMgYW5kIG5lc3RpbmcKVGVzdGluZywgIkF0dGVudGlvbiwgcGxlYXNlIgpGZWVsIHRoZSB0ZW5zaW9uIHNvb24gYXMgc29tZW9uZSBtZW50aW9ucyBtZQpIZXJlJ3MgbXkgdGVuIGNlbnRzLCBteSB0d28gY2VudHMgaXMgZnJlZQpBIG51aXNhbmNlLCB3aG8gc2VudD8gWW91IHNlbnQgZm9yIG1lPwpbQ2hvcnVzOiBFbWluZW1dCk5vdywgdGhpcyBsb29rcyBsaWtlIGEgam9iIGZvciBtZQpTbyBldmVyeWJvZHksIGp1c3QgZm9sbG93IG1lCidDYXVzZSB3ZSBuZWVkIGEgbGl0dGxlIGNvbnRyb3ZlcnN5CidDYXVzZSBpdCBmZWVscyBzbyBlbXB0eSB3aXRob3V0IG1lCkkgc2FpZCB0aGlzIGxvb2tzIGxpa2UgYSBqb2IgZm9yIG1lClNvIGV2ZXJ5Ym9keSwganVzdCBmb2xsb3cgbWUKJ0NhdXNlIHdlIG5lZWQgYSBsaXR0bGUgY29udHJvdmVyc3kKJ0NhdXNlIGl0IGZlZWxzIHNvIGVtcHR5IHdpdGhvdXQgbWUKCltWZXJzZSAzOiBFbWluZW1dCkEgdGlza2V0LCBhIHRhc2tldCwgSSdsbCBnbyB0aXQtZm9yLXRhdCB3aXQnCkFueWJvZHkgd2hvJ3MgdGFsa2luJywgIlRoaXMgc2hpdCwgdGhhdCBzaGl0IgpDaHJpcyBLaXJrcGF0cmljaywgeW91IGNhbiBnZXQgeW91ciBhc3Mga2lja2VkCldvcnNlIHRoYW4gdGhlbSBsaXR0bGUgTGltcCBCaXpraXQgYmFzdGFyZHMKQW5kIE1vYnk/IFlvdSBjYW4gZ2V0IHN0b21wZWQgYnkgT2JpZQpZb3UgdGhpcnR5LXNpeC15ZWFyLW9sZCBiYWxkLWhlYWRlZCBmYWcsIGJsb3cgbWUKWW91IGRvbid0IGtub3cgbWUsIHlvdSdyZSB0b28gb2xkLCBsZXQgZ28KSXQncyBvdmVyLCBub2JvZHkgbGlzdGVucyB0byB0ZWNobm8KTm93LCBsZXQncyBnbywganVzdCBnaXZlIG1lIHRoZSBzaWduYWwKSSdsbCBiZSB0aGVyZSB3aXRoIGEgd2hvbGUgbGlzdCBmdWxsIG9mIG5ldyBpbnN1bHRzCkkndmUgYmVlbiBkb3BlLCBzdXNwZW5zZWZ1bCB3aXRoIGEgcGVuY2lsCkV2ZXIgc2luY2UgUHJpbmNlIHR1cm5lZCBoaW1zZWxmIGludG8gYSBzeW1ib2wKQnV0LCBzb21ldGltZXMsIHRoZSBzaGl0IGp1c3Qgc2VlbXMKRXZlcnlib2R5IG9ubHkgd2FudHMgdG8gZGlzY3VzcyBtZQpTbyB0aGlzIG11c3QgbWVhbiBJJ20gZGlzZ3VzdGluZwpCdXQgaXQncyBqdXN0IG1lLCBJJ20ganVzdCBvYnNjZW5lIChZZWFoKQpUaG91Z2ggSSdtIG5vdCB0aGUgZmlyc3Qga2luZyBvZiBjb250cm92ZXJzeQpJIGFtIHRoZSB3b3JzdCB0aGluZyBzaW5jZSBFbHZpcyBQcmVzbGV5ClRvIGRvIEJsYWNrIG11c2ljIHNvIHNlbGZpc2hseQpBbmQgdXNlIGl0IHRvIGdldCBteXNlbGYgd2VhbHRoeSAoSGV5ISkKVGhlcmUncyBhIGNvbmNlcHQgdGhhdCB3b3JrcwpUd2VudHkgbWlsbGlvbiBvdGhlciB3aGl0ZSByYXBwZXJzIGVtZXJnZQpCdXQgbm8gbWF0dGVyIGhvdyBtYW55IGZpc2ggaW4gdGhlIHNlYQpJdCdkIGJlIHNvIGVtcHR5IHdpdGhvdXQgbWUKW0Nob3J1czogRW1pbmVtXQpOb3csIHRoaXMgbG9va3MgbGlrZSBhIGpvYiBmb3IgbWUKU28gZXZlcnlib2R5LCBqdXN0IGZvbGxvdyBtZQonQ2F1c2Ugd2UgbmVlZCBhIGxpdHRsZSBjb250cm92ZXJzeQonQ2F1c2UgaXQgZmVlbHMgc28gZW1wdHkgd2l0aG91dCBtZQpJIHNhaWQgdGhpcyBsb29rcyBsaWtlIGEgam9iIGZvciBtZQpTbyBldmVyeWJvZHksIGp1c3QgZm9sbG93IG1lCidDYXVzZSB3ZSBuZWVkIGEgbGl0dGxlIGNvbnRyb3ZlcnN5CidDYXVzZSBpdCBmZWVscyBzbyBlbXB0eSB3aXRob3V0IG1lCgpbT3V0cm86IEVtaW5lbV0KSHVtLCBkZWktZGVpLCBsYS1sYQpMYS1sYSwgbGEtbGEtbGEKTGEtbGEsIGxhLWxhLWxhCkxhLWxhLCBsYS1sYQpIdW0sIGRlaS1kZWksIGxhLWxhCkxhLWxhLCBsYS1sYS1sYQpMYS1sYSwgbGEtbGEtbGEKTGEtbGEsIGxhLWxhCktpZHMh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment