# REMINDERS SINCE IT'S BEEN A MONTH
# insert new code chunk by entering Ctrl+Alt+I
# the preview shows you a rendered HTML copy of the contents of the editor
#  unlike *Knit*, *Preview* does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed

Using the Hadamard Matrix in Quantum Computing with Shor’s Algorithm

Shor’s algorithm primarily involves period finding using quantum circuits, and one of the key components in constructing these circuits is the Hadamard gate (or matrix). The Hadamard gate is used to create superpositions, which are essential for quantum parallelism.

Here’s a simplified step-by-step explanation of how the Hadamard matrix is used within the context of Shor’s algorithm:

1. Initialization and Superposition

The Hadamard matrix (or gate) is applied to each qubit to create a superposition of all possible states. For an \(n\)-qubit register, this transforms the state \(|0\rangle^{\otimes n}\) into an equal superposition of all \(2^n\) basis states.

Hadamard Gate (H):

\[ H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix} \]

For an \(n\)-qubit system, the Hadamard operation \(H^{\otimes n}\) creates the superposition:

\[ |0\rangle^{\otimes n} \xrightarrow{H^{\otimes n}} \frac{1}{\sqrt{2^n}} \sum_{x=0}^{2^n-1} |x\rangle \]

2. Modular Exponentiation

A quantum circuit is used to perform modular exponentiation, which is a key step in Shor’s algorithm for creating a periodic function. This step does not directly involve the Hadamard gate but sets up the state for period finding.

3. Quantum Fourier Transform (QFT)

After the modular exponentiation, the quantum state encodes information about the period of the function \(f(x) = a^x \mod N\). To extract this period, the Quantum Fourier Transform (QFT) is applied. The QFT uses Hadamard gates along with controlled phase shifts.

The QFT is defined as:

\[ \text{QFT} |x\rangle = \frac{1}{\sqrt{2^n}} \sum_{k=0}^{2^n-1} e^{2\pi i x k / 2^n} |k\rangle \]

Example Quantum Circuit for QFT: For a 3-qubit system, the QFT circuit involves Hadamard gates and controlled rotations (omitting details for brevity):

  1. Apply Hadamard to the first qubit.
  2. Apply controlled phase shifts to the first qubit conditioned on the second and third qubits.
  3. Apply Hadamard to the second qubit, followed by controlled phase shifts.
  4. Apply Hadamard to the third qubit.

4. Measurement and Classical Post-Processing

Finally, after applying the QFT, the qubits are measured. The measurement results are processed classically to determine the period \(r\). If \(r\) is even, classical algorithms are used to find the factors of \(N\).

Example Using a Simple 2-Qubit System

Here’s a concrete example using a simple 2-qubit system to demonstrate the creation of superposition and the role of Hadamard gates:

Step 1: Initialization

\[ |00\rangle \]

Step 2: Apply Hadamard Gates

\[ H \otimes H |00\rangle = \frac{1}{2} (|00\rangle + |01\rangle + |10\rangle + |11\rangle) \]

This creates an equal superposition of all possible states for 2 qubits.

Step 3: Modular Exponentiation

Assume we perform some operation \(U_f\) such that:

\[ U_f |x\rangle |0\rangle = |x\rangle |f(x)\rangle \]

For our example, let’s simplify and assume \(f(x)\) maps the states in a certain periodic fashion.

Step 4: Apply QFT

\[ \text{QFT} \left(\frac{1}{2} (|00\rangle + |01\rangle + |10\rangle + |11\rangle)\right) \]

Applying the QFT will transform the state into another superposition state, which encodes the period information.

Step 5: Measurement

Measure the qubits to collapse the state to a basis state that gives information about the period.

Step 6: Classical Post-Processing

Using the measured results, apply classical algorithms to determine the period \(r\) and use it to find the factors of \(N\).

Conclusion

The Hadamard gate is crucial in Shor’s algorithm for creating the initial superposition of states and is also used in the QFT to extract periodicity information. By leveraging the principles of quantum superposition and interference, Shor’s algorithm achieves a significant speedup for factoring large integers compared to classical algorithms.

Understanding BELL STATES:

Key Points and Summary of Bell States

Bell States: Bell states are specific quantum states of two qubits that represent the simplest and most powerful examples of quantum entanglement. They are fundamental in quantum information theory and are used to demonstrate the peculiar properties of entanglement.

Types of Bell States: There are four Bell states, each representing a different type of entangled state:

  1. Φ⁺: \(|\Phi^+\rangle = \frac{1}{\sqrt{2}} (|00\rangle + |11\rangle)\)
  2. Φ⁻: \(|\Phi^-\rangle = \frac{1}{\sqrt{2}} (|00\rangle - |11\rangle)\)
  3. Ψ⁺: \(|\Psi^+\rangle = \frac{1}{\sqrt{2}} (|01\rangle + |10\rangle)\)
  4. Ψ⁻: \(|\Psi^-\rangle = \frac{1}{\sqrt{2}} (|01\rangle - |10\rangle)\)

Applications: - Quantum Teleportation: Transmitting quantum information over distances. - Quantum Cryptography: Secure communication methods. - Entanglement-Based Protocols: Foundations of many quantum algorithms and protocols.

Further Understanding of Bell States

  1. Entangled States: Bell states are specific examples of maximally entangled two-qubit states. Entanglement is a fundamental concept in quantum mechanics where the state of one qubit cannot be described independently of the other.

  2. Four Bell States: There are four distinct Bell states, denoted as:

    • |Φ+⟩ = (|00⟩ + |11⟩)/√2
    • |Φ-⟩ = (|00⟩ - |11⟩)/√2
    • |Ψ+⟩ = (|01⟩ + |10⟩)/√2
    • |Ψ-⟩ = (|01⟩ - |10⟩)/√2
  3. Creation of Bell States: Bell states can be created using specific quantum circuits involving Hadamard (H) and controlled-NOT (CNOT) gates.

  4. Measurement of Bell States: Measuring one qubit in a Bell state instantly determines the state of the other qubit, regardless of the distance between them. This is a key feature of entanglement.

  5. Significance in Quantum Information: Bell states are essential in quantum information theory and have applications in quantum teleportation, superdense coding, and quantum key distribution.

  6. Bell’s Theorem: The existence of Bell states and their properties challenge the concept of local realism, a classical notion that physical properties exist independently of measurement and that information cannot travel faster than light.

More Bell States

  1. Definition of Bell States: The four Bell states are specific entangled states of two qubits. They are maximally entangled, meaning the qubits are strongly correlated and cannot be described independently.

  2. Notation and Representation: The Bell states are denoted as

    • \(\ket{\Phi^+}\)
    • \(\ket{\Phi^-}\)
    • \(\ket{\Psi^+}\)
    • \(\ket{\Psi^-}\) Each state is a superposition of the computational basis states of the two qubits.
  3. Properties:

    • Orthonormal: The Bell states form an orthonormal basis for the four-dimensional Hilbert space of two qubits. This means they are mutually perpendicular and have unit length.
    • Measurement Outcomes: Measuring a Bell state in the computational basis always results in one of the four possible outcomes with equal probability (25%).
    • Entanglement: Bell states exhibit perfect correlations between measurement outcomes of the two qubits.
  4. Creation:

    • Bell states can be created using quantum gates like the Hadamard (H) gate and the Controlled-NOT (CNOT) gate.
    • For example, applying a Hadamard gate to the first qubit and then a CNOT gate with the first qubit as control and the second as target will create the \(\ket{\Phi^+}\) state.
  5. Significance:

    • Bell states are fundamental resources for quantum information processing.
    • They are used in quantum teleportation, superdense coding, and other quantum protocols.
    • They play a crucial role in understanding quantum entanglement and its applications.

(https://learning.quantum.ibm.com/course/basics-of-quantum-information/multiple-systems#bell-states).

python

from qiskit import QuantumCircuit

  1. Create a quantum circuit with 2 qubits: qc = QuantumCircuit(2)

  2. Apply Hadamard gate to the first qubit: qc.h(0)

  3. Apply CNOT gate, controlled by qubit 0 and targeting qubit 1: qc.cx(0, 1)

  4. Apply Z gate to qubit 0: qc.z(0)

  5. Apply X gate to qubit 1: qc.x(1)

  6. Don’t change any code past this line: qc.measure_all() qc.draw(‘mpl’)

Explanation:

  1. Initialization: We start with both qubits in the state |0⟩.

  2. Hadamard Gate (H): Applying the Hadamard gate to the first qubit creates a superposition:

    |0⟩ -> (|0⟩ + |1⟩) / √2

    The overall state of the two qubits is now:

    (|00⟩ + |10⟩) / √2
  3. CNOT Gate: The Controlled-NOT (CNOT) gate acts on the second qubit, controlled by the first. If the first qubit is |1⟩, it flips the second qubit. This gives us:

    (|00⟩ + |11⟩) / √2   
  4. Z Gate: The Z gate on the first qubit introduces a relative phase of -1 to the |1⟩ component of the first qubit: (|00⟩ - |11⟩) / √2

  5. X Gate: The X gate on the second qubit flips it from |0⟩ to |1⟩ or vice versa:

    (|01⟩ - |10⟩) / √2 

This final state is the |ψ⁻⟩ Bell state:

|ψ⁻⟩ = (|01⟩ - |10⟩) / √2

Key Points:

LS0tDQp0aXRsZTogIkhhZGFtYXJkIE1hdHJpeCBpbiBRUSINCmF1dGhvcjogIkplc3NpY2EgTWNQaGF1bCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0Ka25pdF9yb290X2RpcjogIkM6L1VzZXJzL0plc3NpY2EgTS9EZXNrdG9wIg0KLS0tDQoNCg0KDQoNCmBgYHtyfQ0KIyBSRU1JTkRFUlMgU0lOQ0UgSVQnUyBCRUVOIEEgTU9OVEgNCiMgaW5zZXJ0IG5ldyBjb2RlIGNodW5rIGJ5IGVudGVyaW5nIEN0cmwrQWx0K0kNCiMgdGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yDQojICB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZA0KYGBgDQoNCiMjIyBVc2luZyB0aGUgSGFkYW1hcmQgTWF0cml4IGluIFF1YW50dW0gQ29tcHV0aW5nIHdpdGggU2hvcidzIEFsZ29yaXRobQ0KDQpTaG9yJ3MgYWxnb3JpdGhtIHByaW1hcmlseSBpbnZvbHZlcyBwZXJpb2QgZmluZGluZyB1c2luZyBxdWFudHVtIGNpcmN1aXRzLCBhbmQgb25lIG9mIHRoZSBrZXkgY29tcG9uZW50cyBpbiBjb25zdHJ1Y3RpbmcgdGhlc2UgY2lyY3VpdHMgaXMgdGhlIEhhZGFtYXJkIGdhdGUgKG9yIG1hdHJpeCkuIFRoZSBIYWRhbWFyZCBnYXRlIGlzIHVzZWQgdG8gY3JlYXRlIHN1cGVycG9zaXRpb25zLCB3aGljaCBhcmUgZXNzZW50aWFsIGZvciBxdWFudHVtIHBhcmFsbGVsaXNtLg0KDQpIZXJl4oCZcyBhIHNpbXBsaWZpZWQgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGUgSGFkYW1hcmQgbWF0cml4IGlzIHVzZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIFNob3IncyBhbGdvcml0aG06DQoNCiMjIyMgMS4gKipJbml0aWFsaXphdGlvbiBhbmQgU3VwZXJwb3NpdGlvbioqDQoNClRoZSBIYWRhbWFyZCBtYXRyaXggKG9yIGdhdGUpIGlzIGFwcGxpZWQgdG8gZWFjaCBxdWJpdCB0byBjcmVhdGUgYSBzdXBlcnBvc2l0aW9uIG9mIGFsbCBwb3NzaWJsZSBzdGF0ZXMuIEZvciBhbiBcKCBuIFwpLXF1Yml0IHJlZ2lzdGVyLCB0aGlzIHRyYW5zZm9ybXMgdGhlIHN0YXRlIFwofDBccmFuZ2xlXntcb3RpbWVzIG59XCkgaW50byBhbiBlcXVhbCBzdXBlcnBvc2l0aW9uIG9mIGFsbCBcKCAyXm4gXCkgYmFzaXMgc3RhdGVzLg0KDQoqKkhhZGFtYXJkIEdhdGUgKEgpOioqDQoNClxbDQpIID0gXGZyYWN7MX17XHNxcnR7Mn19IFxiZWdpbntwbWF0cml4fQ0KMSAmIDEgXFwNCjEgJiAtMQ0KXGVuZHtwbWF0cml4fQ0KXF0NCg0KRm9yIGFuIFwoIG4gXCktcXViaXQgc3lzdGVtLCB0aGUgSGFkYW1hcmQgb3BlcmF0aW9uIFwoIEhee1xvdGltZXMgbn0gXCkgY3JlYXRlcyB0aGUgc3VwZXJwb3NpdGlvbjoNCg0KXFsNCnwwXHJhbmdsZV57XG90aW1lcyBufSBceHJpZ2h0YXJyb3d7SF57XG90aW1lcyBufX0gXGZyYWN7MX17XHNxcnR7Ml5ufX0gXHN1bV97eD0wfV57Ml5uLTF9IHx4XHJhbmdsZQ0KXF0NCg0KIyMjIyAyLiAqKk1vZHVsYXIgRXhwb25lbnRpYXRpb24qKg0KDQpBIHF1YW50dW0gY2lyY3VpdCBpcyB1c2VkIHRvIHBlcmZvcm0gbW9kdWxhciBleHBvbmVudGlhdGlvbiwgd2hpY2ggaXMgYSBrZXkgc3RlcCBpbiBTaG9yJ3MgYWxnb3JpdGhtIGZvciBjcmVhdGluZyBhIHBlcmlvZGljIGZ1bmN0aW9uLiBUaGlzIHN0ZXAgZG9lcyBub3QgZGlyZWN0bHkgaW52b2x2ZSB0aGUgSGFkYW1hcmQgZ2F0ZSBidXQgc2V0cyB1cCB0aGUgc3RhdGUgZm9yIHBlcmlvZCBmaW5kaW5nLg0KDQojIyMjIDMuICoqUXVhbnR1bSBGb3VyaWVyIFRyYW5zZm9ybSAoUUZUKSoqDQoNCkFmdGVyIHRoZSBtb2R1bGFyIGV4cG9uZW50aWF0aW9uLCB0aGUgcXVhbnR1bSBzdGF0ZSBlbmNvZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwZXJpb2Qgb2YgdGhlIGZ1bmN0aW9uIFwoIGYoeCkgPSBhXnggXG1vZCBOIFwpLiBUbyBleHRyYWN0IHRoaXMgcGVyaW9kLCB0aGUgUXVhbnR1bSBGb3VyaWVyIFRyYW5zZm9ybSAoUUZUKSBpcyBhcHBsaWVkLiBUaGUgUUZUIHVzZXMgSGFkYW1hcmQgZ2F0ZXMgYWxvbmcgd2l0aCBjb250cm9sbGVkIHBoYXNlIHNoaWZ0cy4NCg0KVGhlIFFGVCBpcyBkZWZpbmVkIGFzOg0KDQpcWw0KXHRleHR7UUZUfSB8eFxyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyXm59fSBcc3VtX3trPTB9XnsyXm4tMX0gZV57MlxwaSBpIHggayAvIDJebn0gfGtccmFuZ2xlDQpcXQ0KDQoqKkV4YW1wbGUgUXVhbnR1bSBDaXJjdWl0IGZvciBRRlQ6KioNCkZvciBhIDMtcXViaXQgc3lzdGVtLCB0aGUgUUZUIGNpcmN1aXQgaW52b2x2ZXMgSGFkYW1hcmQgZ2F0ZXMgYW5kIGNvbnRyb2xsZWQgcm90YXRpb25zIChvbWl0dGluZyBkZXRhaWxzIGZvciBicmV2aXR5KToNCg0KMS4gQXBwbHkgSGFkYW1hcmQgdG8gdGhlIGZpcnN0IHF1Yml0Lg0KMi4gQXBwbHkgY29udHJvbGxlZCBwaGFzZSBzaGlmdHMgdG8gdGhlIGZpcnN0IHF1Yml0IGNvbmRpdGlvbmVkIG9uIHRoZSBzZWNvbmQgYW5kIHRoaXJkIHF1Yml0cy4NCjMuIEFwcGx5IEhhZGFtYXJkIHRvIHRoZSBzZWNvbmQgcXViaXQsIGZvbGxvd2VkIGJ5IGNvbnRyb2xsZWQgcGhhc2Ugc2hpZnRzLg0KNC4gQXBwbHkgSGFkYW1hcmQgdG8gdGhlIHRoaXJkIHF1Yml0Lg0KDQojIyMjIDQuICoqTWVhc3VyZW1lbnQgYW5kIENsYXNzaWNhbCBQb3N0LVByb2Nlc3NpbmcqKg0KDQpGaW5hbGx5LCBhZnRlciBhcHBseWluZyB0aGUgUUZULCB0aGUgcXViaXRzIGFyZSBtZWFzdXJlZC4gVGhlIG1lYXN1cmVtZW50IHJlc3VsdHMgYXJlIHByb2Nlc3NlZCBjbGFzc2ljYWxseSB0byBkZXRlcm1pbmUgdGhlIHBlcmlvZCBcKCByIFwpLiBJZiBcKCByIFwpIGlzIGV2ZW4sIGNsYXNzaWNhbCBhbGdvcml0aG1zIGFyZSB1c2VkIHRvIGZpbmQgdGhlIGZhY3RvcnMgb2YgXCggTiBcKS4NCg0KIyMjIEV4YW1wbGUgVXNpbmcgYSBTaW1wbGUgMi1RdWJpdCBTeXN0ZW0NCg0KSGVyZeKAmXMgYSBjb25jcmV0ZSBleGFtcGxlIHVzaW5nIGEgc2ltcGxlIDItcXViaXQgc3lzdGVtIHRvIGRlbW9uc3RyYXRlIHRoZSBjcmVhdGlvbiBvZiBzdXBlcnBvc2l0aW9uIGFuZCB0aGUgcm9sZSBvZiBIYWRhbWFyZCBnYXRlczoNCg0KKipTdGVwIDE6IEluaXRpYWxpemF0aW9uKioNCg0KXFsNCnwwMFxyYW5nbGUNClxdDQoNCioqU3RlcCAyOiBBcHBseSBIYWRhbWFyZCBHYXRlcyoqDQoNClxbDQpIIFxvdGltZXMgSCB8MDBccmFuZ2xlID0gXGZyYWN7MX17Mn0gKHwwMFxyYW5nbGUgKyB8MDFccmFuZ2xlICsgfDEwXHJhbmdsZSArIHwxMVxyYW5nbGUpDQpcXQ0KDQpUaGlzIGNyZWF0ZXMgYW4gZXF1YWwgc3VwZXJwb3NpdGlvbiBvZiBhbGwgcG9zc2libGUgc3RhdGVzIGZvciAyIHF1Yml0cy4NCg0KKipTdGVwIDM6IE1vZHVsYXIgRXhwb25lbnRpYXRpb24qKg0KDQpBc3N1bWUgd2UgcGVyZm9ybSBzb21lIG9wZXJhdGlvbiBcKCBVX2YgXCkgc3VjaCB0aGF0Og0KDQpcWw0KVV9mIHx4XHJhbmdsZSB8MFxyYW5nbGUgPSB8eFxyYW5nbGUgfGYoeClccmFuZ2xlDQpcXQ0KDQpGb3Igb3VyIGV4YW1wbGUsIGxldOKAmXMgc2ltcGxpZnkgYW5kIGFzc3VtZSBcKCBmKHgpIFwpIG1hcHMgdGhlIHN0YXRlcyBpbiBhIGNlcnRhaW4gcGVyaW9kaWMgZmFzaGlvbi4NCg0KKipTdGVwIDQ6IEFwcGx5IFFGVCoqDQoNClxbDQpcdGV4dHtRRlR9IFxsZWZ0KFxmcmFjezF9ezJ9ICh8MDBccmFuZ2xlICsgfDAxXHJhbmdsZSArIHwxMFxyYW5nbGUgKyB8MTFccmFuZ2xlKVxyaWdodCkNClxdDQoNCkFwcGx5aW5nIHRoZSBRRlQgd2lsbCB0cmFuc2Zvcm0gdGhlIHN0YXRlIGludG8gYW5vdGhlciBzdXBlcnBvc2l0aW9uIHN0YXRlLCB3aGljaCBlbmNvZGVzIHRoZSBwZXJpb2QgaW5mb3JtYXRpb24uDQoNCioqU3RlcCA1OiBNZWFzdXJlbWVudCoqDQoNCk1lYXN1cmUgdGhlIHF1Yml0cyB0byBjb2xsYXBzZSB0aGUgc3RhdGUgdG8gYSBiYXNpcyBzdGF0ZSB0aGF0IGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwZXJpb2QuDQoNCioqU3RlcCA2OiBDbGFzc2ljYWwgUG9zdC1Qcm9jZXNzaW5nKioNCg0KVXNpbmcgdGhlIG1lYXN1cmVkIHJlc3VsdHMsIGFwcGx5IGNsYXNzaWNhbCBhbGdvcml0aG1zIHRvIGRldGVybWluZSB0aGUgcGVyaW9kIFwoIHIgXCkgYW5kIHVzZSBpdCB0byBmaW5kIHRoZSBmYWN0b3JzIG9mIFwoIE4gXCkuDQoNCiMjIyBDb25jbHVzaW9uDQoNClRoZSBIYWRhbWFyZCBnYXRlIGlzIGNydWNpYWwgaW4gU2hvcidzIGFsZ29yaXRobSBmb3IgY3JlYXRpbmcgdGhlIGluaXRpYWwgc3VwZXJwb3NpdGlvbiBvZiBzdGF0ZXMgYW5kIGlzIGFsc28gdXNlZCBpbiB0aGUgUUZUIHRvIGV4dHJhY3QgcGVyaW9kaWNpdHkgaW5mb3JtYXRpb24uIEJ5IGxldmVyYWdpbmcgdGhlIHByaW5jaXBsZXMgb2YgcXVhbnR1bSBzdXBlcnBvc2l0aW9uIGFuZCBpbnRlcmZlcmVuY2UsIFNob3IncyBhbGdvcml0aG0gYWNoaWV2ZXMgYSBzaWduaWZpY2FudCBzcGVlZHVwIGZvciBmYWN0b3JpbmcgbGFyZ2UgaW50ZWdlcnMgY29tcGFyZWQgdG8gY2xhc3NpY2FsIGFsZ29yaXRobXMuDQoNCg0KDQoNCiMgVW5kZXJzdGFuZGluZyBCRUxMIFNUQVRFUzoNCiMjIyBLZXkgUG9pbnRzIGFuZCBTdW1tYXJ5IG9mIEJlbGwgU3RhdGVzDQoNCioqQmVsbCBTdGF0ZXM6KioNCkJlbGwgc3RhdGVzIGFyZSBzcGVjaWZpYyBxdWFudHVtIHN0YXRlcyBvZiB0d28gcXViaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBzaW1wbGVzdCBhbmQgbW9zdCBwb3dlcmZ1bCBleGFtcGxlcyBvZiBxdWFudHVtIGVudGFuZ2xlbWVudC4gVGhleSBhcmUgZnVuZGFtZW50YWwgaW4gcXVhbnR1bSBpbmZvcm1hdGlvbiB0aGVvcnkgYW5kIGFyZSB1c2VkIHRvIGRlbW9uc3RyYXRlIHRoZSBwZWN1bGlhciBwcm9wZXJ0aWVzIG9mIGVudGFuZ2xlbWVudC4NCg0KKipUeXBlcyBvZiBCZWxsIFN0YXRlczoqKg0KVGhlcmUgYXJlIGZvdXIgQmVsbCBzdGF0ZXMsIGVhY2ggcmVwcmVzZW50aW5nIGEgZGlmZmVyZW50IHR5cGUgb2YgZW50YW5nbGVkIHN0YXRlOg0KDQoxLiAqKs6m4oG6OioqIFwofFxQaGleK1xyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMFxyYW5nbGUgKyB8MTFccmFuZ2xlKVwpDQoyLiAqKs6m4oG7OioqIFwofFxQaGleLVxyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMFxyYW5nbGUgLSB8MTFccmFuZ2xlKVwpDQozLiAqKs6o4oG6OioqIFwofFxQc2leK1xyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMVxyYW5nbGUgKyB8MTBccmFuZ2xlKVwpDQo0LiAqKs6o4oG7OioqIFwofFxQc2leLVxyYW5nbGUgPSBcZnJhY3sxfXtcc3FydHsyfX0gKHwwMVxyYW5nbGUgLSB8MTBccmFuZ2xlKVwpDQoNCioqQXBwbGljYXRpb25zOioqDQotICoqUXVhbnR1bSBUZWxlcG9ydGF0aW9uOioqIFRyYW5zbWl0dGluZyBxdWFudHVtIGluZm9ybWF0aW9uIG92ZXIgZGlzdGFuY2VzLg0KLSAqKlF1YW50dW0gQ3J5cHRvZ3JhcGh5OioqIFNlY3VyZSBjb21tdW5pY2F0aW9uIG1ldGhvZHMuDQotICoqRW50YW5nbGVtZW50LUJhc2VkIFByb3RvY29sczoqKiBGb3VuZGF0aW9ucyBvZiBtYW55IHF1YW50dW0gYWxnb3JpdGhtcyBhbmQgcHJvdG9jb2xzLg0KDQojIyBGdXJ0aGVyIFVuZGVyc3RhbmRpbmcgb2YgQmVsbCBTdGF0ZXMNCg0KMS4gKipFbnRhbmdsZWQgU3RhdGVzOioqIEJlbGwgc3RhdGVzIGFyZSBzcGVjaWZpYyBleGFtcGxlcyBvZiBtYXhpbWFsbHkgZW50YW5nbGVkIHR3by1xdWJpdCBzdGF0ZXMuIEVudGFuZ2xlbWVudCBpcyBhIGZ1bmRhbWVudGFsIGNvbmNlcHQgaW4gcXVhbnR1bSBtZWNoYW5pY3Mgd2hlcmUgdGhlIHN0YXRlIG9mIG9uZSBxdWJpdCBjYW5ub3QgYmUgZGVzY3JpYmVkIGluZGVwZW5kZW50bHkgb2YgdGhlIG90aGVyLg0KDQoyLiAqKkZvdXIgQmVsbCBTdGF0ZXM6KiogVGhlcmUgYXJlIGZvdXIgZGlzdGluY3QgQmVsbCBzdGF0ZXMsIGRlbm90ZWQgYXM6IA0KICAgLSAgfM6mK+KfqSA9ICh8MDDin6kgKyB8MTHin6kpL+KImjIgDQogICAtICB8zqYt4p+pID0gKHwwMOKfqSAtIHwxMeKfqSkv4oiaMg0KICAgLSAgfM6oK+KfqSA9ICh8MDHin6kgKyB8MTDin6kpL+KImjINCiAgIC0gIHzOqC3in6kgPSAofDAx4p+pIC0gfDEw4p+pKS/iiJoyDQoNCjMuICoqQ3JlYXRpb24gb2YgQmVsbCBTdGF0ZXM6KiogQmVsbCBzdGF0ZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgc3BlY2lmaWMgcXVhbnR1bSBjaXJjdWl0cyBpbnZvbHZpbmcgSGFkYW1hcmQgKEgpIGFuZCBjb250cm9sbGVkLU5PVCAoQ05PVCkgZ2F0ZXMuDQoNCjQuICoqTWVhc3VyZW1lbnQgb2YgQmVsbCBTdGF0ZXM6KiogIE1lYXN1cmluZyBvbmUgcXViaXQgaW4gYSBCZWxsIHN0YXRlIGluc3RhbnRseSBkZXRlcm1pbmVzIHRoZSBzdGF0ZSBvZiB0aGUgb3RoZXIgcXViaXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbS4gVGhpcyBpcyBhIGtleSBmZWF0dXJlIG9mIGVudGFuZ2xlbWVudC4NCg0KNS4gKipTaWduaWZpY2FuY2UgaW4gUXVhbnR1bSBJbmZvcm1hdGlvbjoqKiBCZWxsIHN0YXRlcyBhcmUgZXNzZW50aWFsIGluIHF1YW50dW0gaW5mb3JtYXRpb24gdGhlb3J5IGFuZCBoYXZlIGFwcGxpY2F0aW9ucyBpbiBxdWFudHVtIHRlbGVwb3J0YXRpb24sIHN1cGVyZGVuc2UgY29kaW5nLCBhbmQgcXVhbnR1bSBrZXkgZGlzdHJpYnV0aW9uLg0KDQo2LiAqKkJlbGwncyBUaGVvcmVtOioqIFRoZSBleGlzdGVuY2Ugb2YgQmVsbCBzdGF0ZXMgYW5kIHRoZWlyIHByb3BlcnRpZXMgY2hhbGxlbmdlIHRoZSBjb25jZXB0IG9mIGxvY2FsIHJlYWxpc20sIGEgY2xhc3NpY2FsIG5vdGlvbiB0aGF0IHBoeXNpY2FsIHByb3BlcnRpZXMgZXhpc3QgaW5kZXBlbmRlbnRseSBvZiBtZWFzdXJlbWVudCBhbmQgdGhhdCBpbmZvcm1hdGlvbiBjYW5ub3QgdHJhdmVsIGZhc3RlciB0aGFuIGxpZ2h0Lg0KDQoNCiMjIE1vcmUgQmVsbCBTdGF0ZXMNCg0KMS4gKipEZWZpbml0aW9uIG9mIEJlbGwgU3RhdGVzOioqICBUaGUgZm91ciBCZWxsIHN0YXRlcyBhcmUgc3BlY2lmaWMgZW50YW5nbGVkIHN0YXRlcyBvZiB0d28gcXViaXRzLiBUaGV5IGFyZSBtYXhpbWFsbHkgZW50YW5nbGVkLCBtZWFuaW5nIHRoZSBxdWJpdHMgYXJlIHN0cm9uZ2x5IGNvcnJlbGF0ZWQgYW5kIGNhbm5vdCBiZSBkZXNjcmliZWQgaW5kZXBlbmRlbnRseS4NCg0KMi4gKipOb3RhdGlvbiBhbmQgUmVwcmVzZW50YXRpb246KiogVGhlIEJlbGwgc3RhdGVzIGFyZSBkZW5vdGVkIGFzICANCiAgICogXChca2V0e1xQaGleK31cKQ0KICAgKiBcKFxrZXR7XFBoaV4tfVwpDQogICAqIFwoXGtldHtcUHNpXit9XCkNCiAgICogXChca2V0e1xQc2leLX1cKQ0KICAgRWFjaCBzdGF0ZSBpcyBhIHN1cGVycG9zaXRpb24gb2YgdGhlIGNvbXB1dGF0aW9uYWwgYmFzaXMgc3RhdGVzIG9mIHRoZSB0d28gcXViaXRzLg0KDQozLiAqKlByb3BlcnRpZXM6KioNCiAgICAqICoqT3J0aG9ub3JtYWw6KiogVGhlIEJlbGwgc3RhdGVzIGZvcm0gYW4gb3J0aG9ub3JtYWwgYmFzaXMgZm9yIHRoZSBmb3VyLWRpbWVuc2lvbmFsIEhpbGJlcnQgc3BhY2Ugb2YgdHdvIHF1Yml0cy4gVGhpcyBtZWFucyB0aGV5IGFyZSBtdXR1YWxseSBwZXJwZW5kaWN1bGFyIGFuZCBoYXZlIHVuaXQgbGVuZ3RoLg0KICAgICogKipNZWFzdXJlbWVudCBPdXRjb21lczoqKiBNZWFzdXJpbmcgYSBCZWxsIHN0YXRlIGluIHRoZSBjb21wdXRhdGlvbmFsIGJhc2lzIGFsd2F5cyByZXN1bHRzIGluIG9uZSBvZiB0aGUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB3aXRoIGVxdWFsIHByb2JhYmlsaXR5ICgyNSUpLg0KICAgICogKipFbnRhbmdsZW1lbnQ6KiogQmVsbCBzdGF0ZXMgZXhoaWJpdCBwZXJmZWN0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIG1lYXN1cmVtZW50IG91dGNvbWVzIG9mIHRoZSB0d28gcXViaXRzLg0KDQo0LiAqKkNyZWF0aW9uOioqDQogICAgKiBCZWxsIHN0YXRlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyBxdWFudHVtIGdhdGVzIGxpa2UgdGhlIEhhZGFtYXJkIChIKSBnYXRlIGFuZCB0aGUgQ29udHJvbGxlZC1OT1QgKENOT1QpIGdhdGUuICANCiAgICAqIEZvciBleGFtcGxlLCBhcHBseWluZyBhIEhhZGFtYXJkIGdhdGUgdG8gdGhlIGZpcnN0IHF1Yml0IGFuZCB0aGVuIGEgQ05PVCBnYXRlIHdpdGggdGhlIGZpcnN0IHF1Yml0IGFzIGNvbnRyb2wgYW5kIHRoZSBzZWNvbmQgYXMgdGFyZ2V0IHdpbGwgY3JlYXRlIHRoZSBcKFxrZXR7XFBoaV4rfVwpIHN0YXRlLg0KDQo1LiAqKlNpZ25pZmljYW5jZToqKg0KICAgICogQmVsbCBzdGF0ZXMgYXJlIGZ1bmRhbWVudGFsIHJlc291cmNlcyBmb3IgcXVhbnR1bSBpbmZvcm1hdGlvbiBwcm9jZXNzaW5nLg0KICAgICogVGhleSBhcmUgdXNlZCBpbiBxdWFudHVtIHRlbGVwb3J0YXRpb24sIHN1cGVyZGVuc2UgY29kaW5nLCBhbmQgb3RoZXIgcXVhbnR1bSBwcm90b2NvbHMuDQogICAgKiBUaGV5IHBsYXkgYSBjcnVjaWFsIHJvbGUgaW4gdW5kZXJzdGFuZGluZyBxdWFudHVtIGVudGFuZ2xlbWVudCBhbmQgaXRzIGFwcGxpY2F0aW9ucy4gDQoNCg0KDQoNCg0KDQooaHR0cHM6Ly9sZWFybmluZy5xdWFudHVtLmlibS5jb20vY291cnNlL2Jhc2ljcy1vZi1xdWFudHVtLWluZm9ybWF0aW9uL211bHRpcGxlLXN5c3RlbXMjYmVsbC1zdGF0ZXMpLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQojIHB5dGhvbg0KZnJvbSBxaXNraXQgaW1wb3J0IFF1YW50dW1DaXJjdWl0DQoNCiAgMS4gQ3JlYXRlIGEgcXVhbnR1bSBjaXJjdWl0IHdpdGggMiBxdWJpdHM6DQogICAgICAqKnFjID0gUXVhbnR1bUNpcmN1aXQoMikqKg0KDQogIDIuIEFwcGx5IEhhZGFtYXJkIGdhdGUgdG8gdGhlIGZpcnN0IHF1Yml0Og0KICAgICAgKipxYy5oKDApKioNCg0KICAzLiBBcHBseSBDTk9UIGdhdGUsIGNvbnRyb2xsZWQgYnkgcXViaXQgMCBhbmQgdGFyZ2V0aW5nIHF1Yml0IDE6DQogICAgICAqKnFjLmN4KDAsIDEpKioNCg0KICA0LiBBcHBseSBaIGdhdGUgdG8gcXViaXQgMDoNCiAgICAgICoqcWMueigwKSoqDQoNCiAgNS4gQXBwbHkgWCBnYXRlIHRvIHF1Yml0IDE6DQogICAgICAqKnFjLngoMSkqKg0KDQogIDYuIERvbid0IGNoYW5nZSBhbnkgY29kZSBwYXN0IHRoaXMgbGluZToNCiAgICAgICoqcWMubWVhc3VyZV9hbGwoKSoqDQogICAgICAqKnFjLmRyYXcoJ21wbCcpKioNCg0KDQoqKkV4cGxhbmF0aW9uOioqDQoNCjEuICoqSW5pdGlhbGl6YXRpb246KiogV2Ugc3RhcnQgd2l0aCBib3RoIHF1Yml0cyBpbiB0aGUgc3RhdGUgfDDin6kuDQoyLiAqKkhhZGFtYXJkIEdhdGUgKEgpOioqIEFwcGx5aW5nIHRoZSBIYWRhbWFyZCBnYXRlIHRvIHRoZSBmaXJzdCBxdWJpdCBjcmVhdGVzIGEgc3VwZXJwb3NpdGlvbjoNCiAgIGBgYA0KICAgfDDin6kgLT4gKHww4p+pICsgfDHin6kpIC8g4oiaMg0KICAgYGBgDQogICBUaGUgb3ZlcmFsbCBzdGF0ZSBvZiB0aGUgdHdvIHF1Yml0cyBpcyBub3c6IA0KICAgYGBgDQogICAofDAw4p+pICsgfDEw4p+pKSAvIOKImjINCiAgIGBgYA0KMy4gKipDTk9UIEdhdGU6KiogVGhlIENvbnRyb2xsZWQtTk9UIChDTk9UKSBnYXRlIGFjdHMgb24gdGhlIHNlY29uZCBxdWJpdCwgY29udHJvbGxlZCBieSB0aGUgZmlyc3QuIElmIHRoZSBmaXJzdCBxdWJpdCBpcyB8MeKfqSwgaXQgZmxpcHMgdGhlIHNlY29uZCBxdWJpdC4gVGhpcyBnaXZlcyB1czoNCiAgIGBgYA0KICAgKHwwMOKfqSArIHwxMeKfqSkgLyDiiJoyICAgDQogICBgYGANCjQuICoqWiBHYXRlOioqIFRoZSBaIGdhdGUgb24gdGhlIGZpcnN0IHF1Yml0IGludHJvZHVjZXMgYSByZWxhdGl2ZSBwaGFzZSBvZiAtMSB0byB0aGUgfDHin6kgY29tcG9uZW50IG9mIHRoZSBmaXJzdCBxdWJpdDoNCiAgICBgYGANCiAgICAofDAw4p+pIC0gfDEx4p+pKSAvIOKImjINCiAgICBgYGANCjUuICoqWCBHYXRlOioqIFRoZSBYIGdhdGUgb24gdGhlIHNlY29uZCBxdWJpdCBmbGlwcyBpdCBmcm9tIHww4p+pIHRvIHwx4p+pIG9yIHZpY2UgdmVyc2E6DQogICBgYGANCiAgICh8MDHin6kgLSB8MTDin6kpIC8g4oiaMiANCiAgIGBgYA0KDQpUaGlzIGZpbmFsIHN0YXRlIGlzIHRoZSB8z4jigbvin6kgQmVsbCBzdGF0ZToNCg0KYGBgDQp8z4jigbvin6kgPSAofDAx4p+pIC0gfDEw4p+pKSAvIOKImjINCmBgYA0KDQoqKktleSBQb2ludHM6KioNCg0KKiAqKkVudGFuZ2xlbWVudDoqKiBUaGUgQmVsbCBzdGF0ZSBpcyBhbiBlbnRhbmdsZWQgc3RhdGUsIG1lYW5pbmcgdGhlIHR3byBxdWJpdHMgYXJlIGluZXh0cmljYWJseSBsaW5rZWQgYW5kIHRoZWlyIHN0YXRlcyBjYW5ub3QgYmUgZGVzY3JpYmVkIGluZGVwZW5kZW50bHkuDQoqICoqTWVhc3VyZW1lbnQ6KiogSWYgeW91IG1lYXN1cmUgYm90aCBxdWJpdHMgaW4gdGhlIGNvbXB1dGF0aW9uYWwgYmFzaXMgKHww4p+pIGFuZCB8MeKfqSksIHlvdSdsbCBhbHdheXMgZ2V0IG9wcG9zaXRlIHJlc3VsdHMgKDAxIG9yIDEwKSB3aXRoIGVxdWFsIHByb2JhYmlsaXR5Lg0KDQo=