Py.Cafe

vishesh.breja/

streamlit-on-pycafe

Streamlit on PyCafe: Interactive Web Components

DocsPricing
  • llm_workshop_pycafe/
  • app.py
  • requirements.txt
llm_workshop_pycafe/pages/01_llm_theory.py
1
aW1wb3J0IHN0cmVhbWxpdCBhcyBzdAppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CmltcG9ydCBtYXRwbG90bGliLnBhdGNoZXMgYXMgcGF0Y2hlcwpmcm9tIG1hdHBsb3RsaWIuYW5pbWF0aW9uIGltcG9ydCBGdW5jQW5pbWF0aW9uLCBQaWxsb3dXcml0ZXIKI2ltcG9ydCBudW1weSBhcyBucApmcm9tIHRyYW5zZm9ybWVycyBpbXBvcnQgR1BUMlRva2VuaXplckZhc3QsIEdQVDJUb2tlbml6ZXIsIEdQVDJNb2RlbAppbXBvcnQgdG9yY2gKaW1wb3J0IHBsb3RseS5leHByZXNzIGFzIHB4CmltcG9ydCB0aW1lCmltcG9ydCBiYXNlNjQKCgoKCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDYWNoZWQgbW9kZWwgbG9hZGluZwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAc3QuY2FjaGVfcmVzb3VyY2UKZGVmIGxvYWRfZ3B0Ml9tb2RlbF9hbmRfdG9rZW5pemVycygpOgogICAgdG9rZW5pemVyID0gR1BUMlRva2VuaXplci5mcm9tX3ByZXRyYWluZWQoImdwdDIiKQogICAgbW9kZWwgPSBHUFQyTW9kZWwuZnJvbV9wcmV0cmFpbmVkKCJncHQyIiwgb3V0cHV0X2F0dGVudGlvbnM9VHJ1ZSkKICAgIHRva2VuaXplcl9mYXN0ID0gR1BUMlRva2VuaXplckZhc3QuZnJvbV9wcmV0cmFpbmVkKCJncHQyIikKICAgIHJldHVybiB0b2tlbml6ZXIsIG1vZGVsLCB0b2tlbml6ZXJfZmFzdAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojTExNIFRoZW9yeSBUZXh0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCmRlZiBkaXNwbGF5X3BkZl9pbl9leHBhbmRlcihmaWxlX3BhdGgpOgogICAgd2l0aCBzdC5leHBhbmRlcigiRGF0YUJyaWNrc19MTE1fZUJvb2siLCBleHBhbmRlZD1UcnVlKToKICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAicmIiKSBhcyBmOgogICAgICAgICAgICBiYXNlNjRfcGRmID0gYmFzZTY0LmI2NGVuY29kZShmLnJlYWQoKSkuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgcGRmX2Rpc3BsYXkgPSBmJycnCiAgICAgICAgICAgIDxpZnJhbWUgc3JjPSJkYXRhOmFwcGxpY2F0aW9uL3BkZjtiYXNlNjQse2Jhc2U2NF9wZGZ9IiAKICAgICAgICAgICAgICAgIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiA5MDBweDsiIAogICAgICAgICAgICAgICAgZnJhbWVib3JkZXI9IjAiIAogICAgICAgICAgICAgICAgc2Nyb2xsaW5nPSJhdXRvIgogICAgICAgICAgICA+CiAgICAgICAgICAgIDwvaWZyYW1lPgogICAgICAgICcnJwogICAgICAgIHN0Lm1hcmtkb3duKHBkZl9kaXNwbGF5LCB1bnNhZmVfYWxsb3dfaHRtbD1UcnVlKQoKIyBVc2FnZToKCgoKCgoKCgoKCgpkZWYgbGxtX292ZXJ2aWV3X3NlY3Rpb24oKToKICAgIHdpdGggc3QuZXhwYW5kZXIoIkxMTSBPdmVydmlldyIsIGV4cGFuZGVkPVRydWUpOgogICAgICAgIHN0Lm1hcmtkb3duKCIiIgojIyMgV2hhdCBBcmUgTGFyZ2UgTGFuZ3VhZ2UgTW9kZWxzIChMTE1zKT8KLSBMYXJnZSBMYW5ndWFnZSBNb2RlbHMgKExMTXMpIHByb2Nlc3MgbWFzc2l2ZSBkYXRhc2V0cyB0byB1bmRlcnN0YW5kIGFuZCBnZW5lcmF0ZSBodW1hbi1saWtlIHRleHQuCi0gVGhleSB1c2UgdHJhbnNmb3JtZXIgYXJjaGl0ZWN0dXJlIHdpdGggYXR0ZW50aW9uIG1lY2hhbmlzbXMuCi0gRXhhbXBsZXMgaW5jbHVkZSBHUFQsIEJFUlQsIGFuZCBvdGhlcnMuCgojIyMgRm91bmRhdGlvbiB2cy4gRmluZS1UdW5lZCBNb2RlbHMKLSBGb3VuZGF0aW9uIG1vZGVscyBhcmUgcHJlLXRyYWluZWQgb24gbGFyZ2UsIGRpdmVyc2UgZGF0YXNldHMuCi0gRmluZS10dW5lZCBtb2RlbHMgYWRhcHQgZm91bmRhdGlvbiBtb2RlbHMgZm9yIHNwZWNpZmljIHRhc2tzIG9yIGRvbWFpbnMuCi0gRmluZS10dW5pbmcgaW1wcm92ZXMgdGFzay1zcGVjaWZpYyBwZXJmb3JtYW5jZS4KCiMjIyBFdm9sdXRpb24gb2YgTExNcwotIEVhcmx5IE5MUCBtb2RlbHMgZGF0ZSBiYWNrIHRvIHRoZSAxOTYwcyB3aXRoIHBhdHRlcm4gcmVjb2duaXRpb24gYXBwcm9hY2hlcy4KLSBJbnRyb2R1Y3Rpb24gb2YgbmV1cmFsIG5ldHdvcmtzIGFuZCBMU1RNcyBicm91Z2h0IHNpZ25pZmljYW50IGltcHJvdmVtZW50cy4KLSBUcmFuc2Zvcm1lcnMgcmV2b2x1dGlvbml6ZWQgdGhlIGZpZWxkIHNpbmNlIDIwMTcuCi0gR1BUIHNlcmllcywgQkVSVCwgYW5kIG90aGVycyBwcm9ncmVzc2VkIHJhcGlkbHkgc2luY2UgdGhlbi4KCiMjIyBFbnRlcnByaXNlIEJlbmVmaXRzCi0gQXV0b21hdGUgc3VwcG9ydCBhbmQgY3VzdG9tZXIgaW50ZXJhY3Rpb25zLgotIEVuaGFuY2VkIGNvbnRlbnQgY3JlYXRpb24gYW5kIHN1bW1hcml6YXRpb24uCi0gRGF0YS1kcml2ZW4gZGVjaXNpb24gbWFraW5nIGltcHJvdmVtZW50cy4KLSBTY2FsYWJpbGl0eSBhbmQgZWZmaWNpZW5jeSBpbiBsYW5ndWFnZSB1bmRlcnN0YW5kaW5nLgoKIyMjIENoYWxsZW5nZXMgd2l0aCBMTE0KLSBIdWdlIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG5lZWRlZCBmb3IgdHJhaW5pbmcuCi0gUmlza3Mgb2YgYmlhcyBhbmQgZmFpcm5lc3MgaXNzdWVzLgotIERpZmZpY3VsdHkgaW4gZXhwbGFpbmFiaWxpdHkgYW5kIGNvbnRyb2wuCi0gRGF0YSBwcml2YWN5IGFuZCByZWd1bGF0aW9uIGNvbXBsaWFuY2UgY29uY2VybnMuCgojIyMgRXZhbHVhdGlvbiBNZXRob2RzCi0gU3RhbmRhcmQgTmF0dXJhbCBMYW5ndWFnZSBVbmRlcnN0YW5kaW5nIGJlbmNobWFya3MuCi0gSHVtYW4gZXZhbHVhdGlvbiBhbmQgZmVlZGJhY2suCi0gUm9idXN0bmVzcyBhbmQgZ2VuZXJhbGl6YXRpb24gdGVzdGluZy4KLSBSZWFsLXdvcmxkIGRlcGxveW1lbnQgbW9uaXRvcmluZy4KIiIiKQoKCgoKCgoKCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDYWNoZWQgdG9rZW5pemF0aW9uIEdJRiBjcmVhdG9yCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBzdC5jYWNoZV9kYXRhCmRlZiBjcmVhdGVfdG9rZW5pemF0aW9uX2dpZihfdG9rZW5pemVyX2Zhc3QsIHNlbnRlbmNlOiBzdHIpIC0+IHN0ciB8IE5vbmU6CiAgICAjIFRva2VuaXplIGFuZCBjbGVhbiB0b2tlbnMgZm9yIGRpc3BsYXkKICAgIHRva2VucyA9IFtfdC5yZXBsYWNlKCLEoCIsICIiKSBmb3IgX3QgaW4gX3Rva2VuaXplcl9mYXN0LnRva2VuaXplKHNlbnRlbmNlKV0KICAgIGlmIG5vdCB0b2tlbnM6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBjb2xvcnMgPSBbJyNlNDFhMWMnLCAnIzM3N2ViOCcsICcjNGRhZjRhJywgJyM5ODRlYTMnLCAnI2ZmN2YwMCcsICcjYjg4NjBiJ10KICAgIGZpZywgYXggPSBwbHQuc3VicGxvdHMoZmlnc2l6ZT0oMTIsIDIpKQogICAgYXguYXhpcygnb2ZmJykKCiAgICBjaGFyX3dpZHRoLCBzcGFjaW5nLCB4ID0gMC4wMTUsIDAuMDIsIDAuMDUKICAgIHhfcG9zaXRpb25zID0gW10KICAgIGZvciB3b3JkIGluIHRva2VuczoKICAgICAgICB4X3Bvc2l0aW9ucy5hcHBlbmQoeCkKICAgICAgICB4ICs9IGxlbih3b3JkKSAqIGNoYXJfd2lkdGggKyBzcGFjaW5nCgogICAgdGV4dF9lbGVtcyA9IFtheC50ZXh0KDAsIDAuNSwgIiIsIGhhPSJsZWZ0IiwgdmE9ImNlbnRlciIsIGZvbnRzaXplPTE2KSBmb3IgXyBpbiB0b2tlbnNdCgogICAgZGVmIHVwZGF0ZShmcmFtZSk6CiAgICAgICAgZm9yIGksIHR4dCBpbiBlbnVtZXJhdGUodGV4dF9lbGVtcyk6CiAgICAgICAgICAgIGlmIGkgPD0gZnJhbWU6CiAgICAgICAgICAgICAgICB0eHQuc2V0X3RleHQodG9rZW5zW2ldKQogICAgICAgICAgICAgICAgdHh0LnNldF9jb2xvcihjb2xvcnNbaSAlIGxlbihjb2xvcnMpXSkKICAgICAgICAgICAgICAgIHR4dC5zZXRfcG9zaXRpb24oKHhfcG9zaXRpb25zW2ldLCAwLjUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdHh0LnNldF90ZXh0KCIiKQogICAgICAgIGlmIGZyYW1lID49IGxlbih0b2tlbnMpOgogICAgICAgICAgICBheC5zZXRfdGl0bGUoZiJUb3RhbCBUb2tlbnM6IHtsZW4odG9rZW5zKX0iLCBmb250c2l6ZT0xNCkKICAgICAgICByZXR1cm4gdGV4dF9lbGVtcwoKICAgIGFuaSA9IEZ1bmNBbmltYXRpb24oZmlnLCB1cGRhdGUsIGZyYW1lcz1sZW4odG9rZW5zKSArIDMsIGludGVydmFsPTgwMCwgcmVwZWF0PUZhbHNlKQogICAgYW5pLnNhdmUoInRva2VuaXphdGlvbi5naWYiLCB3cml0ZXI9UGlsbG93V3JpdGVyKGZwcz0xKSkKICAgIHBsdC5jbG9zZShmaWcpCiAgICByZXR1cm4gInRva2VuaXphdGlvbi5naWYiCgpkZWYgdG9rZW5pemF0aW9uX3NlY3Rpb24odG9rZW5pemVyX2Zhc3QpOgogICAgc3QuaGVhZGVyKCJMTE0gVG9rZW5pemF0aW9uIFZpc3VhbGl6YXRpb24iKQogICAgc2VudGVuY2UgPSBzdC50ZXh0X2lucHV0KCJFbnRlciBhIHNlbnRlbmNlOiIsICJUaGUgd2VhdGhlciBjaGFuZ2VzIGV2ZXJ5IGRheSBhbmQgb2Z0ZW4gc3VycHJpc2VzIHVzLiIpCiAgICBpZiBzZW50ZW5jZS5zdHJpcCgpOgogICAgICAgIGdpZl9wYXRoID0gY3JlYXRlX3Rva2VuaXphdGlvbl9naWYodG9rZW5pemVyX2Zhc3QsIHNlbnRlbmNlKQogICAgICAgIGlmIGdpZl9wYXRoOgogICAgICAgICAgICBzdC5pbWFnZShnaWZfcGF0aCkKICAgIGVsc2U6CiAgICAgICAgc3Qud2FybmluZygi4pqg77iPIFBsZWFzZSBlbnRlciBhIHNlbnRlbmNlLiIpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEF0dGVudGlvbiBtZWNoYW5pc20gZXhwbGFuYXRpb24KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGVmIGF0dGVudGlvbl9tZWNoYW5pc21fZXhwYW5kZXIoKToKICAgIHdpdGggc3QuZXhwYW5kZXIoIldoYXQgaXMgQXR0ZW50aW9uIGluIExhcmdlIExhbmd1YWdlIE1vZGVscz8iKToKICAgICAgICBzdC5tYXJrZG93bigiIiIKICAgICAgICAjIyMgV2hhdCBJcyBBdHRlbnRpb24/CiAgICAgICAgQXR0ZW50aW9uIGxldHMgdGhlIG1vZGVsIGZvY3VzIG9uIHRoZSBtb3N0IHJlbGV2YW50IHBhcnRzIG9mIGlucHV0IHRleHQgdG8gYmV0dGVyIHVuZGVyc3RhbmQgY29udGV4dCBhbmQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHdvcmRzLgogICAgICAgIEl0IGR5bmFtaWNhbGx5IHdlaWdocyBlYWNoIHdvcmQncyBpbXBvcnRhbmNlIHJlbGF0aXZlIHRvIG90aGVycywgYWxsb3dpbmcgZm9yIGJldHRlciBpbnRlcnByZXRhdGlvbiBvZiBtZWFuaW5nLgoKICAgICAgICAjIyMgSG93IEl0IFdvcmtzCiAgICAgICAgRm9yIGVhY2ggd29yZCwgd2UgY29tcHV0ZToKICAgICAgICAtICoqUXVlcnkgKFEpKio6IHdoYXQgdGhlIG1vZGVsIGlzIGxvb2tpbmcgZm9yCiAgICAgICAgLSAqKktleSAoSykqKjogcmVmZXJlbmNlcyByZXByZXNlbnRpbmcgb3RoZXIgd29yZHMKICAgICAgICAtICoqVmFsdWUgKFYpKio6IHRoZSBhY3R1YWwgY29udGVudCBvZiB3b3JkcwoKICAgICAgICBUaGUgbW9kZWwgY2FsY3VsYXRlcyBhdHRlbnRpb24gc2NvcmVzIGJldHdlZW4gcXVlcnkgYW5kIGtleXMsIG5vcm1hbGl6ZXMgdGhlc2UgdmlhIHNvZnRtYXggdG8gZ2V0IHdlaWdodHMsIHRoZW4gY29tcHV0ZXMgYSB3ZWlnaHRlZCBzdW0gb2YgdmFsdWVzLgogICAgICAgICIiIikKCiAgICAgICAgc3QubWFya2Rvd24oIiMjIyBUaGUgRm9ybXVsYTogU2NhbGVkIERvdC1Qcm9kdWN0IEF0dGVudGlvbiIpCiAgICAgICAgc3QubGF0ZXgociIiIgogICAgICAgIFx0ZXh0e0F0dGVudGlvbn0oUSwgSywgVikgPSBcdGV4dHtzb2Z0bWF4fVxsZWZ0KFxmcmFje1EgS15cdG9wfXtcc3FydHtkX2t9fVxyaWdodCkgVgogICAgICAgICIiIikKCiAgICAgICAgc3QubWFya2Rvd24ociIiIgogICAgICAgIFdoZXJlOgogICAgICAgIC0gXCggUSBcKSA9IFF1ZXJ5IG1hdHJpeAogICAgICAgIC0gXCggSyBcKSA9IEtleSBtYXRyaXgKICAgICAgICAtIFwoIFYgXCkgPSBWYWx1ZSBtYXRyaXgKICAgICAgICAtIFwoIGRfayBcKSA9IGRpbWVuc2lvbiBvZiBrZXkgdmVjdG9ycwoKICAgICAgICAjIyMgSW50dWl0aW9uCiAgICAgICAgQXR0ZW50aW9uIGlzIGxpa2UgYSBzcG90bGlnaHQgdGhhdCBmb2N1c2VzIG9uIGRpZmZlcmVudCBwYXJ0cyBvZiBhIHNlbnRlbmNlIGRlcGVuZGluZyBvbiB3aGljaCB3b3JkIGlzIGJlaW5nIGNvbnNpZGVyZWQsIGhlbHBpbmcgY2FwdHVyZSBjb250ZXh0IGVmZmVjdGl2ZWx5LgoKICAgICAgICAjIyMgV2h5IEF0dGVudGlvbiBJcyBJbXBvcnRhbnQKICAgICAgICAtIEVuYWJsZXMgY2FwdHVyaW5nIGxvbmctcmFuZ2UgZGVwZW5kZW5jaWVzIGFjcm9zcyB3b3Jkcy4KICAgICAgICAtIEFsbG93cyBwYXJhbGxlbCBwcm9jZXNzaW5nIG9mIGlucHV0cyAodW5saWtlIHNlcXVlbnRpYWwgbW9kZWxzKS4KICAgICAgICAtIEZvcm1zIHRoZSBjb3JlIG9mIFRyYW5zZm9ybWVyIG1vZGVscyBwb3dlcmluZyBtb2Rlcm4gTExNcyBsaWtlIEdQVCBhbmQgQkVSVC4KCiAgICAgICAgRm9yIG1vcmUgZGV0YWlsLCBleHBsb3JlOgogICAgICAgIC0gW0FJMjEgTGFicyAtIEF0dGVudGlvbiBNZWNoYW5pc21zXShodHRwczovL3d3dy5haTIxLmNvbS9rbm93bGVkZ2UvYXR0ZW50aW9uLW1lY2hhbmlzbXMtbGFuZ3VhZ2UtbW9kZWxzLykKICAgICAgICAtIFtTZWJhc3RpYW4gUmFzY2hrYSBCbG9nIC0gU2VsZi1BdHRlbnRpb24gRnJvbSBTY3JhdGNoXShodHRwczovL3NlYmFzdGlhbnJhc2Noa2EuY29tL2Jsb2cvMjAyMy9zZWxmLWF0dGVudGlvbi1mcm9tLXNjcmF0Y2guaHRtbCkKICAgICAgICAiIiIpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEF0dGVudGlvbiBoZWF0bWFwIHdpdGggUGxvdGx5CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRlZiBwbG90X2F0dGVudGlvbl9oZWF0bWFwKHRleHQsIHRva2VuaXplciwgbW9kZWwpOgogICAgaW5wdXRzID0gdG9rZW5pemVyKHRleHQsIHJldHVybl90ZW5zb3JzPSJwdCIpCiAgICB3aXRoIHRvcmNoLm5vX2dyYWQoKToKICAgICAgICBvdXRwdXRzID0gbW9kZWwoKippbnB1dHMpCiAgICBhdHRuID0gb3V0cHV0cy5hdHRlbnRpb25zWzBdWzAsIDBdLm51bXB5KCkKCiAgICBmaWcgPSBweC5pbXNob3coCiAgICAgICAgYXR0biwKICAgICAgICBsYWJlbHM9ZGljdCh4PSJLZXkgVG9rZW4iLCB5PSJRdWVyeSBUb2tlbiIsIGNvbG9yPSJBdHRlbnRpb24iKSwKICAgICAgICB4PVt0b2tlbml6ZXIuZGVjb2RlKFtpXSkgZm9yIGkgaW4gaW5wdXRzLmlucHV0X2lkc1swXV0sCiAgICAgICAgeT1bdG9rZW5pemVyLmRlY29kZShbaV0pIGZvciBpIGluIGlucHV0cy5pbnB1dF9pZHNbMF1dLAogICAgICAgIGNvbG9yX2NvbnRpbnVvdXNfc2NhbGU9J1ZpcmlkaXMnCiAgICApCiAgICBzdC5wbG90bHlfY2hhcnQoZmlnLCB1c2VfY29udGFpbmVyX3dpZHRoPVRydWUpCgpkZWYgYXR0ZW50aW9uX2hlYXRtYXBfc2VjdGlvbih0b2tlbml6ZXIsIG1vZGVsKToKICAgIHN0LmhlYWRlcigiQXR0ZW50aW9uIEhlYXRtYXAgVmlzdWFsaXphdGlvbiIpCiAgICB0ZXh0ID0gc3QudGV4dF9hcmVhKCJFbnRlciB0ZXh0IiwgIkRlZXAgbGVhcm5pbmcgdHJhbnNmb3JtcyBBSS4iKQogICAgaWYgdGV4dC5zdHJpcCgpOgogICAgICAgIHBsb3RfYXR0ZW50aW9uX2hlYXRtYXAodGV4dCwgdG9rZW5pemVyLCBtb2RlbCkKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKICAgICAgICAKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBMTE0gUGFyYW1ldGVycwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCmRlZiBsbG1fcGFyYW1ldGVyc19leHBsYW5hdGlvbigpOgogICAgd2l0aCBzdC5leHBhbmRlcigiS2V5IExMTSBQYXJhbWV0ZXJzICYgQ29uY2VwdHMgRXhwbGFpbmVkIPCfk5rwn5SNIiwgZXhwYW5kZWQ9RmFsc2UpOgogICAgICAgIHN0Lm1hcmtkb3duKCIiIgogICAgICAgICMjIyBUZW1wZXJhdHVyZQogICAgICAgIENvbnRyb2xzIHJhbmRvbW5lc3MgaW4gdGhlIG1vZGVsJ3Mgb3V0cHV0IGdlbmVyYXRpb24uICAKICAgICAgICAtIExvdyAoZS5nLiwgMC4yKTogTW9yZSBmb2N1c2VkIGFuZCBkZXRlcm1pbmlzdGljIGFuc3dlcnMuICAKICAgICAgICAtIEhpZ2ggKGUuZy4sIDAuOCk6IE1vcmUgY3JlYXRpdmUgYW5kIGRpdmVyc2Ugb3V0cHV0cy4KCiAgICAgICAgIyMjIFRvcC1LIFNhbXBsaW5nCiAgICAgICAgUmVzdHJpY3RzIHRva2VuIGNob2ljZXMgdG8gdGhlIHRvcCBLIHByb2JhYmxlIHRva2VucyBhdCBlYWNoIGdlbmVyYXRpb24gc3RlcCwgaW1wcm92aW5nIG91dHB1dCBxdWFsaXR5IGJ5IGV4Y2x1ZGluZyB1bmxpa2VseSB0b2tlbnMuCgogICAgICAgICMjIyBUb3AtUCAoTnVjbGV1cykgU2FtcGxpbmcKICAgICAgICBTZWxlY3RzIHRva2VucyBmcm9tIHRoZSBzbWFsbGVzdCBzZXQgYWNjdW11bGF0aW5nIHByb2JhYmlsaXR5IFAgKGUuZy4sIDAuOSksIGJhbGFuY2luZyBjcmVhdGl2aXR5IHdpdGggY29oZXJlbmNlLgoKICAgICAgICAjIyMgTWF4IFRva2VucwogICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b2tlbnMgdGhlIG1vZGVsIGdlbmVyYXRlcyBwZXIgcmVxdWVzdC4gQ29udHJvbHMgbGVuZ3RoIGFuZCByZXNvdXJjZSB1c2FnZS4KCiAgICAgICAgIyMjIEJhdGNoIFNpemUKICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBwcm9jZXNzZWQgc2ltdWx0YW5lb3VzbHkgZHVyaW5nIHRyYWluaW5nIG9yIGluZmVyZW5jZS4gTGFyZ2VyIGJhdGNoZXMgc3BlZWQgdXAgcHJvY2Vzc2luZyBidXQgcmVxdWlyZSBtb3JlIG1lbW9yeS4KCiAgICAgICAgIyMjIEVwb2NocwogICAgICAgIFRoZSBudW1iZXIgb2YgZnVsbCBwYXNzZXMgb3ZlciB0aGUgdHJhaW5pbmcgZGF0YXNldC4gTW9yZSBlcG9jaHMgdHlwaWNhbGx5IGltcHJvdmUgbGVhcm5pbmcgYnV0IHJpc2sgb3ZlcmZpdHRpbmcuCgogICAgICAgICMjIyBMZWFybmluZyBSYXRlCiAgICAgICAgVGhlIHN0ZXBzIHRoZSBvcHRpbWl6ZXIgdGFrZXMgZHVyaW5nIHRyYWluaW5nIHRvIG1pbmltaXplIGxvc3MuIAogICAgICAgIC0gVG9vIGhpZ2g6IFRyYWluaW5nIGNhbiBiZSB1bnN0YWJsZS4gIAogICAgICAgIC0gVG9vIGxvdzogVHJhaW5pbmcgaXMgc2xvdyBhbmQgbWF5IGdldCBzdHVjay4KCiAgICAgICAgIiIiKQoKICAgICAgICAjIFN1Z2dlc3RlZCB2aXN1YWxpemF0aW9ucyBvciBpbWFnZXMgVVJMcyAocmVwbGFjZSB3aXRoIGxvY2FsIGlmIHlvdSBoYXZlKQogICAgICAgIHN0Lm1hcmtkb3duKCIjIyMgVmlzdWFsaXppbmcgQ29uY2VwdHMiKQogICAgICAgIAogICAgICAgICMgVmlzdWFsOiBUZW1wZXJhdHVyZSBlZmZlY3QgKGNvbmNlcHR1YWwgaW1hZ2UpCiAgICAgICAgc3QuaW1hZ2UoCiAgICAgICAgICAgICIuL3Jlc291cmNlcy9UZW1wZWFydHVyZS5wbmciLAogICAgICAgICAgICBjYXB0aW9uPSJFZmZlY3Qgb2YgVGVtcGVyYXR1cmUgb24gbW9kZWwgY3JlYXRpdml0eSIsCiAgICAgICAgICAgIHVzZV9jb250YWluZXJfd2lkdGg9VHJ1ZSwKICAgICAgICApCiAgICAgICAgCiAgICAgICAgc3QuaW1hZ2UoCiAgICAgICAgICAgICIuL3Jlc291cmNlcy9Ub3BfcGFyYW1ldGVycy5wbmciLAogICAgICAgICAgICBjYXB0aW9uPSJEaWZmZXJlbmNlIGJldHdlZW4gVG9wLUsgYW5kIFRvcC1QIFNhbXBsaW5nIiwKICAgICAgICAgICAgdXNlX2NvbnRhaW5lcl93aWR0aD1UcnVlLAogICAgICAgICkKICAgICAgICBzdC5tYXJrZG93bigiIiIKICAgICAgICBGb3IgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbnMgYW5kIGludGVyYWN0aXZlIHZpc3VhbGl6YXRpb25zLCByZWZlciB0byB0aGUgZXh0ZXJuYWwgcmVzb3VyY2VzIHdpdGhpbiB0aGlzIGFwcCBhbmQgYmV5b25kLgogICAgICAgICIiIikKCiMgVXNhZ2U6IENhbGwgYGxsbV9wYXJhbWV0ZXJzX2V4cGxhbmF0aW9uKClgIGluc2lkZSB5b3VyIGNob2NvbGF0ZV9hbmltYXRpb25fc2VjdGlvbiBiZWZvcmUgcmVuZGVyaW5nIGNvbnRyb2xzCgoKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENob2NvbGF0ZSBhbmltYXRpb24gYW5hbG9neQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkZWYgcGxvdF9jaG9jb2xhdGVfYW5pbWF0aW9uKHRvdGFsX2Nob2NvbGF0ZXMsIGJhdGNoX3NpemUsIGVwb2NocywgbGVhcm5pbmdfcmF0ZSk6CiAgICBwbHQucmNQYXJhbXMudXBkYXRlKHsnZm9udC5mYW1pbHknOiAnU2Vnb2UgVUknLCAnZm9udC5zaXplJzogMTR9KQogICAgc3RlcHNfcGVyX2Vwb2NoID0gKHRvdGFsX2Nob2NvbGF0ZXMgKyBiYXRjaF9zaXplIC0gMSkgLy8gYmF0Y2hfc2l6ZQogICAgdG90YWxfc3RlcHMgPSBzdGVwc19wZXJfZXBvY2ggKiBlcG9jaHMKICAgIHBsb3RfcGxhY2Vob2xkZXIgPSBzdC5lbXB0eSgpCiAgICBwcm9ncmVzc19iYXIgPSBzdC5wcm9ncmVzcygwKQogICAgZmlnX3dpZHRoLCBmaWdfaGVpZ2h0ID0gMTQsIDQKCiAgICBmb3Igc3RlcF9udW0gaW4gcmFuZ2UodG90YWxfc3RlcHMpOgogICAgICAgIGVwb2NoLCBzdGVwX2luX2Vwb2NoID0gZGl2bW9kKHN0ZXBfbnVtLCBzdGVwc19wZXJfZXBvY2gpCiAgICAgICAgY2hvY29sYXRlc19waWNrZWQgPSBtaW4oYmF0Y2hfc2l6ZSwgdG90YWxfY2hvY29sYXRlcyAtIHN0ZXBfaW5fZXBvY2ggKiBiYXRjaF9zaXplKQogICAgICAgIHBvc19jdXJyZW50ID0gc3RlcF9udW0gKiBsZWFybmluZ19yYXRlCgogICAgICAgIGZpZywgYXggPSBwbHQuc3VicGxvdHMoZmlnc2l6ZT0oZmlnX3dpZHRoLCBmaWdfaGVpZ2h0KSkKICAgICAgICBheC5heGlzKCdvZmYnKQoKICAgICAgICAjIFByb2dyZXNzIGxpbmUKICAgICAgICBheC5obGluZXMoMCwgMCwgdG90YWxfc3RlcHMgKiBsZWFybmluZ19yYXRlLCBjb2xvcnM9JyNjY2NjY2MnLCBsaW5lc3R5bGVzPSdkYXNoZWQnLCBsaW5ld2lkdGg9MikKICAgICAgICBheC5wbG90KDAsIDAsICJvIiwgbWFya2Vyc2l6ZT0xNiwgY29sb3I9IiMyN2FlNjAiLCBsYWJlbD0iU3RhcnQiLCB6b3JkZXI9NSkKICAgICAgICBheC5wbG90KHRvdGFsX3N0ZXBzICogbGVhcm5pbmdfcmF0ZSwgMCwgIm8iLCBtYXJrZXJzaXplPTE2LCBjb2xvcj0iI2MwMzkyYiIsIGxhYmVsPSJFbmQiLCB6b3JkZXI9NSkKCiAgICAgICAgIyBDaG9jb2xhdGVzIGFzIHJvdW5kZWQgcmVjdGFuZ2xlcwogICAgICAgIGZvciBwYXN0X3N0ZXAgaW4gcmFuZ2Uoc3RlcF9udW0gKyAxKToKICAgICAgICAgICAgcF9lcG9jaCwgcF9zdGVwID0gZGl2bW9kKHBhc3Rfc3RlcCwgc3RlcHNfcGVyX2Vwb2NoKQogICAgICAgICAgICBjaG9jc19sZWZ0ID0gdG90YWxfY2hvY29sYXRlcyAtIHBfc3RlcCAqIGJhdGNoX3NpemUKICAgICAgICAgICAgY2hvY3MgPSBtaW4oYmF0Y2hfc2l6ZSwgY2hvY3NfbGVmdCkKICAgICAgICAgICAgcG9zID0gcGFzdF9zdGVwICogbGVhcm5pbmdfcmF0ZQogICAgICAgICAgICB5X29mZnNldCA9IC1wX2Vwb2NoICogMC44CgogICAgICAgICAgICByZWN0ID0gcGF0Y2hlcy5GYW5jeUJib3hQYXRjaCgKICAgICAgICAgICAgICAgIChwb3MsIHlfb2Zmc2V0KSwgbGVhcm5pbmdfcmF0ZSAqIDAuOSwgMC41LAogICAgICAgICAgICAgICAgYm94c3R5bGU9InJvdW5kLHBhZD0wLjAyIiwKICAgICAgICAgICAgICAgIGxpbmV3aWR0aD0xLAogICAgICAgICAgICAgICAgZmFjZWNvbG9yPScjNmM1Y2U3JywKICAgICAgICAgICAgICAgIGVkZ2Vjb2xvcj0nYmxhY2snLAogICAgICAgICAgICAgICAgYWxwaGE9MC44LAogICAgICAgICAgICAgICAgem9yZGVyPTMsCiAgICAgICAgICAgICkKICAgICAgICAgICAgYXguYWRkX3BhdGNoKHJlY3QpCiAgICAgICAgICAgIGF4LnRleHQocG9zICsgbGVhcm5pbmdfcmF0ZSAqIDAuNDUsIHlfb2Zmc2V0ICsgMC4yNSwgZiJ7Y2hvY3N9IiwKICAgICAgICAgICAgICAgICAgICBoYT0nY2VudGVyJywgdmE9J2NlbnRlcicsIGZvbnRzaXplPTE0LCBjb2xvcj0nd2hpdGUnKQoKICAgICAgICAjIEhpZ2hsaWdodCBjdXJyZW50IHN0ZXAKICAgICAgICByZWN0X2N1ciA9IHBhdGNoZXMuRmFuY3lCYm94UGF0Y2goCiAgICAgICAgICAgIChwb3NfY3VycmVudCwgMS4wKSwgbGVhcm5pbmdfcmF0ZSAqIDAuOSwgMC41LAogICAgICAgICAgICBib3hzdHlsZT0icm91bmQscGFkPTAuMDUiLAogICAgICAgICAgICBsaW5ld2lkdGg9MiwKICAgICAgICAgICAgZmFjZWNvbG9yPScjNTVlZmM0JywKICAgICAgICAgICAgZWRnZWNvbG9yPSdibGFjaycsCiAgICAgICAgICAgIHpvcmRlcj02LAogICAgICAgICAgICBhbHBoYT0wLjk1LAogICAgICAgICkKICAgICAgICBheC5hZGRfcGF0Y2gocmVjdF9jdXIpCiAgICAgICAgYXgudGV4dChwb3NfY3VycmVudCArIGxlYXJuaW5nX3JhdGUgKiAwLjQ1LCAxLjcsIGYiQWN0aXZlXG4oe2Nob2NvbGF0ZXNfcGlja2VkfSkiLAogICAgICAgICAgICAgICAgaGE9J2NlbnRlcicsIHZhPSdib3R0b20nLCBmb250c2l6ZT0xNiwgZm9udHdlaWdodD0nYm9sZCcsIGNvbG9yPSdibGFjaycsIHpvcmRlcj03KQoKICAgICAgICAjIEVwb2NoIGxhYmVscyBvbiByaWdodAogICAgICAgIGZvciBlIGluIHJhbmdlKGVwb2Nocyk6CiAgICAgICAgICAgIGF4LnRleHQodG90YWxfc3RlcHMgKiBsZWFybmluZ19yYXRlICsgbGVhcm5pbmdfcmF0ZSAqIDAuNywgLWUgKiAwLjggKyAwLjI1LAogICAgICAgICAgICAgICAgICAgIGYiRXBvY2gge2UgKyAxfSIsIGhhPSdsZWZ0JywgZm9udHNpemU9MTQsIGNvbG9yPScjNjM2ZTcyJykKCiAgICAgICAgIyBTZXQgbGltaXRzCiAgICAgICAgYXguc2V0X3hsaW0oLWxlYXJuaW5nX3JhdGUgKiAwLjUsIHRvdGFsX3N0ZXBzICogbGVhcm5pbmdfcmF0ZSArIGxlYXJuaW5nX3JhdGUgKiAzKQogICAgICAgIGF4LnNldF95bGltKC1lcG9jaHMgKiAwLjksIDIpCgogICAgICAgIGF4LmxlZ2VuZChsb2M9J2xvd2VyIGxlZnQnLCBiYm94X3RvX2FuY2hvcj0oLTAuMDgsIC0wLjMpLCBmb250c2l6ZT0xNCwgZnJhbWVvbj1UcnVlKQoKICAgICAgICBwbG90X3BsYWNlaG9sZGVyLnB5cGxvdChmaWcpCiAgICAgICAgcHJvZ3Jlc3NfYmFyLnByb2dyZXNzKChzdGVwX251bSArIDEpIC8gdG90YWxfc3RlcHMpCiAgICAgICAgdGltZS5zbGVlcCgwLjIpCgogICAgc3Quc3VjY2Vzcygi8J+PgSBGaW5pc2hlZCBjYXJyeWluZyBhbGwgY2hvY29sYXRlcyEiKQoKCgpkZWYgY2hvY29sYXRlX2FuaW1hdGlvbl9zZWN0aW9uKCk6CiAgICB3aXRoIHN0LmNvbnRhaW5lcigpOgogICAgICAgIHdpdGggc3QuZXhwYW5kZXIoIkR5bmFtaWMgVmlzdWFsaXphdGlvbjogRXBvY2gsIEJhdGNoIFNpemUgJiBMZWFybmluZyBSYXRlIChDaG9jb2xhdGUgQW5hbG9neSkiLCBleHBhbmRlZD1GYWxzZSk6CiAgICAgICAgICAgIHRvdGFsX2Nob2NzID0gc3QubnVtYmVyX2lucHV0KCLwn42rIFRvdGFsIENob2NvbGF0ZXMgKERhdGFzZXQgc2l6ZSkiLCBtaW5fdmFsdWU9MSwgdmFsdWU9MzIpCiAgICAgICAgICAgIGJhdGNoID0gc3QubnVtYmVyX2lucHV0KCLinIsgQmF0Y2ggU2l6ZSAoSGFuZGZ1bCBzaXplKSIsIG1pbl92YWx1ZT0xLCBtYXhfdmFsdWU9dG90YWxfY2hvY3MsIHZhbHVlPTQpCiAgICAgICAgICAgIGVwID0gc3QubnVtYmVyX2lucHV0KCLwn5SBIEVwb2NocyAoTnVtYmVyIG9mIGZ1bGwgcGFzc2VzKSIsIG1pbl92YWx1ZT0xLCB2YWx1ZT01KQogICAgICAgICAgICBsciA9IHN0LnNsaWRlcigi8J+TiCBMZWFybmluZyBSYXRlIChTdGVwIHNpemUpIiwgbWluX3ZhbHVlPTAuMSwgbWF4X3ZhbHVlPTMuMCwgdmFsdWU9MS4wLCBzdGVwPTAuMSkKCiAgICAgICAgICAgICMgQ3JlYXRlIHR3byBjb2x1bW5zIHNpZGUtYnktc2lkZQogICAgICAgICAgICBjb2wxLCBjb2wyID0gc3QuY29sdW1ucyhbMywgMV0pICAjIGFkanVzdCB3aWR0aHMgYXMgbmVlZGVkCiAgICAgICAgICAgIAogICAgICAgICAgICAjIExlZnQgY29sdW1uOiBjaG9jb2xhdGUgYW5pbWF0aW9uIHBsb3QgYW5kIHByb2dyZXNzCiAgICAgICAgICAgIHdpdGggY29sMToKICAgICAgICAgICAgICAgIHBsb3RfY2hvY29sYXRlX2FuaW1hdGlvbih0b3RhbF9jaG9jcywgYmF0Y2gsIGVwLCBscikKICAgICAgICAgICAgCiAgICAgICAgICAgICMgUmlnaHQgY29sdW1uOiB2aWRlbyBwbGF5ZXIKICAgICAgICAgICAgd2l0aCBjb2wyOgogICAgICAgICAgICAgICAgc3QudmlkZW8oIi4vcmVzb3VyY2VzL25ldXJhbF9uZXR3b3JrX3dvcmtpbmcubXA0IiwgZm9ybWF0PSJ2aWRlby9tcDQiLCBzdGFydF90aW1lPTApCgoKCgoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgV29ya3Nob3AgcmVzb3VyY2VzIGRyb3Bkb3duCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRlZiB3b3Jrc2hvcF9yZXNvdXJjZXNfZHJvcGRvd24oKToKICAgIHdpdGggc3QuZXhwYW5kZXIoIldvcmtzaG9wIExpbmtzICYgUmVzb3VyY2VzIiwgZXhwYW5kZWQ9RmFsc2UpOgogICAgICAgIG9wdGlvbnMgPSBbIlNlbGVjdCBhIHJlc291cmNlIiwgIlRyYW5zZm9ybWVyIEV4cGxhaW5lciAoSW50ZXJhY3RpdmUgRGVtbykiXQogICAgICAgIGNob2ljZSA9IHN0LnNlbGVjdGJveCgiV29ya3Nob3AgTGlua3MgJiBSZXNvdXJjZXMiLCBvcHRpb25zLCBpbmRleD0wLCBrZXk9IndvcmtzaG9wX3Jlc291cmNlX3NlbGVjdCIpCiAgICAKICAgICAgICBpZiBjaG9pY2UgPT0gIlRyYW5zZm9ybWVyIEV4cGxhaW5lciAoSW50ZXJhY3RpdmUgRGVtbykiOgogICAgICAgICAgICBzdC5tYXJrZG93bigKICAgICAgICAgICAgICAgICc8aWZyYW1lIHNyYz0iaHR0cHM6Ly9wb2xvY2x1Yi5naXRodWIuaW8vdHJhbnNmb3JtZXItZXhwbGFpbmVyLyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iNjAwIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPicsCiAgICAgICAgICAgICAgICB1bnNhZmVfYWxsb3dfaHRtbD1UcnVlCiAgICAgICAgICAgICkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgTWFpbiBvcmNoZXN0cmF0b3IKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGVmIG1haW4oKToKICAgIAogICAgc3QubWFya2Rvd24oIjxoMSBzdHlsZT0ndGV4dC1hbGlnbjogY2VudGVyOyc+TGV0IHVzIGxlYXJuIHRoZW9yeSBpbiBhIGZ1biB3YXkhISEhPC9oMT4iLCB1bnNhZmVfYWxsb3dfaHRtbD1UcnVlKQogICAgc3QubWFya2Rvd24oIi0tLSIpCiAgICAKICAgIAogICAgCiAgICBkaXNwbGF5X3BkZl9pbl9leHBhbmRlcigiLi9yZXNvdXJjZXMvTExNX2d1aWRlLnBkZiIpCiAgICAKICAgIHN0Lm1hcmtkb3duKCItLS0iKQogICAgCiAgICBsbG1fb3ZlcnZpZXdfc2VjdGlvbigpCiAgICB0b2tlbml6ZXIsIG1vZGVsLCB0b2tlbml6ZXJfZmFzdCA9IGxvYWRfZ3B0Ml9tb2RlbF9hbmRfdG9rZW5pemVycygpCiAgICB0b2tlbml6YXRpb25fc2VjdGlvbih0b2tlbml6ZXJfZmFzdCkKICAgIGF0dGVudGlvbl9oZWF0bWFwX3NlY3Rpb24odG9rZW5pemVyLCBtb2RlbCkKICAgIGF0dGVudGlvbl9tZWNoYW5pc21fZXhwYW5kZXIoKQogICAgbGxtX3BhcmFtZXRlcnNfZXhwbGFuYXRpb24oKQogICAgY2hvY29sYXRlX2FuaW1hdGlvbl9zZWN0aW9uKCkKICAgIHdvcmtzaG9wX3Jlc291cmNlc19kcm9wZG93bigpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==